习题册56章答案.docx

上传人:b****5 文档编号:3432500 上传时间:2022-11-23 格式:DOCX 页数:32 大小:48.70KB
下载 相关 举报
习题册56章答案.docx_第1页
第1页 / 共32页
习题册56章答案.docx_第2页
第2页 / 共32页
习题册56章答案.docx_第3页
第3页 / 共32页
习题册56章答案.docx_第4页
第4页 / 共32页
习题册56章答案.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

习题册56章答案.docx

《习题册56章答案.docx》由会员分享,可在线阅读,更多相关《习题册56章答案.docx(32页珍藏版)》请在冰豆网上搜索。

习题册56章答案.docx

习题册56章答案

第五章循环结构程序设计

一、选择题

1.有以下程序

 main()

 {inti;

 for(i=1;i<=40;i++)

 {if(i++%3=0)

 if(++i%8=0)printf("%d",i);

 }

 printf("\n")

 }

 执行后的输出结果是____A____。

 A)832 B)24 C)32 D)40

【解析】:

本题考查了自增运算符和for循环。

自增运算符“++”分为前缀和后缀两种形式。

两种形式的作用效果是一样的,都是使运算变量那个的值加1,但是它们的表达式的值不一样,前缀形式表达式的值为运算变量加1之后的值,而后缀形式表达式的值为运算变量加1之前的值。

题目中使用了一个for循环,循环变量i从1递增到40。

在循环体中又两条嵌套的if语句,首先判断i++%3==0,即判断i++的值(i加1之前的值)是否能被3整除(判断后i被加1),然后再判断++i的值(i加1之后的值)是否能被8整除(判断后i被加1),若两个条件都满足了,就输出此时的i值。

即要输出的数得在1-42(含1和42),且能被8整除,并且将其减2后能被3整除,这样的数有两个,即8和32,但由于输出的格式表达式为”%d”,因此结果为832

2.有以下程序

 main()

 {intn;

 for(n=3;n<=10;n++)

 { if(n%6==0)break;printf("%d",n); }

 printf("\n")

 }

 执行后的输出结果是____A____。

 A)345 B)456C)345 D)456

【解析】:

本题考查的for循环、if语句和break(break语句结束的是整个循环)。

题目中的for循环变量n从3递增到10,在循环体内先判断n是否等于6,如果不等于6,执行输出语句,将n值输出(输出的格式表达式为”%d”,注:

无空格),如果n为6,执行break;语句,跳出for循环。

因此输出345.正确答案为A.

3.有以下程序

main()

{inti=0,s=0;

do{

if(i%3){i++;continue;}

i++;

s+=i;

}while(i<11);

printf("%d\n",s);

}

执行后输出结果是____A________

A)22 B)16 C)34 D)21

【解析】:

本题考查的是do…while循环、if语句和continue(continue结束的本次循环,接着判断是否继续执行下一轮循环)。

在do…while循环中,先执行循环体,再判断i是否小于11.if(i%3)判断是否能整除3,余数为0,则进行i++;s+=i;

不为0则为真,则进行{i++;continue;}由于包含contunue;i++;s+=i;部分不执行,直接进行条件判断。

所以当i=0,3,6,9时,进行i++;s+=i;操作。

所以s=1+4+7+10=22.

4.运行以下程序后,如果从键盘上输入6514<回车>,则输出结果为:

____C________

main()

{intm,n;

printf("Enterm,n;");scanf("%d%d",&m,&n):

while(m!

=n)

{while(m>n)m-=n;

while(n>m)n-=m;

}

printf("m=%d\n",m);

}

A)m=3B)m=2C)m=1D)m=1

【解析】:

(1999-04-48)本题考查的是嵌套while循环,外层循环条件是m!

=n,由于从键盘输出后m=65,n=14;因此不符合结束条件,进入循环体内。

(1)先执行循环体while(m>n)m-=n;即判断/m>n,如果是循环执行m-=n,(即m=m-n);因此此循环至少要执行4次m的值才可能不大于n(m=m-n*4=65-14*4=9),即此时m=9,n=14;不符合本循环条件,跳出本循环。

(2)由于n>m了,执行循环体while(n>m)n-=m;,执行后n=n-m=14-9=5,即此时m=9,n=5,不符合本循环条件,跳出本循环。

(3)但此时m!

=n,因此不跳出外层循环,继续执行while(m>n)m-=n;执行后m=4,n=5;不符合本循环条件,跳出本循环。

(4)然后执行while(n>m)n-=m;执行后n=1,m=4,不符合本循环条件,跳出本循环。

(5)但此时m!

=n,因此不跳出外层循环,继续执行while(m>n)m-=n;此循环需要执行3此m的值才可能不大于n(m=m-n*3=4-1*3=1),即此时m=1,n=1;不符合本循环条件,跳出本循环。

