




已阅读5页,还剩71页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.,第六章循环结构的C程序设计,.,第一节循环的基本概念第二节while语句第三节do-while语句第四节for语句第五节break、continue、goto语句第六节几种循环语句比较第七节循环的嵌套第八节程序举例,.,循环的必要性,intresult1,result2,result3;intresult4,result5;result1=1*10;printf(110%dn,result1);result2=2*10;printf(210%dn,result2);result3=3*10;printf(310%dn,result3);result4=4*10;printf(410%dn,result4);result5=5*10;printf(510%dn,result5);,1101021020310304104051050,输出结果,重复语句,6.1概述,.,循环的必要性,110=10210=20310=30410=40510=50,0+1,1+1,2+1,上个数字+1,.,重复(上个数字+1)10,.,C语言中的各种循环,while,do-while,for,需要多次重复执行一个或多个任务的问题考虑使用循环来解决,.,C语言可实现循环的语句:用goto和if构成循环while语句dowhile语句for语句,循环型程序设计,.,6.2while语句一般形式:,while(表达式)循环体语句;,执行流程:,计算表达式的值,当值为真(非0)时,执行循环体语句,一旦条件为假,就停止执行循环体。如果条件在开始时就为假,那么不执行循环体语句直接退出循环。,工作原理,说明:语句部分可以是简单语句也可以是复合语句。,.,循环体,例用while循环求,#includemain()inti,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(%d,sum);,.,说明:循环体有可能一次也不执行循环体可为任意类型语句,一个以上的语句用括起来下列情况,退出while循环条件表达式不成立(为零)循环体内遇break,goto无限循环:while(1)循环体;,.,例:分析程序的运行结果#includemain()inti=1,sum=0;while(i=100)printf(“i=%d,sum=%d”,i,sum+=i);i+;printf(”Sum=%dn”,sum);结果:程序将不停的打印“i=1,sum=.”。无法正常终止的程序,称为“死循环”。结论:在while语句循环体中,一定要有能够对循环控制条件产生影响的语句。避免出现“死循环”现象。,.,例显示110的平方,#includemain()inti=1;while(i=10)printf(%d*%d=%dn,i,i,i*i);i+;,运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=100,.,6.3dowhile语句一般形式:,do循环体语句;while(表达式);,执行流程:,它先执行循环体中的语句,然后再判断条件是否为真,如果为真则继续循环;如果为假,则终止循环。,工作原理,.,特点:先执行循环体,后判断表达式说明:至少执行一次循环体dowhile可转化成while结构,分别用dowhile和while求,main()inti,sum=0;i=1;dosum+=i;i+;while(i=10);printf(%d,sum);,main()inti,sum=0;i=1;while(i=10)sum=sum+i;i+;printf(%d,sum);,do-while,while,.,问题描述:猜数游戏。要求猜一个介于110之间的数字,根据用户猜测的数与标准值进行对比,并给出提示,以便下次猜测能接近标准值,直到猜中为止。,do-while循环示例,main()intnumber=5,guess;printf(猜一个介于1与10之间的数n);doprintf(请输入您猜测的数:);scanf(%d,猜一个介于1与10之间的数请输入您猜测的数:3太小请输入您猜测的数:5您猜中了!答案为5,输入数字5后,dowhile循环中的条件为假,输出结果消息后,程序终止。,.,比较while和do-while循环,while(循环条件)循环体;,do循环体;while(循环条件);,do-while循环是先执行后判断,所以,即使开始条件为假,循环体也至少会被执行一次。,while循环是先判断后执行,所以,如果条件为假,则循环体一次也不会被执行。,比较while和do-while循环的工作原理,编程:辗转相除法求任意两个整数间的最大公约数,.,:输入一个正整数,要求以相反的顺序输出该数。例如:输入12345,则输出为54321。基本思路:可以从个位开始,按位输出整数的每一位,Inputanintegertonumber,Untilnumber=0,Outputnumber%10number=number/10,.,main()unsignedintnumber;printf(Inputthenumber:);scanf(%d,思考:使用while或for语句,如何实现?,两个程序有何区别?,前面的程序可以处理数字0,后面的程序不能处理,1234,5,.,6.4for语句一般形式:,for(expr1;expr2;expr3)循环体语句;,执行流程:,.,for(表达式1;表达式2;表达式3)语句;,for循环的一般语法:,for循环,counter=0;num=1;cnt=100;,counter=10;num0,counter+;num=num+1;cnt-,分号用于分隔for循环的三个表达式,1、计算表达式1的值,通常为循环变量赋初值;2、计算表达式2的值,即判断循环条件是否为真,若值为真则执行循环体一次,否则跳出循环;3、计算表达式3的值,这里通常写更新循环变量的赋值表达式,然后转回第2步重复执行;,工作原理,1,2,3,4,.,表达式1,表达式2,表达式3,语句,表达式1,表达式2,Y,表达式2,for循环,Y,N,表达式3,.,.,for循环示例,#includevoidmain()intnumber,i,fac=1;printf(n请输入任意一个正整数:);scanf(%d,请输入任意一个正整数:5,5,1,1,2,120,6,循环执行五次,5的阶乘=120,.,for循环的表达式,for循环中有三个表达式for语句中的各个表达式都可以省略分号分隔符不能省略,for(;);,可省略,不能省略,.,省略表达式1,intnum=0;for(;num=10;num+)printf(%dn,num*2);,inta=0,n;printf(n输入n的值:);scanf(%d,相当于省去了为循环变量赋初值,此时应在for语句之前给循环变量赋初值,.,省略表达式2,for(num=1;num+).,即不判断循环条件,也就是认为表达式2始终为真,这时应在循环体内设法结束循环,否则将成为死循环,.,省略表达式3,for(i=1;i=100;)sum=sum+1;i+;,即省去修改循环变量的值,但此时应在循环体内设法结束循环,.,省略三个表达式,for(;)printf(这将一直进行下去);i=getchar();if(i=X|i=x)break;,即不为循环变量赋初值,不设置循环条件(认为表达式2为真值),不修改循环变量的值,无终止地执行循环体。此时应在循环体内设法结束循环,否则会成为死循环,.,说明:expr1也可以是给其它变量赋初值;expr1和expr3也可以是逗号表达式例:for(sum=0,i=1;i=100;i+,i+)for(sum=0,i=1;i=100;i=i+2)for语句可以转换成while结构,expr1;while(expr2)循环体语句;expr3;,.,例:#includemain()inti=0;for(i=0;i10;i+)putchar(a+i);,运行结果:abcdefghij,例:#includemain()inti=0;for(;i10;i+)putchar(a+i);,例:#includemain()inti=0;for(;i10;)putchar(a+(i+);,例:#includemain()inti=0;for(;i10;putchar(a+i),i+);,.,main()inti,j,k;for(i=0,j=100;i=3)为求出第N项的值,请编写程序。根据递推通项公式,可用递推法编写程序,计算第N项的值。递推法:由初始的已知条件开始,先计算出第(N1)步的结果,再利用前面已知的(N1)项结果,按照递推公式(或遵照递推规则),推出第N步结果。递推法是程序设计中最常用的方法之一,使用递推法必须有明确的递推初始值和递推规则(递推公式)。,.,6.5break、continue、goto语句break语句功能:在循环语句和switch语句中,终止并跳出循环体或switch说明:break只能终止并跳出最近一层的结构break不能用于循环语句和switch语句之外的任何其它语句之中,continue语句功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断仅用于循环语句中,.,break语句,跳出for循环for(;)printf(这将一直进行下去);i=getchar();if(i=X|i=x)break;,跳出while循环while(1)if(x=10)break;,跳出do-while循环doif(x=10)break;while(x15);,.,continue语句,continue语句的作用是跳过循环体中剩余的语句而执行下一次循环对于while和do-while循环,continue语句执行之后的动作是条件判断;对于for循环,随后的动作是变量更新,功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断仅用于循环语句中,.,continue语句,while()continue;,while()break;,跳出整个循环,继续下一次循环,.,例6.5把100200之间的不能被3整除的数输出,main()intn;for(n=100;n200;n+)if(n%3=0)continue;printf(%d,n);,main()intn;for(n=100;n=100;j-)if(n%j=0)/*若能够整除j,则j是约数*/printf(”3digitsin%ld=%dn”,n,j);break;/*控制退出循环*/,main()inti,count=0,j,sum=0;for(i=1;i=10;i+)printf(Inputinteger:);scanf(%d,:输入10个整数,求其中正数的个数及平均值,精确到小数点后两位。,.,goto语句及用goto构成循环,goto语句一般格式:,goto语句标号;.标号:语句;,功能:使系统转向标号所在的语句行执行说明:语句标号用标识符表示,要符合标识符命名规则,gotoloop;goto255;,.,#includemain()inti,sum=0;i=1;loop:if(i=100)sum+=i;i+;gotoloop;printf(%d,sum);,sum=0+1sum=1+2=3sum=3+3=6sum=6+4sum=4950+100=5050,用if和goto语句构成循环,C不主张使用goto循环,.,从键盘输入一组数据,以0结束输入,求数据和,#includemain()intnumber,sum=0;read_loop:scanf(%d,.,6-6几种循环语句的比较,C语言三种循环语句的特点如下:for和while先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件。while和do-while语句的条件表达式只有一个,for语句有三个。while、do-while、for可以相互替换使用。while语句多用于不需要赋初值的或循环次数不定的情况。for语句多用于要赋初值或循环次数固定的情况。do-while语句多用于至少要运行一次的循环控制。循环语句可以嵌套,循环可以并列,但不能交叉。,.,为了保证循环体正常运行,应该特别注意:循环控制条件控制条件的初始状态(初始值)循环体内部对控制条件的影响以上三个方面相互配合,相互影响,共同完成循环控制,.,6.7循环的嵌套定义:一个循环体内又包含了另一个完整的循环结构三种循环可互相嵌套,层数不限,(1)while()while().,(2)dodowhile();.while();,(3)while()dowhile();.,(4)for(;)dowhile();while().,.,程序举例,main()inti,j;for(i=1;i=2;i+)printf(“ni=%dn”,i);for(j=1;j=3;j+)printf(“j=%d,”,j);,.,程序举例,内层循环终止,j=2,j=3,j=4,main()inti,j;for(i=1;i=2;i+)printf(“ni=%dn”,i);for(j=1;j=3;j+)printf(“j=%d,”,j);,.,程序举例,运行结果:,循环全部终止,i=2,i=3,main()inti,j;for(i=1;i=2;i+)printf(“ni=%dn”,i);for(j=1;j=3;j+)printf(“j=%d,”,j);,.,嵌套循环的跳转,禁止:从外层跳入内层跳入同层的另一循环向上跳转,三种循环可互相嵌套,层数不限外层循环可包含两个以上内循环,但不能相互交叉嵌套循环的执行流程,.,:输出下三角形乘法九九表。123456789-12436948121651015202561218243036714212835424981624324048566491827364554637281假设:行号为i,列号为j,i=6j=5i*j,(1=i=9),(1=j=i),则:第i行中要输出j个乘积,输出项aij和行(i)、列(j)的关系,.,#includemain()inti=1,j;/*i:行计数器j:列计数器*/while(i=9)/*控制打印表头*/printf(%4d,i+);printf(n-n);i=1;while(i=9)/*行控制*/j=1;/*列计数器置1*/while(j0)则i为整数m的平方。main()inti,m;scanf(“%d”,.,:抓交通肇事犯一辆卡车违犯交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车号的一些特征:甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是位数学家,说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。问题分析与算法设计按照题目的要求造出一个前两位数(i)相同、后两位数(j)相同且相互间又不同的整数。得到:(1)0=31),.,main()inti,j,k,m;for(i=1;i=9;i+)/*i:车号前二位的取值*/for(j=0;j=9;j+)/*j:车号后二位的取值*/if(i!=j)/*判断两位数字是否相异*/k=i*1000+i*100+j*10+j;for(m=31;m*mk;m+);if(m*m=k)/*判断是否为整数的平方*/printf(Lorry_No.is%d.n,k);运行结果:Lorry_No.is7744.,.,:百钱百鸡问题中国古代数学家张丘建在他的算经中提出了著名的“百钱百鸡问题”:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何?问题分析与算法设计设:要买x只公鸡,y只母鸡,z只小鸡,可得到方程:x+y+z=1005x+3y+z/3=100取值范围:0=x、y、z=100可以采用穷举法求解。,.,main()intx,y,z,j=0;for(x=0;x=100;x+)for(y=0;y=100;y+)for(z=0;z=100;z+)if(x+y+z=100运行结果:1:cock=0hen=25chicken=752:cock=3hen=20chicken=777:cock=12hen=4chicken=84,.,丢失重要条件:z应该能够被整除。main()intx,y,z,j=0;for(x=0;x=100;x+)for(y=0;y=100;y+)for(z=0;z=100;z+)if(z%3=0运行程序,正确的结果:1:cock=0hen=25chicken=752:cock=4hen=18chicken=783:cock=8hen=11chicken=814:cock=12hen=4chicken=84,.,优化程序:main()intx,y,z,j=0;for(x=0;x=20;x+)for(y=0;y=33;y+)for(z=0;z=100;z+)if(z%3=0,.,穷举法的关键数学模型适宜进行穷举的数学模型决定程序是否正确穷举的范围明确的穷举终止条件决定穷举的效率,范围过大,则效率太低。,.,:打印边长为m的正方型要求:从键盘输入m值,输出m行每行m个*号。例:输入m=4,输出的图形如下:*算法分析与设计:1.输入m,2.重复打印m行,每行打印m个*;加细:1.输入m;2.for(k=1;k=m;k+)打印一行中的m个*;,.,算法分析与设计:加细:1.输入m;2.for(k=1;k=m;k+)打印m个*;换新行;加细:1.输入m;2.for(k=1;k=m;k+)for(j=1;j=m;j+)printf(“*”);printf(“n”);,.,#includemain()intk,m,j;scanf(“%d”,分析方法逐步求精法。对于复杂问题,不可能一下得到程序,可以先将简单的部分明确出来,再逐步对复杂部分进行细化,一步一步推出程序。,.,:打印数字魔方要求:从键盘输入m值,输出m行的数字方阵。例:输入m=5,输出的图形如下:1234523451345124512351234分析:1.重复打印m行。,2.第j行的第一个数字为j,之后依次递增,但以m为模:aij=(i+j-2)%m+1,输出项和行、列的关系,.,#includemain()inti,j,m;printf(EnterM:);scanf(%d,.,问题描述:用“*”输出一个菱形图案,图案如下:*,main()inti,j,k;for(i=1;i=4;i+)for(j=1;j=4-i;j+)printf();for(k=1;k=2*i-1;k+)printf(*);printf(n);for(i=1;i=3;i+)for(j=1;j=i;j+)printf();for(k=1;k=7-2*i;k+)printf(*);printf(n);,嵌套循环示例,输出:*,*,控制打印的行数,控制每行打印的空格数,控制每行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年人工智能(AI)基础设施状况报告
- 电玩城技术知识培训课件
- 高科技显示课件
- 北京七年级考试新题目及答案
- SBT-100-生命科学试剂-MCE
- Clothiapine-Standard-生命科学试剂-MCE
- 北京安管人员考试题型及答案
- 报关员考试练习题及参考答案
- 广东高考试题及答案
- 历年自考试题及答案
- 秦兵马俑的课件教学
- 2025-2026学年苏教版(2024)初中生物八年级上册教学计划及进度表
- DBJT15-110-2015 广东省建筑防火及消防设施检测技术规程
- 2024年河北机场管理集团有限公司招聘考试真题
- 2025-2030矿山机械行业应收账款管理优化与现金流改善策略
- 2025-2026秋季学年第一学期教导处工作安排表
- 2025山东菏泽郓城县人民医院招聘合同制护理人员60人笔试备考试题及答案解析
- 低血糖知识培训课件
- 银行公司服务礼仪管理规章
- 2025年秋季开学全体教师大会校长讲话:践行“六个学会”做学生生命中的那束光
- 吊装作业安全专项方案
评论
0/150
提交评论