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,直到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()

{

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.下述程序接收来自键盘的输入,直到按+Z(值为-1)键为止。这些字

符被原样输出,但若有连续的一个以上的空格时只输出一个空格。请填空。

#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


本文标签: 循环 程序 输出 结果 语句