第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;
则与上述程序段功能等价的赋值语句是_______。
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的和。
✧c语言程序分析题及答案 答案:B
【例2】设x和y均为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循环中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循环的循环次数是_______。
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的值为 。
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循环语句的执行结果是 。
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】在下列选项中,没有构成死循环的程序段是 。
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不可能超过100;B)没有循环条件,显然为死循环;C)经过“k++”后,k的值一定是大于1000的,所以也为死循环;D)中的循环控制为s,s每循环一次则递减,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);
}
A)2,0 B)5,0 C)5,5 D)5,2
✧ 考点:本例考查switch的用法。
✧ 分析:本题的程序是为了检查输入字符中a、h、o的个数。
✧ 答案: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的用法。
✧ 分析:可以看出此题和上一例题类型一样,只不过上一例题考的是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】以下程序的输出结果是 。
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<回车>,则输出结果为 。
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的公因数。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论