C语言习题详细解答.docx
《C语言习题详细解答.docx》由会员分享,可在线阅读,更多相关《C语言习题详细解答.docx(59页珍藏版)》请在冰豆网上搜索。
C语言习题详细解答
程序设计基础(C语言版)习题
第01章绪论
一.选择题
1.以下叙述中正确的是________。
A)程序设计的任务就是编写程序代码并上机调试
B)程序设计的任务就是确定所用数据结构
C)程序设计的任务就是确定所用算法
D)以上三种说法都不完整
【解析】程序设计通常分为问题建模、算法设计、编写代码和编译调试四个阶段。
所以选项A)、B)、C)说法都不完整。
2.以下关于简单程序设计的步骤和顺序的说法中正确的是。
A)确定算法后,整理并写出文档,最后进行编码和上机调试
B)首先确定数据结构,然后确定算法,再编码,并上机调试,最后整理文档
C)先编码和上机调试,在编码过程中确定算法和数据结构,最后整理文档
D)先写好文档,再根据文档进行编码和上机调试,最后确定算法和数据结构
【解析】设计一个能解决实际问题的计算机程序需要经过以下几个过程:
①建立模型。
②算法设计:
给出解决问题的步骤,即算法。
③算法表达:
选择一种表达算法的工具,对算法进行清晰的表达。
④编写程序:
选择一种程序设计语言,把以上算法程序化,这称为编写程序。
⑤程序调试:
对编写好的程序进行调试,修改程序中的错误。
⑥程序文档编写与程序维护。
综上所述,B)选项是符合上述描述的,其他选项不恰当。
3,叙述中正确的是________。
A)C程序的基本组成单位是语句
B)C程序中的每一行只能写一条语句
C)简单C语句必须以分号结束
D)C语句必须在一行内写完
【解析】函数是C程序的基本组成单位;C语言书写风格很自由,不但一行可以写多个语句,还可以将一个语句写在多行中。
故本题答案为C)。
4.以下叙述中正确的是。
A)C程序中的注释只能出现在程序的开始位置和语句的后面
B)C程序书写格式严格,要求一行内只能写一个语句
C)C程序书写格式自由,一个语句可以写在多行上
D)用C语言编写的程序只能放在一个程序文件中
【解析】在C语言中,注释可以加在程序中的任何位置,选项A)错误。
C程序可以分模块写在不同的文件中,编译时再将其组合在一起,选项D)错误。
C程序的书写风格很自由,不但一行可以写多个语句,还可以将一个语句写在多行中。
所以正确答案为选项C)。
5.以下关于C语言的叙述中正确的是。
A)C语言中的注释不可以夹在变量名或关键字的中间
B)C语言中的变量可以在使用之前的任何位置进行定义
C)在C语言算术表达式的书写中,运算符两侧的运算数类型必须一致
D)C语言的数值常量中夹带空格不影响常量值的正确表示
【解析】C语言中注释可以放在任何位置,但不能夹在变量名或关键字中间,选项A正确;C语言中的变量要在使用之前定义,C标准规定定义位置在相关程序块的首部,选项B错误;C语言中两侧数据类型可以不一致,系统可进行强制类型转换,选项C错误;C语言数值常量中不允许存在空格,选项D错误。
6.以下关于C语言数据类型使用的叙述中错误的是。
A)若要准确无误差地表示自然数,应使用整数类型
B)若要保存带有多位小数的数据,应使用双精度类型
C)若要处理如"人员信息"等含有不同类型的相关数据,应自定义结构体类型
D)若只处理"真"和"假"两种逻辑值,应使用逻辑类型
【解析】C语言中没有逻辑类型,若只处理"真"或"假"两种逻辑值,可以使用整型数"1"或"0"表示,故选D。
第02章基本数据类型
一.选择题
1.有以下定义:
inta;longb;doublex,y;则以下选项中正确的表达式是。
A)a%(int)(x-y)B)a=x!
=y;C)(a*y)%bD)y=x+y=x
【解析】A)选项中如果x与y的值相等那么取余时就会有除数为0的情况。
C)选项中取余的两个数据都应为整数,不能有一方为实型变量,而a*y的结果为double型。
D)选项表达式本身就错误,不能给表达式赋值。
所以,本题答案为B)。
2.有以下程序
#include
main()
{ ints,t,A=10;doubleB=6;
s=sizeof(A);t=sizeof(B);
printf("%d,%d\n",s,t);
}
在VC6平台上编译运行,程序运行后的输出结果是
A)2,4B)4,4C)4,8D)10,6
【解析】sizeof的作用就是返回一个对象或者类型所占的内存字节数。
在VC6中整型占4个字节,双精度实型占8个字节,所以选C)。
3.若有定义:
doublea=22;inti=0,k=18;,则不符合C语言规定的赋值语句是。
A)a=a++,i++;B)i=(a+k)<=(i+k);
C)i=a%11;D)i=!
a;
【解析】C语言中取余运算符两侧的操作数只能是整型(若为char型,则会自动转换成整型)。
4.有以下程序:
#include
main()
{ int a=1,b=0;
printf("%d,",b=a+b);
printf("%d\n",a=2*b);
}
程序运行后的输出结果是________。
A)0,0B)1,0
C)3,2D)1,2
【解析】执行第一个printf语句时,b=a+b=1,所以输出1,执行第二个printf语句时,a=2*b=2,所以输出结果为2。
5.若有定义语句:
inta=3,b=2,c=1;,以下选项中错误的赋值表达式是。
A)a=(b=4)=3;B)a=b=c+1;C)a=(b=4)+c;D)a=1+(b=c=4);
【解析】在A)选项中,赋值语句b=4先把4赋值给整型变量b,之后执行(b=4)=3是把常量3赋值给常量4,但是由于C语言规定赋值运算符的左侧只能是变量,不能是常量或者表达式,因此A)选项错误。
6.有以下定义:
inta;longb;doublex,y;则以下选项中正确的表达式是。
A)a%(int)(x-y)B)a=x!
=y;C)(a*y)%bD)y=x+y=x
【解析】A)选项中如果x与y的值相等那么取余时就会有除数为0的情况。
C)选项中取余的两个数据都应为整数,不能有一方为实型变量,而a*y的结果为double型。
D)选项表达式本身就错误,不能给表达式赋值。
所以,本题答案为B)。
7.若有定义语句:
int x=10;,则表达式x-=x+x的值为________。
A)-20B)-10
C)0D)10
【解析】x-=x+x可化为:
x=x-(x+x),由于x初始值为10,所以计算后,x=10-20=-10,因此选B)。
二.填空题
1.以下程序的功能是:
将值为三位正整数的变量x中的数值按照个位、十位、百位的顺序拆分并输出。
请填空。
#include
main()
{intx=256;
printf("%d-%d-%d\n",__,x/10%10,x/100);
}
参考答案:
x%10
【解析】x=256,x%10=6。
2.以下程序运行后的输出结果是。
#include
main()
{inta;
a=(int)((double)(3/2)+0.5+(int)1.99*2);
printf("%d\n",a);
}
参考答案:
3
【解析】本题中3/2=1,(double)(3/2)=1,(int)1.99*2=1*2=2,因此(int)(1+0.5+2)=(int)3.5=3。
3.若有定义语句:
inta=5;,则表达式:
a++的值是____。
参考答案:
5
【解析】a++的含义是在使用a值以后,使a值加1,所以a++的值为5。
4.若有语句doublex=17;inty;,当执行y=(int)(x/5)%2;之后y的值为____。
参考答案:
1
【解析】y=(int)(x/5)%2=(int)(3.4)%2=3%2=1。
5.设变量a和b已正确定义并赋初值。
请写出与a-=a+b等价的赋值表达式____。
参考答案:
a=-b
【解析】a-=a+b等价于a=a-(a+b),等价于a=-b。
第03章顺序结构
一.选择题
1.有以下程序
#include
main()
{chara,b,c,d;
scanf("%c%c",&a,&b);
c=getchar();d=getchar();
printf("%c%c%c%c\n",a,b,c,d);
}
当执行程序时,按下列方式输入数据(从第1列开始,代表回车,注意,回车也是一个字符)
12
34
则输出结果是
A)1234B)12C)12D)12
334
【解析】程序根据用户输入分别给字符型变量a、b、c、d赋值为'1'、'2'、''、'3',因此输出到屏幕得到选项C中的格式。
2.有以下程序段:
char ch;
int k;
ch=′a′;
k=12;
printf("%c,%d,",ch,ch,k);
printf("k=%d\n",k);
已知字符a的ASCII码值为97,则执行上述程序段后输出结果是
A)因变量类型与格式描述符的类型不匹配输出无定值
B)输出项与格式描述符个数不符,输出为零或不定值
C)a,97,12k=12
D)a,97,k=12
【解析】输出格式控制符%c表示将变量以字符的形式输出;输出格式控制符%d表示将变量以带符号的十进制整型数输出。
所以第一个输出语句输出的结果为a,97,第二个输出语句输出的结果为k=12,所以选项D)为正确答案。
3.有以下程序
#include
main()
{chara[30],b[30];
scanf("%s",a);
gets(b);
printf("%s\n%s\n",a,b);
}
程序运行时若输入:
howareyou?
Iamfine<回车>
则输出结果是
A)howareyou?
Iamfine
B)how
areyou?
Iamfine
C)howareyou?
Iamfine
D)howareyou?
解析】scanf函数会把空格字符作为输入的字符串之间的分隔符,因此字符串a为"how"。
gets()函数读取字符串时,直至接受到换行符或EOF时才停止,并将读取的结果存放在指针所指向的字符数组中,因此其余输入的内容赋值给b。
二.填空题
1.以下程序运行后的输出结果是 。
#include
main()
{ inta=200,b=010;
printf("%d%d\n",a,b);
}
参考答案:
2008
【解析】整型变量a的值为200,b的值"010"是用八进制表示的"10"即十进制的"8",最后输出格式均为%d,即十进制格式,所以输出为"2008"。
2.有以下程序(说明:
字符0的ASCIl码值为48)
#include
main()
{charc1,c2;
scanf("%d",&c1);
c2=c1+9;
printf("%c%c\n",c1,c2);
}
若程序运行时从键盘输入48<回车>,则输出结果为。
参考答案:
09
【解析】本题中通过ASCII码对字符变量赋值,由于字符0的ASCII码是48,因此字符变量c1为0,c2的ASCII码比c1大9,因此c2为9。
第04章选择结构
一.选择题
1.若变量已正确定义,在if(W)printf("%d\n",k);中,以下不可替代W的是。
A)a<>b+cB)ch=getchar()C)a==b+cD)a++
【解析】在C语言中,表示不等于不能用"<>",而只能使用"!
="。
其他选项均满足题目的要求。
2.当变量c的值不为2、4、6时,值也为"真"的表达式是。
A)(c==2)||(c==4)||(c==6)
B)(c>=2&&c<=6)||(c!
=3)||(c!
=5)
C)(c>=2&&c<=6)&&!
(c%2)
D)(c>=2&&c<=6)&&(c%2!
=1)
【解析】满足表达式(c>=2&&c<=6)的整型变量c的值是2,3,4,5,6。
当变量c的值不为2,4,6时,其值只能为3或5,所以表达式c!
=3和c!
=5中至少有一个为真,即不论c为何值,选项B)中表达式的值都为"真"。
正确答案为B)。
3.已知字母A的ASCII码值为65,若变量kk为char型,以下不能正确判断出kk中的值为大写字母的表达式是。
A)kk>=′A′&&kk<=′Z′
B)!
(kk>=′A′||kk<=′Z′)
C)(kk+32)>=′a′&&(kk+32)<=′Z′
D)isalpha(kk)&&(kk<91)
【解析】C语言的字符以其ASCII码的形式存在,所以要确定某个字符是大写字母,只要确定它的ASCII码在'A'和'Z'之间就可以了,选项A)和C)符合此要求。
在选项D)中,函数isalpha用来确定一个字符是否为字母,大写字母的ASCII码值的范围为65到90,所以如果一个字母的ASCII码小于91,那么就能确定它是大写字母。
本题答案选B)。
4.有以下程序:
#include
main()
{ inta=l,b=2,c=3,d=0;
if(a==l&&b++==2)
if(b!
=2||c--!
=3)
printf("%d,%d,%d\n",a,b,c);
elseprintf("%d,%d,%d\n",a,b,c);
elseprintf("%d,%d,%d\n",a,b,c);
}
程序运行后的输出结果是________。
A)1,2,3
B)1,3,2
C)l,3,3
D)3,2,1
【解析】程序首先执行第一个判断语句,a==1成立;b++==2,先判断b是否为2,再进行b加1操作,执行后b的值为3。
继续执行第二个判断语句,注意程序此时进行逻辑或运算,b!
=2的值为真,因此条件表达式b!
=2||c--!
=3的值为真,程序便不再执行第二个逻辑语句c--!
=3,而直接进行输出操作。
因此,本题正确答案为C)。
5.执行以下程序段后,w的值为________。
int w='A',x=14,y=15;
w=((x‖y)&&(w<'a'));
A)-1
B)NULL
C)1
D)0
【解析】根据题目所给条件可知,x||y为1,w<'a'为1,1&&1结果为1。
因此正确答案为C)。
6.若变量已正确定义,有以下程序段:
int a=3,b=5,c=7;
if(a>b)a=b; c=a;
if(c!
=a)c=b;
printf("%d,%d,%d\n",a,b,c);
其输出结果是
A)程序段有语法错
B)3,5,3
C)3,5,5
D)3,5,7
【解析】两个if语句的判断条件都不满足,程序只执行了c=a这条语句,所以变量c的值等于3,变量b的值没能变化,程序输出的结果为3,5,3。
所以正确答案为选项B)。
7.有以下程序段:
int a,b,c;
a=10; b=50; c=30;
if(a>b)a=b, b=c; c=a;
printf("a=%db=%dc=%d\n",a,b,c);
程序的输出结果是________。
A)a=10b=50c=10
B)a=10b=50c=30
C)a=10b=30c=10
D)a=50b=30c=50
【解析】该题考查if条件语句,当条件为真时,将b值赋给a,c值赋给b;当条件为假时,将a值赋给c。
该题中if条件为假,所以将a的值赋给c,故a=10b=50c=10。
8.有以下程序:
#include
main()
{ int x=1,y=2,z=3;
if(x>y)
if(y else printf("%d",++y);
printf("%d\n",x++);
}
程序的运行结果是________。
A)331
B)41
C)2
D)1
【解析】该题目考查if条件语句。
else语句和最近的一个if语句配对。
由于x>y为假,所以直接执行最后一行代码。
9.有以下程序:
#include
main()
{ int x=1,y=0,a=0,b=0;
switch(x)
{ case1:
switch(y)
{ case0:
a++;break;
case1:
b++;break;
}
case2:
a++;b++;break;
case3:
a++;b++;
}
printf("a=%d,b=%d\n",a,b);
}
程序的运行结果是
A)a=1,b=0
B)a=2,b=2
C)a=1,b=1
D)a=2,b=1
【解析】本题考查了switch结构的内容。
在C语言中,程序执行完一个case标号的内容后,如果没有break语句,控制结构会转移到下一个case继续执行,因为case常量表达式只是起语句标号作用,并不是在该处进行条件判断。
本题程序在执行完内部switch结构后,继续执行了外部switch结构的case2分支。
最后a和b的值分别为2和1。
二.填空题
1.在C语言中,当表达式值为0时表示逻辑值"假",当表达式值为 时表示逻辑值"真"。
参考答案:
非0
【解析】本题一定要明确一个概念,即:
所有非0的数(并不只是"1"),在c语言中都表示逻辑值为"真"。
2.设x为int型变量,请写出一个关系表达式__,用以判断x同时为3和7的倍数时,关系表达式的值为真。
参考答案:
(x%3==0)&&(x%7==0)
【解析】x%3==0能保证x是3的倍数,x%7==0能保证x是7的倍数,(x%3==0)&&(x%7==0)能保证x是3的倍数并且x是7的倍数。
3.有以下程序
#include
main()
{inta=1,b=2,c=3,d=0;
if(a==1)
if(b!
=2)
if(c==3)d=1;
elsed=2;
elseif(c!
=3)d=3;
elsed=4;
elsed=5;
printf("%d\n",d);
}
程序运行后的输出结果是__。
参考答案:
4
【解析】a==1为真,b!
=2为假,c!
=3为假,所以d=4。
4.有以下程序
#include
main()
{intx;
scanf("%d",&x);
if(x>15)printf("%d",x-5);
if(x>10)printf("%d",x);
if(x>5)printf("%d\n",x+5);
}
若程序运行时从键盘输入12<回车>,则输出结果为。
参考答案:
1217
【解析】本题中输入12时,第一条if的条件x>15不满足因此不执行,第二条if的条件x>10满足因此输出12,第三条if的条件x>5满足因此输出17。
5.以下程序运行后的输出结果是。
#include
main()
{intx=10,y=20,t=0;
if(x==y)t=x;x=y;y=t;
printf("%d%d\n",x,y);
}
参考答案:
200
【解析】本题中if选择的条件x==y不满足,因此直接执行后面的x=y和y=t,则x的值为20,y的值为0。
第05章循环结构
一.选择题
1.以下不构成无限循环的语句或语句组是
A)n=0;
do{++n;}while(n<=0);
B)n=0;
while
(1){n++;}
C)n=10;
while(n);{n--;}
D)for(n=0,i=1;;i++)
n+=i;
【解析】项A)中变量n的值,先自加1,再进行循环条件判断,此时循环条件n<=0不成立,跳出循环。
所以正确答案为A)。
2.有以下程序
#include
main()
{inty=10;
while(y--);
printf("y=%d\n",y);
}
程序执行后的输出结果是
A)y=0B)y=-1
C)y=lD)while构成无限循环
【解析】当y减为1时判断while(y--),此时满足条件,但是y变成0。
下次循环判断while(y--)时,因为y为0不满足条件跳出循环,但是此时也要执行y--,所以y变成了-1。
打印输出时输出-1。
3.有以下程序:
#include
main()
{ int i=5;
do
{ if(i%3==1)
if(i%5==2)
{ printf("*%d",i); break; }
i++;
} while(i!
=0);
printf("\n");
}
程序的运行结果是________。
A)*7
B)*3*5
C)*5
D)*2*6
【解析】整个程序中只有对i增加的语句而没有对i减少的语句,所以2、3都不可能出现,选项B)和D)错误。
而i=5时第一个if语句的表达式为假,所以选项C)也错误。
4.以下程序段中的变量已正确定义:
for(i=0;i<4;i++,i++)
for(k=l;k<3;k++);printf("*");
程序段的输出结果是________。
A)********
B)****
C)**
D)*
【解析】本题考察for循环语句,注意第二个for语句的后面有一个分号,即printf函数不属于循环体,无论循环执行多少次,printf("*")语句只执行一次。
因此,本题正确答案为D)。
5.有以下程序
#include
main()
{inta=1,b=2;
for(;a<8;a++){b+=a;a+=2;}
printf("%d,%d\n",a,b);
}
程序运行后的输出结果是
A)9,18B)8,11C)7,11D)10,14
【解析】初始值a=1,b=2,第一次循环:
b=b+a=2+1=3,a=a+2=1+2=3,a=a+1=3+1=4;第二次循环:
b=b+a=3+4=7,a=a+2=4+2=6,a=a+1=6+1=7;第三次循环:
b=b+a=7+7=14,a=a+2=7+2=9,a=a+1=9+1=10,故本题答案选D。
6.有以下程序:
#include
main()
{ int i,j;
for(i=3;i>=1;i--)
{ for(j=1;j<=2;j++)printf("%d",i+j);
printf("\n");
}
}
程序的运行结果是________。
A)234B)432
345543
C)23D)45
3434
4523
【解析】该题目主要考查for嵌套循环,要注意循环变量i和j的取值范围。
输出结果为变量i和j的和。
8.设变量已正确定义,以下不能统计出一行中输入