C语言程序设计习题2.docx
- 文档编号:30170595
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:20
- 大小:33.21KB
C语言程序设计习题2.docx
《C语言程序设计习题2.docx》由会员分享,可在线阅读,更多相关《C语言程序设计习题2.docx(20页珍藏版)》请在冰豆网上搜索。
C语言程序设计习题2
第二套习题
1.填空题
(1)_是组成C程序的基本单位。
(2)已知字母b的ASCII码为十进制数98,且设ch为字符型变量,则表达式ch=‘b’+‘9—‘6’的值为_。
(3)若用︹表示一个空格,则执行以下程序的输出结果是_
main()
{
inta=-2;
longb=-567890;
printf(“*a=%d,%d8o,%-8x,%-8u*\n”,a,a,a,a);
printf(“*b=%ld,%8ld,%-8ld*\n”,b,b,b);
}
(4)在C语言中,没有逻辑常量,所以,用0表示逻辑“假”,用_表示逻辑“真”值。
(5)以下程序用于从键盘输入的字符中统计小写英文字母字符的个数,以数字0结束循环。
请填空。
#include
main()
{
intn=0;
charc;
do
{
c=getchar();
if(_)n++;
}
while(_);
printf(“n=%d\n”,n);
}
(6)在C语言中,二维数组元素在内存中的排列规律是_小元素排在前面;对于_相同的元素,_小的元素排在前面。
(7)在C语言中,函数的实参与其对应的_之间,按_值传递方式进行数据传递。
(8)下列程序的运行结果是_。
#include
swap(int*p1,int*p2)
{
intn;
n=*p1;*p1=*p2;*p2=n;
}
main()
{
inta=10,b=14,*pp1,*pp2;
pp1=&a;pp2=&b;
swap(pp1,pp2);
printf(“*pp1=%d,*pp2=%\n”,*pp1,*pp2);
printf(“a=%d,b=%d\n”,a,b);
}
(9)设有以下宏定义:
#defineW10
#defineLW+30
则编译后赋值语句s=L*20的展开式为_。
(10)以下程序的运行结果是_。
structdata
{
floatx;
charc;
};
main()
{
structdataa={1.0,‘a’};
f(a);
printf(“%f,%c\n”,a,x,a,c);
}
f(structdatab);
{
b,x=2.0;
b.c=‘b’;
}
(11)在C语言中,文本有两种存取方式,分别是_存取和_存取。
2.选择题
(1)以下不正确的C语言标识符是_。
A.floatB.b_3_4C.AexeD._yE.2bat
(2)假设所有变量均为整型,则表达式(a=3,b=7,a++,a+b)的值是_。
A.10B.11C.4D.3
(3)在执行以下程序过程中,
#include
main()
{
charc1,c2,c3,c4,c5,c6;
scanf(“%c%c%c%c”,&c1,&c2,&c3,&c4);
c5=getchar();
c6=getchar();
putchar(c1);
putchar(c2);
printf(“%c%c\n”,c5,c6);
}
如果输入数据:
987
65432
输出结果是(注意:
从第一列开始,
A.9843B.9854C.9832D.9865
(4)为下面程序中的exp1和exp2选择正确的表达式,以便使程序能够计算出圆的面积(输入标记a时)和周长(输入标记c时)。
#include
#definepi3.14159
main()
{
charm;
floatd,a=0,c=0;
printf(“inputmarkaorcanddiameterdpiaese.\n”);
scanf(“%c%f”,&m,&d);
if(exp1)
{a=pi*d*d/4;printf(“areais%f”,a);}
If(exp2)
{c=pi*d;printf(“circleis%f”;c);}
}
A.exp1为m=a,exp2为m=c
B.exp1为m==a,exp2为m==c
C.exp1为m==“a”,exp2为m==“c”
D.exp1为m==‘a’,exp2为m==‘c’
(5)若运行一下程序,从键盘输入1306<回车>,则下面程序的运行结果是_。
#include
main()
{
intc;
while(c=getchar())!
=‘\n’)
switch(c-‘0’)
{
case0:
putchar(c);
case1:
putchar(c+1);
case2:
putchar(c+2);break;
case2:
putchar(c+3);
default:
putchar(c-1);break;
}
printf(“\n”);
}
A.2605B.23620125C.1306D.2362125
(6)对二维数组进行正确初始化的语句是_。
A.inta[][]={6,5,4,3,2,1};B.inta[2][]={6,5,4,3,2,1};
C.inta[][3]={6,5,4,3,2,1};D.inta[2,3]={6,5,4,3,2,1};
(7)已知如下定义的函数:
func(m)
{
m++;
printf(“%d”,m);
}
则该函数的数据类型是_。
A.无法确定返回值类型B.字符型
C.void型D.与参数m的类型相同
(8)若有定义语句“int(*p)()”,则p的含义是_。
A.P是一个函数,该函数返回指向整型数据的指针
B.p是一个指向函数的指针,该函数返回整型值
C.p是一个指向整型数据的指针变量
D.以上说法都是错误的
(9)已知“enumworkday{mon,tue,wed,thd,fri}myday;”则正确的赋值是_。
A.mon=0;B.tue=myday;C.myday=2;D.myday=wed
(10)以下程序的运行结果是_。
#include
main()
{
structtime
{
inthour,minute,second;
}now;
printf(“%d\n”,sizeof(now));
}
A.6B.8C.10D.12
(11)fopen(filename,mode)用于打开文件,以下可作为filname参数的正确格式是_。
A.c:
myfile.txtB.“c:
\\myfile.txt”C.c:
\myfile.txtD.“c:
\myfile.txt”
3.解答题
(1)编程计算以下数学表达式的值。
(2)以下程序的功能是:
找出一个大于给定整数m且紧随m的素数,并打印这个素数。
请改正程序中的错误,使它能得出正确的结果。
注意:
不得增行或删行,也不能更改程序的结构。
#include
#include
main()
{
intm,i,k;
clrscr();
printf(“\nPleaseinputm:
”);
scanf(“%d”,&m);
for(i=m+1;;i++)
if(i%k!
=0)break;
if(i } printf(“%d\n”,i); } (3)编写下列函数change的程序,实现以下矩阵的行列互换。 输入矩阵: 程序输出: 不能改动main函数中的任何内容,仅在函数change的花括号中填入你编的若干语句。 #include #include intchange(intm[4][4]) { } main() { inti,j; inta[4][4]={{10,11,12,13}{20,21,22,23}{30,31,32,33}{40,41,42,43}}; clrscr(); for(i=0;i<4;i++) printf(“\n”); } change(a); printf(“Changearray: \n”); for(i=0;i<4;i++) } for(j=0;j<4;j++)printf(“%3d”,a[i][j]); printf(“\n”); } } (4)下列程序中,函数inversing的功能是: 将在字符串a中的字符按逆序放到b串中。 请改正函数inversing程序中的错误。 注意: 不能改动main函数,不恩能够增行或删行,不能更改程序的结构! #include #include #include voidinversing(char*a,char*b) { inti,al; al=strlen(a) for(i=0;i b[i]=a[al-i-1]; b[al]=‘\0’; } main() { chara[50],b[50]; clrscr() printf(“Pleaseenterstringa: ”); scanf(“%s”,a); inversing(a,b); printf(“Theresultis: %s\n”,b); } (5)改正以下程序中的错误,使其能够正确打印相应的数组元素。 注意: 不能增行或删行,不能改动程序结构。 #include main() { structdata { inta; int*b; }d[2]; intc0[]={0,1},c1[]={3,4}; d[0].b=c0; d[1].b=c1; printf(“%d\n”,d[0].b); printf(“%d\n”,d[1].b+1); } (6)编写程序,使其功能为把文件myfile.c的内容输出到屏幕上。 4.编程题 (1)把从键盘输入的字符串变成一个新的字符串,并输出。 要求新字符串在原串中的每两个字符之间插入一个星号,如原串name,则新串是n*a*m*e。 请只用指针方法在函数insert中产生新串,在main函数中完成原串的输入和新串的输出。 (2)编写程序,把磁盘上的文本文件逐行按逆序复制到另一个文件中,在命令行中给出这两个文件名,源文件名在前,目的文件名在后。 第二套解答 1.填空题 (1)答案: 函数 说明: C源程序由函数构成,所以函数时C源程序的基本单位。 (2)答案: ‘e’ 说明: C语言中字符表达式可以这样运算,先计算表达式中各个字符对应的ASCII码之间的运算结果,然后按计算结果值在ASCII码表中找出相应的字符作为该字符表达式的结果。 在ASCII码表中字符‘9’的ASCII码比字符‘6’的ASCII码大3,字母b的ASCII码为十进制数98,所以,‘b’+‘9’-‘6’的ASCII码结果为十进制数101,101在ASCII码中对应的字符为‘e’。 因此,表达式ch=‘b’+‘9’-‘6’的值为‘e’。 (3)答案: *a=-2,︹︹177776,fffe︹︹︹︹,65534︹* *b=-567890,︹-567890,-567890*︹ 说明: %8o: o表示八进制数形式输出,8表示数据宽度是8位且数据靠右,左端空位以空格补齐。 由于是将内存单元中的各位的值(0或1)按八进制形式输出,因此输出的数值不带符号,即将符号位也一起作为八进制的一部分输出。 %-8x: x表示以十六进制数形式输出整数,-8表示数据宽度是8位且数据靠左,右端空位以空格补齐。 同样,输出的十六进制数不带符号。 %-6u: u表示输出unsigned型数据,即无符号十进制数整型数据,-6表示数据宽度是6位且数据靠左,右端空位以空格补齐。 Printf的附加格式说明字符1表示用于长整型整数,可以放在格式符d、o、x和u前面。 (4)答案: 非0数字 (5)答案: c>=97&&c<=122 c! =48 说明: 本题使用循环结构类型的一般形式为“do语句whlie(表达式);”,其特点是先执行语句,后判断表达式,只要表达式非0,就返回执行do后面的语句。 小写字母a的ASCII码是97,小写英文字母z的ASCII码是122,如果逻辑表达式c>=97&&c<=122为真,可判断字符变量c是小写字母。 数字0的ASCII码是48,c! =48为真时可判断字符c不是数字0。 (6)答案: 行下标、行下标,列下标。 说明: 在内存中,二维数组元素排列的顺序是,从行列下标都为0的元素开始,下标值的元素排在前面,且列下标值先变化行下标值后变化。 (7)答案: 形参、单向 (8)答案: *pp1=14,*pp2=10 a=14,b=10 说明: 本题中的swap函数把两个变量中的值进行交换。 由于函数的参数按“单向值传递”方式传递数据,所以,若swap参数为两个变量,则不能完成两个变量值的交换。 若swap参数为向这两个变量的指针,则可以完成两个变量值的交换。 (9)答案: s=10+30*20 说明: 在编程过程中,先把L中的W替换成10,L变为10+30。 然后再把s=L*20替换为s=10+30*20。 所以,若打算先计算10+30,再用结果40乘以20,则应该把#includeLW+30改为#includeL(W+30),这样,s=L*20的展开式为s=(10+30)*20。 (10)答案: 1.000000,a 说明: 在本题中,先定义结构体类型data,再定义结构体类型data的变量a,并给变量a赋初值。 由于函数的单向传递方式,调用函数f(a)后,变量a的值未被改变。 最后,屏幕上输出的仍然是变量a的初值 (11)答案: 顺序(或随机),随机(顺序) 2.选择题 (1)答案: A、E 说明: C语言标识符由英文字母。 下划线和数字组成,且首字符必须是英文字母或下划线。 另外,C语言标识符不能是C语言的关键字。 Float是C语言的关键字,2bit的首字符不是英文字母或下划线。 (2)答案: B 说明: 逗号运算是运算优先级最低的运算符,由逗号分隔的各个表达式从左向右进行求值,逗号表达式的类型和值是其右边运算分量的类型和值。 所以,逗号表达式(a=3,b=7,a++,a+b)从左向右求值后,其右边运算分量a+b的值为4+7=11(注意: a在前面经过加一运算已经变为4),即该表达式的值为11。 (3)答案: 本题的关键有两点: 一是数据输入时每个字符变量只读一个字符;二是回车也是一个字符而被读取。 所以,9、8、7和 然后,c1、c2、c5和c6被输出到屏幕上,显示为9865。 (4)答案: D 说明: exp1和exp2为if语句条件表达式。 m是字符型变量,读入标记a或c后,应该与字符数据进行是否相等的比较,所以正确答案应该是D。 (5)答案: B 说明: 在C语言中,当switch后面表达式的值与某个case后面常量表达式的值相同时,就从此case后面的语句开始顺序执行下去,直至switch语句结束或遇到“break;”语句才停止switch语句的执行。 本题中,进入switch循环语句后,字符型变量c从键盘读入字符1,则c-‘0’的值为1,故从case1后面的语句“putchar(c+1);”开始执行,putchar(c+1)向屏幕输出字符2,接下来执行“putchar(c+2);”语句,屏幕上显示字符3,再执行break语句,break使switch语句终止执行。 于是,进入到whlie语句的下一次循环,字符型变量c又从键盘读入字符3,同理可以分析得到屏幕上显示62。 对于字符型变量c从键盘读入字符0的循环,屏幕上显示012,。 当c读入字符6时,显示5。 最后屏幕显示结果为23620125。 (6)答案: C 说明: C语言规定: 如果提供全部初始数据,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。 所以,由于省略了第二维长度,本题的答案A和B是错误的。 答案D中数组形式书写有错误。 只有答案C符合C语言规定,故答案C正确。 (7)答案: D 说明: 按照C语言规定,如果数据类型被省略,则表示为整型。 参数m和函数func的数据类型说明都被省略了,表明它们都为整型。 所以,正确答案是D。 (8)答案: B 说明: 注意“int(*p)();”与“int*p(): ”和“int(*p)[];”的区别。 在语句“int*p();”中。 P是一个返回指针的函数,该指针指向整型数据。 在语句“int(*p)[];”中,p是一个指向数组的指针,该数组的元素为整型。 (9)答案: D 说明: 对于枚举类型,C编译时把枚举元素按常量处理。 枚举元素不是变量,不能对枚举元素赋值。 所以,答案A和B都是错误的。 由于类型不同,一个整数不能直接赋值给枚举变量,必须进行强制类型转换才可赋值。 因此,本题中myday=2是错误的,这形式的正确写法是myday=(enumworkday)2,表示把顺序号为2的枚举元素赋值给枚举变量myday,枚举变量的取值范围是所有的枚举元素,枚举元素可以直接赋值给赋值变量。 本题的正确答案是D。 (10)答案: A 说明: 结构体类型变量在内存中所占空间,等于其各个元素所占字节数的和。 由于一个int型变量占两个字节,所以,有3个int型元素的结构体类型变量now在内存中占6个字节的空间。 本题的正确答案为A。 (11)答案: B 3.解答题 (1)答案: #include #include #definePI3.141593 main() { doublex,y; printf(“\nPleaseinputx: ”); scanf(“%1f”,&x); y=exp(x*x/2.0)/sqrt(2.0*PI); /*exp和sqrt函数是标准数学库函数,在math.h中定义*/ printf(“\n%g\n”,y); } 说明: 本题的关系是把数学表达式用正确的C语言表达出来,同时要正确地用标准数学库。 注意变量x和y要定义为双精度型。 (2)答案: if(i%k! =0)更改为if(i%f==0),if(i 说明: 如果一个整型i不能被2到i-1的整数整除,则i是素数。 本题中for语句的双层循环用于计算机紧随m的素数。 内层for语句循环用与判断整数i是否为素数,若内层循环正常结束(表示i不能被2到i-1的整数整除),则i为素数;否则i不是素数。 外层for循环用于产生大于m的整数i,并根据内层循环是否正常结束,执行外层循环的停止或继续。 “if(i%k! =0)break;”表示i不能被k整除时中断循环,应改为“if(i%k==0)break;”,这表示i能被k整除(i不是素数)时中断循环(循环非正常结束)。 内层循环正常结束时k=i,此时i为素数,故“f(i (3)答案: intchange(intm[4][4]) { inti,j,n; for(i=0;i<4;i++)/*矩阵行下标i从0循环到3*/ for(j=i+1;j<4;j++)/*选取列下标j总大于下标i的元素,即矩阵右上角元素*/ {n=m[i][j];m[i][j]=m[j][i];m=[j][i];} /*元素m[i][j]和m=[j][i]的内容互换*/ 说明: 本题的关键有两点: 一个要弄清楚行列互换就是数组元素m[i][j]和m=[j][i]的内容互换;二是互换过程中只是循环遍历矩阵右上角的元素(即列下标j大于行下标i的元素),如果遍历矩阵所有元素,就相当于把m[i][j]和m=[j][i]的内容互换两次,其结果是输出矩阵与输入矩阵相同,而不是行列互换。 (4)答案: 把“b[i]=a[al-i-1];”改为“*(b+i)=*(a+al-i-1);”,把“b[al]=‘\0’;”改为“*(b+al)=‘\0’;”。 说明: 由于函数inversing的参数定义为字符型指针变量,所以在引用该参数时不能按数组元素处理,而应该按指针处理。 (5)答案: 把第一个printf语句中的d[0].b改为*d[0].b,把第二个printf语句中的d[1].b改为*(d[1].b+1)。 说明: d[0].b是指向c0[0]的指针,d[1].b+1是指向cl[1]的指针,要打印相应的数组元素,应该使用指针运算符*求得相应的数组元素。 (6)答案: #include main() { FILEfp;/*定义指向文件的指针*/ fp=fopen(“myfile.c”,“r”);/*以只读方式打开文件myfile.c*/ while(! feof(fp))putchar(getc(fp)); fclose(fp); } 说明: 在C语言中,正确操作文件的步骤是,先用FILE定义一个文件指针,再用fopen函数打开文件,然后对文件的内容进行读或写操作,最后用fclose函数关闭文件。 feof是用于判断文件是否结束的函数,注意: feof的值为0表示文件没有结束。 putchar函数把一个字符送到屏幕上,函数getc从文件中读一个字符。 4.编程题 (1)答案: #include main() { charstring[50];/*定义一个字符数组*/ inti; printf(“Pleaseinputastring: \n”); scanf(“%s”,string);/*从键盘把字符串输入到字符数组*/ insert(string);/*调用insert函数把原串处理为新串*/ printf(“Thenewstringis: ”,string);/*输出新串*/ } insert(char*p) { inti,j; j=strlen(p);/*将原串长度赋值给变量j*/ for(i=j;i>0;i--)/*循环赋值从后面向前进行*/ { *(p+2*i)=(p+i);/*在新串的奇数位置原串相应字符*/ *(P+2*j-1)=’*’;/*在新串的奇数位置放置星号*/ } *(p+2*j-1)=’’;/*去掉最后字母后面的星号*/ } 说明: 本题有2个关键: 由于新串比原串长,字符数组各个字符应该从后向前赋值,以免原字符未处理时就被覆盖;字符串最后一个字符是‘\0’字符和最后一个英文字母之间有一个星号,应去掉该星号。 (2)答案: #ingclude FILE*fs,*fd voidrevco
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 习题
![提示](https://static.bdocx.com/images/bang_tan.gif)