习题册56章答案.docx
- 文档编号:3432500
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:32
- 大小:48.70KB
习题册56章答案.docx
《习题册56章答案.docx》由会员分享,可在线阅读,更多相关《习题册56章答案.docx(32页珍藏版)》请在冰豆网上搜索。
习题册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的循环体。 所以本题只要弄清楚表达式
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 习题 56 答案