admin 管理员组文章数量: 1087139
2024年4月21日发(作者:view point)
第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) 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
main()
{
int v1=0,v2=0;
char ch;
while((ch=getchar())!='#')
switch(ch)
{
case 'a':
case 'h':
case 'o': v2++;
default: v1++;
}
printf("%d,%dn",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("%dn",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=%dn",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=%dn",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=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("%dn", s);
}
执行后输出结果是 。
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)
退出循环。
答案:A
3.1.2填空题
【例1】以下程序运行后的输出结果是 。
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 %dn",m,n,k);
}
考点:本例考查for循环与switch的结合应用。
分析:for循环i从9开始到11,共循环3次,i=9时,i/10的值为0,
执行case 0,m=1,n=1;i=10时,i/10的值为1,执行default,k=1,
n=2;i=11时,i/10的值为1,执行default,k=2,n=3。
答案:1 3 2
【例2】以下程序的功能是调用函数fun计算:m=1-2+3-4+…+9-10,并输出
结果。请填空。
int fun( int n)
{ int m=0,f=1,i;
for(i=1; i<=n; i++)
{
m+=i*f;
f= 【1】 ;
}
return m;
}
main()
{ printf("m=%dn", 【2】 ); }
考点:本例考查函数调用中for的应用。
分析:此题要用到for循环,关键问题在于循环的次数和对加减数的处
理,显然本题要循环10次,所以,n的值为10。注意到奇数加,偶数减
所以m+=i*f中的f用到正负数变化,f = - f或 f*-1 或 -1*f或 f*(-1)
或 (-1)*f,最终打印的m值是由fun函数计算的,int n的值应该由主
函数传入10。
答案:【1】f = - f或 f*-1 或 -1*f或 f*(-1) 或 (-1)*f;【2】fun(10)
【例3】下面程序的功能是:计算1到10之间奇数之和及偶数之和,请填空。
main()
{
int a,b,c,i;
a=c=0;
for(i=0;i<10;i+=2)
{ a+=i;
;
c+=b;
}
printf("偶数之和=%dn",a);
printf("奇数之和=%dn",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()
{ int i, 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()
{ int x=15;
while(x>10 && x<50)
{ x++;
if(x/3){x++;break;}
else continue;
}
printf(“%dn”,x);
}
考点:本例考查break和continue在循环结构中的综合使用。
分析:本题输出15到50以内第一个被3整除不为0的整数且让该整数
加1。
答案:17
3.2 自测练习与参考答案
3.2.1选择题
1.以下程序的输出结果是 。
main( )
{
int x=10,y=10,i;
for(i=0;x>8;y=++i)
printf("%d %d ",x--,y);
}
A) 10 1 9 2 B) 9 8 7 6 C) 10 9 9
0 D) 10 10 9 1
2.以下程序的输出结果是_______。
main()
{ int n=4;
while(n--)printf("%d ",--n);
}
A) 2 0 B) 3 1
C) 3 2 1 D) 2 1 0
3.执行下面程序片段的结果是_______。
int x=23;
do
{
printf("%2d",x--);}
while(!x);
A) 321 B) 23 C) 不输出任何内容 D) 陷入死循环
4.以下程序的输出结果是________。
main()
{
int i;
for(i=1;i<6;i++)
{
if(i%2){printf("#"); continue;}
printf("*");
}
printf("n");
}
A) #*#*# B) ##### C) *****
D) *#*#*
5.以下循环体的执行次数是________。
main()
{ int i,j;
for(i=0,j=1; i<=j+1; i+=2, j--)printf("%d n",i);
}
A) 3 B) 2 C) 1
D) 0
6.有如下程序
main()
{ int i,sum;
for(i=1;i<=3;sum++) sum+=i;
printf("%dn",sum);
}
该程序的执行结果是_______。
A) 6 B) 3 C) 死循环 D) 0
7.有以下程序段
int n=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()
{ int n=9;
while(n>6)
{
n--;printf("%d",n);}
}
该程序段的输出结果是_______。
A) 987 B) 876 C) 8765
D) 9876
9.以下程序的输出结果是_______。
main()
{
int i;
for(i='A';i<'I';i++,i++)
printf("%c",i+32);
printf(" n");
}
A) 编译不通过,无输出 B) aceg
C) acegi D) abcdefghi
10.有以下程序段
int k=0
while(k=1)k++;
while 循环执行的次数是_______。
A) 无限次 B) 有语法错,不能执行
C) 一次也不执行 D) 执行1次
11.以下程序执行后sum的值是_______。
main()
{ int i , sum;
for(i=1;i<6;i++) sum+=i;
printf(“%dn”,sum);
}
A) 15 B)14 C) 不确定
D)0
12.有以下程序
main()
{ int i;
for (i=0; i<3; i++)
switch (i)
{ case 1: printf("%d ", i);
case 2: printf("%d ", i);
default : printf("%d ", i);
}
}
执行后输出结果是 。
A)011122 B)012 C
13.以下程序的输出结果是_______。
main()
{ int num= 0;
while(num<=2)
{
num++; printf("%dn",num);
}
A) 1 B) 1 C)1
2 2 2
3 3
4
14.以下程序的输出结果是_______。
main()
{
int a,b;
for(a=1,b=1;a<=100;a++)
{ if(b>=10) break;
if(b%3==1)
{
b+=3;continue;
}
}
printf("%dn",a);
}
)012020 D
D) l
)120
A) 101 B) 6 C) 5 D) 4
15.有以下程序
main()
{ int k=4,n=0;
for( ; n { n++; if(n%3!=0) continue; k--; } printf("%d,%dn",k,n); } 程序运行后的输出结果是_______。 A)1,1 B)2,2 C)3,3 D)4,4 16.有以下程序 main() { int s=0, a=1, n; scanf("%d", &n); do{ s+=1; a=a-2; } while(a!=n); printf("%dn", s); } 若要使程序的输出值为2,则应该从键盘给n输入的值是_______。 A) -1 B) -3 C) -5 D) 0 17.要求以下程序的功能是计算:s= 1+1/2+1/3+……+1/10 main() { int n; float s; s=1.0; for(n=10;n>1;n--) s=s+1/n; printf("%6.4fn", s); } 程序运行后输出结果错误,导致错误结果的程序行是_______。 A) s=1.0; B) for(n=10;n>1;n--) C) s=s+1/n; D) printf("%6.4fn", s); 18.执行以下程序后,输出的结果是 。 main() { int y=10; do{ y--; }while(--y); printf("%dn",y--); } A) -1 B) 1 C)8 D)0 19.执行语句:for(i=1;i++<4;)后,变量i的值是 。 A) 3 B) 4 C) 5 D) 不定 20.以下程序的输出结果是_______。 #include void main() { int k=0,m=0; int i, 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=3 B)k=0,m=5 C)k=1,m=3 D)k=1,m=5 21.当执行以下程序段时 。 int x; 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) int i=100; B) int k=1000; while(1) do {i=i%100+1; {++k;} while(k>=10000); if(i>100) break;} C) for(;;); D) int s=36; while(s); --s; 25.若程序执行时的输入数据是“2473”,则下述程序的输出结果是_______。 #include void main() { int cx; while((cx=getchar())!='n') { switch(cx-'2') { case 0: case 1: putchar(cx+4); case 2: putchar(cx+4); break; case 3: putchar(cx+3); default: putchar(cx+2); } } } A)668977 B)668966 C)6677877 D)6688766 26.从以下给出的表达式中选择与while(E)语句中的(E)不能等价的表达式 ______ 。 A) (!E==0) B) (E>0)|| (E<0) C)(E==0) D)(E!=0) 27.以下叙述正确的是______。 A) do-while语句构成的循环不能用其他语句构成循环。 B) do-while语句构成的循环只能用break语句退出。 C) 用 do-while语句构成的循环,在while后的表达式为非0时结束循环。 D) 用 do-while语句构成的循环,在while后的表达式为0时结束循环。 28.对for(表达式1; ;表达式3)可理解为______。 A) for(表达式1;0 ;表达式3) B) for(表达式1;1 ;表达式3) C) for(表达式1;表达式1 ;表达式3) D) for(表达式1;表达式3 ;表达式3) 29.C语言中用于结构化程序设计的三种基本结构是______。 A) 顺序结构、选择结构、循环结构 B) if、switch、break C) for、while、do-while D) if、for、continue 30.以下程序的功能是:按顺序读入10名学生4门课程的成绩,计算出每位学生 的平均分并输出,程序如下: main() { int n,k; float score ,sum,ave; sum=0.0; for(n=1;n<=10;n++) { for(k=1;k<=4;k++) { scanf(“%f”,&score); sum+=score; } ave=sum/4.0; printf(“NO%d:%fn”,n,ave); } } 上述程序运行后结果不正确,调试中发现有一条语句出现在程序中的位置不正 确。这条语句是______。 A) sum=0.0; B) sum+=score; C) ave=sun/4.0; D) printf(“NO%d:%fn”,n,ave); 3.2.2填空题 1.要使以下程序段输出10个整数,请填入一个整数。 for(i=0;i<= ; printf("%dn", i+=2)); 2.下面程序的功能是计算1到20之间的奇数之和偶数之和,请填空。 #include void main() { int a,b,c,i; a=c=0; for(i=0;i<=10;i+=2) { a+=i; ; c+=b; } printf("偶数之和:%dn",a); printf("奇数之和:%dn",c-21); } 3.下面程序的输出结果是 。 #include void main() { int a=100,b=0; do { b=b+a; a--; } while(a>2); printf("%dn",b); } 4.设有如下程序段: int i=0,sum=1; do{ sum+=sum; i++; } while(i<6); printf("%dn",sum); 上述程序段的输出结果是 。 5.已知如下公式: Π/2 = 1+1/3+(1/3)(2/5)+ (1/3)(2/5)(3/7)+ (1/3)(2/5)(3/7)(4/9)+… 函数pi的功能时根据上述公式计算满足精度要求的Π值。请填空。 double pi(double eps) { double s=0.0,t=1.0; int n; for(n=1; 【1】 ; n++) { s+=t; t=n*t/(2*n+1) } return 【2】 ; } 6.执行以下程序后,输出'#'号的个数是 。 #include main() { int i,j; for(i=1; i<5; i++) for(j=2; j<=i; j++) putchar('#'); } 7.以下程序的功能是调用函数fun计算:m=1-2+3-4+…+19-20,并输出结果,请 填空。 int fun( int n) { int m=0,f=1,i; for(i=1; i<=n; i++) { m+=i*f; f= 【1】 ; } return m; } main() { printf("m=%dn", 【2】 ); } 8.下述程序利用二分法求方程 在(-10,10)之间的根。请填空。 #include #include void main() { float eps=1.0E-5; float x0=0.0,x1=3.0,x=(x0+x1)/2.0; float mid=((5*x-4)*x+3)*x-6; while( 【1】 ) { if((((5*x0-4)*x0+3)*x0-6)* 【2】 <0) x1=x; else x0=x; x=(x0+x1)/2.0; 【3】 =((5*x-4)*x+3)*x-6; } printf("root=%f",x); } 9.下述程序接收来自键盘的输入,直到按 符被原样输出,但若有连续的一个以上的空格时只输出一个空格。请填空。 #include #include void main() { char ch; char front='0'; while( 【1】 !=EOF) { if(ch!=' ') putchar(ch); if(ch==' ') if( 【2】 ) putchar( 【3】 ); front=ch; } } 10.下述程序按公式 求和并输出结果。请填空。 #include void main() { 【1】 ; int i; for(i=1;i<=100;i++) s+=i; for(i=1;i<=50;i++) s+=i*i; for(i=1;i<=10;i++) s+= 【2】 ; printf("sum= 【3】 ",s); } 11.菲波纳契数列中的头两个数是1和1,从第三个数开始,每个数等于前两个 数的和。下述程序计算此列数列的前50个数,且每行输出10个数。请填空。 #include void main() { int f,f1=1,f2=1; int i; printf("%6d, %6d",f1,f2); for(i=3;i<=50;i++) { f= 【1】 ; printf("%6d",f); if( 【2】 ) printf("n"); f1=f2; 【3】 ; } } 12.下述程序用“辗转相除法”计算两个正整数m和n 的最大公约数。该方法的 基本思想是计算m和n相除的余数,如果余数为0则结束,此时的被除数就是最 大公约数。否则,将除数作为新的被除数,余数作为新的除数,继续计算m和n 相除的余数,判断是否为0,等等。请填空。 #include void main() { int i,m,n; scanf("%d, %d",&m,&n); while(n) { i= 【1】 ; m= 【2】 ; n= 【3】 ; } printf("%d",m); } 13.以下程序的输出结果是 。 main() { int s,i; for(s=0,i=1;i<3;i++,s+=i); printf("%dn",s); } 3.3.3 参考答案 一.选择题: 1.D 2.A 3.B 4.A 5.D 6.C 7.D 8.B 9.B 10.A 11.C 12.A 13.B 14.D 15.C 16.B 17.C 18.D 19.B 20.B 21.C 22.A 23.C 24.B 25.A 26.C 27.D 28.B 29.A 30.A 二.填空题: 1. 18或19 2. b=i+1 3. 5047 4. 64 5. 【1】t>eps 【2】 2.0*s 6. 6 7. 【1】-f 【2】fun(20) 8. 【1】 fabs(mid)>eps 【2】 mid 【3】 mid 9. 【1】 (ch=getchar()) 【2】 front!=' ' 【3】 chs 10. 【1】 float s=0.0 【2】 1.0/i 【3】%f 11. 【1】 f1+f2 【2】 i%10==0 【3】 f2=f 12. 【1】 m%n 【2】 n 【3】 i 13. 5
版权声明:本文标题:C语言各章节单元测试题及答案——循环结构程序设计 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1713691499a647227.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论