(6)由于此时m=n了,因此结束了外层循环,结果m=1,正确答案为C

5.有以下程序

main()

{intn,s=0;

for(n=10;n<30;n++)

{if(n%3==0)

{s+=n;

continue;

}

if(s>100)break;

}

printf("%d\n",s);

}

执行后输出结果是____A________

A)117B)147 C)127 D)137

【解析】:

本题考查的是for循环\、if语句和continue\、break语句,其中break语句结束的。

是整个循环,continue结束的本次循环,接着判断是否继续执行下一轮循环。

本题中for循环变量n从10递增到29,在循环体中又两条嵌套的if语句,首先判断n%3==0,即判断n的值是否能被3整除,如果能整除,则加这些数累加到s,然后执行continue,跳出本次循环,执行n++,继续判断下一个数,如果不能被3整数,则判断s是否大于100,如果符合,则跳出整个循环。

因此本题的主要功能是循环累加10到29中能被3整除的数,如果累加和大于100,则退出循环。

因此当n=27时,s=12+15+18+21+24+27=117时,超过了100,退出循环,因此最后输出结果为117,正确答案为A.

6.以下程序执行后sum的值是___C______

min()

{inti,sum;

for(i=1;i<6;i++)sum+=i;

printf(“%d\n”,sum);

}

A)15B)14C)不确定D)0

【解析】:

(2001-04-26)此题考查的是for循环,实现1到6的累加并输出,但是由于sum的初始值位设定,因此其最后的值属于不确定值,正确答案为C.

7.有以下程序

main()

{inti,n=0;

for(i=2;i<5;i++)

{do

{if(i%4+1)continue;

n++;

}while(!

i);

n++;

}

printf(“n=%d\n”,n);

}

程序执行后的输出结果是____C_________

A)n=5 B)n=2 C)n=3 D)n=4

【解析】:

此题考查的是for循环嵌套do-while循环。

本题执行for循环的条件是变量i的范围是2-4,循环3次。

进入do-while循环体,由于i%4+1的条件永远为真,因此一直执行continue,则跳出n++;执行while(!

i);由于!

i为假,跳出do-while循环,执行n++;因此n++;执行3次,执行后n的值为3,正确答案为3.

以上过程可简写为:

i=2,判断i%4+1,(i%4+1)!

=0,执行continue,跳出本次循环,执行n++n=1

i=3,判断i%4+1,(i%4+1)!

=0,执行continue,跳出本次循环,执行n++n=2

i=4,判断i%4+1,(i%4+1)!

=0,执行continue,跳出本次循环,执行n++n=3

8.有以下程序

main()

{inti;

for(i=0;i<3;i++)

switch(i)

{case1:

printf("%d",i);

case2:

printf("%d",i);

default:

printf("%d",i+1);

}

}

程序运行后的输出结果是______A_______

A)111223 B)123 C)011023D)122

【解析】:

本题考查的是for循环和switch语句,本题for循环的循环变量i从0到2,循环3次。

当i=0时,switch语句中,没有case匹配,进入default,执行printf("%d",i+i);输出1(注输出1后无回车也无其他分隔符);然后跳出switch语句,执行i++=i+1=1,符合循环条件i<3,继续执行switch语句。

当i=1时,switch语句中,进入case1分支,执行printf("%d",i);在原来的1后输出1;但由于case1分支后无break;语句,因此继续执行case2分支,执行printf("%d",i);在原来的11后输出1,但由于case2分支后无break;语句,继续执行default语句,执行printf("%d",i+i);在原来的11后输出2,即此步骤执行后为1112。

然后跳出switch语句,执行i++=i+1=2,符合循环条件i<3,继续执行switch语句。

当i=2时,switch语句中,进入case2分支,执行printf("%d",i);在原来的1112后输出2;但由于case2分支后无break;语句,继续执行default语句,执行printf("%d",i+i);在原来的11122后输出3,即为111223。

然后跳出switch语句,执行i++=i+1=3,不符合循环条件i<3,结束循环。

以上过程可简写为:

i=0,执行default,输出1

i=1,执行case1,输出1

执行case2,输出1

执行default,输出2

i=2,执行case2,输出2

执行default,输出3

9.在以下给出的表达式中,与while(E)中的(E)不等价的表达式是__A_____

      A)(!

E=0)B)(E>0||E<0)C)(E==0)D)(E!

=0)

【解析】:

(2006-04-21)本题考查的是逻辑表达式,在C语言中,整型值可以转换为逻辑值,规则是:

当整型值为0时,它表示逻辑值假;当整型值不为0时,它表示逻辑值真。

所以题目中的while(E)循环是当E等于0时,循环结束,E不等于0时,继续循环。

