已阅读5页,还剩66页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
4.2.1while语句4.2.2do-while语句4.2.3for语句4.2.4转移语句4.2.5循环的嵌套4.2.6循环结构程序设计举例,4.2循环结构程序设计,循环的概念,当所要解决的问题存在重复执行内容时,应该使用循环结构来实现,具体的设计步骤可归纳如下。,(1)构造循环体。,(2)寻找控制循环的变量。,(3)找出控制循环的3个要素。循环控制变量的初值。循环的条件。使循环趋于结束的部分。,在C语言中可以用以下语句来实现循环:用while语句;用do-while语句;用for语句;用goto语句和if语句构成循环;,4.2.1while语句,真(非零),循环体,假(零),1、while语句的形式:while(表达式)循环体;,2、while语句常称为“当型”循环语句。,3、说明:,先判断表达式,后执行语句。,表达式同if语句后的表达式一样,可以是任何类型的表达式。,循环体多于一句时,用一对括起。,while循环结构常用于循环次数不固定,根据是否满足某个条件决定循环与否的情况。,例:分析下列程序段的循环次数,i=1;while(i=100)putchar(*);i+;,例:用while语句编程实现:计算1+2+3+4+100,算法:s1.设一个变量sum用于存放最后的结果,初值为0s2.设一个循环变量i,初值为1s3.判断i是否小于等于100,若是执行s4;否则程序结束s4.sum=sum+is5.i+s6.返回s3,main()intsum=0,i=1;while(i0)printf(+);elseprintf(-);scanf(%d,判断正负号,#includestdio.hvoidmain()charch;intnum=0;ch=getchar();,例:统计从键盘输入的一行字符的个数(以回车键作为输入结束标记)。,while(ch!=n),判断是否输入结束,num+;ch=getchar();,printf(num=%dn,num);,注意,表达式在判断前,必须要有明确的值。,循环体中一般有改变条件表达式的语句。,while(表达式)后面没有分号。,4.2.2do-while语句,1、do-while的形式:do循环体;while(表达式);,2、do-while语句常称为“直到型”循环语句。,真(非零),循环体,假(零),3、说明:,先执行语句,后判断表达式。,第一次条件为真时,while,do-while等价;第一次条件为假时,二者不同。,例:用do-while语句编程实现:计算1+2+3+4+100,算法:s1.设一个变量sum用于存放最后的结果,初值为0s2.设一个循环变量i,初值为1s3.sum=sum+is4.i+s5.判断i是否小于等于100,若是重复执行s3s5;否则程序结束,main()intsum=0,i=1;dosum=sum+i;i+;while(i=100);printf(“%d”,sum);,例:用do-while语句编程实现:计算1+2+3+4+100,do,例:用do-while语句编写程序统计从键盘输入的一行字符的个数(以回车键作为输入结束标记)。,#includestdio.hvoidmain()charch;intnum=0;ch=getchar();donum+;ch=getchar();while(ch!=n);printf(num=%dn,num);,注意,在if、while语句中,表达式后面都没有分号,而在do-while语句的表达式后面则必须加分号。,do-while和while语句相互替换时,要注意修改循环控制条件。,5.3.3for语句,1、for的形式:for(初始表达式1;条件表达式2;循环表达式3)循环体;,表达式1:用于循环开始前为循环变量设置初始值。,表达式2:控制循环执行的条件,决定循环次数。,表达式3:循环控制变量修改表达式。,循环体语句:被重复执行的语句。,表达式3,计算表达式1,循环体,零,非零,for的下一条语句,2、执行过程,for(i=1;i=100;i+)sum=sum+i;,例如:,它相当于以下语句:i=1;while(i=100)sum=sum+i;i+;,表达式1;,while(表达式2),表达式3;,3、说明,三个表达式都可以是逗号表达式。,三个表达式都是任选项,都可以省略,但要注意省略表达式后,分号间隔符不能省略。,1、for语句中表达式省略的形式(1)for语句一般形式中的“表达式1”可以省略;如:sum=0;i=1;for(;i100)break;sum=sum+i;,1、for语句中表达式省略的形式(3)表达式3也可以省略,但此时保证循环能正常结束如:for(sum=0,i=1;i=100;)sum=sum+i;i+;,(4)可以省略表达式1和表达式3,只有表达式2,如:i=1;sum=0;for(;i=100;)sum=sum+i;i+;,1、for语句中表达式省略的形式,i=1;sum=0;while(i100)break;sum=sum+i;i+;,相当于,(6)循环体为空语句对for语句,循环体为空语句的一般形式为:for(表达式1;表达式2;表达式3);如:for(sum=0,i=1;i=100;sum+=i,i+);,1、for语句中表达式省略的形式,for语句与while比较,例:for(i=1;i=10,i+)a=a*i;printf(“%d,%d”,a,i);,表达式1while(表达式2)循环语句;表达式3;,for(表达式1;表达式2;表达式3)循环语句;,for语句,while语句,i=1;while(i=100)a=a*i;printf(“%d,%d”,a,i);i+;,(1)在进入累加前先给累加器赋初值(一般为0);(2)用循环语句实现累加;for(循环变量赋初值;循环条件;循环变量改变规律)(3)循环体语句的设计。累加器当前值=累加器原值+循环变量当前值;,典型例题分析,例:求累加和1+2+3+1000,基本方法:,属于“累加器”类型问题。,累加器赋初值,求偶数和2+4+6+100,参考程序:,voidmain()longintk,s;,s=0;,for(k=1;k=1000;k+)s=s+k;,printf(s=%ld,s);,累加,思考,(1)给累乘器赋初值,一般为1;(2)用循环语句实现累乘;for(循环变量赋初值;循环条件;循环变量改变规律)(3)循环体设计。累乘器当前值=累乘器原值*循环变量当前值;,例:求累乘积。如:123.100,基本方法:,属于“累乘器”类型问题。,累乘器赋初值,求n!=123n,参考程序:,voidmain()doubles=1;,intk;,for(k=1;k=100;k+)s=s*k;,printf(s=%lf,s);,累乘,思考,例:判断一个数是否为素数?,一个数x在2,sqrt(x)范围内没有因子,我们就称其为素数(质数),主要编程方法:循环变量终值法、标记变量法,#includemath.hvoidmain()intx,k;scanf(%d,排除法:如果有因子,不再往下判断是否是素数,循环变量终值法,for(k=2;ksqrt(x)printf(%disaprime,x);elseprintf(%disnotaprime,x);,在判断范围内无因子,程序正常终止,有因子,程序非正常终止,#includemath.hvoidmain()intx,k,f=1;scanf(%d,排除法:如果有因子,不再往下判断是否是素数,for(k=2;k=1;x-)if(x%17=0)break;printf(x=%dn,x);,找到满足条件的最大数,结束循环,(1)语句形式:continue;,(2)语句作用:结束本次循环。,三、continue语句,(3)语句执行流程:continue语句可以结束本次循环,即不再执行循环体中continue语句之后的语句,转入下一次循环条件的判断与执行。,例:求300以内能被17整除的所有整数。,#includestdio.hvoidmain()intx,k;for(x=1;x=300;x+)if(x%17!=0)continue;printf(%dt,x);,while(条件)语句A;break;语句B;,真,语句B,条件,语句A,break,假,结束循环,break语句与continue语句的区别:,至此位置,while(条件)语句A;continue;语句B;,真,语句B,条件,语句A,continue,假,结束循环,至此位置,#includestdio.hvoidmain()inta,b;for(a=1,b=1;a=10)break;if(b%3=1)b+=3;continue;printf(%dn,a);,例:分析以下程序的运行结果。,程序运行结果:4,在循环体语句中又包含有另一个完整的循环结构的形式,称为循环的嵌套。如果内循环体中又有嵌套的循环语句,则构成多重循环。,4.2.5循环的嵌套,嵌套在循环体内的循环体称为内循环,外面的循环称为外循环。,while、do-while、for三种循环都可以互相嵌套。,真,真,外循环初始条件,内循环初始条件,内循环体,外循环条件,假,内循环条件,假,内循环循环条件,外循环循环条件,循环结束,二重循环嵌套结构执行流程,例:输出图形:,*,编程分析:,采用双重循环,一行一行输出。,每一行输出步骤:一般3步。1)光标定位,3)每输完一行光标换行(n),2)输出图形。例如本题:共4行,若行号用k表示,则每一行有2*k-1个*号。,#includestdio.hvoidmain()intk1,k2;for(k1=1;k1=k1;k2-)putchar();,for(k2=1;k2=k1*2-1;k2+)putchar(*);,putchar(n);,定位,输出,编程方法:“递推法”,例:裴波那契数列的第1、2项分别为1、1,以后各项的值均是其前两项之和。求前30项菲波那契数。,所谓递推法就是从初值出发,归纳出新值与旧值间的关系,直到求出所需值为止。新值的求出依赖于旧值,不知道旧值,无法推导出新值。数学上递推公式正是这一类问题。,4.2.6循环结构程序设计举例,f1-第一个数f2-第二个数f3-第三个数f1=1;f2=1;f3=f1+f2;,以后只要改变f1,f2的值,即可求出下一个数.f1=f2;f2=f3;f3=f1+f2;,递推,voidmain()longf1=1,f2=1,f3;intk;,参考程序:,printf(%ldt%ldt,f1,f2);,for(k=3;k=30;k+)f3=f1+f2;printf(%ldt,f3);f1=f2;f2=f3;,注意f1、f2、f3、x的类型,递推,例:输出100以内的素数。所谓素数是指只能被1和其本身整除的数。算法分析:我们先用穷举法来对2100之间所有的数进行判断。在判断一个数n是否是素数时,我们对n用2n-1逐个去除,若某次可以整除则说明n不是素数,跳出该层循环。如果在所有的数都是未除尽的情况下结束循环,则为素数。程序源代码如下:,main()intn,i;for(n=2;n=n)printf(t%d,n);,例:求解百鸡百钱问题。公元钱五世纪,我国古代数学家张丘建在算经一书中提出了“百鸡百钱”问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?算法分析:百鸡百钱问题是典型的穷举法问题。我们设x,y,z分别为买的鸡翁,鸡母,鸡雏的个数,则有x+y+z=1005*x+3*y+z/3=100而x,y可能取数的范围为x:020y:033z可以由公式z=100-x-y计算出来。据此,我们建立一个两重循环,对所有可能的情况进行判别。程序源代码如下:,#includestdio.hmain()inti,j,k;printf(解百鸡百钱问题n);for(i=1;i=20;i+)for(j=1;j0);问最后b的值为多少?循环了多少次?,b=4循环2次,习题,3.i=1;a=0;s=1;doa=a+s*i;s=-s;i+;while(i=10);printf(“a=%d”,a);,a=0+1-2+3-4+5-6+7-8+9-10,习题,4.运行以下程序,输入right?则下面程序结果为?#includemain()charc;while(c=getchar()!=?)putchar(+c);,sjhiu,习题,5.,5.main()inti,j;for(i=1;i50)break;while(a=14);,a=12y=12a=16y=28a=16y=44a=16y=60,/*给a赋值*/,7.1-,习题,用三种做法做,for(i=1;i0)t=m%n;m=n;n=t;,习题,9.输入两个整数x、y,求,x,y,main()intx,y,i,mul=1;scanf(“%d,%d”,习题,10.求出1100之间的所有素数,main()inti,j,flag;for(i=2;i=100;i+)flag=1;for(j=2;j=sqrt(i);j+)if(i%j=0)flag=0;break;if(flag=1)printf(“%5d”,i);,习题,11.计算1!+2!+3!+100!,main()inti,sum=0,s=1;for(i=1;i=100;i+)sum=sum+s;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年全国“安全生产月”知识培训考试试题附参考答案
- 2025年八篇护理文献的题目及答案
- 幼儿园食堂天然气泄漏应急处置预案
- 未来五年马德堡半球市场需求变化趋势与商业创新机遇分析研究报告
- 2025年及未来5年市场数据中国二丙二醇甲醚市场深度分析及投资战略咨询报告
- 2025年注册安全工程师考试试题附参考答案
- 2025年旅游电商平台开发项目可行性研究报告及总结分析
- 2025年老龄化社会产品设计可行性研究报告及总结分析
- (2025年)燃气安装及检修工安全技术知识竞赛试题库附含答案
- 2025年绿色消费品研发项目可行性研究报告及总结分析
- 《PMP项目管理》课件
- 混凝土泵车维护与保养课件
- 无人机在公安领域的应用
- 餐饮个人简历模板5篇大全
- 高血压的防治健康宣教
- 讴霭咨询-零售行业创新的洞察:策展式零售、叙事零售
- WB/T 1087-2018煤炭仓储设施设备配置及管理要求
- GB/T 2566-2010低煤阶煤的透光率测定方法
- GB/T 11032-2020交流无间隙金属氧化物避雷器
- 华为战略绩效PBC标准模板(华为)
- 矿井顶板灾害防治
评论
0/150
提交评论