C语言程序设计实例教程第三版练习题答案2.docx
《C语言程序设计实例教程第三版练习题答案2.docx》由会员分享,可在线阅读,更多相关《C语言程序设计实例教程第三版练习题答案2.docx(32页珍藏版)》请在冰点文库上搜索。
C语言程序设计实例教程第三版练习题答案2
练习2
一、选择题
1.下面关于语句的说法中,正确的是(ABD)。
A、对程序中使用的变量、数组、函数等进行定义、声明的语句属于说明性语句
B、表达式后面加;号构成表达式语句
C、复合语句中不允许包含另一条复合语句
D、对程序执行流程起控制作用的语句属于控制语句
解析:
复合语句是可以嵌套的,所以C选项是错误的;
2.下面语句中,错误的是(B)。
A、m=x>y>z;B、floatx=y=z;C、m=x,m>y;D、{k=m>n;k?
:
x,y;}
解析:
C语言中,在变量声明语句中不能使用连续赋值初始化变量,故B选项是错误的。
3.下面不正确的if语句形式是(A)。
A、if(x=y;)m++;B、if(x<=y)m++;C、if(x-y)m++;D、if(x)m++;
解析:
if选择结构中圆括号内是表达式,而不能是语句,故A选项是错误的。
4.下面不正确的if语句形式是(C)。
A、if(x=y);B、if(x==y)m=0,n=1;C、if(x>=y)m=0elsen=1;D、if(x!
=y)m=n;
解析:
C选项中if结构中条件成立时执行的m=0后没有分号,缺少语句标识,故结构错误;
5.下面程序的运行结果是(A)。
intmain()
{
intx=7,y=8,z=9;
if(x>y)
x=y,y=z;z=x;
printf("x=%dy=%dz=%d\n",x,y,z);
return0 ;
}
A、x=7y=8z=7B、x=7y=9z=7D、x=8y=9z=7D、x=8y=9z=8
解析:
这里主要是考察if选择结构条件下所能执行的语句只有x=y,y=z;而后边的z=x;并受选择结构条件所限制,所以根据题目要求当x>y(7>8)不成立,x=y,y=z;语句不能被执行,而只执行z=x;语句,将变量x的值赋值给z变量,而x与y的值不变化,所以x=7y=8z=7,故答案选A;
6.下面程序的运行结果是(B)。
intmain()
{
intx=6,y=6;
if(++xprintf("%d\n",x++);
else
printf("%d\n",y++);
return0;
}
A、6B、7C、8D、9
解析:
这里考察自增运算符++,if(++x7.下面程序的运行结果是(D)。
intmain()
{
intx=1,y=2,z=3,m=1
if(!
x)m--;
elseif(!
y)m=2;
elseif(!
z);
elsem=3;
printf("m=%d\n",m);
return0;
}
A、m=0B、m=1C、m=2D、m=3
解析:
这里考察if…elseif多分支结构的执行,第1个条件!
x为假,执行第2个条件!
y也为假,执行第3个条件!
也为假,执行最后一个else语句m=3;然后执行printf语句输出m=3;故答案选D;
8.在下面的if语句中,功能上具有等价关系的两条if语句是(B)。
①if(flag)x+y;elsex-y;
②if(flag==1)x+y;elsex-y;
③if(flag!
=0)x+y;elsex-y;
④if(flag==0)x+y;elsex-y;
A、①和②B、①和③C、③和④D、②和③
解析:
①结构中的条件是flag变量,该结构执行是flag值不等于0执行x+y,反之执行x-y,与③结构执行一致;而②选择结构中是判断flag等于1和不等于1两种情况,而④结构执行与①和③刚好相反;故答案选B;
9.在if语句多层嵌套的情况下,为了正确区分多个if和else之间的匹配关系,C语言规定:
如果没有使用花括号,那么从最内层的else开始,else总是与其(D)。
A、前面最近的if配对B、缩进位置相同的if配对
C、后面最近的if配对D、前面最近的且尚未与其它else配对的if配对
解析:
在程序,对于if与else的配对是,程序由上而下从第1个else开始找寻其配对的if,else找寻配对if是从else位置开始向上找寻配对的if,这个if是离else最近的if,但是注意这个if要是没有被配过对的,如果最近的if已经被之前else配对过了,那么需要继续向上找if,故答案选D;
10.下面程序的运行结果是(A)。
intmain()
{
inta=3,b=5,c=2,d=3,m=0;
if(a>b)
if(a>c)
if(a>d)m=1;
elsem=2;
elsem=3;
printf("%d\n",m);
return0;
}
A、0B、1C、2D、3
解析:
这里考察if的嵌套,进一步考察else与if的配对,根据上一题描述,在程序中由上而下从第1个elsem=2;查找离他最近的if(a>d)m=1;与其配对,下面第2个elsem=3;与离它最近且没有配对的if是if(a>c),程序只有两个else,那么第1个if(a>b)没有与之配对的else;当进行if(a>b)判断时其条件为假,没有执行的else,整个if结构执行结束,执行printf语句输出m的值,而m的初值为0,故答案选A;
11.对下面程序运行结果的分析中,正确的是(D)。
intmain()
{
intx,y;
scanf("%d,%d",&x,&y);
if(x>y)
x=y;y=x;
else
x++;y++;
printf("%d,%d\n",x,y);
return0;
}
A、若输入4和3,则输出4和5B、若输入3和4,则输出4和5
C、若输入4和3,则输出4和5D、有语法错误,不能通过编译
解析:
本题考核重点是if选择结构中语句层次的划分,对于if语句后只能有一条语句,如果多条需要用一对花括号{}将多条语句括起来,故本题的if语句后面有两条语句,所以这是一个单条件的if语句,后面的else不能与这个if匹配,所以就语法错误,故答案选D
12.以下关于switch语句的叙述中,不正确的是(C)。
A、switch语句中各case子句后面的表达式必须是整型或字符型常量表达式。
B、同一switch语句中各case子句后面表达式的值必须互不相同。
C、switch语句中必须有default部分。
D、switch语句必须与break语句结合才能实现真正的选择结构。
解析:
再switch结构语句中defaule部分是可有可无的,他的作用是当所有case后的常量都不满足表达式的值时,default位置作为switch语句结构的入口点;而break语句再switch语句中的作用是中断switch语句的执行,以实现分支效果,本题答案选C;
13.假定已定义变量intx,y;则下面正确的switch语句是(BD)。
A、switch(x)
{
case1.1:
y++;
case2.1:
y--;
default:
y*=y;
}
C、switch(x)
{
case2:
y++;
case1+1:
y--;
default:
y*=y;
}
B、switch(x)
{
case'a':
y++;
case'b':
y--;
default:
y*=y;
}
D、switch(x)
{
default:
y*=y;
case1:
y++;
case1+1:
y--;
}
解析:
这里考察switch语句结构的语法:
case后面是整型或字符型常量表达式,且每个case后的值需要互不相同,故答案A和C都是错误的,答案选B和D;
14.以下程序输出结果是(B)。
intmain()
{
intx=1,y=2,m=0,n=0;
switch(x)
{
case1:
switch(y)
{
case2:
m++;break;
case4:
n++;break;
}
case3:
m++;n++;break;
case5:
m++;n++;
}
printf("m=%d,n=%d",m,n);
return0;
}
A、m=1,n=0B、m=2,n=1C、m=1,n=1D、m=2,n=2
解析:
这里考察switch语句的执行流程,因为x=1,所以外层的switch语句执行从case1入口开始,而内层switch在case2入口执行使得m由0变为1,然后执行break语句跳出内层switch结构,顺序执行外层的case3使得m由1变为2,n由0变为1,故答案选B;
15.下面的循环语句执行完毕后,循环变量k的值是(B)。
intk=1;
while(k++<10);
A、10B、11C、9D、无限循环,值不确定
解析:
本题考查自增运算符的使用,以及空语句在作为循环体执行,当k为9时,k++是先将k的值参与表达式k<10运算,9<10成立,然后k的值自增变为10,继续执行k++<10,即10<10不成立,跳出循环,但是在跳出循环时k由10自增变为11,故答案选择B;
16.对下面程序段中while循环执行情况分析正确的是(C)。
intk=2;
while(k=0){printf("%d",k);k--;}
A、该循环只执行1次B、循环是无限循环
C、循环体中的语句1次也不执行D、存在语法错误
解析:
这里考察阅读者是否仔细阅读while循环结构的表达式,这里表达式并不是关系表达式,而是一个赋值表达式,是将0赋值给k,表达式的结果为0,即终止循环,循环体育局一次也不执行,故答案选C;
17.以下程序段(C)。
x=-1;
do
{x=x*x;}
while(!
x);
A、是死循环B、循环执行2次C、循环执行1次D、有语法错误
解析:
do…while结构语句是先执行循环体语句x=x*x,即(-1)*(-1)=1,将1赋值给x,然后进行循环条件表达式!
x的运算,结果为!
1,即为0,所以终止循环,故答案选C;
18.对下面程序段中do-while循环执行情况分析正确的是(C)。
intm=1,n=5;
do
{
m++;
n--;
}while(mA、该循环可能1次也不执行B、该循环执行1次
C、该循环执行2次D、该循环执行3次
解析:
本题考查do…while结构语句的执行流程,第一次循环体执行后,循环条件为2<4成立,继续执行第二次循环体后,循环条件为3<3不成立,终止循环体语句结构的执行,故答案选C;
19.下面程序的功能是从键盘输入一组字符,统计这些字符中大写字母和小写字母的个数,程序中while语句的循环条件是(A)。
intmain()
{
intc1=0,c2=0;
charch;
while(()!
=’\n’)
{
if(ch>='A'&&ch<='Z')c1++;
if(ch>='a'&&ch<='z')c2++;
}
return0;
}
A、ch=getchar()B、getchar()C、ch==getchar()D、scanf("%c",&ch)
解析:
C语言从键盘获取字符数据,使用函数getchar()获取单个字符,这里使用循环结构设计逐个获取字符,直到获取到回车终止,因为下面是对变量进行判断,所以使用函数getchar()获取的字符需要赋给变量ch,故答案选A;
20.下面有关for循环的正确描述是(D)。
A、for循环只能用于循环次数已经确定的情况。
B、for循环的执行流程是先执行循环体语句,后判断表达式。
C、在for循环中,表达式1和3可以省略,但表达式2是不能省略。
D、for循环的循环体中,可以包含多条语句,但必须用花括号括起来。
解析:
本题考查for循环结构语句的语法,对于A的说法是不正确的,不能用只能;对于B答案显然不符合for循环的执行流程描述,for循环是先判断循环条件,后执行循环体语句;对于C答案,for循环结构中三个表达式都可以省略,当表达式2省略,默认循环条件为真;故答案选择D;
21.执行语句for(i=1;i++<4;);后变量i的值是(C)。
A、3B、4C、5D、不定
解析:
这里考察自增运算以什么值参与表达式运算,i++是先用i的值参与表达式运算再自增,而++i是先自增,然后以自增结果参与表达式运算;故而i=1开始,第1次循环条件判断1<4,然后i自增变为2,进入第2次循环条件判断2<4,然后i自增变为3,进入第3次循环条件判断3<4,然后i自增变为4,进入第4次循环条件判断4<4,然后i自增变为5,这时循环条件判断为假跳出循环,这时变量i的值为5,故答案选C;
22.以下程序段的循环次数是(B)。
for(i=2;i==0;)
printf("%d",i--);
A、无限次B、0次C、1次D、2次
解析:
考察识别for结构中各表达式的作用,表达式1为i=2,即为i变量赋值,表达式2为循环条件判断,i==0,表达式即2==0,显然为假,即终止循环,这里表达式3省略;故而循环次数为0,故答案选B;
23.下面的双重循环中的内循环体将一共会被执行(C)次。
for(i=0;i<=3;i++)
for(j=4;j;j--)
printf("a");
A、12B、15C、16D、20
解析:
外层循环for中i从0到3循环了4次,内循环for中j从4到1也是循环了4此,对于内循环体的次数为内外循环次数的乘积,即4*4=16,故答案选C;
24.如果下面程序在运行时输入1,-1,0,2,-2↙,则程序输出结果是(C)。
intmain()
{
intx,i,sum;
for(i=0,sum=0;i<5;i++)
{
scanf("%d",&x);
if(x<0)continue;
sum+=x;
}
printf("%d",sum);
return0;
}
A、-3B、0C、3D、1
解析:
本题考察循环结构中continue语句的作用;根据程序的执行流程中可以看到这里使用了for循环结构,而佛如循环体中并没有改变循环变量i的值,故for循环的次数为5此,即i从0到4;这里sum初值为0,循环体中有键盘获取数据,将执行5次,获取5个数据,且体中使用sum变量对键盘送入的数据进行累加,但是在累加之前有一个判断语句if(x<0)continue;代表键盘获取的数据为负数将结束本次循环,不执行后续的累加语句,故题目是累加键盘送入数据中大于0的数据的和,所以答案选C;
25.如果下面程序在运行时输入1,2,0,-1,-2↙,则程序输出结果是(C)。
intmain()
{
intx,i,sum;
for(i=0,sum=0;i<10;i++)
{
scanf("%d",&x);
if(x<0)break;
sum+=x;
}
printf("%d",sum);
return0;
}
A、-3B、0C、3D、1
解析:
本题考察循环结构中break语句的作用;与上题类似,只是本体的循环次数本来是10此,只是在循环体中进行累加之前有一个判断语句if(x<0)break;即在键盘键入负数后终止循环;故只能累加键盘键入的负数之前的数据;故答案选C;
二、填空题
1.在一个循环语句的循环体中又包含了另一个循环语句,则这种循环形式称为循环的嵌套。
2.for语句中的三个表达式可以全部或部分省略,但应保留其分隔符;。
3._switch_通常适用于条件表达式的取值为多个离散而不连续的整型值(或字符型值)时实现多分支选择结构。
4.C语言提供的选择控制语句可以对给定的条件进行判断,并根据判断结果选择执行分支程序。
5.语句可以分为说明性语句,表达式语句,复合语句 和控制结构语句4种类型,if语句属于其中的控制结构语句。
6.C语言中语句的结束标志是分号。
7.复合语句是用一对{}界定的语句块。
8.将“y能被4整除但不能被100整除,或者y能被400整除”这一条件描述写成逻辑表达式y%4==0&&y%100!
=0||y%400==0 。
9.能够表示“4040&&x<=60||x<120。
10.下面程序的功能是求3个整数中的最小数,,将程序补充完整。
intmain()
{
intx,y,z,min;
scanf(“%d%d%d”,&x,&y,&z);
if(xelsemin=y;
if(zprintf(“min=%d”,min);
return0;
}
11.switch语句中case关键字后面的表达式必须是整型常量表达式。
12.switch语句只有与case语句结合使用,才能实现程序的选择结构。
13.C语言实现循环结构的三种语句分别是for语句、while语句和do-while语句。
14.除for语句外,可能一次循环体也不执行的循环语句是while,至少执行一次循环体的循环语句是do-while。
15.若键盘输入字符ABCDE↙(↙表示按下回车键,则下面for语句执行后k的值是5。
for(k=0;(c=getchar())!
=’\n’;k++);
16.下述程序段的运行结果是2,1,2。
inta=1,b=2,c=3,t;
while(a
printf(“%d,%d,%d”,a,b,c);
17.执行下面的程序段后,m的值是30。
intm=1,n=325;
do{m*=n%10;n/=10;}while(n);
18.下面程序的功能是求1~100之间能同时被3和5整除的数,以8个数为一行的形式输出,将程序补充完整。
intmain()
{intn,j=0;
for(n=1;n<=100;n++)
{if(n%3!
=0&&n%5!
=0)
continue;
printf("%6d",n);
j++;
if(j%8==0)
printf("\n");
}
printf("\nj=%d\n",j);
return0;
}
三、程序阅读,写出程序运行结果。
1.intmain()
{
inta=1,b=3,c=5,d=4,x;
if(a
if(celse
if(a if(b elsex=3;
elsex=6;
elsex=7;
printf("x=%d",x);
return0;
}
输出:
x=2
2.intmain()
{
inta=2,b=7,c=5;
switch(a>0)
{
case1:
switch(b>0)
{
case1:
printf("@");break;
case2:
printf("!
");break;
}
case0:
switch(c==5)
{
case1:
printf("*");break;
case2:
printf("#");break;
default:
printf("#");break;
}
default:
printf("&");
}
printf("\n");
return0;
}
输出:
@*&↙
3.intmain()
{
intx,y;
for(x=1,y=1;x<=10;x++)
{
if(y>10)break;
if(y%3==1)
{
y+=3;continue;
}
y-=5;
}
printf("%d,%d\n",y,x);
return0;
}
输出:
13,5
4.找寻两个数的最小公倍数。
intmain()
{
intx,y,z,t;
scanf("%d,%d",&x,&y);
if(x>y)
{
t=x;x=y;y=t;
}
z=x;
do
{
if(z%x==0&&z%y==0)break;
elsez++;
}while
(1);
printf("gbs=%d\n",z);
return0;
}
键盘输入数据:
5,8↙
输出:
gbs=40
5.intmain()
{
inti,j;
for(i=1;i<=3;i++)
{
for(j=1;j<=i;j++)
printf("");
for(j=1;j<=7-2*i;j++)
printf("*");
printf("\n");
}
return0;
}
输出:
*****
***
*
四、编程题
1.编程实现,键盘输入4个整数a,b,c,d,输出其中的最小数。
解:
#include
intmain()
{
inta,b,c,d,s;
printf("请输入个数字");
scanf("%d%d%d%d",&a,&b,&c,&d);
if(a>b)s=b;
elses=a;
if(s>c)s=c;
if(s>d)s=d;
printf("最小是:
%d",s);
return0;
}
2.编程实现,键盘输入3个整数a,b,c,按照由小到大的顺序输出这三个整数。
解:
#include
intmain()
{
inta,b,c,s;
scanf("%d%d%d",&a,&b,&c);
if(a>b)
{
s=