选项C中,当E等于0时,表达式“E==0”为真继续循环,而E不等于0时,表达式为假循环结束,这与题目中的条件不等价,故应该选择C。

10.要求通过while循环不断读入字符,当读入字母N时结束循环。

若变量已正确定义,以下正确的程序段是____A_______

      A)while((ch=getchar())!

='N')printf(“%c”,ch);

      B)while(ch=getchar()!

='N')printf(“%c”,ch);

      C)while(ch=getchar()==N')printf(“%c”,ch);

      D)while((ch=getchar())=='N')printf(“%c”,ch);

【解析】:

(2006-04-22)本题考查的是逻辑表达式与赋值表达式。

在C语言中,逻辑表达式的优先级高于赋值运算符的优先级。

所以在选项B和C中先计算getchar()!

='N或getchar())=='N'部分,然后将得到的一个逻辑值(“真”或“假”)赋给字符变量ch,在while循环体中输出的ch肯定不是我们输入的字符,故不为所选。

选项A和D中因为加了括号,所以先计算ch=getchar()部分,将输入的字符读入变量ch。

根据题意,要在读入字母N的时候结束循环,即while循环的循环条件是:

读入的字符不等于字母N。

故应该选择A。

11.有以下程序:

voidmain()

{

intk=10,n=0;

for(;n

{n++;

if(n++%3!

=0)continue;

k--;

}

printf(“%d,%d\n”,k,n);

}

程序运行后的输出结果是___D_____

A)7,7B)6,6C)3,3D)8,10

【解析】:

本题考查的是for循环。

其中for(;n

n=0时,n

=0,即判断n++的值(n加1之前的值)是否不能被3整除(判断后n被加1),由于n值为1,因此n++%3!

=0返回真,执行continue退出本次循环,不执行k--;此时n=n+1=2;

n=2时,n

=0,由于n值为3,因此n++%3!

=0返回假,执行k--;此时k=k-1=10-1=9;n=n+1=3+1=4;

n=4时,n

=0,由于n值为5,因此n++%3!

=0返回真,执行continue退出本次循环,不执行k--;此时n=n+1=6;

n=6时,n

=0,由于n值为7,因此n++%3!

=0返回真,执行continue退出本次循环,不执行k--;此时n=n+1=7+1=8;

n=8时,n

=0,由于n值为9,因此n++%3!

=0返回假,执行k--;此时k=k-1=9-1=8;n=n+1=9+1=10;

n=10时,n

最后输出8.10.正确答案为D

12.下列叙述中正确的是___D_____。

 A)break语句只能用于switch语句

 B)在switch语句中必须使用default

 C)break语句必须与switch语句中的case配对使用

 D)在switch语句中,不一定使用break语句

【解析】:

(2006-09-21)本题主要考查switch语句的概念。

break语句除了能用于switch语句外,还可以用于循环语句中,因此选项A不正确;

在switch语句中,可以使用default来执行所有case均失配时的分支,也可以不使用default,此时若所有case均失配跳出switch,因此选项B不正确;

在switch语句中,每个case的作用就是标出一个执行的起点,当符合某个case时,程序就从该case所标出的起点处开始执行,若没有break语句中执行的话,程序会一直执行到switch的最后一条语句,而不是碰到下一个case就跳出switch。

虽然break和case的配对使用会让所有case分支互不重叠条例明确,但不配对使用在C语言中是不允许的,因此选项C不正确。

正确答案为D.

13.下面程序的功能是输出以下形式的金字塔图案是:

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

***

*****

*******

*********

main()

{inti,j;

for(i=1;i<=4;i++)

{for(j=1;j<=4-i;j++)printf(““);

for(j=1;j<=_______;j++)printf(“*”);

printf(“\n”);

}

}

在下划线处应填入的是____C_______

A)i B)2*i-1 C)2*i+1 D)i+2

【解析】:

(2004-04-42)本题考查的是嵌套for循环。

第一个for循环的循环变量i从1递增到4,用来表示行数为4行;

第二个for循环的循环变量j从1递增到4-i,用来输出每行左边的空格,

当i=1(第一行),循环4-i=4-1=3次,输出3个空;

当i=2(第二行),循环4-i=4-2=2次,输出2个空;

当i=3(第三行),循环4-i=4-1=1次,输出1个空;

当i=4(第四行),循环4-i=4-2=4次,输出0个空;

第二个for循环的循环变量j从1递增到4-i,用来输出每行的*号,

当i=1(第一行),需循环3次,输出3个*;

当i=2(第二行),需循环5次,输出5个*;

当i=3(第三行),需循环7次,输出7个*;

当i=4(第四行),需循环9次,输出9个*;

根据循环次数与i值的特点,可以发现每次需循环2*i+1次。

因此本题则横却答案为C

 

14.若有如下程序段,其中s、a、b、c均已定义为整型变量,且a、c均已赋值(c大于0)

