第3章  循环结构程序设计
3.1  典型考试题剖析
3.1.1 选择题
【例1若有如下程序段,其中sabc均已定义为整型变量,且ac均已赋值(c大于0
s=a;
for(b=1;b<=c;b++) s=s+1;
则与上述程序段功能等价的赋值语句是_______
As=a+b; Bs=a+c; Cs=s+c; Ds=b+c;
        考点:本例考查for循环。
        分析:初始赋值时s=a,那么s的值一定与a有关,CD答案中不含a所以排除掉。只用清楚for循环的次数,不管b以前的值为多少,第一次循环时b=1,当b>c时循环结束,
那么显然s要加c1。所以s的值为ac的和。
c语言程序分析题及答案        答案:B
【例2xy均为int型变量,则执行下面的循环后,y值为         
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循环中breakcontinue的用法,以及区别。
        分析: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循环的循环次数是_______
main()
{    int  i=0;
while(i<10)
{      if(i<1)  continue;
if(i==5)  break;
i++;
}
......
}
A) 1    B) 10        C) 6          D) 死循环,不能确定次数
        考点:本例考查while循环的用法,以及continuebreak的分别。
        分析:本题要求的是循环次数,首先要检查while中的判断条件,i<10是有限循环,然后再观察while内部,if(i<1)  continue;第一次循环i=0,满足if条件,执行continue直接跳出循环,不再执行循环内部的其它语句,再次执行while(i<10),而此时i的值仍为0,无疑仍然重复以上步骤,那么i的值没有变化,循环继续,本题是死循环。
        答案:D
【例4假定abint型变量,则执行以下语句后b的值为                   
a=1;b=10;
do{
b-=a;a++;
}while(b--<0); 
A) 9                    B) –2              C) -1          D) 8
        考点:本例考查do-while循环的用法。
        分析:第一次循环a=1b减去ab=9。然后执行“while(b--<0);”,为假跳出循环。所以本程序的循环仅执行1次,9-1=8
        答案:D
【例5jint型变量,则下面for循环语句的执行结果是                   
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=10j%3j连续减三次1,得到7,继续第二次循环;第二次循环j%3j连续减三次1,得到4,结束循环。
        答案:B
【例6在下列选项中,没有构成死循环的程序段是                   
A)  int i=100                                                          B) for(;;);
int i=100;
while(1)
{
i=i%100+1;
if(i>100) break;
}
C)  int k=1000;                                                      D) int s=36;
do{++k;                                                                while(s);--s;
} while(k>=1000);
        考点:本例考查死循环。
        分析:A)要退出循环必须满足i>100但是执行语句“i=i%100+1;”后,i不可能超过100B)没有循环条件,显然为死循环;C)经过“k++”后,k的值一定是大于1000的,所以也为死循环;D)中的循环控制为ss每循环一次则递减,s<0时,退出循环,所以D不是死循环。
        答案:D
【例7运行以下程序后,如果从键盘上输入china#<回车>,则输出结果为                   
#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);
}
A20            B)50          C)55            D)52
        考点:本例考查switch的用法。
        分析:本题的程序是为了检查输入字符中aho的个数。
        答案:D
【例8以下程序的输出结果是                   
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的用法。
        分析:可以看出此题和上一例题类型一样,只不过上一例题考的是whileswitch,而此题考查的是forswitch。大家在分析历年考题时会发现很多题型多次重复出现,所以我们在复习的过程中对以前试题要详加分析。分析本题得到,for一共循环4次,每次循环内部再执行switch,但是有一个问题,本题的case没有break语句结束,所以要从case i一直执行到default,这一点一定要注意!不难发现,i=1时,a=a+3+5=8i=2时,a=a+3+5=16i=3时,a=a+2+3+5=16+10=26i=4时,a=a+5=31
        答案:A
【例9以下程序的输出结果是                   
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=1j%2=0%2,则x=x+1=1+1=2,再执行内层循环,i=0,j=1x=3;继续i=0,j=2j%2=2%2=0,跳出循环;再执行i=1x=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<回车>,则输出结果为                   
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嵌套。
        分析:本题主要是为了比较mn的大小,用了两层while循环,直到m=n了才退出循环(注意循环结束的条件)。开始循环m=65 n=1465>14,所以执行”while(m>n)m-=n;”m=m-n=65-14=51,又51>14,接着m=m-n=51-14=37,直到m<nm=9,n=14,继续执行”while(n>m)n-=m;”n=n-m=14-9=5,再执行”while(m>n)m-=n;”m=m-n=9-5=44<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,商499是最终执行m-n的结果m=9;再来当n>m时,循环执行n-m,所以14除以9,商15,此时n=5m=9,接着m>n,再执行m-n,同样9除以5,商14m=4n=5,再来用5除以4,余1,此时n=1,最后不难得到m=1m=n=1,不再循环。本题可以看作是求mn的公因数。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。