第5章循环结构的程序设计.ppt_第1页
第5章循环结构的程序设计.ppt_第2页
第5章循环结构的程序设计.ppt_第3页
第5章循环结构的程序设计.ppt_第4页
第5章循环结构的程序设计.ppt_第5页
已阅读5页,还剩62页未读, 继续免费阅读

下载本文档

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

文档简介

2020/5/16,1,双选择结构:if(表达式)语句1else语句2,单选择结构:if(表达式)语句,4.1条件选择结构,break;,break;,break;,switch(表达式)case常量表达式1:语句组1case常量表达式2:语句组2case常量表达式n:语句组ndefault:语句组n+1,4.2开关选择结构,第5章循环结构的程序设计,三种基本控制结构的流程图,顺序结构,Y,N,An,P,P,A,B,P,P,A,A,5,循环结构程序的设计步骤,1)构造循环体(需要重复执行的部分)。2)寻找循环变量(控制循环的变量)。3)确定循环变量的三个要素:循环变量的初值循环的条件(终值)使循环趋于结束的操作,5.1穷举与迭代算法5.2goto语句5.3while语句5.4do-while语句5.5for语句5.6循环的嵌套5.7循环结构中的跳转语句5.8循环结构程序设计举例,第5章循环结构的程序设计,7,学习重点:1.while、do-while、for语句的格式及执行过程2.循环的嵌套及其执行过程3.break、continue语句的用法学习难点:1.for语句的使用2.循环的嵌套,8,穷举与迭代是两种具有代表性的用循环结构实现的算法。1穷举算法也称枚举算法或试探算法,类似于数学的“完全归纳法”。它是对可能是解的众多候选解按某种顺序进行逐一枚举和检验,并从中找出那些符合要求的候选解作为问题的解。穷举算法的循环控制有两种方法:计数器法与标志法。计数器法是完成测试次数后循环结束。标志法是达到某一目标后,循环结束。,5.1穷举与迭代算法,9,穷举法实例1:录取新生问题。计数器循环法。穷举法实例2:求的近似值。/4=1-1/3+1/5-1/7+,直到最后一项的绝对值小于10-6。标志值循环法。,5.1穷举与迭代算法,10,2迭代算法迭代算法是基于分步递增方式进行求解,如累加和、累乘积、递推等。迭代是一个不断用变量的新值取代变量的旧值,或由变量的旧值递推出变量新值的过程。迭代法实例1:人口增长问题。m=m(1+2%),设m=12迭代法实例2:求解阶乘。f=f*i,5.1穷举与迭代算法,11,1、goto语句(无条件转移语句)goto标号;注意:标号用标识符表示,用来表示程序的某个位置。,loop:if(i=100)sum=sum+i;i+;gotoloop;,5.2goto语句,12,【例5.3】用goto语句和if语句一起构成循环,求sum=1+2+3+100的累加和。,#includevoidmain()inti=1,sum=0;loop:if(i=100)sum=sum+i;i+;gotoloop;printf(sum=%dn,sum);运行结果:sum=5050,思考:1、sum的初值?2、如何求100!3、程序可否再简化?,13,i=1sum=0,i100,假(0),真(非0),sum=sum+ii=i+1,图5.1用goto求和流程图,输出sum,14,5.3while语句,一般形式:while(表达式)语句,循环体,注意:循环体必须是一条单独的语句或复合语句。,【例5.4】用while语句构成循环,求sum=1+2+3+100的累加和。#includevoidmain()inti=1,sum=0;while(i=100)sum=sum+i;i+;printf(“sum=%dn,sum);,loop:if(in)。(2)用m除以n,余数为r,如果r等于0,则n是最大公因子,算法结束,否则(3)。(3)把n赋给m,把r赋给n,转(2)。,5.3while语句,20,#includevoidmain()intm,n,r;printf(pleasetypeintwopositiveintegersn);scanf(%d%d,5.3while语句,21,#includevoidmain()intm,n,r;printf(pleasetypeintwopositiveintegersn);scanf(%d%d,5.3while语句,22,5.4do-while语句,一般形式:do语句while(表达式);,23,【例5.6】用do-while语句构成循环,求sum=1+2+3+100的累加和。#includevoidmain()inti,sum=0;i=1;dosum=sum+i;i+;while(i=100);printf(“sum=%dn,sum);,while(i=100)sum=sum+i;i+;,5.4do-while语句,24,说明如下:1)do-while先执行循环体,后判断,常称为“改进的直到型”循环语句。2)无论表达式的值是什么,循环体总是先执行一次。3)而在do-while语句的表达式的括号后面则必须加分号,分号是语句结构中不可缺少的一部分,它不是空语句。5)当do-while(1);时,为死循环。6)do-while语句中的表达式与while语句中的表达式一样,可以是任何类型的表达式。,5.4do-while语句,【例5.7】将一个整数的各位数字颠倒后输出。算法:提取最后一位数字,用取模10的余数求得。#includevoidmain()inti,r;printf(Inputanintegern);scanf(%d,26,5.4do-while语句,wlile循环与do-while循环的异同:在一般情况下它们是没区别的,只是while循环先判断条件后执行循环体,而do-while循环先执行循环体后判断条件,它们的结果基本是一样的;只有表达式的值开始就为0时,while循环不执行循环体,而do-while循环执行一次循环体,即do-while至少执行一次循环体时,才不一样。,27,5.4do-while语句,【例5.8】while和do-while区别举例。while语句do-while语句#include#includevoidmain()voidmain()intsum=0,i;intsum=0,i;scanf(“%d”,,28,一般形式:for(表达式1;表达式;表达式)语句,5.5for语句,说明:用于已知循环次数或开始条件和结束条件的重复问题;先判断,后执行;循环体最少执行0次;,变量赋初值,循环条件,修正变量,循环体,29,【例5.9】用for语句构成循环,求sum=1+2+3+100的累加和。#includevoidmain()inti,sum=0;for(i=1;i=100;i+)sum+=i;printf(SUM=%d,sum);,5.5for语句,30,说明如下:1)三个表达式都可以是逗号表达式。例如:inti,j,sum;for(sum=0,i=0,j=100;i=j;i+,j-)sum=sum+i+j;,5.5for语句,31,2)三个表达式都是任选项,都可以缺省,但要注意缺省表达式后,分号间隔符不能缺省。若缺省表达式1:表示该循环无初值,这时应该在for之前为变量赋初值,注意缺省表达式1时,其后的分号不能缺省。例如:i=1;sum=0;for(;i100)break;缺省表达式2时,相当于while(1)语句:,5.5for语句,33,若缺省表达式3:表示循环变量无改变,这样可能产生死循环,为避免死循环,通常把表达式3放在循环体中。例如:for(sum=0,i=1;i=100;)sum=sum+i;i+;将表达式3作为循环体的一部分,也能保证循环正常结束。,5.5for语句,34,若同时缺省表达式1、3,只有表达式2时,for语句相当于while语句。例如下面左右语句都是等价的:i=1;sum=0;i=1;sum=0;for(;i=100;)while(i=100)sum=sum+i;sum=sum+i;i+;i+;对于计次循环,使用for语句的程序比使用while语句的程序简洁。,5.5for语句,35,若三个表达式同时缺省:其形式为“for(;);”,两个分号不能省略。这就要求循环体中要有退出循环的语句。3)循环体为空语句。一般形式为:for(表达式1;表达式2;表达式3);把本来要在循环体内处理的内容放在表达式3中,作用是一样的。例如:for(i=1,sum=0;i=100;sum=sum+i,i+);,5.5for语句,36,【例5.10】求菲波那契数列的前20个数。#includevoidmain()inti,f1,f2,f3;f1=1;f2=1;printf(%10d%10d,f1,f2);for(i=3;i=20;i+)f3=f1+f2;printf(%10d,f3);if(i%5=0)printf(n);f1=f2;f2=f3;printf(n);,5.5for语句,37,【例5.11】输出100以内所有偶数的和与所有奇数的和。#includevoidmain()inti,s1=0,s2=0;for(i=1;i100;i+)if(i%2=0)s1=s1+i;elses2=s2+i;printf(s1=%d,s2=%dn,s1,s2);,5.5for语句,再请看【例5.1】和【例5.2】。,【例5.1】编程求100499之间的所有水仙花数,即各位数字的立方和恰好等于该数本身的数。#includevoidmain()inti,j,k,n;for(n=100;n500;n+)i=n/100;j=(n/10)%10;/*或者j=(n-i*100)/10;也可*/k=n%10;if(i*100+j*10+k=i*i*i+j*j*j+k*k*k)printf(%dn,n);,38,【例5.2】用循环程序求解阶乘。程序如下:#includevoidmain()inti,n;longf=1;scanf(%d,39,40,5.6循环的嵌套,一个循环体内又包含了另一个完整的循环结构,称为循环的嵌套。while、do-while和for这三种循环均可以相互嵌套,即在while循环、do-while循环和for循环体内,都可以完整地包含上述任一种循环结构。嵌套的循环(即多重循环)常用于解决矩阵运算、报表打印这类问题。,41,例如,下面几种都是循环嵌套的形式:(1)while()while().,5.6循环的嵌套,42,(2)dodowhile();while();,(3)for(;).for(;).,5.6循环的嵌套,43,(4)while()dowhile();,(5)for(;)while(),5.6循环的嵌套,44,(6)dofor(;)while();,5.6循环的嵌套,45,使用嵌套的循环,应注意以下问题:(1)在嵌套的各层循环体中,若使用复合语句,应用一对大花括号将循环体语句括起来以保证逻辑上的正确性;(2)内层和外层循环控制变量不应同名,以免造成混乱;(3)嵌套的循环最好采用右缩进格式书写,以保证层次的清晰性。(4)循环嵌套不能交叉,即在一个循环体内必须完整地包含着另一个循环。,5.6循环的嵌套,46,嵌套循环的执行过程:嵌套循环执行时,先由外循环进入内循环,只有在内循环终止之后才能执行外循环,当外循环终止时,程序结束。外循环慢,内循环快。内外循环视为一条语句。,5.6循环的嵌套,47,【例5.12】输出一个图形。#includevoidmain()inti,j;for(i=1;i=4;i+)/*外循环控制行数*/for(j=1;j=4;j+)/*内循环控制每行字符个数*/printf(*);printf(n);,5.6循环的嵌套,48,【例5.12*】输出一个图形。#includevoidmain()inti,j;for(i=1;i=4;i+)/*外循环控制行数*/for(j=1;j=i;j+)/*内循环控制每行空格的个数*/printf(“);/*输出每行前的空格*/for(j=1;j=4;j+)/*内循环控制每行字符的个数*/printf(*);printf(n);,5.6循环的嵌套,49,复习7,1、while语句的功能?2、如何理解s=s+i?(s=46,i=1、2、310),50,复习8,1、在while、do-while和for语句中,什么情况下执行循环体?循环体执行完(结束本次循环)后该如何?2、嵌套循环的执行过程?,51,5.7循环结构中的跳转语句,5.7.1break语句,5.7.2continue语句,52,5.7.1break语句,break语句的两个用途:跳出switch语句;跳出本层循环。,break语句的形式:break;,5.7循环结构中的跳转语句,53,【例5.14】break语句的应用。#includevoidmain()intn;for(n=1;n3)break;m*=i*j;printf(m=%dn,m);结果:m=6,5.7循环结构中的跳转语句,55,5.7.2continue语句,continue语句作用:立即结束本次循环,转去判断循环条件是否成立,决定是否继续下次循环。它没有退出循环体。continue语句的形式:continue;,5.7循环结构中的跳转语句,56,【例5.17】求输入的正数之和。#includevoidmain()inti,n,sum=0;for(i=1;i=10;i+)scanf(%d,5.7循环结构中的跳转语句,57,break和continue语句的区别如下:1)break语句是退出本层循环;continue语句是结束本次循环。2)break语句可以用于循环语句和switch语句中;continue语句只用于循环语句中。3)循环嵌套时,break和continue只影响包含它们的最内层循环,与外层循环无关。,5.7循环结构中的跳转语句,58,【例5.18】break和continue语句的执行情况对比。,#includevoidmain()inti;for(i=1;i=10;i+)if(i=5),break;printf(i=%5dn,i);,#includevoidmain()inti;for(i=1;i=10;i+)if(i=5),continue;printf(i=%5dn,i);,5.7循环结构中的跳转语句,59,【例5.19】编程输出如下形式的乘法九九表。123456789-1246981216101520251218243036714212835424981624324048566491827364554637281问题分析:打印三角形的关键是控制每行打印的列数,规律是:第1行打印1列,第2行打印2列,第9行打印9列,第m行打印m列。,#includevoidmain()intm,n;for(m=1;m10;m+)printf(%4d,m);/*打印表头*/printf(n);for(m=1;m10;m+)printf(_);printf(n);for(m=1;m10;m+)/*被乘数m从1变化到9*/for(n=1;n=m;n+)/*乘数n从1变化到m*/printf(%4d,m*n);printf(n);/*输出换行符,准备打印下一行*/,5.8循环结构程序设计举例,【例5.20】求100200间的全部素数。,算法:m不能被2(m-1)之间的任一整数整除,则m为素数。,#includevoidmain()intm,i;scanf(%d,#includevoidmain()intm,i,n=0;for(m=101;m=m)printf(%d,m);n=n+1;printf(nprimenumber=%dn,n);,101103107109113127131137139149151157163167

温馨提示

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

评论

0/150

提交评论