第三章循环结构
3.1 选择题
1.以下程序的输出结果是( )。
main()
{ int n=4;
while (n--)
printf(〞%d〞,--n);
}
A.20
B.31
C.321
D.210 2.以下程序的输出结果是( )。
main()
{int x=10,y=10,i;
for(i=0;x>8;y=++i)
printf("%d%d",x--,y);
}
A.10192
B.9876
C.10990
D.101091 3.当执行以下程序段时。
x=-1;
do
{x=x*x;}
while (!x);
A.循环体将执行一次
B.循环体将执行两次
C.循环体将执行无数多次
D.系统将提示有语法错误4.执行以下程序后输出的结果是()。
main()
{ int y=10;
do{y--;}while(--y);
printf("%d\n",y--);}
A.-1
B.1
C.8
D.0
5.下面程序的输出结果是()。
main()
{ int x=3,y=6,a=0;
while (x++!=(y-=1))
{a+=1;
if (y } printf("x=%d,y=%d,a=%d\n",x,y,a); } A.x=4,y=4,a=1 B.x=5,y=5,a=1 C.x=5,y=4,a=3 D.x=5,y=4,a=1 6.若i,j已定义为int类型,则以下程序段中内循环的总的执行次数是()。 for (i=5;i;i--) for (j=0;j<4;j++) {…} A.20 B.24 C.25 D.30 7.请读程序: #include main() {int x=1,y=0,a=0,b=0; switch(x) {case 1:switch(y) {case 0:a++;break; case 1:b++;break; } case 2:a++;b++;break; } printf("a=%d,b=%d\n",a,b); } 上面程序的输出结果是()。 A.a=2,b=1 B.a=1,b=1 C.a=1,b=0 D.a=2,b=2 8.若有以下程序段,w和k都是整型变量 w=k; LB: if(w==0) goto LE; w--; printf(〞*〞); goto LB; LE: 则不能与上面程序段等价的循环语句是()。 A. for(w=k;w!=0;w--) print(〞*〞); B. w=k; while(w--!=0) printf(〞*〞); w++; C. w=k; do {w--;printf(〞*〞);} while (w!=0); D.for (w=k;w;--w) printf(〞*〞); 9.下面程序的输出是()。 main() { char *s=〞12134211〞; int k,v1=0,v2=0,v3=0,v4=0; for (k=0;s[k];k++) switch(s[k]) { default:v4++; case 1:v1++; case 2:v2++; csse 3:v3++; } printf(〞v1=%d,v2=%d,v3=%d,v4=%d\n〞,v1,v2,v3,v4); } A.v1=4,v2=2,v3=1,v4=1 B.v1=4,v2=9,v3=3,v4=1 C.v1=5,v2=8,v3=6,v4=1 D.v1=8,v2=8,v3=8,v4=8 10.有以下程序 #include〞stdio.h〞 int abc(int u,int v ); main() { int c,a=24,b=16; c=abc(a,b); printf(〞%d\n〞,c); } int abc (int u,int v) { int w; while (v) {w=u%v;u=v;v=w;} return u; } 输出结果是( )。 A.6 B.7 C.8 D.9 11.在下列选项中,没有构成死循环的程序段是()。 A.int i=100; while (1) { i=i%100+1; if(i>100) break; } B. for ( ;;); C.int k=1000; do {++k;}while (k>=10000); D.int s=36; while (s) ; --s; 12.若输入B,以下程序的运行结果为()。 main() {char grade;scanf("%c",&grade); switch(grade) {case'A':printf(">=85."); case'B': case'C':printf(">=60."); case'D':printf("<60."); default:printf("error."); } } A.>=85. B.>=60. C.>=60.<60.error. D.error. 13.列程序运行的情况是()。 main() { int i=1,sum=0; while(i<10)sum=sum+1;i++; printf("i=%d,sum=%d",i,sum); } A.i=10,sum=9 B.i=9,sum=9 C.i=2,sum=1 D.运行出现错误 14.有以下语句: i=1; for(;i<=100;i++) sum+=i; 与以上语句序列不等价的有( )。 A. for(i=1; ;i++) {sum+=i;if(i==100)break;} B. for(i=1;i<=100;){sum+=i;i++;} C. i=1;for(;i<=100;)sum+=i; D. i=1;for(; ;){sum+=i;if(i==100)break;i++;} 15.下面程序的运行结果为()。 main() { int n; for(n=1;n<=10;n++) { if(n%3==0)continue; printf("%d",n); } } A.12457810 B.369 C.12 D.12345678910 16.下面程序的运行结果是()。 main() {int x,y,z; x=0;y=z=-1; x+=-z---y; printf("x=%d\n",x); } A.x=4 B.x=0 C.x=2 D.x=3 17.标有/**/的语句的执行次数是()。 int y,i; for(i=0;i<20;i++) {if(i%2==0)continue; y+=i;/**/ } A.20 B.19 C.10 D.9 18.在C语言中,if语句后的一对圆括号中,用以决定分支的流程的表达式。 A.只能用逻辑表达式 B.只能用关系表达式 C.只能用逻辑表达式或关系表达式 D.可用任意表达式 19.在以下给出的表达式中,与do-while(E)语句中的(E)不等价的表达式是()。 A.(!E==0) B.(E>0||E<0) C.(E==0) D.(E!=0) 20.假定所有变量均已正确定义,下列程序段运行后x的值为()。 k1=1;k2=2; k3=3; x=15; if(!k1)x--;else if(k2) if(k3)x=4;else x=3; A.14 B.4 C.15 D.3 21.执行下面语句的输出为()。 int i=-1; if(i<=0)printf(“* * * *\n”); else printf(“% % % % \n”); A.* * * * B.% % % % C.% % % % c D.有错,执行不正确22.下列程序的输出是()。 #include main() { int i;char c; for(i=0;i<=5;i++) {c=getchar();putchar(c); } } 程序执行时从第一列开始输入以下数据, u w xsta A.uwxsta B.u C.u D.u w w w x xs xsta 23.下列程序的输出为()。 #include"stdio.h" main() { int i,j,x=0; for(i=0;i<2;i++) {x++; for(j-0;j<=3;j++) {if(j%2)continue;x++; } x++; } printf("x=%d\n",x); } A.x=4 B.x=8 C.x=6 D.x=12 24.下列程序的输出为()。 #include main() {int i,j,k=0,m=0; for(i=0;i<2;i++) { for(j=0;j<3;j++)k++;k-=j;} m=i+j; printf("k=%d,m=%d\n",k,m); } A.k=0,m=3 B.k=0,m=5 C.k=1,m=3 D.k=1,m=5 25.在C语言中,为了结束while语句构成的循环,while后一对圆括号中表达式的值应该为()。 A.0 B.1 C.true D.非0 26.在C语言中,为了结束由do-while语句构成的循环,while后一对圆括号中表达式的值应为()。 A.0 B.1 C.true D.非0 27.下列程序的输出为()。 #include main() { int k=0;char c='A'; do {switch(c++) { case'A':k++;break; case'B':k--; case'C':k+=2;break; case'D':k=k%2;continue; case'E':k=k*10;break; default:k=k/3; } k++; } while(c<'G'); printf("%d\n",k); } A.k=3 B.k=4 C.k=2 D.k=0 28.C语言的if语句嵌套时,if与else的配对关系是()。 A. 每个else总是与它上面的最近的if配对 B. 每个else总是与最外的if配对 C. 每个else与if的配对是任意的 D. 每个else总是与它上面的if配对 29.下列程序的输出为()。 #include main() {int i=0,j=0,a=6; if((++i>0)||(++j>0))a++; printf("i=%d,j=%d,a=%d\n",i,j,a); } A.i=0,j=0,a=6 B.i=1,j=1,a=7 C.i=1,j=0,a=7 D.i=0,j=1,a=7 30.下列程序段的输出结果为()。 main() {int x=3; do { printf("%3d",x-=2);} while(!(--x));} A.1 B.3 0 C.1 -2 D.死循环3.2 填空题: 1.当输入19,2,21时下列程序运行的结果是_________。 main() {int a,b,c,max; printf("please scan three number a,b,c:\n"); scanf("%d,%d,%d",&a,&b,&c); max=a; if(max if(max printf("max is:%d",max); } 2.若输入字母C,程序输出结果为【1】;若输入字符*,程序将【2】。 #include main() {char c1,c2; c1=getchar(); while(c1<97||c1>122)c1=getchar(); c2=c1-32; printf("%c,%c\n",c1,c2); } 3.以下程序运行的结果为________。 main() { int a,b,c,x,y,z; a=10;b=2; c=!(a%b);x=!(a/b); y=(a=0); z=(a=0); printf("%d,%d,%d,%d\n",c,x,y,z); } 4.若输入4,程序运行结果为【1 】,若输入-4,运行结果为【2 】,若输入10,运行结果为【 3 】. main() { int x,y; scanf("%d",&x); if(x<1) { y=x; printf("x=%d,y=x=%d\n",x,y); } else if(x<10) { y=2*x-1; printf("x=%d,y=2*x-1=%d\n",x,y); } else { y=3*x-11; printf("x=%d,y=3*x-11=%d\n",x,y); } } 5.以下程序运行的结果________。 main() {int i=1,sum=0; loop:if(i<=10) {sum+=i; i++; goto loop; } printf("sum=%d\n",sum); } 6.以下程序运行的结果________。 main() { int x=2,y,z; x*=3+1; printf("%d,",x++); x+=y=z=5; printf("%d,",x); x=y==z; printf("%d\n",x); } 7.以下程序运行的结果________。 #include #include main() {int i,k,m,n=0; for(m=1;m<=10;m+=2) { if(n%10==0)printf("\n"); k=sqrt(m); for(i=2;i<=k;i++) if(m%i==0)break; if(i>k) {printf("%2d",m); n++; } } } 8.如果输入‘1’,‘2’,‘3’,‘4’,程序运行输出的是________。 #include main() {char c; int i,k; k=0; for(i=0;i<4;i++) {while(1) { c=getchar();if(c>='0'&&c<='9')break;} k=k*10+c-'0'; } printf("k=%d\n",k); } 9.运行以下程序后,如果从键盘上输入china#<回车>,则输出结果为________。 #include main() {int v1=0,v2=0; char ch; while ((ch=getchar())!='#') switch(ch) {case 'a': case 'h': default: v1++; case '0':v2++; } printf("%d,%d\n",v1,v2); } 10.程序运行结果是_________。 #include main() {int i; for(i=1;i+1;i++) { if(i>4){printf("%d\t",i++);break;} printf("%d\t",i++); } } 11.以下程序运行的结果是_________。 #include main() { int a,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); } 12.以下程序运行的结果是________。 main() {int i=1; while(i<10) if(++i%3!=1)continue; else printf("%d",i); } 13.程序运行的结果是________。 main() {int n=0; while(n++<=1) printf("%d\t",n); printf("%d\n",n); } 14.此程序运行时,输入qwert?程序的运行结果是_________。 #include main() {char c; while((c=getchar())!='?')putchar(++c); } 15.对以下程序: 当输入65 14时,其运行结果是【 1 】。 当输入14 63时,其运行结果是【2 】。 当输入25 125时,其运行结果时【3 】。 #include main() {int m,n; scanf("%d%d",&m,&n); while(m!=n) { while(m>n)m-=n; while(n>m)n-=m; } printf("m=%d\n",m); } 16.在执行以下程序时,为了使输出结果为t=4,则给a和b输入的值应满足的条件是_______。 main() {int s,t,a,b; scanf(〞%d,%d〞,&a,&b); s=1;t=1; if(a>0)s=s+1; if(a>b)t=s+t; else if (a==b) t=5; else t=2*s; printf(〞t=%d\n〞,t); } 17.求出1000以内的“完全数”。(提示:如果一个数恰好等于它的因子之和(因子包括1,不包括数本身),则称该数为“完全数”。如:6的因子是1,2,3而6=1+2+3,则6是个“完数”)。 main() {int i,a,m; for(i=1;i<1000;i++) {for(m=0,a=1;a<=i/2;a++) if(!(i%a)) 【1 】; if【2】)printf("%4d",i); } } 18.鸡问题:100元钱买100只鸡,公鸡一只5元钱,母鸡一只3元钱,小鸡一元钱三只,求100元钱能买公鸡、母鸡、小鸡各多少只? #include main() {int cocks,hens,chicks; cocks=0; while(cocks<=19) { hens=0; while(hens<=33) { chicks=100.0-cocks-hens; if(5.0*cocks+3.0*hens+chicks/3.0==100.0) printf("%d,%d,%d\n",cocks,hens,chicks); 【1】; } 【2】; } } 19.爱因斯坦的阶梯问题:设有一阶梯,每步跨2阶,最后余1阶;每步跨3阶,最后余2阶;每步跨5阶,最后余4阶;每步跨6阶,最后余5阶;只有每步跨7阶时,正好到阶梯顶。问共有多少阶梯。 main() {int ladders=7; while(【 1 】)ladders+=14; printf("%d\n",ladders); } 20.下列程序计算平均成绩并统计90分及以上人数。 main() {int n,m; float grade,average; average=n=m=【1】; while(【2】) { scanf("%f",&grade); if(grade<0)break; n++; average+=grade; if(grade<90)【3】; m++; } if(n)printf("%.2f%d\n",average/n,m); } 21.下列程序计算Fibonacci数列:1,1,2,3,5,8,13……的前40项。 main() {int I;long f1,f2; 【1】; for(I=0;I<20;I++) { printf("%12ld%12ld",f1,f2); if(I%2)printf("\n"); f1+=f2; 【2】; } } 22.下列程序判断一个数是否为素数。 #include #include main() {int I,k,m; scanf("%d",&m); k=sqrt(【1】); for(I=2;I<=k;I++) if(m%I==0)【2】; if(【3】)printf("%dyes\n",m); else printf("%dno\n",m); } 23.求100~499之间的所有水仙花数,即各位数字的立方和恰好等于该数本身的数。 main() {int I,j,k,m,n; for(I=1;【1】;I++) for(j=0;j<=9;j++) for(k=0;k<=9;k++) {【2】; n=I*I*I+j*j*j+k*k*k; if(【3】) printf("%d",m); } } 24.从键盘上输入两个整数m和n,求其最大公约数。 main() {int a,b,num1,num2,temp; scanf("%d,%d",&num1,&num2); if(【1】) { temp=num1; num1=num2; num2=temp; } a=num1;b=num2; while(b!=0) { temp=【2】; a=b; b=temp; } printf("%d,%d",a,num1*num2/a); } 3.3 答案及部分解题分析 一.选择题答案 1.A 2.D 3.A 4.D 5.D 6.A 7.A8.C 9.D 10.C 11.C 12.C 13.D 14C 15.A16.C 17.C 18.D 19.C 20.B 21.A22.C 23.B 24.B 25.A26.A27.B 28.A29.C 30.C 1.答案:A 解析:此题中判断while后面的条件时,先使用n的值再n--,而打印时打印的是n减1 后的值。所以第一次循环,n=4,执行完后n=2,打印出2;第二次循环,n=2, 经过n—和—n,n变成了0,打印出0;第三次循环时while后面的条件不成立(n=0),所以循环结束。 故输出为20。 2.答案:D 解析:第一次循环时打印的x和y的值都是10,然后x通过x—后变成9,因此第二次循环时x=9, 而“y=++i”执行完后,y变成1,所以第二次循环时打印的x和y的值是9和1 ,然后x—变成8;第三次循环时,x>8条件不成立,循环结束。故D为正确答案。 3.答案:A 解析:对于一个不为0的数,!x即为0,故对于x=-1,while后条件不成立,但是do 循环体是先执行的,故等判断条件时,循环体已执行了一次。 4.答案:D 解析:此题是一个do-while循环,当y值为1时,while后的条件--y变成0,从而循环结束,这时打印出0,然后y--变成-1。故D为正确答案。 5.答案:D 解析:此题中循环进行了1次,但判断了2次,第一次x加1变成4,y减1变成5,a 加1变成1;第2次while后面的条件不成立,因为!=的左边先使用x的值4来判断,右边表达式的值为4,即y由5变成4,判断结束后4变成5,循环结束。故D为正确答案。 6.答案:A 解析:此题中外层for要进行5次,内层for循环要进行4次,所以共进行4*5=20次循环。 二.填空题答案 1.答案:21 2.答案:【1】c C 【2】等待继续输入,直到输入小写字母。 3.答案:1,0,0,1 4.答案:【1】x=4,y=2*x-1=7 【2】x=-4,y=x=-4 【3】x=10,y=3*x-11=19 5.答案:55 6.答案:8,14,1 7.答案:1 3 5 7 8.答案:1234 9.答案:5,5 10.答案:1 3 5 11.答案:8 12.答案:4 7 10 13.答案:1 2 3 14.答案:rxfsu