




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章 循环控制 6 61 1 概述概述 所谓循环控制,就是如何实现循环结构所谓循环控制,就是如何实现循环结构的控制问题。的控制问题。有有4 4种方法:种方法: 用用gotogoto语句和语句和ifif构成循环。构成循环。 用用whilewhile语句。语句。 用用do-whiledo-while语句。语句。 用用forfor语句。语句。6 62 2 用用gotogoto语句和语句和ifif语句构成循环语句构成循环例例: : 对于计算对于计算 s=1+2+3+4+5+6+7+8+9+100 s1 is+i s i+1 ii10 输出syn s=0;s=0; i=1; i=1; label:la
2、bel:s+=i;s+=i; i+; i+; if(i=10) if(i=10) goto labelgoto label; ; printf(“%d”,s) printf(“%d”,s) ;语句标号 无条件转向语句 goto goto 语句可以构语句可以构造循环,但不主张用,造循环,但不主张用,因为它容易破坏结构因为它容易破坏结构化程序设计。化程序设计。 6 63 while3 while语句语句 whilewhile语句是专门用于实现循环控制的语语句是专门用于实现循环控制的语 句之一。句之一。 其一般形式为:其一般形式为: while (while (表达式表达式) ) 语句语句 含义:当
3、表达式的值为非含义:当表达式的值为非0 0时,执行循环体,时,执行循环体,否则执行后续语句。否则执行后续语句。语句关键 表达循环条件的表达式循环体 语句关键字 执行过程执行过程: : while (while (表达式表达式) ) 语句语句 表达式循环体0非0例:用例:用whilewhile语句实现前面算法:语句实现前面算法:eg6-1eg6-1main()main() int i=1,s=0; int i=1,s=0; while(i=10)while(i=10) s=s+i; s=s+i; i+; i+; printf(“n %d”,s); printf(“n %d”,s); 注意注意:
4、:循环体若包括一条以上的语句,使用花括号。循环体若包括一条以上的语句,使用花括号。循环体中要有使循环趋于结束的条件循环体中要有使循环趋于结束的条件i 1 0? s=0 i=1s=s+ii=i+1yn while(i=10)while(i=10) s=s+i; s=s+i; i+; i+; 可简写为:可简写为: eg6-2eg6-2 while(i=10) s+=i+; while(i=10) s+=i+;非0(真)0(假)表达式循环体 6 64 do-while4 do-while语句语句 do-whiledo-while语句主要用于实现直到型循环。语句主要用于实现直到型循环。 其一般形式为:
5、其一般形式为: dodo 循环体循环体 while(while(表达式表达式);); 执行过程:执行过程:例:用例:用do-whiledo-while语句实现前面算法:语句实现前面算法:eg6-3eg6-3 main() main() int i=1,s=0; int i=1,s=0; dodo s+=i+;s+=i+; while(i=10);while(i=10); printf(“n%d”,s); printf(“n%d”,s); 真s=0i=1i10?s=s+ii=i+1假do-while与与while语句的区别语句的区别#include void main()int s=0,i;sc
6、anf(%d,&i);while(i=10)s+=i+;printf(%dn,s); eg6-4#include void main()int s=0,i;scanf(%d,&i);dos+=i+;while(i=10);printf(%dn,s); eg6-5输入的输入的i:10dowhile能方便的实现“直到型”循环,但应将条件取反。 0 s 1 i 输出s s+i s i+1 i 直到i10直到型main()main() int i=1,s=0; int i=1,s=0; dodo s+=i+; s+=i+; while(i=10);while(i=10); printf(“n%d”,s
7、); printf(“n%d”,s); 假表达式2求解表达式1循环体求解表达式3真 6 65 for 5 for 语句语句 forfor语句是一种使用最为灵活,并语句是一种使用最为灵活,并且是用得最多的循环控制语句,且是用得最多的循环控制语句,其一般形式为:其一般形式为:for(for(表达式表达式1;1;表达式表达式2;2;表达式表达式3)3) 循环体循环体大体含义:大体含义:对于()中的情况执对于()中的情况执行循环体内容:行循环体内容:表达式表达式1 1:赋初值:赋初值表达式表达式2 2:判断循环条件是否成立:判断循环条件是否成立表达式表达式3 3:改变循环条件(避免进:改变循环条件(避
8、免进入死循环)入死循环)例:用例:用forfor语句实现前面的算法:语句实现前面的算法:eg6-6eg6-6s=0;s=0;for(i=1;i=10;i+) s+=i; for(i=1;i=10;i+) s+=i; 标准形式标准形式表达式1 表达式2表达式3循环体可以理解:可以理解: 循环变量循环变量i i从初值从初值1 1开始到终值开始到终值1010,步长为,步长为1 1,重复执,重复执行循环体。行循环体。forfor语句的常见变化:语句的常见变化: s=0; i=1;s=0; i=1; for(;i=10;i+)s+=i; for(;i=10;i+)s+=i; s=0;s=0; f o r
9、 ( i = 1 ; i = 1 0 ; ) s + = i + + ; f o r ( i = 1 ; i = 1 0 ; ) s + = i + + ; s=0;i=1;s=0;i=1; for(;i=10;)s+=i+; for(;i=10;)s+=i+;(1 1)省略表达式)省略表达式1 1(2 2)省略表达式)省略表达式3 3(3 3)省略表达式)省略表达式1 1和和3 3for(i=1;i10) break; if(i10) break; s=10;i=10; s=10;i=10; for(;-i;) s+=i; for(;-i;) s+=i;(4 4)省略三个表达式)省略三个表达
10、式表达式表达式2 2可为任意表达可为任意表达式,值为式,值为0 0时跳出循环时跳出循环eg6-7eg6-7标准形式:标准形式:for(i=1;i=10;i+) s+=i; 循环体之前赋初值循环体内改变循环条件循环体内判断循环条件eg6-8eg6-8 s=0; s=0; for(i=1,j=10;ij;i+,j-) s+=i+j; for(i=1,j=10;ij;i+,j-) s+=i+j; 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10在程序设计中在程序设计中不要不要过分追求它的多变性过分追求它的多变性ij用逗号表达式用逗号表达式多个初值修改多个循环变量例:
11、例:求求n! n!=1n! n!=1* *2 2* *3 36-9(n-1)6-9(n-1)* *n n 参照累加求和参照累加求和 eg6-9eg6-9main()main() int i,n=5 int i,n=5,s=1;s=1; for(i=1;i=n;i+)s for(i=1;i=n;i+)s* *=i;=i; printf(“n s=%d”,s); printf(“n s=%d”,s); 注意注意s s的初值。的初值。注意当注意当n n较大时的情况。较大时的情况。求和与连乘都是最常用的算法,要熟练掌握。求和与连乘都是最常用的算法,要熟练掌握。 例:求自然数例:求自然数1-1001-1
12、00中能被中能被3 3整除的数之和。整除的数之和。 main()main() int i,s=0; int i,s=0; printf(“n %d”,s); printf(“n %d”,s); eg6-10,eg6-11:1683eg6-10,eg6-11:1683 求能被求能被3 3整除但不被整除但不被7 7整除的数之和?整除的数之和?eg6-12:1473for(i=1;i=100;i+) s+=i;for(i=1;i=100;i+) if(i%3=0)s+=i;for(i=3;i=100;i+=3) s+=i; for(i=3;i=100;i+=3) if (i%7)s+=i; 例:求任
13、意例:求任意100100个数中的最大值。个数中的最大值。eg6-13eg6-13 main() main() int i,a,max; int i,a,max; max=?max=? for(i=1;i=100;i+) for(i=1;imax) max=a;if(amax) max=a; printf(“n max=%d”,max); printf(“n max=%d”,max); 循环体中没有引用循环变量。循环体中没有引用循环变量。i i的作用?的作用? 求任意个数中的最大值?求任意个数中的最大值?eg6-14 eg6-15eg6-14 eg6-15for(i=1; ;i+)for(i=1
14、; ;i+) if(a=-9999)break;if(a=-9999)break;max=-32768/-2147483647 ;max=-32768/-2147483647 ;6.6 循环的嵌套循环的嵌套在c语言中,三种循环可以相互嵌套(1) while( ) (2) do (3) for( ; ; ) while( ) do for( ; ;) . . .while( ); . . . while( ); (4) while( ) (5) for( ; ;) (6) do do while( ) for( ; ;) . . .while( ); . . . . . . while( );6
15、.7 几种循环的比较几种循环的比较1.四种循环通常可以用来解决同一问题,但不提倡使用goto语句,因为它是非结构化语句;2.while和dowhile中循环体是反复执行的部分,要有使循环趋于结束的语句。for中使循环趋于结束的操作在表达式3中。3.while , do while 中循环变量初始化在该语句之前,而for是在表达式1中;4.while, for先判断表达式,然后再执行语句,而do while先执行语句,再判表达式;5.while , do while , for 可用break 跳出循环,continue是结束本次循环,而 if - goto 中不能使用break 和 conti
16、nue语句eg6-16 已知半径 r , 计算圆面积area,当area 100时结束程序的运行。main() int r ; float pi=3.14159, area; for( r=1 ; r 100) break ; printf( “r=%d , area=%5. 2f n”, r, area); 输出:r=1, area=3.14 r=2, area=12.57 r=3, area=28.27 r=4, area=50.27 r=5, area=78.85 / * 当 r=6时,area=113.10 故此值没有被输出 */6.8 break 和和 continue 语句语句6.
17、8.1 break 语句语句一般形式一般形式: break;功能功能:结束循环语句,转向循环语句的下一语句,在多层循环结构中,只退出包含它的那层循环。本语句仅限用于 while, do while , for, switch 语句6.8.2 continue语句语句一般形式一般形式:continue;功能功能:跳过循环体中后面的语句,进入本循环结构的下次循环, 在while 和 do while中立即转到表达式进行判断。 在for语句中,转到表达式3进行增量,再转到表达式2进行判断。eg6-17 把100 - 120之间不能被3整除的数输出。main( )int n; for(n=100; n
18、=120; n+) if(n%3=0) printf (“ n” ); continue; printf( “%d,” , n); 运行结果:运行结果:100,101, 103,104,106,107, 109,110, 112,113, 115,116, 118,119,例:例:一场晚会要现场随机抽取幸运观众,抽一场晚会要现场随机抽取幸运观众,抽取办法是由主持人随机给定一个数字,如座位取办法是由主持人随机给定一个数字,如座位的行号和列号之和正好等于该数字的观众就是的行号和列号之和正好等于该数字的观众就是幸运观众,已知晚会现场共有幸运观众,已知晚会现场共有3030排座位,每排排座位,每排202
19、0个座位,请编写程序,从键盘输入主持人随个座位,请编写程序,从键盘输入主持人随机给定数字,输出所有幸运观众的坐号。机给定数字,输出所有幸运观众的坐号。 eg6-18 main()main() int i,j,num; int i,j,num; scanf(“%d”,&num); scanf(“%d”,&num); for(i=1;i=30;i+) for(i=1;i=30;i+) for(j=1;j=20;j+) for(j=1;j=20;j+) if(i+j=num) if(i+j=num) printf(“n%d,%d”,i,j); printf(“n%d,%d”,i,j); 注意循环的关
20、系例:百钱买百鸡问题。例:百钱买百鸡问题。 给定给定100100块钱,要求正好买块钱,要求正好买100100只鸡,已知公只鸡,已知公鸡鸡5 5元元/ /只,母鸡只,母鸡3 3元元/ /只,小鸡只,小鸡1 1元元/3/3只,问公只,问公鸡、母鸡和小鸡应各买多少只?鸡、母鸡和小鸡应各买多少只?若考虑用方程组:若考虑用方程组: x+y+z=100 x+y+z=100 5x+3y+z/3=100 5x+3y+z/3=100 是一个多解问题。是一个多解问题。用测试法求解的程序:用测试法求解的程序: eg6-19 main() main() int x,y,z; int x,y,z; for(x=1;x=
21、100;x+) for(x=1;x=100;x+) for(y=1;y=100;y+) for(y=1;y=100;y+) for(z=1;z=100;z+) for(z=1;z=100;z+) if(x+y+z=100&5 if(x+y+z=100&5* *x+3x+3* *y+z/3.0=100)y+z/3.0=100) printf(“n%d,%d,%d”,x,y,z); printf(“n%d,%d,%d”,x,y,z); 程序可进一步简化为:程序可进一步简化为: eg6-20 main() main() int x,y,z; int x,y,z; for(x=1;x=20;x+) f
22、or(x=1;x=20;x+) for(y=1;y=33;y+) for(y=1;y=33;y+) z=100-x-y; z=100-x-y; if(5 if(5* *x+3x+3* *y+z/3.0=100)y+z/3.0=100) printf(“n%d,%d,%d”,x,y,z); printf(“n%d,%d,%d”,x,y,z); 用测试法求解问题的典型例子用测试法求解问题的典型例子测试法求解的程序设计有两个要点:测试法求解的程序设计有两个要点: 通过循环列出所有可能的解。通过循环列出所有可能的解。 对所有列出的可能的解进行条件测试。对所有列出的可能的解进行条件测试。例:判断一个数例
23、:判断一个数m m是否为素数。是否为素数。 eg6-21main()main() int i,m; int i,m; scanf(“%d”,&m); scanf(“%d”,&m); for(i=2;im;i+) if(m%i=0)break;for(i=2;im;i+) if(m%i=0)break; if(i=m) if(i=m) printf(“n %d is a prime”,m); printf(“n %d is a prime”,m); else else printf(“n %d is not a prime”,m); printf(“n %d is not a prime”,m)
24、; 用测试法求解用测试法求解例:(习题例:(习题6.66.6) 打印出所有的打印出所有的“水仙花数水仙花数”,所谓,所谓“水水仙花数仙花数”是指一个三位数,其各位数字的是指一个三位数,其各位数字的立方和等于该数本身。如:立方和等于该数本身。如:153153是一水仙花是一水仙花数,因为数,因为 153=1153=13 3+5+53 3+3+33 3。eg6-22main()main() int i,j,k,n; int i,j,k,n; for(n=100;n=999;n+) for(n=100;n=999;n+) i=? i=? j=? j=? k=? k=? if(i if(i* *i i*
25、 *i+ji+j* *j j* *j+kj+k* *k k* *k=n)k=n) printf(“n%d”,n); printf(“n%d”,n); 通过循环列出通过循环列出n n的所有可能的范围的所有可能的范围 i=n/100;k=n%10;j=n/10%10;eg6-23main()main() int i,j,k,n; int i,j,k,n; for(i=1;i=9;i+) for(i=1;i=9;i+) for(j=0;j=9;j+) for(j=0;j=9;j+) for(k=0;k=9;k+) for(k=0;k=9;k+) n=in=i* *100+j100+j* *10+k;
26、10+k; if(i if(i* *i i* *i+ji+j* *j j* *j+kj+k* *k k* *k=n)k=n) printf(“n%d”,n); printf(“n%d”,n); 通过循环列出通过循环列出i,j,ki,j,k的所有可能的范围的所有可能的范围main()main() int i,j; int i,j; float t,s=0; float t,s=0; for(i=1;i=20;i+) for(i=1;i=20;i+) s+=?s+=?; ; printf(“n s=%f”,s); printf(“n s=%f”,s); 用两重循环实现用两重循环实现s+=t;t=1
27、;t=1;for(j=1;j=i;j+) tfor(j=1;j=i;j+) t* *=j;=j;例例:(:(习题习题6.4 6.4 ) eg6-24求求s=i! =1 1!+2+2!+3+3!+4+4!+ +19+19!+20+20!20i=1用递推法:用递推法: 递推公式:递推公式:t ti i=t=ti-1i-1.i.i求求s=i! =1 1!+2+2!+3+3!+4+4!+ +19+19!+20+20!20i=1=1+(i-1)!.i = 1+ti-1.i 20i=220i=2main()main() int i,j; int i,j; float t=1,s=t; float t=1,
28、s=t; for(i= for(i=2 2;i=20;i+);i=20;i+) t=tt=t* *i;i; s+=t; s+=t; printf(“n s=%f”,s); printf(“n s=%f”,s); eg6-25例:例: 递推公式:递推公式: s=s= i i!1120= = + + + + + 1! 2! 3! 4! 20!1 1 1 1 1t ti i= t= ti-1 i-1 / / i ieg6-26main()main() int i,j; int i,j; float t= float t=1 1,s=t;,s=t; for(i= for(i=2 2;i=20;i+);
29、i=20;i+) t=tt=t* *i;i; s+=t; s+=t; printf(“n s=%f”,s); printf(“n s=%f”,s); t=t/i;t=t/i;习题习题6.3:6.3: s=a+aa+aaa+aaaa+aaaaa s=a+aa+aaa+aaaa+aaaaa 2+22+222+2222+22222 2+22+222+2222+22222 递推公式:递推公式:t ti i= t= ti-1i-1? ?t ti i= t= ti-1 i-1 * * 10+a10+aeg6-27main()main() int i,j,a=2; int i,j,a=2; float t=
30、 float t=a a,s=t;,s=t; for(i= for(i=2 2;i=5;i+);i=5;i+) t=tt=t* *10+a;10+a; s+=t; s+=t; printf(“n s=%f”,s); printf(“n s=%f”,s); 例:例:求定积分:求定积分: 数值积分数值积分 f (x)abxsinxxdxab等分nh=b-an第i个矩形:x=?x=a+(i-1).h#include “math.h” main() int n,i; float a,b,x,y,h,s=0; scanf(“%f%f%d”,&a,&b,&n); h=(b-a)/n; for(i=1;i=n;i+
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 银行网点春游活动方案
- 过期妊娠考试题及答案
- 广告手绘考试题及答案
- 骨科职称考试题及答案
- 古典剧目考试题及答案
- 公需考试题及答案
- 工地厨师考试题及答案
- 改良员考试题及答案
- 时间的价值议论文话题5篇
- 防疫保安考试题及答案
- 煤矿安全规程2025版解读
- 尿培养的采集
- 具有法律效应的还款协议书6篇
- 东航空乘英语考试题目及答案
- 2025年全国企业员工全面质量管理知识竞赛题及参考答案
- 2025年广东省中考英语试卷深度评析及2026年备考策略
- 2025-2026秋中小学升旗仪式演讲稿:(第3周)积跬步养习惯向未来
- 绿色建筑和绿色建筑材料
- 《七堂保险金信托课》读书笔记思维导图
- Jade6操作和应用优秀课件
- 渐开线花键强度校核(完整计算)
评论
0/150
提交评论