第六章循环控制_第1页
第六章循环控制_第2页
第六章循环控制_第3页
第六章循环控制_第4页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第六章 循环控制(一)选择题【例6-1】 在循环语句结构中,当循环条件为( )时,执行循环体语句。A.0B.falseC.trueD.非0解析:当循环控制条件表达式的值非零时为“真”,执行循环体语句。答案:D举一反三:在循环语句结构中,循环条件为( )时,结束循环。(答案:0)【例6-2】 以下程序的运行结果是()main() int sum=0,i=11; do sum=sum+i; i+; while(i=10); prinf(“sum=%d,i=%d”,sum,i);A. sum=0,i=11 B. sum=0,i=12 C. sum=11,i=11 D. sum=11,i=12解析:d

2、o-while循环语句的执行顺序是先执行循环体再判断,因此循环体至少执行一次。本题先执行循环体sum=sum+i=11;i+;i增值为12,再判断循环条件(i=10)不满足,结束循环。答案:D举一反三:若将此题循环部分改为: while(i=10) sum=sum+i;i+; 则输出结果为:sum=0,i=11. while循环的执行顺序是先判断循环条件满足后再执行循环体。【例6-3】 对循环语句:for(表达式1;表达式2;表达式3)语句,以下叙述正确的是( )。A. for语句中的三个表达式一个都不能少B. for语句中的循环体至少要被执行一次C. for语句中的循环体可以是一个复合语句D

3、. for语句只能用于循环次数已经确定的情况解析:选项A是错误的。如果初始条件使表达式2为零,循环体就不会被执行,所以,选项B错误。for语句对于循环次数不确定的情况也是可以处理的,实际上while语句是能够实现的,for语句都可以实现。选项D是不对的。正确的应该是选项C。l for语句中的三个表达式都是可以省略的。l 循环体可以是任何类型的语句。答案:C【例6-4】 以下程序段执行后i的值是( )。int i;for(i=1; i5; )i+;A3 B4 C5 D6解析:本题的for语句中表达式3省略了,循环变量的改变放在循环体中,先判断表达式i5,然后执行循环体i+。当i=5时,比较i0;

4、y-) if(y%3=0)printf(%d,-y);A.741B.852 C.963D.87521解析:在循环之前已经给y赋初值9,for语句中省略了表达式1,y 0执行循环体,当y % 3 = = 0为“真”时,输出- - y;否则,不输出,继续执行循环,当y 0不成立时,退出循环。在for循环语句中,通常表达式1是给循环语句中的变量赋初值,如果省略了表达式1,那么要在循环之前给循环语句中的变量赋初值。答案:B【例6-7】 执行完循环语句for(i=1,s=0;i+10;i+) s=s+i; 后,变量i,s的值各是多少?循环体被执行了几次?A. i的值是11,s的值是30,循环体执行了6次

5、B. i的值是12,s的值是30,循环体执行了6次C. i的值是11,s的值是30,循环体执行了5次D. i的值是12,s的值是30,循环体执行了5次解析:本题的for语句中循环变量的改变放在表达式2与表达式3中,先判断表达式2:i+10,其中自增运算符“+”的优先级高于关系运算符“”,所以先执行表达式i+,表达式的值是i的值,而后i本身再加1,如第一次循环i=1,s=0,表达式i+的值为1,110条件成立,而i本身增值为2,此时执行循环体s=0+2=2,然后执行表达式3:i+;i增值为3。依次类推,当i=9时,910条件满足,i本身=10,s=2+4+6+8+10=30,之后执行表达式3:i

6、+;i增值为11,此时比较1110(不满足条件),i的值为12,退出循环,此时循环体被执行了5次(i=1,3,5,7,9时,执行循环体)。答案:D【例6-8】 若x,y是int型变量,执行以下语句后x的值是( )。for(y=1,x=1;y=10) break;if(x%2=1) x+=5;continue;x-=3;A.1 B.6 C.7 D.10解析:当x = 10为“真”执行break;语句或当y =10 break;x%2=1 x+=5;continuex-=3;完成本次循环后x的值第一次x=1,y=1假 不执行真 执行不执行6第二次x=6,y=2假 不执行 假 不执行执行3第三次x=

7、3,y=3假 不执行真 执行不执行8第四次x=8,y=4假 不执行 假 不执行执行5第五次x=5,y=5假 不执行真 执行不执行10第六次x=10,y=6真 执行,结束循环【例6-9】 对以下程序段,描述正确的是()。int k=10;while(k=0) k=k-1;A. 循环体执行了10次 B. 循环是无限循环C. 循环体语句一次也不执行 D. 循环体语句执行了一次解析:表达式k=0是一个赋值表达式而不是一个关系表达式,将0赋值给k,且此表达式的值也为0,所以,循环体语句一次也不执行。答案:C举一反三:如果将程序段改为: int k=10; while(k!=0) k=k-1;那么,循环体

8、将被执行10次。若再改为: int k=10; while(k=0) k=k-1;那么,循环体一次也不执行。【例6-10】 对以下程序段,描述正确的是()。int k=10;while(k0) printf(%d,k);k=k-1;A被执行了10次 B. 循环是无限循环C循环体一次也不执行 D. 循环体语句执行了1次解析:循环体语句是printf(“%d,”,k);没有使循环趋于结束的语句,导致死循环,k=k-1;不是循环体内的语句。答案:B举一反三:如果将程序段改为:int k=10; 或 int k=10;while(k0) while(k0) printf(“%d,”,k); print

