




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第 5 5 章章 循环控制程序设计循环控制程序设计 1. 目的、要求目的、要求 掌握掌握实现循环的实现循环的3种方法及其比较种方法及其比较。 掌握循环的嵌套。掌握循环的嵌套。 掌握掌握break和和continue语句的使用。语句的使用。2. 重点、难点重点、难点 循环结构的灵活应用。循环结构的灵活应用。循环型程序设计循环型程序设计 循环结构在程序设计中十分重要。所谓循环结构就是当给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。循环结构是结构化程序三种基本结构之一,可用于实现循环的c语句有: goto语句+if语句 while语句 d
2、owhile语句 for语句q问题提出打印整数打印整数1-10打印整数打印整数1-100打印整数打印整数1-n方法一:方法二:printf(“%d”,1);printf(“%d”,2);printf(“%d”,10);printf(“%d%d%d%d”,1,2,3,10);printf(“%d”,i);i+;printf(“%d”,i); i+;printf(“%d”,i); i+;i=1;程序段 int i=1; while (i=10) printf(%d,i); i+; 循环不变式循环不变式goto 语句及其构成的循环语句及其构成的循环goto语句为无条件转向语句,一般形式为:goto
3、语句标号;语句标号;语句标号的命名规则与变量名相同。 goto语句程序的可读性差、无规律,不符合结构化程序设计原则,因而只有在万不得已时才使用。 例:ifgoto循环1001nnsummain()int i,sum=0; i=1; loop:if (i=100) sum=sum+i; i+; goto loop; printf(%d,sum);while结构的应用结构的应用while语句用于实现“当型”循环结构,一般形式为:while(条件表达式)(条件表达式) 循环体循环体当表达式为非非0时,执行while的内嵌语句。特点:先判断表达式,后执行语句。特点:先判断表达式,后执行语句。 注意:
4、循环体可以是用花括号括起的复合语句;循环体中应有使循环趋于结束的语句,否则将进入死循环。 用计数法设置循环条件时,应特别注意“边界值”的选取。 while语句的意义为:计算表达式的值,若表达式的值为真(非0)时,则执行循环体语句;不断反复,直到表达式的值为假(0),则不执行循环体语句,而直接转向循环体外的第一条语句。 注意,whlie语句后没有分号(;)。 为了保证循环体可以结束,通常采用每循环一次向某种方向改变表达式的值,使得表达式的值最终可以为假。还有一种方法是在某种条件下,强行从循环体中跳出(如使用break语句)。 若表达式的值永远为真,则循环体被不断地执行,也就是说,永远不能从循环中
5、退出,我们通常称这种循环为“死循环”。在绝大多数情况下,都不允许死循环。pa假真a当p为真 计算表达式的值,为非0(逻辑真)时,重复执行内嵌语句,每执行一次,就判断一次表达式的值,直到表达式的值为0 时结束循环,转去执行while后面的语句。 当表达式为真当表达式为真 语句语句表 达 式 非表 达 式 非0?语句语句【例5.2】编写程序,求100个自然数的和即: sum=1+2+3+ +100 sum=0sum+1 sumsum+2 sumsum+3 sumsum+100 sum循环不变式sum=sum+?main( ) int i,sum; i=1; sum=0; while (i=100)
6、 sum=sum+i; i+; printf(sum=%dn,sum); i=1,sum=0 当当i = 100 sum=sum+i i+输出输出sum 为了保证循环正常运行,应该特别注意: 循环控制条件的描述 控制条件的初始状态(初始值) 循环体内部对控制条件的影响用于实现“直到型”循环结构,一般形式为:do 循环体循环体 while(条件表达式)(条件表达式); 先执行语句,再判断表达式的值,直到表达式的值为0时结束循环。特点:先执行语句,后判断表达式。特点:先执行语句,后判断表达式。do while结构的应用结构的应用pa假真a直到p为真 循环体循环体当表达式为真当表达式为真n-s结构图
7、结构图ny循环体循环体表达式非表达式非0?流程图流程图main( ) int i=1,sum=0; do sum=sum+i; i+; while (i=100); printf(%dn,sum);对于do-while语句还应注意以下几点:l 在if语句、while语句中,表达式后面都不能加分号,而在do-while语句的表达式后面则必须加分号;l do-while语句也可以组成多重循环,而且也可以和while语句相互嵌套;l 在do和while之间的循环体由多个语句组成时,必须用括起来;l do-while和while语句相互替换时,要注意修改循环控制条件;例:求i+(i+1)+(i+2)+
8、10,其中i由键盘输入,分别用两种语句编程while 循环程序do -while 循环程序#includemain()int i,sum=0; scanf(%d,&i); while(i=10) sum=sum+i; i+; printf(i=%d,sum=%dn,i,sum);#includemain()int i,sum=0; scanf(%d,&i); do sum=sum+i; i+; while(i=10); printf(i=%d,sum=%dn,i,sum);例:输入一些数,求和,直到输入负数为止#includemain() int x,sum=0; scanf(
9、%d,&x); while(x=0) sum=sum+x; scanf(%d,&x); printf(sum=%d,sum);#includemain() int x,sum=0; do scanf(%d,&x); sum=sum+x; while(x=0); printf(sum=%d,sum);输入:1,2,5,-10输入:-10,1,2,5结果:sum=8结果:sum=-2结果:sum=0结果:sum=-10一般形式为: for(表达式表达式1;表达式;表达式2;表达式;表达式3) 语句语句 最简单、最易理解的形式为:for(循环变量初值;循环条件;循环变量增值)
10、语句循环变量初值;循环条件;循环变量增值)语句如:for(i=1;i=100;i+) sum=sum+i;求解表达式1表达式2语句求解表达式3for语句的下一语句for结构的语法结构的语法0非 0 for语句一般格式 for (表达式1;表达式2;表达式3) 语句 for(表达式表达式1;表达式;表达式2;表达式;表达式3)语句)语句表达式表达式1;while (表达式(表达式2) 语句语句 表达式表达式3; 等价于n-s结构图结构图for (表达式表达式1;表达式表达式2;表达式表达式3) 语句语句ny流程图流程图计算表达式计算表达式1 计算表达式计算表达式3表达式表达式2为真为真?例如:m
11、ain( ) int i,sum; sum=0; for ( i=1; i=100; i+) sum=sum+i; printf(sum=%dn,sum);for语句用while实现 exp1;while(exp2) 语句语句; exp3; for ( ; ; ) 注意:在省略某个表达式时,应在适当位置进行循注意:在省略某个表达式时,应在适当位置进行循环控制的必要操作,以保证循环的正确执行环控制的必要操作,以保证循环的正确执行 3. 限定转向语句限定转向语句 break:终止循环或多路选择结构。 continue:结束本次循环。 函数调用和返回:转向被调函数和从被调函数返回。while ()(
12、) | break; | while ()() | continue; | 后续语句后续语句后续语句后续语句break语句 功能:利用break语句能够强迫终止本层循环,转到后续语句执行。后续语句后续语句后续语句后续语句 后续语句后续语句continue语句 功能:中断循环体的本次执行(即跳过循环体中尚未执行的语句),立即开始执行下一次循环。后续语句后续语句 例:用while语句求n项和#includemain()int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(%dn,sum); 例:用while语句将输入字符原样输出#include
13、stdio.hmain() int c; while(c=getchar( )!=n) putchar(c); 例:等待按下c键#include stdio.hvoid wait_a_char() char ch; printf(请输入正确的密码请输入正确的密码:n); scanf(%c,&ch); while (ch!=c) printf(密码输入不正确,请重输密码输入不正确,请重输!); scanf(%c,&ch); return;main()wait_a_char();printf(password ok!n); 例:用dowhile语句求n项和main()int i,s
14、um=0; i=1; do sum=sum+i; i+; while(i=100); printf(%dn,sum);几种循环的比较几种循环的比较1)虽然4种循环通常可以互相代替,但不提倡用goto循环。2)对while和dowhile循环,在循环体中包含应反复执行的操作语句;而对for循环,可将循环体中的操作全部放到表达式3中。因此for语句的功能更强,可完全代替while循环。3)对while和dowhile循环,循环变量的初始化应在while和dowhile语句之前完成,而for语句可在表达式1中完成。4)while和for是先判断后执行,dowhile是先执行后判断。5)while、d
15、owhile、for可用break和continue控制。循环的嵌套循环的嵌套 对于相互嵌套的循环,应遵循以下原则:对于相互嵌套的循环,应遵循以下原则: 1、内外循环不得交叉;、内外循环不得交叉; 2、外循环的控制变量不能与任何一个内循环变量相同,、外循环的控制变量不能与任何一个内循环变量相同,但几个并列的内循环允许用相同的控制变量;但几个并列的内循环允许用相同的控制变量; 一个循环(称为一个循环(称为“外循环外循环”)的循环体内包含另一个循)的循环体内包含另一个循环(称为环(称为“内循环内循环”)。内循环中还可以包含循环,形成多)。内循环中还可以包含循环,形成多层循环。(循环嵌套的层数理论上
16、无限制)层循环。(循环嵌套的层数理论上无限制), 三种循环(三种循环(while循环、循环、do-while循环、循环、for循环)可以互相嵌套。循环)可以互相嵌套。 while( ) while( ) for( ; ; ) while( ) . for( ; ; ) for( ; ; ) . do do . while( ); while( ); for( ; ;) do . while(); #includemain() int i,j; for(i=0;i5;i+) for(j=0;j=i;j+) printf(“%3d”,j); printf(“n”); 运行结果:运行结果: 0 0
17、1 0 1 2 0 1 2 3 0 1 2 3 4 循环嵌套举例一循环嵌套举例一#include main() int i,j; for(i=1;i=9;i+) for(j=1;j=i;j+) printf(“%dx%d=%d ”,i,j,i*j); printf(“n”); 循环嵌套举例二:打印九九乘法表循环嵌套举例二:打印九九乘法表运行结果:运行结果:1x1=12x1=2 2x2=43x1=3 3x2=6 3x3=94x1=4 4x2=8 4x3=12 4x4=16 #includemain() int i,j; int sum1,sum2=0; for(i=1;i=5;i+) sum1=
18、1; for(j=1;j=i;j+) sum1=sum1*j; sum2=sum2+sum1; printf(“1!+2!+3!+4!+5!=%dn”,sum2);循环嵌套举例三:计算循环嵌套举例三:计算1!+2!+3!+4!+5! sum1=1; for(j=1;j=5;j+) sum1=sum1*j;求求5!#includemain() int n; for (n=100;n=200;n+) if (n%3=0) continue; printf(%d,n); 例:求100200间不能被3整除的数#includemain() int a,sum=0; printf(输入一批数输入一批数:n
19、); scanf(%d,&a); for(; ;) if(a0)break; sum=sum+a; scanf(%d,&a); printf(此次输入的正数之和是此次输入的正数之和是%dn,sum);例例:统计输入正数的和的程序:统计输入正数的和的程序#includemain() int i=0; for( ; ;) i+; if(i=3) printf(“next,”); continue; printf(“%d ”,i); if(i=5) printf(“break,”); break; printf(“end!n”);例:一个特殊形式的循环程序运行结果:运行结果:1 2
20、next, 4 5 break,end!程程 序序 举举 例例例例1-1 1-1 求求1+2+3+1+2+3+n+n算法:算法:i=1 to n s=s+t t+i+i=1 to n s=s+i i+for(i=1;i=n; i+) s=s+i; 程程 序序 举举 例例例例1-2 1-2 求求1+1/2+1/3+1+1/2+1/3+1/n+1/n算法:算法:i=1 to n s=s+t t+i+i=1 to n s=s+t t=1.0/ii+s=0;for(i=1;i=n; i+) s=s+1.0/i; 程程 序序 举举 例例例例1-3 1-3 求求1-1/2+1/3-1/41-1/2+1/3
21、-1/41/n1/n算法:算法:i=1 to n s=s+t t=1.0/ii+i=1 to n s=s+t t=1.0/i*flag flag=(-1)*flagi+s=0;flag=1;for(i=1;i=n; i+) s=s+1.0/i*flag; flag=-flag; 算法:算法:i=1 to n s=s+t t=1.0/ii+i=1 to n s=s+t t=1.0/i*flag flag=(-1)*flagi+s=0;t=1;tt=1;flag=1;for(i=1;i=n; i+) s=s+1.0/tt*flag; flag=-flag; tt=2*i+1; 例例1-4 1-4
22、求求1-1/3+1/5-1/71-1/3+1/5-1/71/n1/ni=1 to n s=s+t t=1.0/tt*flag flag=(-1)*flag tt=2*i+1i+i=1 to n s=s+t t=1.0/(2*i-1)*flag flag=(-1)*flagi+s=0;t=1;tt=1;flag=1;for(i=1;i=n; i+) s=s+1.0/(2*i-1)*flag; flag=-flag; 算法:算法:i=1 to n s=s+t t=i/(i+1)i+i=1 to n s=s+t t= i/(i+1) *flag flag=(-1)*flagi+s=0; flag=1
23、;for(i=1;i=n; i+) s=s+1.0*i/ (i+1) *flag; flag=-flag; i+; 例例1-5 1-5 求求s = 1/2 -2/3 + 3/4 - 4/5 + s = 1/2 -2/3 + 3/4 - 4/5 + (-1)(-1)n-1 n-1 n/(n+1)n/(n+1) 71513114#include #includemain() int flag =1; float s,t,tt,pi; s=0; t=1.0; tt=1.0; while(fabs(t)=1e-6) s=s+t; tt=tt+2; flag =-flag; t=1.0/tt* flag
24、; pi=s*4; printf(pi=%10.7fn,pi);例例2-1 2-1 求求1-1/3+1/5-1/71-1/3+1/5-1/7, ,直到最后一项的绝对值直到最后一项的绝对值 =1e-6 s=s+t t=1.0/tt*flag flag=(-1)*flag tt=tt+2例例3-1 3-1 求求n!n!算法:算法:i=1 to n s=s*t t+i+i=1 to n t=t*i i+t=1;for(i=1;i=n; i+) t=t*i; 例例3-2 3-2 求求x xn n算法:算法:i=1 to n t=t*x i+#includemain() int n=10,x,i; lo
25、ng int t=1; scanf(%d,&x); for(i=1;i=n; i+) t=t*x; printf(%d的的%d次方是次方是:%dn,x,n,t); #includemain() int x1,x2,i,t; x1=x2=1; printf(%d %d ,x1,x2); for (i=1;i=18;i+) t=x1+x2; printf(%d ,t); x1=x2; x2=t; printf(n);例例4-1 4-1 输出输出fibonaccifibonacci数列前数列前2020个数个数1,1,2,3,5,8,13,x1 x2tx1 x2t算法:算法:x1=x2=1;t
26、=x1+x2;x1=x2;x2=t;x1 x2t例例5-1 5-1 求最大数求最大数abcmaxmaxmax循环不变式循环不变式scanf(“%d”,&x)x max#includemain() int a,b,c,max; printf(input a,b,c:n); scanf(%d%d%d,&a,&b,&c); max=a; if(maxb)max=b; if(maxc)max=c; printf(max is %d,max);例例5-2 5-2 输入一个正整数输入一个正整数n n,再输入,再输入n n个数,输出个数,输出n n个数中个数中的最大数的最大数
27、abcmaxmaxmax循环不变式循环不变式scanf(“%d”,&x)x maxmax#include#includemain()main() int i,x,n,max; int i,x,n,max; printf(input n:n); printf(input n:n); scanf(%d,&n); scanf(%d,&n); if(n0) if(n0) scanf(%d,&x); scanf(%d,&x); max=x; max=x; for(i=1;in;i+) for(i=1;in;i+) scanf(%d,&x); scanf(%
28、d,&x); if(maxx)max=x; if(maxx)max=x; printf(max is %d,max); printf(max is %d,max); #include math.hmain()int i,m; scanf(%d,&m); for (i=2;i=m) printf(%d is a prime numbern,m); else printf(%d is not a prime numbern,m);例例6-1 6-1 判断判断m m是否是素数是否是素数算法:除了算法:除了1 1和和m m,不能被其它整数整除,不能被其它整数整除 m %2 %3 %4
29、%5 m %2 %3 %4 %5 %(m-1) %(m-1) 是素数是素数 & !=0 !=0 !=0 !=0 !=0& !=0 !=0 !=0 !=0 !=0不是素数不是素数 | =0 =0 =0 =0 =0| =0 =0 =0 =0 =0循环结束两个出口:循环结束两个出口: 1、自然结束、自然结束!(i=m2、强制终止、强制终止(m%i=0) break#include math.hmain() int m,k,i,n=0; for (m=101;m=200;m=m+2) if (n%10=0) printf(n); k=sqrt(m); for (i=2;i=k+1) p
30、rintf(%d ,m); n=n+1; printf(n);例例6-2 6-2 求求100-200100-200间的全部素数间的全部素数例例7-1 7-1 将一个正整数逆序输出将一个正整数逆序输出123455 4 3 2 112345%10=5 12345/10=12341234%10=4 1234/10=123123%10=3 123/10=1212%10=2 12/10=1 1%10=1 1/10=0结束结束循环不变式:循环不变式:x%10 x= x/10 x%10 x= x/10循环条件:循环条件:x!=0 x!=0scanf(“%d”,&x)while(x!=0) digit
31、=x%10; x=x/10; printf(“%d”,digit);循环编程注意事项:循环编程注意事项: 写出写出循环不变式循环不变式和和循环条件循环条件,其中循环条件包,其中循环条件包括:指定循环次数、判断某项的值、输入一个特殊括:指定循环次数、判断某项的值、输入一个特殊数作为结束。数作为结束。循环分类:循环分类:1.1. 求和、求积求和、求积2.2. 求最大值、最小值求最大值、最小值3.3. fibonaccifibonacci数列,数列中某项的值与前若干项有关数列,数列中某项的值与前若干项有关4.4. 判断素数、完数判断素数、完数5.5. 拆分一个整数拆分一个整数6.6. 输入一些字符,
32、统计输入一些字符,统计7. 7. 穷举法穷举法 #includemain() int n=0; printf(输入一行字符输入一行字符:n); while(getchar()!=n) n+; printf(%d,n);1.1.统计从键盘输入一行字符的个数统计从键盘输入一行字符的个数课堂练习课堂练习#includemain() int n=100; while(n) printf(“%d”,n); n-; 2.2.在屏幕上从大到小输出在屏幕上从大到小输出100100以内的整数以内的整数程序一程序一 #include main() int i,j=1; for(i=1;i=5;i+) printf(%d ,i); j+; printf(n* * * * * n); printf(j=%dn,j); 程序二程序二 #include main() int i,j=1; for(i=1;i=5;i+) printf(%d ,i); j+; printf(n* * * * * n); printf(j=%dn,j); 3.3.试比较下列两程序的运行结果试比较下列两程序的运行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 玉米加工与农业产业链优化考核试卷
- 玻璃成分分析与调整考核试卷
- 航空航天器推进剂供给系统考核试卷
- 篷布制造与智能化生产流程的改进考核试卷
- 景区旅游安全生产责任追究制度考核试卷
- 船舶货运与跨境电商的融合考核试卷
- 玻璃水刀切割技术考核试卷
- 羊毛混纺纱线生产工艺试题考核试卷
- 影视剧服装定制设备租赁与知识产权保护合同
- 电商仓储物流服务及仓储设施租赁及仓储管理合同
- JT-T 1495-2024 公路水运危险性较大工程专项施工方案编制审查规程
- 幸福心理学智慧树知到期末考试答案章节答案2024年浙江大学
- 个人工劳务分包合同
- 5月8日世界微笑日微笑的力量生活中保持微笑宣传课件
- 2024年四川省自然资源投资集团有限责任公司招聘笔试参考题库附带答案详解
- 2022智慧健康养老服务与管理专业人才培养调研报告
- 酒店网评分提升方案
- 石油化工设备维护检修规程设备完好标准SHS010012004-副本
- 妊娠合并垂体侏儒的护理查房
- 厨房消防安全培训课件
- 全国工会财务知识竞赛题库及答案
评论
0/150
提交评论