第六章循环体程序设计.ppt
第六章 循环结构程序设计,氯哺尽室抵萤士熄领匿金瑟庆讽翔粕鸟丹囤岂猪拦蛹檬湍拘过内消试酗湍第六章循环体程序设计第六章循环体程序设计,第 2 页,6 循环语句,提出问题,?,提问:打印10行“*”,怎么编程?回答:写10个printf(“*”);语句。提问:打印500行,怎么编程?回答:这个,嗯?不会让我写500个.,注意:让我们换一个角度来看待这些问题,以上问题实质是:将printf函数重复执行N遍。,printf(“*”);,笆旗风灶馆我撩够界城骏赣揭钩铡杯玻股袜糊略鹤哈飞湍甫卫做梗罗匿佣第六章循环体程序设计第六章循环体程序设计,第 3 页,6 循环语句,循环 反复执行同一段程序,直到满足一定的条件后才停止执行该段程序。C语言中控制循环的语句:while do-while for,芹虑措戚莫逐羡剂卷轮淆炬被封纲洛胜鬃砰鉴凶妻慨汾瞳汇壕邻恒撅闰刘第六章循环体程序设计第六章循环体程序设计,第 4 页,6-1 while语句,while语句格式while(表达式)语句;说明:语句部分可以是简单语句,也可以是复合语句。while语句的执行流程,啥剁赦胸挠痛冷觉醋肢昏妹敲绢捞禁缔隘稚驻笺镐贫芬咎停涌润晚豆烬筏第六章循环体程序设计第六章循环体程序设计,第 5 页,6-1 while语句-实例,例:从键盘输入10个整数,求这10个整数的和。#include main()int count,num,total;/*count:计数器,num:输入的整数*/count=0;total=0;/*total:存放累加和*/while(count10)/*循环控制条件*/count+;/*循环体*/printf(Enter the No.%d=,count);scanf(%d,戈茶檀锗萨胸畦下奉鸣徒差箔腊轰炭虐年渡旬纽利蘑浸绊承姆减谭讨祥吏第六章循环体程序设计第六章循环体程序设计,第 6 页,6-1 while语句-实例,例:分析程序的运行结果#include main()int n=0;while(n3)printf(”n is%dn”,n);n+;printf(”Thats all this program does.n”);结果:程序将不停的打印“n is 0”,直至终止程序无法正常终止的程序,称为“死循环”。结论:在while语句循环体中,一定要有能够对循环控制条件产生影响的语句。避免出现“死循环”现象。,雇才耿锋翱类营激腥堤纱屑亿缠凸捐视庭著威攘谋熊摆者文鳃海疏跑止版第六章循环体程序设计第六章循环体程序设计,第 7 页,6-1 while语句-实例,例1:分析下列程序段 index=1;while(index 5)printf(”Good morning!n”);分析:程序段将无限制打印字符串。因为循环中没有任何语句可以改变循环控制变量index的初值1例2:分析下列程序段 index=1;while(-index 5)printf(”Good morning!n”);分析:仍有问题,程序改变了index的值,但方向错了。在index达到系统能够处理的最大负数时,将会产生下溢而终止程序。结论:循环体中必须有能够使循环正常停止的条件。,洲傲竟丑睡鸦梯露撬爪狞点汇砍阔泵借赴冗灌求掏袋饥患毙葫埂木策音轮第六章循环体程序设计第六章循环体程序设计,第 8 页,6-1 while语句-实例,【例6.1】求,main()int i,sum0;i=1;while(i100)sum=sum+i;i=i+1;printf(“d”,sum);,赐争两渗妇密哼蔷棵荧吃撑糯杉茸嗅拉据澳驱诗机仑婉顽盒桌弥菊婪世架第六章循环体程序设计第六章循环体程序设计,第 9 页,6-1 while语句-实例,【例6.2】求前n个数的平方的和:,根据上例写出程序如下:main()int i=1,sum=0,n;scanf(“%d”,&n);while(i=n)sum=sum+i*i;i+;printf(“i=%d,n=%d,sum=%dn”,i,n,sum);,碾腑践虎霄咙寒争玛岂技甩呻惶卓祭限吝矩烹鹿台匝级商误咸嫉嘲眯暑彼第六章循环体程序设计第六章循环体程序设计,第 10 页,6-1 while语句-实例,该例也可以写成如下:,main()int i=1,sum0,n;scanf(“%d”,&n);while(n)sum=sum+n*n;n-;printf(“i=%d,n=%d,sum=%dn”,i,n,sum);,组豹锭策嗓皋拼沪掇砷凤卧惕虎哗毙郴属古谨浮峰犁锑衍策骂税参壳韦驹第六章循环体程序设计第六章循环体程序设计,第 11 页,6-1 while语句-实例,【例6.3】将输入的字符原样输出,以“#”号结束。,#include main()char c;c=getchar();while(c!=#)putchar(c);c=getchar();,般腔排验煎挪桑迭壁愤懊补切戌傍挡奢题渡凳薪戒貉膜角警毅能士耍屁闻第六章循环体程序设计第六章循环体程序设计,第 12 页,6-1 while语句-实例,上述程序也可以写为:,#include“stdio.h”main()char c;while(c=getchar()!=#)putchar(c);,锹毗忌汹洛忆袄拽祖蕾讫进穿别瞳渝披钓忠亡辱爽异染节彪睡沿壁业窥衣第六章循环体程序设计第六章循环体程序设计,第 13 页,6-1 while语句-实例,【例6.4】统计从键盘输入的以n结束的字符中英文字母的个数。,#include main()int n=0;char c;while(c=getchar()!=n)if(c=a,Ab2!*AB4,椰阀抚此毕阻淮簿骆沫博材涤勇室泡永哄稍垂呢筒叮活耪娃伶昏搽者锋涎第六章循环体程序设计第六章循环体程序设计,第 14 页,6-1 while语句-实例,while使用注意 1.while(0).由于循环的条件表达式恒等于0,循环体永远也不会执行。2.while(1).由于循环的条件表达式恒等于1,所以不可能通过循环控制条件来结束循环体的执行,称为“死循环”。3.为了保证循环正常运行,应该特别注意:循环控制条件 控制条件的初始状态(初始值)循环体内部对控制条件的影响,谦焚撕企归骏芹董盲蜒撬瓶蕉拼搐递负藐戒怕芋伞澈晌奥臂孜耶乞禾搪纬第六章循环体程序设计第六章循环体程序设计,第 15 页,6-2 do-while语句,do-while语句格式 do 语句 while(表达式);do-while语句的执行流程,循环控制条件,循环体,致渣樟索雀韧津釜功歇象矾毙暑人查隙胳纯映翌背搭来骑拉遭桐剁丈蓑急第六章循环体程序设计第六章循环体程序设计,第 16 页,6-2 do-while语句,do-while语句特点do-while与while的最大区别:do-while语句先执行循环体然后再判断循环控制条件,而while却是先判断条件之后再执行循环体。使用do-while构成的循环,循环体至少要执行一次;而采用while构成的循环,循环体有可能一次也不会执行。,佛诗扇昨盾果瑶钡程宏冰要沫拭刻宁鸟被毒漂严旨麻汞啼降纫捣自妊乌你第六章循环体程序设计第六章循环体程序设计,第 17 页,6-2 do-while语句-实例,【例6.6】用do-while语句求,main()int i,sum=0;i=1;do sum=sum+i;i+;while(i=100);printf(“%d”,sum);,捶窿骤查元沼种慑有枢醇傀剃蛔胎糠赘兜礁符手佳勤荷阵晒逐琼宜徊挛柴第六章循环体程序设计第六章循环体程序设计,第 18 页,/*ex4-11-1.c*/#include main()int i,sum=0;scanf(%d,/*ex4-11-2.c*/#include main()int i,sum=0;scanf(%d,1 sum=55,1 sum=55,11 sum=11,11 sum=0,6-2 while和do while比较,蒜柒咳儡尖霸罪阔鸟深喇涵寺倔筑帽锰恤敝毖漫蘸肖腰卑授迅琳寥埃惨世第六章循环体程序设计第六章循环体程序设计,第 19 页,6-2 do-while语句-实例,【例6.8】输入一个整数,计算它的位数.并反向输出.,main()long num;int count=0;printf(“输入一个整数:”);scanf(“%ld”,&num);do printf(“%d”,num%10);num=num/10;count+;while(num);printf(“该整数是%d 位数.”,count);,葛惭惭铲协缴浮驾呐鸯俭椒肮论啤蛮劫颤捉杂村箱寓救疵倪恬翱捻渺鄙宽第六章循环体程序设计第六章循环体程序设计,第 20 页,6-3 for语句,for语句格式for(表达式1;表达式2;表达式3)语句;for语句的执行流程,循环初始条件,循环控制条件,循环体,for语句等价于下列语句:表达式1;while(表达式2)语句;表达式3;,涉丫疵祥梦赦性功权歌靶抒缆竿哩梢词纠辆拒乒敌影舰却役丁樊超澡悼记第六章循环体程序设计第六章循环体程序设计,第 21 页,6-3 for语句-实例,例:求一个数的阶乘。#include main()long int jc=1;int i,n;scanf(“%d”,for语句最常用的形式for(初值;控制条件;增量)语句;,3 3!=6,血敲饿然讨歌刊蟹贝曳梗开憾箍镭枚浙穗屈雁侵幼猩硒监往篓缝涛殆始迎第六章循环体程序设计第六章循环体程序设计,第 22 页,6-3 for语句,for语句的变化形式for语句中的三个表达式中的任意一个都是可以省略的,但是分号不能省略。1.省略表达式2,则:for(表达式1;表达式3)就形成了一个死循环。2.省略表达式1和表达式3,则:for(;表达式2;)就等同于:while(表达式)据此结论:所有用while语句实现的循环都可以用for语句实现。3.表达式1、2、3全省略,则:for(;)就等同于:while(1),滁羞茫师井赊措伙戮版以务膨勃阴苯碎蔑泉禄搬强烈锁泛昧涵河跟第种诽第六章循环体程序设计第六章循环体程序设计,第 23 页,6-3 for语句-实例,【例6.9】输入20个09的数字字符,计算有多少奇数,偶数和零。,#define M 20main()int i,k,n1=0,n2=0,n3=0;char ch;printf(“输入数字字符20个:n”);for(k=1;k=M;k+)scanf(“%c”,&ch);i=ch-0;if(i=0)n3+;/*零*/else if(i%2=0)n1+;/*偶数*/else n2+;/*奇数*/printf(“有%2d 个偶数,%2d 个奇数,%2d 个零”,n1,n2,n3);,戳致继姑益捅质窿樊再泪闭名赊逐际毛辅瓶慑鲍靡廓崎漠理守比计伊阎溃第六章循环体程序设计第六章循环体程序设计,第 24 页,外层循环可包含两个以上内循环,但不能相互交叉,循环的嵌套三种循环可互相嵌套,层数不限,(1)while()while().,(2)do do while();.while();,(3)while()do while();.,6-4 循环的嵌套,是促绽食眉俗驰健豫牟渺固擎卤蝎绵近毕早藐叹啡渡辊孪印沾简盾按酉磕第六章循环体程序设计第六章循环体程序设计,第 25 页,6-4 循环的嵌套,【例6.23】打印九九表。,main()int i,j;for(i=1;i10;i+)for(j=1;j=i;j+)printf(%d*%d=%dt,j,i,i*j);printf(n);,夹驶教伪驴樊丁距矗乖赏摄林侗俭档富啤索痰巢已枫颊礼鸽辅嘛饮谚甲屹第六章循环体程序设计第六章循环体程序设计,第 26 页,6-4 循环的嵌套,【例6.10】写出运行结果。,main()int i,j,k;printf(i j kn);for(i=0;i2;i+)for(j=0;j2;j+)for(k=0;k2;k+)printf(“%d%d%dn,i,j,k);,息公骑嘲棋虏阮划谜炭肝铜时交毯拥侦券翻杰梨脸铜毫襟炭膝毒韩疗捻良第六章循环体程序设计第六章循环体程序设计,第 27 页,6-5 循环语句小结,C语言提供了三种循环语句:for、while、do-while。特点如下:1、for和while先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件。2、while、do-while、for可以相互替换使用。3、while语句多用于不需要赋初值的或循环次数不定的情况。for语句多用于要赋初值或循环次数固定的情况。do-while语句多用于至少要运行一次的循环控制。4、循环语句可以嵌套,循环可以并列,但不能交叉。,枯摊饿翻你抹挥钱梦倘槛佃额于欠循挛瘩霸注会帝翼骋枣迢擅姨柠卓白呕第六章循环体程序设计第六章循环体程序设计,第 28 页,6-5 循环语句小结,为了保证循环体正常运行,应该特别注意:循环控制条件 控制条件的初始状态(初始值)循环体内部对控制条件的影响以上三个方面相互配合,相互影响,共同完成循环控制,优入伶爹免帝闲恿兔甜碰锚绍渐七走凋臀富潮氰六付刷曹寝逾忘友峨咯绢第六章循环体程序设计第六章循环体程序设计,第 29 页,6-6 转移语句,转移语句的作用 改变程序的运行流程。C语言转移语句 break continue goto return,阑蓑嘎硫牟凭赶镀狂淀列硝察伪禄油颂船棱瓢淘惶辨割固整临泅藐腥枪慷第六章循环体程序设计第六章循环体程序设计,第 30 页,6-6-1 break语句,格式break;break语句的功能 1.在switch语句中结束case子句,使控制转到switch语句之外。2.在循环语句的循环体中使用,结束循环过程,使控制转移到整个循环语句之外的下一条语句处。,花孺浚邹见丑咐铱蛆浴进蔼页绍原铺鼎耳堤恋霉饰娩摊酝修狡勇惭映苛媳第六章循环体程序设计第六章循环体程序设计,第 31 页,6-6-1 break语句,break语句的执行流程,break,break,break,while语句,for语句,do-while语句,淌闽吻堤阂洪谜悠绽左擦兴撮轻唇闲口龟伍哼矛柯咙美设薛词温桑淆兴近第六章循环体程序设计第六章循环体程序设计,第 32 页,6-6-1 break语句-实例,例:求555555的约数中最大的三位数是多少?main()int j;long n;printf(Please input number:);scanf(%ld,/*控制退出循环*/,午框吉杀尘六痔隘还猜龄岿殷跺赘绚先柔芹坝脆阻办堪拜陶例膜臼笆征讽第六章循环体程序设计第六章循环体程序设计,第 33 页,/*ex4-13.c*/#define PI 3.14159main()int r;float area;for(r=1;r100)break;printf(r=%d,area=%.2fn,r,area);,【例6.11】求面积不大于100的半径为自然数的圆面积。,r=1,area=3.14r=2,area=12.57r=3,area=28.27r=4,area=50.27r=5,area=78.54,r=6时,area=113.10,压喉府致恭胀痹恳札震浦馏山莹锁簇集疚邮挡月翠瘁轰跳醚邑凸衙鄂候思第六章循环体程序设计第六章循环体程序设计,第 34 页,6-6-1 break语句-实例,break语句使用注意:1、在嵌套循环中,break语句仅能退出一层(当前)循环。2、若在循环语句中包含了switch语句,那么switch语句中的break语句仅能使控制退出switch语句。3、break语句并不是程序设计中必不可少的语句,可以通过改变程序的结构去掉。,缕对依妻貉归拓咋摸汤苹伸又籍戎浅冒劫蜀秽拨剪顽缄您助否翰温杉吧贬第六章循环体程序设计第六章循环体程序设计,第 35 页,6-6-2 continue语句,continue语句格式continue;continue语句的功能 continue语句仅能在循环语句中使用.它的作用不是结束循环,而是开始一次新的循环。对于for语句,将控制转到执行表达式3和条件测试部分 对于while和do-while语句,将控制转到条件测试部分 从逻辑上讲,改变if语句的条件表达式所表示的条件,就可以不需要使用continue语句。,预恢豪儡衰盒租伯河舌溶败援鸭浮瘦臂帚骆陌趴函晴福夹蓖下不鞭诗毛泪第六章循环体程序设计第六章循环体程序设计,第 36 页,6-6-2 continue语句,continue语句的执行流程,扣寐瘟艘巴祷攫悲侦走殖亦漆熟财噬宰消吼胡行戮戈圆刃封典瘫雾楔梭论第六章循环体程序设计第六章循环体程序设计,第 37 页,6-6-2 continue语句-实例,例:输入10个整数,求其中正数的个数及平均值,精确到小数点后两位。main()int i,count=0,j,sum=0;for(i=1;i=10;i+)printf(Input integer:);scanf(%d,改变if语句的条件表达式,可以不需要使用continue。,锈侩波萤牛犹陀灵瓮分裹疾屹诽辈壶诧囊垃从权丢压炼兢即梭匡坎胀尤猜第六章循环体程序设计第六章循环体程序设计,第 38 页,6-6-2 continue语句-实例,【例6.12】输出100200之间的不能被3整除的数。,main()int n;for(n=100;n=200;n+)if(n%3=0)continue;printf(“%d”,n);,掷鄂拂晌诣沾落晰北捐临啼阔恃环榨遂侮拿烹箕诗恃汐却药明蚜人莽涵岗第六章循环体程序设计第六章循环体程序设计,第 39 页,6-6-3 goto语句,goto语句格式goto 标号;goto语句的功能1、将控制转移到标号所指定的语句处继续执行。2、标号的唯一功能就是作为goto语句的目标。标号的作用域是它所在的整个函数,标号必须是合法的标识符。goto语句的使用说明在C语言中,goto语句并不是必不可少的,使用goto语句的地方都可以用C的其他控制流程语句改写。,晰丽镑巨巨债写矩尔础应贡拎档奋食膘襟已甘兽绚崭安蚜槛讥免潭铝席洛第六章循环体程序设计第六章循环体程序设计,第 40 页,/*ex4-8.c*/#include main()int i,sum=0;i=1;loop:if(i=100)sum+=i;i+;goto loop;printf(%d,sum);,sum=0+1sum=1+2=3sum=3+3=6sum=6+4sum=4950+100=5050,例 用if 和goto语句构成循环,求,6-6-3 goto语句-实例,俘阵旅妆饥绿痊逆嘿翁世碍唁靛躇孕焦即鲜肠窑鲁叁圭陋你雅镇阻辨构茨第六章循环体程序设计第六章循环体程序设计,第 41 页,6-6-4 return语句,retunrn语句格式格式一:return;格式二:return(表达式);return语句的功能 1.return语句使程序从被调用函数中返回到调用函数的调用处继续运行。2.如果return后跟一表达式,则该表达式的值会从被调用函数中带回到调用它的函数,称为返回值。,扮储椅洼无降复钩竖匡煎引驾盾豺恃番北叠剂冗哆坦眯坠祟诬篮蝇硕吉囚第六章循环体程序设计第六章循环体程序设计,第 42 页,6-7 算法举例-穷举法,穷举法例6.14】将2角钱换成1分、2分和5分的硬币,列出所有可能的换法。main()int x,y,z,k=0;for(z=0;z=4;z+)for(y=0;y=(20-5*z)/2;y+)printf(“第%d种:1分=%dt2分=%dt5分=%dn”,+k,20-2*y-5*z,y,z);printf(“总的换法=%dn”,k);,阳胚贮拎勺盟遮馋荚鸳匡盆秩鼎犹寞夕婚撰盾尾瞒疗馈恐弯弓哈介逃心媳第六章循环体程序设计第六章循环体程序设计,第 43 页,6-7 算法举例-迭代法,例:数列1、1、2、3、5、8、13、21、是著名的菲波那奇(Fibonacci)数列,其递推通项公式为:1 2 n n-1 n-2(n=3)为求出第N项的值,请编写程序。根据递推通项公式,可用递推法编写程序,计算第N项的值。递推法:由初始的已知条件开始,先计算出第(N1)步的结果,再利用前面已知的(N1)项结果,按照递推公式(或遵照递推规则),推出第N步结果。递推法是程序设计中最常用的方法之一,使用递推法必须有明确的递推初始值和递推规则(递推公式)。,点搏绥词抬满掷累浊郸氓轨别痛垦亲韦霹亏抬紊驹盔业侯礼凳霜霉绸蚌泊第六章循环体程序设计第六章循环体程序设计,第 44 页,6-3 for语句-实例,main()int n,i,un1,un2,un;for(;)printf(Input n=?);scanf(%d,皿扶刑龚抬沪肃扩紫照充量旧卢羊瘪慨残晰理抢郸盾漓引倚滋撮榴婆撰桂第六章循环体程序设计第六章循环体程序设计,第 45 页,f1 f2?,f1,例6.17 求Fibonacci斐波纳契数列 的前40个数,f2,main()long f1,f2;int i;f1=1;f2=1;for(i=1;i=20;i+)printf(“%12ld%12ld”,f1,f2);if(i%2=0)printf(“n”);f1=f1+f2;f2=f2+f1;,1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 1493035224157817 39088169 63245986 102334155,吧收弱剑船卒颇蜂斑吼籽音奔初竣型臣变逐氟绅框穆伐损纠雅彝齐啪猩瑟第六章循环体程序设计第六章循环体程序设计,第 46 页,6-8 循环程序设计举例,辗转相除法main()int x,y,a,b,t;printf(输入两个整数x,y:);scanf(%d,%d,/*用乘积除以最大公约数得到最小公倍数*/,【例6.18】求两个整数的最大公约数和最小公倍数。,部鼠郊源亢怀寇颊鞍示天者谢链磊衅炕椰鸵诗稍晋靴茹庐泡掏赂傀播忆祥第六章循环体程序设计第六章循环体程序设计,第 47 页,分子 s:1,-1,1,-1分母 n:1,3,5,7,.项t=s/n,【例6.19】用 公式求 的近似值,直到某一项的绝对值小于 为止,#include main()int s;float n,t,pi;t=1;pi=0;n=1;s=1;while(fabs(t)=1e-6)pi=pi+t;n=n+2;s=-s;t=s/n;pi=pi*4;printf(“pi=%10.6f”,pi);,6-8 循环程序设计举例,迈歇纬型谜时曼虚隋喂潮索奄嚏论壶握涅寡展溅弹虾仙芳粳忠撕阁罕莽绑第六章循环体程序设计第六章循环体程序设计,第 48 页,#include main()int m,i,k;scanf(“%d”,6-8 循环程序设计举例,【例6.20】判断m是否素数。,兼厉麦虐邢闸庇凑屑瓢弓侄叶吐硅瞎焙薛因纸未继青灌毋颈灭杀纬卜蛋豫第六章循环体程序设计第六章循环体程序设计,第 49 页,#includemain()int m,i,k,n=0;for(m=101;m=k+1)printf(“%d”,m);n=n+1;if(n%10=0)printf(“n”);/*一行输出10个*/printf(“n”);,6-8 循环程序设计举例,【例6.21】求100至200间的全部素数。,锑骤帅铁胶昆行刹抓扔蕾未蛇晦袖敦换枉涛邹捌训霖竟乞憨婆色蚤矗膝第第六章循环体程序设计第六章循环体程序设计,第 50 页,6-8 循环程序设计举例,【例6.22】用循环输出如下图案:*,main()int i,m,n;for(i=1;i=5;i+)/*行数的控制*/for(m=1;m=5-i;m+)printf(“”);/*空格的控制*/for(n=1;n=i;n+)printf(“*”);/*输出*个数的控制*/printf(“n”);/*每一行要有回车换行*/,错我武孟馋拧卧违唬殆娄滨邵傍钧喳憾耻叙蔑胯鞭臆久哀顽粘锭向迎淘但第六章循环体程序设计第六章循环体程序设计,第 51 页,6-8 循环程序设计举例,【例6.24】打印所有“水仙花数”(三位数:153135333)。,main()int i,ge,shi,bai;for(i=100;i=999;i+)bai=i/100;shi=i/10%10;ge=i%10;if(i=ge*ge*ge+shi*shi*shi+bai*bai*bai)printf(%6d,i);printf(n);,子鸵镰顾藕赔泵薄狠占拱唉长邀章答慎驶语则押膏仕比恤咬蕊宇漆燎缓谋第六章循环体程序设计第六章循环体程序设计,