9、f(“%d,”,k), k=k-1; k=k-1;加一对括号,使循环体是一个复合语句或使用逗号表达式语句,那么,循环将是有限次的。还可以用以下方法,使循环成为有限的。l 将原题的printf(“%d,”,k);改成:printf(“%d,”,k - -);l 将原题的(k0)改成:(k - - 0)并且去掉k=k-1;等等。【例6-11】 下面程序的运行结果是()。main() int i,j,k,x=0;for(i=0;i2;i+) x+;for(j=0;j3;j+) if(j%2) continue; x+;x+;k=i+j;printf(k=%d,x=%dn,k,x);A.k=8,x=4

10、 B.k=5,x=8 C.k=3,x=6 D.k=8,x=12解析:本例是一个二重循环结构,内层循环在j=3时终止,外层循环在i=2时终止,故k=5。本程序的运行情况见表6-2。表6-2 程序运行情况初值x=0i=0执行x+;(x=1)外 循 环j=0j%2为假执行x+;(x=2)j=1j%2为真执行continue;j=2j%2为假执行x+;(x=3)j=3j3为假结束内循环执行x+;(x=4)执行x+;(x=5)i=1内 循 环j=0j%2为假执行x+;(x=6)j=1j%2为真执行continue;j=2j%2为假执行x+;(x=7)j=3j3为假结束内循环执行x+;(x=8)i=2,i

11、2为假, 结束外循环(k=i+j=5)答案:B举一反三:读者要从循环体的有限次运行中,找出规律,推出问题的结论。在上述程序中,如果将外层循环的条件条件表达式“i2”改成“i100”,将内层循环的条件表达式“j3”改成“j10”,那么,程序的运行结果又如何呢?(答案:k=110,x=700)(二)阅读程序题【例6-1】 以下程序的输出结果是() main() int n;for(n=1;n=20;n+) if(n%3=0) continue;printf(“%d,”,n); 解析:当n能被3整除时,执行continue语句,结束本次循环(即跳过printf函数语句),只有n不能被3整除时才执行p

12、rintf函数,所以此题是求在120内不能被3整除的数。答案:1,2,4,5,7,8,10,11,13,14,16,17,19,20,举一反三:若将本题中的continue;语句改为break;语句,则结果为:1,2,。 break语句的功能是当满足条件时,跳出循环体,结束循环。因此,当n=3时,执行break语句,循环结束。(三)完善程序题【例6-1】 为了输出如下图形,请在程序的 处填入合适的内容。* * * * * * * * * * * * * * * *main() int i,j;for(i=1;i6;i+) for(j=1;j5;j+) (1) ; (2) ;解析:使用循环嵌套。

13、循环变量i控制输出行数(共5行),循环变量j控制每行输出“*”的个数,此外,还要考虑在每一行输出完后,光标要换行,所以,第一个空处应该填入printf(“*”),第二个空处应该填入printf(“n”).注意:printf(“n”);语句是外循环体中的一条语句,但它不是内循环体中的语句,答案:(1)printf(“*”);printf(“n”);举一反三:打印如下图形:* * * * * * * * * * * * * * * * * * * * * * *main() int i,j;for(i=1;i6;i+) for(j=1;j10-i;j+)printf(“ ”); for(j=1;j

14、6;j+)printf(“*”);printf(“n”); 打印如下图形: * * * * * * * * * * * * * * * * * * * * * * * * *main() int i,j, k;for(i=1;i=5;i+) for(j=1;j=5-i;j+) /*每行前输出空格*/printf(“ ”); for(k=1; ;k+) /*每行输出“*”号*/printf(“*”);printf(“n”);答案:k=2*i-1打印如下图形:* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

15、* * * *main() int i,j;for(i=1;i10;i+) if(i6) for(j=1;j6-i;j+) /*输出上半部分三角形*/ printf(“ ”);for(j=1; (1) ;j+)printf(“*”); else for(j=1;j=i-5;j+) /*输出下半部分三角形*/ printf(“ ”);for(j=1; (2) ;j+)printf(“*”);printf(“n”);答案:(1)j=2*i-1(2)j=19-2*i【例6-2】用/4=1-1/3+1/5-1/7+公式求的近似值,直到某一项的绝对值小于10-6为止#includemain() int

16、s; float n,t,pi; t=1;pi=0;n=1.0;s=1; while( ) pi=pi+t;n=n+2;s=-s;t=s/n;pi=pi*4;printf(“pi=%fn”,pi);解析:while循环中,若想找到满足循环的条件,可以先判断出循环的结束条件,它的相反值即循环条件。本题的循环结束条件为某一项的绝对值小于10-6,则循环条件为某一项的绝对值大于10-6。答案:fabs(t)1e-6【例6-3】判断m是否素数 main() int m,i,k; scanf(“%d”,&m); for(i=2;i=m)printf(“%d是一个素数n”,m); else printf(“%d不是一个素数n”,m); 解析:判断一个数m是否素数的条件是m能否被2m-1之中任何一个整数整除,如果能整除,则该数不是素数,提前结束循环,此时i必然小于m;如果不能被整除,则在完成最后一次循环后,i还要加1,因此i=m,然后才终止循环。由于有两种情况结束循环,所以在循环之后判别i的值是否大于或等于m,若是,则表明未曾被2m-1之间任一整数整除过,该数是素数,否则,不是素数。因此本题空白处应填提前结束

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论