s=a;

for(b=1;b<=c;b++)s=s+1;

则与上述程序段功能等价的赋值语句是___B_____

A)s=a+b; B)s=a+c; C)s=s+c; D)s=b+c;

【解析】:

(2003-09-22)本题考查是for循环,循环变量b从1递增到c,每次循环s=s+1,加c个1,s的初始值为a,因此相当于s=a+c;

15.请读程序片段:

#include

main()

{inta,b;

for(a=1;b=1;a<=100;a++)

{if(b>=20)break;

if(b%3==1)

{b+=3;

continue;

}

b-=5;

}

printf("%d\n",a);

}

上面程序的输出结果是_____A______

A)7B)8C)9D)10

【解析】:

(1996-04-22)本题考查的是for循环和break、continue语句。

For循环的循环变量从1增加到100,判断如果b>=20则退出整个循环,否则判断b%3==1,即b整除3是否余1,如果是,则b=b+3;退出本次循环,否则b=b-5;结束本次循环。

以下是循环过程:

第一次:

a=1,b=1,判断b>=20不符合条件,不执行break;判断b%3==1(1%3==1)符合条件,执行b=b+3=1+3=4;然后执行continue退出本次循环。

然后a++,a=2,符合a<=100继续循环。

用同样的方法可以继续执行循环,但会发现一个规律,b会一直符合b%3==1,执行b+=3;continue语句,因此不会执行b-=5;语句。

这样b从初始值1开始加7次后,即b=1+3*7=22后,满足b>=20这个条件,执行break语句,跳出整个循环。

此时a也累加了7次,,所以正确答案A。

16.以下程序的功能是计算正整数234的各位数字之和。

main()

{intn,sun=0;

n=234;

while(n)

{sun=sun+n%10;n=______;}

printf(“sun=%d”,sun);

}

请把适当的选项填在下划线处___B________

A)n/100B)n/10C)n%100D)n%10

【解析】:

本题考查的是while循环。

本题的功能是计算正整数234的各个数字之和,因此需要分离出百位、十位和个位。

可以先将234与10取余可以先得到个位数4,然后除以10,变成23,再与10取余可以得到十位数3,再除10,变成2,与10取余可以得到百位数2,将这些数加起来就可以实现题目的功能。

可以发现在循环与10取余,并且将原数除以10.而程序中:

while(n)是判断n是否为0,如果不为0,执行sun=sun+n%10,实现与10取余并将余数累加,因此在后面得语句主要可以实现将原数除以10的功能,即n=n/10.正确答案为B

17.以下程序中,while循环的循环次数是_____D______

main()

{inti=0;

while(i<10)

{if(i<1)continue;

if(i==5)break;

i++;

}

......

}

A)1B)10

C)6D)死循环,不能确定次数

【解析】:

(2002-04-25)本题主要考查while循环和continue、break语句.i的初始值为0,当i<10时进入循环体,先执行if(i<1),由于i=0,满足条件,则执行continue;退出本次循环,不执行if(i==5)break;和i++;因此i没有任何变化,一直执行if(i<1)continue;变成了死循环,正确答案为D.

18.以下程序的输出结果是____A________

main()

{inta=0,i;

for(i=1;i<5;i++)

{switch(i)

{case0:

case3:

a+=2;

case1:

case2:

a+=3;

default:

a+=5;

}

}

printf("%d\n",a);

}

A)31B)13C)10D)20

【解析】:

(2002-04-26)本题考查的是for循环和switch语句,执行过程如下:

i=1时,进入case1分支,但其后无任何执行语句,则进入case2分支,执行a+=3(a=a+3)a=3;但没有遇到break语句,继续执行default部分,a+=5;a=8

i=2时,进入case2分支,执行a+=3(a=a+3)a=11;但没有遇到break语句,继续执行default部分,a+=5;a=16

i=3时,进入case3分支,执行a+=2(a=a+2)a=18;但没有遇到break语句,进入case1分支,但其后无任何执行语句,则进入case2分支,执行a+=3(a=a+3)a=21;但没有遇到break语句,继续执行default部分,a+=5;a=26

i=4时,无case分支匹配,执行default部分,a+=5;a=31

i=4时,不符合循环条件,退出整个循环,因此正确答案为A

19.有以下程序

main()

{inty=10;

while(y--);printf(“y=%d\n”,y);

}

程序执行后的输出结果是___B________

A)y=0B)y=-1C)y=1D)while构成无限循环

【解析】:

(2006-04-30)本题考查的是while循环与—运算符。

本题中有一个陷阱,很多考生会根据程序中的书写格式来判断while循环的循环体为printf(“y=%d\n”,y);语句。

其实while的循环体是一条空语句,即y—后面的那个分号就是while的循环体。

所以本题只要弄清楚表达式

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1