第3章循环结构程序设计3.1 典型等考试题剖析3.1.1 选择题【例1】若有如下程序段,其中s、a、b、c均已定义为整型变量,且a、c 均已赋值(c大于0)s=a;for(b=1;b<=c;b++) s=s+1;则与上述程序段功能等价的赋值语句是_______。
(等考2003年9月第22题)A)s=a+b; B)s=a+c; C)s=s+c; D)s=b+c;✧考点:本例考查for循环。
✧分析:初始赋值时s=a,那么s的值一定与a有关,C、D答案中不含a所以排除掉。
只用清楚for循环的次数,不管b以前的值为多少,第一次循环时b=1,当b>c时循环结束,那么显然s要加c次1。
所以s的值为a与c的和。
✧答案:B【例2】设x和y均为int型变量,则执行下面的循环后,y值为。
(等考1998年9月第29题)for(y=1,x=1;y<=50;y++){if(x>=10) break;if(x%2==1){x+=5;continue;}x-=3;}A) 2 B) 4 C) 6 D) 8✧考点:本例考查for循环中break和continue的用法,以及区别。
✧分析:break用在循环中,只能退出一层循环。
尤其是在嵌套循环中,只能退出它所在的那一层循环。
不能期望用break从最内层循环一下子退出最外层循环(可以用goto实现)。
continue语句只能用在循环中,它的作用是跳过其后面的语句,直接将控制转移到下一轮循环条件的测试。
语句“if(x>=10) break;”中的break只有当x>=10时,才会执行,并且跳出for循环;语句“x+=5;continue;”是每次执行完一次跳过其后面的语句,直接将控制转移到下一轮循环条件的测试for(y=1,x=1;y<=50;y++)中。
✧答案:C【例3】以下程序中,while循环的循环次数是_______。
(等考2002年4月第25题)main(){ int i=0;while(i<10){ if(i<1) continue;if(i==5) break;i++;}......}A) 1 B) 10 C) 6 D) 死循环,不能确定次数✧考点:本例考查while循环的用法,以及continue和break的分别。
✧分析:本题要求的是循环次数,首先要检查while中的判断条件,i<10是有限循环,然后再观察while内部,if(i<1) continue;第一次循环i=0,满足if条件,执行continue直接跳出循环,不再执行循环内部的其它语句,再次执行while(i<10),而此时i的值仍为0,无疑仍然重复以上步骤,那么i的值没有变化,循环继续,本题是死循环。
✧答案:D【例4】假定a和b为int型变量,则执行以下语句后b的值为。
(等考1998年9月第32题)a=1;b=10;do{b-=a;a++;}while(b--<0);A) 9 B) –2 C) -1 D) 8✧考点:本例考查do-while循环的用法。
✧分析:第一次循环a=1,b减去a后b=9。
然后执行“while(b--<0);”,为假跳出循环。
所以本程序的循环仅执行1次,9-1=8。
✧答案:D【例5】设j为int型变量,则下面for循环语句的执行结果是。
(等考1998年9月第33题)for(j=10;j>3;j--){if(j%3)j--;--j;--j;printf("%d ",j);}A) 6 3 B) 7 4 C) 6 2 D) 7 3✧考点:本例考查for循环的用法。
✧分析:本题的难点可能是几个“j--;”、“--j;”容易让人混淆第一次循环j=10,j%3后j连续减三次1,得到7,继续第二次循环;第二次循环j%3后j连续减三次1,得到4,结束循环。
✧答案:B【例6】在下列选项中,没有构成死循环的程序段是。
(等考1999年4月第29题)A) int i=100;while(1){i=i%100+1;if(i>100) break;}B) for(;;);C) int k=1000;do{++k;} while(k>=1000);D) int s=36;while(s);--s;✧考点:本例考查死循环。
✧分析:A)要退出循环必须满足i>100,但是执行语句“i=i%100+1;”后,i不可能超过100;B)没有循环条件,显然为死循环;C)经过“k++”后,k的值一定是大于1000的,所以也为死循环;D)中while的循环体语句是个空语句,--s不属于while语句。
✧答案:?【例7】运行以下程序后,如果从键盘上输入china#<回车>,则输出结果为。
(等考1999年4月第32题)#include<stdio.h>main(){int v1=0,v2=0;char ch;while((ch=getchar())!='#')switch(ch){case 'a':case 'h':case 'o': v2++;default: v1++;}printf("%d,%d\n",v1,v2);}A)2,0 B)5,0 C)5,5 D)5,2✧考点:本例考查switch的用法。
✧分析:本题的程序是为了检查输入字符中a、h、o的个数。
✧答案:D【例8】以下程序的输出结果是。
(等考2002年4月第26题)main(){int a=0,i;for(i=1;i<5;i++){ switch(i){ case 0:case 3:a+=2;case 1:case 2:a+=3;default:a+=5;}}printf("%d\n",a);}A) 31 B) 13 C) 10 D) 20✧考点:本例考查for循环中switch的用法。
✧分析:可以看出此题和上一例题类型一样,只不过上一例题考的是while和switch,而此题考查的是for和switch。
大家在分析历年考题时会发现很多题型多次重复出现,所以我们在复习的过程中对以前试题要详加分析。
分析本题得到,for一共循环4次,每次循环内部再执行switch,但是有一个问题,本题的case没有break语句结束,所以要从case i一直执行到default,这一点一定要注意!不难发现,i=1时,a=a+3+5=8;i=2时,a=a+3+5=16;i=3时,a=a+2+3+5=16+10=26;i=4时,a=a+5=31。
✧答案:A【例9】以下程序的输出结果是。
(等考1999年4月第46题)main(){int i,j,x=0;for(i=0;i<2;i++){x++;for(j=0;j<3;j++){if(j%2) continue;x++;}}printf("x=%d\n",x);}A)x=4 B)x=8 C)x=6 D)x=12✧考点:本例考查for嵌套。
✧分析:本题有两层for循环,内层for循环中嵌套if判断。
首先从i=0,j=0开始,x=x+1=0+1=1;j%2=0%2,则x=x+1=1+1=2,再执行内层循环,i=0,j=1,x=3;继续i=0,j=2,j%2=2%2=0,跳出循环;再执行i=1,x=x+1=3+1=4;接着i=1,j=0,x=5;i=1,j=1,x=6,再下来j=2跳出循环,最终x=6。
这一题关键要看x能循环几次。
✧答案:C【例10】运行以下程序后,如果从键盘上输入65 14<回车>,则输出结果为。
(等考1999年4月第48题)main(){int m,n;printf("Enter 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);}A)m=3 B)m=2 C)m=1 D)m=0✧考点:本例考查while嵌套。
✧分析:本题主要是为了比较m和n的大小,用了两层while循环,直到m=n了才退出循环(注意循环结束的条件)。
开始循环m=65 n=14,65>14,所以执行”while(m>n)m-=n;”,m=m-n=65-14=51,又51>14,接着m=m-n=51-14=37,直到m<n,m=9,n=14,继续执行”while(n>m)n-=m;”,n=n-m=14-9=5,再执行”while(m>n)m-=n;”,m=m-n=9-5=4。
4<5,再执行”while(n>m)n-=m;”,n=n-m=5-4=1,接下来m>n,再继续m=m-n,一直到m=1,此时m=n=1不再循环。
本题还可以这样看,当m>n时,循环执行m-n,所以65除以14,商4余9,9是最终执行m-n的结果m=9;再来当n>m时,循环执行n-m,所以14除以9,商1余5,此时n=5,m=9,接着m>n,再执行m-n,同样9除以5,商1余4,m=4,n=5,再来用5除以4,余1,此时n=1,最后不难得到m=1,m=n=1,不再循环。
本题可以看作是求m和n的公因数。
✧答案:C【例11】有以下程序main(){int i=0,s=0;do {if (i%2) {i++; continue;}i++;s += i;} while(i<7);printf("%d\n", s);}执行后输出结果是。
(等考2003年4月第24题)A)16 B)12 C)28 D)21✧考点:本例考查continue。
✧分析:初始赋值时s=0,由题意知s的值与i有关。
if (i%2) { i++;continue; }则i=1,3,5时,执行s+=i;即s=1+3+5+7=16。
while(i<7)退出循环。
✧答案:A3.1.2填空题【例1】以下程序运行后的输出结果是。
(等考2003年9月第9题)main(){ int i,m=0,n=0,k=0;for(i=9; i<=11;i++)switch(i/10){ case 0: m++;n++;break;case 10: n++; break;default: k++;n++;}printf("%d %d %d\n",m,n,k);}✧考点:本例考查for循环与switch的结合应用。