C语言各章节单元测试题及答案循环结构程序设计.docx
《C语言各章节单元测试题及答案循环结构程序设计.docx》由会员分享,可在线阅读,更多相关《C语言各章节单元测试题及答案循环结构程序设计.docx(25页珍藏版)》请在冰豆网上搜索。
C语言各章节单元测试题及答案循环结构程序设计
第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的和。
✧ 答案:
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)2B)4C)6D)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()
{inti=0;
while(i<10)
{if(i<1)continue;
if(i==5)break;
i++;
}
......
}
A)1B)10C)6D)死循环,不能确定次数
✧ 考点:
本例考查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)9B)–2C)-1D)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)63B)74C)62D)73
✧ 考点:
本例考查for循环的用法。
✧ 分析:
本题的难点可能是几个“j--;”、“--j;”容易让人混淆第一次循环j=10,j%3后j连续减三次1,得到7,继续第二次循环;第二次循环j%3后j连续减三次1,得到4,结束循环。
✧ 答案:
B
【例6】在下列选项中,没有构成死循环的程序段是。
A)inti=100B)for(;;);
inti=100;
while
(1)
{
i=i%100+1;
if(i>100)break;
}
C)intk=1000;D)ints=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
main()
{
intv1=0,v2=0;
charch;
while((ch=getchar())!
='#')
switch(ch)
{
case'a':
case'h':
case'o':
v2++;
default:
v1++;
}
printf("%d,%d\n",v1,v2);
}
A)2,0B)5,0C)5,5D)5,2
✧ 考点:
本例考查switch的用法。
✧ 分析:
本题的程序是为了检查输入字符中a、h、o的个数。
✧ 答案:
D
【例8】以下程序的输出结果是。
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
✧ 考点:
本例考查for循环中switch的用法。
✧ 分析:
可以看出此题和上一例题类型一样,只不过上一例题考的是while和switch,而此题考查的是for和switch。
大家在分析历年考题时会发现很多题型多次重复出现,所以我们在复习的过程中对以前试题要详加分析。
分析本题得到,for一共循环4次,每次循环内部再执行switch,但是有一个问题,本题的case没有break语句结束,所以要从casei一直执行到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()
{
inti,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=4B)x=8C)x=6D)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】运行以下程序后,如果从键盘上输入6514<回车>,则输出结果为。
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=0
✧ 考点:
本例考查while嵌套。
✧ 分析:
本题主要是为了比较m和n的大小,用了两层while循环,直到m=n了才退出循环(注意循环结束的条件)。
开始循环m=65n=14,65>14,所以执行”while(m>n)m-=n;”,m=m-n=65-14=51,又51>14,接着m=m-n=51-14=37,直到mm)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()
{
inti=0,s=0;
do{
if(i%2){
i++;continue;
}
i++;
s+=i;
}while(i<7);
printf("%d\n",s);
}
执行后输出结果是。
A)16B)12C)28D)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)退出循环。
✧ 答案:
A
3.1.2填空题
【例1】以下程序运行后的输出结果是。
main()
{inti,m=0,n=0,k=0;
for(i=9;i<=11;i++)
switch(i/10)
{case0:
m++;n++;break;
case10:
n++;break;
default:
k++;n++;
}
printf("%d%d%d\n",m,n,k);
}
✧ 考点:
本例考查for循环与switch的结合应用。
✧ 分析:
for循环i从9开始到11,共循环3次,i=9时,i/10的值为0,执行case0,m=1,n=1;i=10时,i/10的值为1,执行default,k=1,n=2;i=11时,i/10的值为1,执行default,k=2,n=3。
✧ 答案:
132
【例2】以下程序的功能是调用函数fun计算:
m=1-2+3-4+…+9-10,并输出结果。
请填空。
intfun(intn)
{intm=0,f=1,i;
for(i=1;i<=n;i++)
{
m+=i*f;
f=【1】;
}
returnm;
}
main()
{printf("m=%d\n",【2】);}
✧ 考点:
本例考查函数调用中for的应用。
✧ 分析:
此题要用到for循环,关键问题在于循环的次数和对加减数的处理,显然本题要循环10次,所以,n的值为10。
注意到奇数加,偶数减所以m+=i*f中的f用到正负数变化,f=-f或f*-1或-1*f或f*(-1)或(-1)*f,最终打印的m值是由fun函数计算的,intn的值应该由主函数传入10。
✧ 答案:
【1】f=-f或f*-1或-1*f或f*(-1)或(-1)*f;【2】fun(10)
【例3】下面程序的功能是:
计算1到10之间奇数之和及偶数之和,请填空。
main()
{
inta,b,c,i;
a=c=0;
for(i=0;i<10;i+=2)
{a+=i;
;
c+=b;
}
printf("偶数之和=%d\n",a);
printf("奇数之和=%d\n",c-11);
}
✧ 考点:
本例考查for的简单应用。
✧ 分析:
在做填空题的时候,先要看整个程序的流程,然后再考虑如何填入语句以符合题意。
本题要得到的是1-10之间的奇、偶数之和,for(i=0;i<10;i+=2)此语句共执行5次,显然a+=i是为了得到偶数之和,那么c+=b应该是求奇数之和,而且是由前一个我们需要填入的语句决定,b是每次加入的数据,那么要填的语句应该是b的取值,i是0、2、4、6、8,那么b应该是1、3、5、7、9,可以由i得来,所以b=i+1。
✧ 答案:
b=i+1
【例4】下面程序的功能是:
输出100以内能被3整除且个位数为6的所有整数,请填空。
#include
main()
{inti,j;
for(i=0;【1】;i++)
{j=i*10+6;
if(【2】)continue;
printf("%d",j);
}
}
✧ 考点:
本例考查for和continue的结合使用。
✧ 分析:
本题需要输出100以内能被3整除且个位数为6的所有整数。
先看程序流程。
✧ 答案:
【1】
(1)i<10【2】
(2)i%3!
=0
【例5】以下程序运行后的输出结果是_。
main()
{intx=15;
while(x>10&&x<50)
{x++;
if(x/3){x++;break;}
elsecontinue;
}
printf(“%d\n”,x);
}
✧ 考点:
本例考查break和continue在循环结构中的综合使用。
✧ 分析:
本题输出15到50以内第一个被3整除不为0的整数且让该整数加1。
✧ 答案:
17
3.2自测练习与参考答案
3.2.1选择题
1.以下程序的输出结果是。
main()
{
intx=10,y=10,i;
for(i=0;x>8;y=++i)
printf("%d%d",x--,y);
}
A)10192B)9876C)10990D)101091
2.以下程序的输出结果是_______。
main()
{intn=4;
while(n--)printf("%d",--n);
}
A)20B)31C)321D)210
3.执行下面程序片段的结果是_______。
intx=23;
do
{
printf("%2d",x--);}
while(!
x);
A)321B)23C)不输出任何内容D)陷入死循环
4.以下程序的输出结果是________。
main()
{
inti;
for(i=1;i<6;i++)
{
if(i%2){printf("#");continue;}
printf("*");
}
printf("\n");
}
A)#*#*#B)#####C)*****D)*#*#*
5.以下循环体的执行次数是________。
main()
{inti,j;
for(i=0,j=1;i<=j+1;i+=2,j--)printf("%d\n",i);
}
A)3B)2C)1D)0
6.有如下程序
main()
{inti,sum;
for(i=1;i<=3;sum++)sum+=i;
printf("%d\n",sum);
}
该程序的执行结果是_______。
A)6B)3C)死循环D)0
7.有以下程序段
intn=0,p;
do{scanf(“%d”,&p);n++;}while(p!
=12345&&n<3);
此处do-while循环的结束条件是______。
(2002年9月)
A)P的值不等于12345并且n的值小于3
B)P的值等于12345并且n的值大于等于3
C)P的值不等于12345或者n的值小于3
D)P的值等于12345或者n的值大于等于3
8.有如下程序
main()
{intn=9;
while(n>6)
{
n--;printf("%d",n);}
}
该程序段的输出结果是_______。
A)987B)876C)8765D)9876
9.以下程序的输出结果是_______。
main()
{
inti;
for(i='A';i<'I';i++,i++)
printf("%c",i+32);
printf("\n");
}
A)编译不通过,无输出B)aceg
C)acegiD)abcdefghi
10.有以下程序段
intk=0
while(k=1)k++;
while循环执行的次数是_______。
A)无限次B)有语法错,不能执行
C)一次也不执行D)执行1次
11.以下程序执行后sum的值是_______。
main()
{inti,sum;
for(i=1;i<6;i++)sum+=i;
printf(“%d\n”,sum);
}
A)15B)14C)不确定D)0
12.有以下程序
main()
{inti;
for(i=0;i<3;i++)
switch(i)
{case1:
printf("%d",i);
case2:
printf("%d",i);
default:
printf("%d",i);
}
}
执行后输出结果是。
A)011122B)012C)012020D)120
13.以下程序的输出结果是_______。
main()
{intnum=0;
while(num<=2)
{
num++;printf("%d\n",num);
}
A)1B)1C)1D)l
222
33
4
14.以下程序的输出结果是_______。
main()
{
inta,b;
for(a=1,b=1;a<=100;a++)
{if(b>=10)break;
if(b%3==1)
{
b+=3;continue;
}
}
printf("%d\n",a);
}
A)101B)6C)5D)4
15.有以下程序
main()
{intk=4,n=0;
for(;n{n++;
if(n%3!
=0)continue;
k--;}
printf("%d,%d\n",k,n);
}
程序运行后的输出结果是_______。
A)1,1B)2,2C)3,3D)4,4
16.有以下程序
main()
{ints=0,a=1,n;
scanf("%d",&n);
do{
s+=1;a=a-2;}
while(a!
=n);
printf("%d\n",s);}
若要使程序的输出值为2,则应该从键盘给n输入的值是_______。
A)-1B)-3C)-5D)0
17.要求以下程序的功能是计算:
s=1+1/2+1/3+……+1/10
main()
{
intn;
floats;
s=1.0;
for(n=10;n>1;n--)
s=s+1/n;
printf("%6.4f\n",s);
}
程序运行后输出结果错误,导致错误结果的程序行是_______。
A)s=1.0;B)for(n=10;n>1;n--)C)s=s+1/n;D)printf("%6.4f\n",s);
18.执行以下程序后,输出的结果是。
main()
{
inty=10;
do{
y--;
}while(--y);
printf("%d\n",y--);
}
A)-1B)1C)8D)0
19.执行语句:
for(i=1;i++<4;)后,变量i的值是。
A)3B)4C)5D)不定
20.以下程序的输出结果是_______。
#include
voidmain()
{intk=0,m=0;
inti,j;
for(i=0;i<2;i++)
{for(j=0;j<3;j++)
k++;
k-=j;}
m=i+j;
printf("k=%d,m=%d",k,m);
}
A)k=0,m=3B)k=0,m=5C)k=1,m=3D)k=1,m=5
21.当执行以下程序段时。
intx;
x=-1;
do{
x=x*x;}
while(!
x);
A)循环体将执行一次B)循环体将执行两次
C)循环体将执行无限次D)系统将提示有语法错误
22.当执行以下程序时_______。
x=-1;
do
{
x=x*x;}
while(!
x)
A)循环体将执行一次B)循环体将执行两次
C)循环体将执行无限次D)系统将提示有语法错误
23.下述循环程序_______。
for(a=0,b=0;a<3&&b!
=3;a++);
A)是无限次循环B)循环次数不定
C)循环3次D)循环4次
24.在下列程序中,没有构成死循环的程序段是_______。
A)inti=100;B)intk=1000;
while
(1)do
{i=i%100+1;{++k;}while(k>=10000);
if(i>100)break;}
C)for(;;);D)ints=36;
while(s);--s;
25.若程序执行时的输入数据是“2473”,则下述程序的输出结果是_______。
#include
voidmain()
{
intcx;
while((cx=getchar())!
='\n')
{
switch(cx-'2')
{
case0:
case1:
putchar(cx+4);
case2:
putchar(cx+4);break;
case3:
putchar(cx+3);
default:
putchar(cx+2);
}
}
}
A)668977B)668966C