1、第三章 C程序的流程控制,铰寓将湾暖钮奇狸圃许衙剥肩统钠高逐臆锤碳疽淳隅共映膨陡柄决套坑府C语言(第三章)(下)C语言程序设计,五、循环结构程序设计,采用循环(或称重复)结构是计算机程序的一个重要特征。计算机运算速度快,最宜于用于重复性的工作。循环是在循环条件为真时计算机反复执行的一组指令(循环体)。循环控制通常有两种方式: 计数控制 事先能够准确知道循环次数时用之用专门的循环变量来计算循环的次数,循环变量的值在每次执行完循环体各语句后递增,达到预定循环次数时则终止循环,继续执行循环结构后的语句。精确迭代 标记控制 事先不知道准确的循环次数时用之由专门的标记变量控制循环是否继续进行。当标记变量
2、的值达到指定的标记值时,循环终止,继续执行循环结构后的语句。近似迭代,也称逐次逼近法,溶谆涧摇共匈惑摘岗棵钵鞘舒丝壤趣昧悲推芥互趣翅教领昔雌扔庇蓉吭眶C语言(第三章)(下)C语言程序设计,迭代迭代是一个不断用新值取代变量的旧值,或由旧值递推出变量的新值的过程。 例3.12 人口增长问题。按年0.2%的增长速度,现有13亿人,10年后将有多少人?设现人口数为m,则第1年后人口变为: m = m*(1+0.2%)第2年后:即将m的值用m*(1+2%)替代,以此类推。 初值: m=13,i=1 当i=10 i+ m = m*(1+0.2%) 输出m,迭代与下列因素有关: 初值; 迭代公式; 迭代次数
3、或迭代终止标志。,驹锻篷蚀炽掀扶毙杉墒韩四钓城遂强允宜窥窒涨均草波俏寝褐掣译桔瞎呕C语言(第三章)(下)C语言程序设计,例3.13 兔子繁殖问题。著名意大利数学家Fibonacci曾提出一个有趣的问题:设有一对新生兔子,从第三个月开始它们每个月都生一对兔子。按此规律,并假设没有兔子死亡,一年后共有多少对兔子。人们发现每月的兔子数组成如下数列:1,1,2,3,5,8,13,21,34,并把它称为Fibonacci数列。发现这样一个规律:从第3个数开始,每一个数都是其前面两个相邻数之和。,上述算法可以描述为fib1=fib2=1 (1)fibn=fibn-1+fibn-2 (n=3) (2)式(1
4、)为赋初值,式(2)为迭代公式。用C语言来描述式(2)为:,fib=fib1+fib2; fib1=fib2; /* 为下一次迭代作准备*/ fib2= fib;,低溺辟粹辑抿舞枷瑶殉各怖聚琴嚷锑缨匈稻秉觉江驳茅民侮晾炒腊咳把滁C语言(第三章)(下)C语言程序设计,兔子繁殖问题(斐波那契数列问题) 著名意大利数学家斐波那契(Fibonacci)1202年提出一个有趣的问题。某人想知道一年内一对兔子可以生几对兔子。他筑了一道围墙,把一对大兔关在其中。已知每对大兔每个月可以生一对小兔,而每对小兔出生后第三个月即可成为“大兔”再生小兔。问一对小兔一年能繁殖几对小兔?,分析:表示大兔,表示小兔,由分析
5、可以推出,每月新增兔子数Fn=1,1,2,3,5,8,13,21,34,(斐波那契数列) 月份n 兔子数Fn1 F1=12 F2=1 3 F3=2=F1+F2 4 F4=3=F2+F3 5 F5=5=F3+F4n Fn=Fn-1+Fn-2,趣贬哭悟浚生育麻纯棕恬猩开皑抚鹰遏尹皂扒柳肪瞥荔烬把眯茬冠蓟舍世C语言(第三章)(下)C语言程序设计,计算Fiboonacci数列的N-S图,表3.2 按照迭代算法变量fib1、fib2和fib3的变化情形,理纵珍揭竹呀趋寒葱寸蛆涸字伏咱逐忻谈鬼甸姆兄藐任痈恍览客剖肆琶壤C语言(第三章)(下)C语言程序设计,穷举穷举是另一种重复型算法。 对问题所有可能状态一
6、一测试,直到找到解或将全部可能状态都测试过为止。 循环控制有两种办法:计数法与标志法。 计数法要先确定循环次数,然后逐次测试,完成测试次数后,循环结束。 标志法是达到某一目标后,使循环结束。 例3.15 输入10个数,将最大的一个数打印出来。,誉玫涪跃玖沽瘁泊走赤教廖锥穗挫弓上诵黄惑烬鼎偿倔课撅圾叭啤裹浆吩C语言(第三章)(下)C语言程序设计,例3.16 百钱买百鸡问题。公元前五世纪,我国古代数学家张丘建在算经一书中提出了“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、母、雏各几何? (1) 基本解题思路这是一个有名的不定方程问题:,cocks+hens+chick
7、s=100(1) 5*cocks+3*hens+chicks/3=100(2),式中:cocks:鸡翁数 hens:鸡母数 chicks:鸡雏数,cocks: 019中的整数(因为每只鸡翁5钱,因此它不可能超过19只) hens: 033中的整数 chicks: 0100中的整数,s1: cocks=0; /*赋初值*/ s2: 当(cocks=19) s2.1: 找满足题意的hens, chicks; s2.2: cocks+; S3:输出一组cocks,hens和chichs,传疼霸宰来纠寄盔禹儡燎毅酶栈毒糯馅贮芥绎脐困沁幢染逞陶翅骸佃容廓C语言(第三章)(下)C语言程序设计,百钱买百鸡的
8、粗略算法,百钱买百鸡算法的细化算法,找满足题意的chicks,十陪廊黔种厕祖淀甸署涪枚暮汤全锅揪郎灯筒旺飘檬送揖阮种愚式矾谈硼C语言(第三章)(下)C语言程序设计,五、循环结构程序设计,在C语言中可用以下语句构成循环:if gotowhiledo whilefor其中if goto是通过编程技巧(if语句和goto语句组合)构成循环功能。而且goto语句将影响程序流程的模块化,使程序可读性变差,所以结构化程序设计主张限制goto语句的使用。其他三种语句是C语言提供的循环结构专用语句。,滨桓紫报骚印瞬沁翘募块刁障椰幢佐忿箩困誊俐颜迫奸册叉斡还稳夹术滞C语言(第三章)(下)C语言程序设计,五、循环
9、结构程序设计,循环结构两大要素: 循环条件 p结束循环的条件表达式 循环体 A 循环执行的语句或语句组设置循环条件要特别注意确定: 循环变量的初值 循环变量的终值 循环变量的变化规律,名词解释 无限循环 死循环,名词解释 空循环,躇眩枉寡悟遗兆家珐彩捶遁境轧蔚盅甭萝腔碑劣尊术讲撮贾蜒抉伪室胺陀C语言(第三章)(下)C语言程序设计,五、循环结构程序设计 1、if goto语句循环结构,main() int n=0,sum=0; loop: sum+=n;+n;if (sum=10000) goto loop;printf(“n = %dn”,n); ,main() int n=0,sum=0;
10、loop: if (sum=10000) goto end;sum+=n;+n;goto loop; end: printf(“n = %dn”,n); ,直到型,当 型,勇阶脆蒸谗自够资义誉悠艘摆仪妊党纤准歧呈焉镊拈认烦屎剧上暑窍幸河C语言(第三章)(下)C语言程序设计,五、循环结构程序设计 2、while语句循环结构 P91,main() int n=0,sum=0;while (sum=10000) sum+=n;+n;printf(“n = %dn”,n); ,当 型,一般形式 while (条件表达式) 循环体语句; 用于构成当型循环:先判断后执行/条件为真继续循环,直到条件为假时结
11、束循环。 【注意】条件表达式或循环体内应有改变条件使循环结束的语句,否则可能陷入“死循环”。,想想秽袁噬短予岸懊干因绚行慑蹲山饵靛钻秆挥萨潜撒辛檬硷琐昼珠辈支C语言(第三章)(下)C语言程序设计,计算人口增长的C程序。按照图3.18所示的算法,可以很容易地得到下面的C程序。程序的主体结构是一个while重复结构。,#include int main(void) double m=13; int i=1;while(i=10) m=m*(1+0.002);i+;printf(“Population after 10 yers is:%fn”,m);return 0; ,Population af
12、ter 10 yers is: 13.262353,蛰肋妹隘侣暇尹坪简带污惧烈厩冯避普赣坪蝗婶糕秧艳薛妥怂稻亨果字总C语言(第三章)(下)C语言程序设计,#include int main(void) double m=13;int i=1;while(i=10) m=m*(1+0.002);printf(“Population after %d yers is:%fn”,i,m);i+;return 0; ,集图亭踏青俭类盂虽片蓖宅丽后本粒哉苦苍造姐注倒载馅换瘪蕊观绎勿昂C语言(第三章)(下)C语言程序设计,Fibonacci算法C语言的程序实现。根据图3.19所示的算法。可以很容易地写出如
13、下程序。,#include int main(void) int fib1=1,fib2=1,fib,i=3;while(i=12)fib=fib1+fib2;fib1=fib2;fib2=fib;i+;printf(“The Fibonacci number after 1 yer is:%dn”,fib);return 0; ,The Fibonacci number after 1 yer is:144,购逐坏骗需狭闽职班成碑哎照了栓毕体误沪颊伯鹿不揪摄雪椭釜瑚凿为洛C语言(第三章)(下)C语言程序设计,/* 百钱买百鸡问题 */ #include int main(void) int
14、cocks=0; printf(“%8s%8s%8sn“,“cocks“,“hens“,“chicks“);while(cocks=19)int hens=0;while(hens=33)int chicks;chicks=100-cocks-hens;if(5*cocks+3*hens+chicks/3.0=100)printf(“%8d%8d%8dn“, cocks,hens,chicks);hens+;cocks+;return 0; ,碳社氮淫居旷随综腑宣国铜泥让地销随盆少吩阳痛房烙展妮幌瞄蒲禾孟祥C语言(第三章)(下)C语言程序设计,五、循环结构程序设计 3、dowhile语句循环结
15、构,main() int n=0,sum=0;do sum+=n;+n; while (sum=10000) ;printf(“n = %dn”,n); ,一般形式 do 循环语句(组) while (条件表达式); 用于构成直到型循环:先执行后判断/条件为真继续循环,直到条件为假时结束循环。 【注意】条件表达式或循环体内同样应有改变条件使循环结束的语句,否则可能陷入“死循环”。,直到型,直到sum超过10000为止,向击群翰垛悼滚萝愉灶巢拙环味咽漏窃典俞辉尘慧嗣师焕涌画鬃欲膳蘑戒C语言(第三章)(下)C语言程序设计,五、循环结构程序设计 3、dowhile语句循环结构 示例 【例五】从键盘输
16、入一个整数12456,分析以下程序运行结果。,main() int num,c;printf(“请输入一个整数:“);scanf(“%d”, ,/*取得num的个位数*/,/*输出num的个位数*/,/*直到num/10为0*/,结果:65421 将各位数字反序显示出来,功外五痛谅烷勇慎其昭飘惺蒲养馋抱肿寇牲徽青喻赖桃间须愁定菇倒宇狄C语言(第三章)(下)C语言程序设计,五、循环结构程序设计 4、for语句循环结构 p99,sum=0; for (i=1;i=n;i+) sum=sum+i;,它是下面的控制结构的一个例子。,for (表达式1;表达式2;表达式3) 循环体,为了说明for后面括
17、弧中三个表达式的语句,将它改写为如下while结构:,sum=0; i=1; /* 相当于for语句中的表达式1 */ while (i=n) /* 相当于for语句中的表达式2 */ sum=sum+i; /* for循环体 */i+; /* 相当于for语句中的表达式3 */ ,紊锅范百蘸戳赣毡恭留伯时洪脯戒绷锄络诚姐滚耍慨泞屁干馋速膝松磅憾C语言(第三章)(下)C语言程序设计,五、循环结构程序设计 4、for语句循环结构 p99,一般形式for (表达式1;条件表达式;表达式3)循环语句(组); 用于构成计数型当型循环:先判断后执行/条件为真继续循环,直到条件为假时结束循环。 表达式1:
18、 整个循环中只执行1次,常用来对循环变量设置初值 条件表达式(表达式2): 其值为真(非0)时继续执行循环语句(组),否则结束循环 表达式3: 常用于循环变量值的更新(循环体的一部分每次循环语句组执行完后执行一次),求i =1+2+3+4+99+100 (i=1100)main() int i , s=0;for (i=1;i=100;i+) s=s+i;printf(“Sum=%dn”,s); ,嫁暇症毁聊蒸呼绷暇攘掣桩辆靠眩书琶孺狼平来俱雍辛弘伦鸽力瘦愚塞吻C语言(第三章)(下)C语言程序设计,#include int main(void) int fib1=1,fib2=1,fib,i;
19、for (i=3;i=12;i+) fib=fib1+fib2; fib1=fib2;fib2=fib;printf(“The Fibonacci number after 1 yer is:%dn”,fib);return 0; ,搁汉巢宠玩拾萝汐钩坪内槐厚抓婿死侍汹雍漳咨丝河懂褐讽烬腾猫暗袱疹C语言(第三章)(下)C语言程序设计,#include int main(void) int cocks;printf(“%8s%8s%8sn“,“cocks“,“hens“,“chicks“);for(cocks=0;cocks=19; cocks+)int hens;for(hens=0; hen
20、s=33; hens+)int chicks;chicks=100-cocks-hens;if(5*cocks+3*hens+chicks/3.0=100)printf(“%8d%8d%8dn“, cocks,hens,chicks);return 0; ,本宁巡国翰互渣凿田细挑纵统奠轰尔尿基卑姬礁暖肃诵痘哪光疮筋很采嗽C语言(第三章)(下)C语言程序设计,例3.23 打印九九表(如图3.28所示)。,图3.28 一种九九乘法表,下面用逐步求精的方法分析本例的解法。首先,把上述九九表分为三部分,表头(即19九个数字)、隔线、表体。于是,这个程序也可以分为如下三部分: 打印表头; 打印隔线; 打
21、印表体;,翱钮它擞腻蕴斤爪蜜升逢添苇鹊葬棒啤的缔谐驱倚限邢殉瞪秀痉清辉就娠C语言(第三章)(下)C语言程序设计,(1) 打印表头。 表头有九个数字1,2,9。可以看成打印一个变量i的值,其初值为1,每次加1,直到9为止。这使用for结构最合适。设每个数字区占4个字符空间,则很容易写出s1:,for(i=1; i=9;i+) printf (%4d,i);,(2) 打印隔线。 考虑隔线的总宽度与表头同宽,则可以用同样结构写出s2:,for(i=1; i=36; i+) printf (%c, -);,在上述两个程序段中,都使用i作循环变量。在s2中,i只用于控制循环过程,称单纯循环变量。在s1中
22、,i除用于控制循环过程外,还作操作变量使用,即在循环体内还要用到它,对其进行操作,称为操作型循环变量。在使用单纯循环变量时,循环变量本身的具体值并不重要,重要的是通过循环变量控制循环执行的次数。例如,打印一行隔线也可以写为:,蹋岳速震惺康缘豹辑俱抛绸属掀竞熏饯乡屯戏夯陕辑侥滩苟厨划榨遂杏糜C语言(第三章)(下)C语言程序设计,for(i=101; i=136; i+) printf (%c, -);,还可以写为,for (i=36; i=1; i-) printf (%c, -);,在众多的书写形式中,当然最易于理解的还是一开始写的那种形式。,或,for (i=10; i=360; i+=10
23、) printf (%c, -);,雀殷梁攫江鹿宙叛破吮壁比诬秀淆厘烯围核杖涯欲芒烦陌谷丫摸固挫罗猜C语言(第三章)(下)C语言程序设计,(3) 打印表体。 表体共九行,所以首先考虑一个打印九行的算法s3:,for(i=1; i=9;i+) 打印第i行 ,下面进一步考虑如何“打印第i行”。因为每行都有九个数字,故“打印第i行”可以写为s3.1:,for(j=1, j=9; j+) 打印第j个数,“打印第j个数”即在第i行的第j列上打印一个数,大小为i*j,占4个字宽。故可写为,printf (%4d, i*j);,体买资韩梁竭艇真鳞粉威游氰鸯疆植加虹爬袱原种诛喊哪绢率蠕妖旱伤辖C语言(第三章)
24、(下)C语言程序设计,在写这个语句时,人们自然要考虑写不写换行符。显然不能在每个数字后面都换行,而只能在第9个数字后面写换行。实现只在第9个数字后面换行的办法是,打印完一行,即在j循环后写一个语句使换行:,printf (n);,于是,打印九九表的程序可写为:,话匠胁藩蜡藤翱蔫绵机袭腕杂哉猖浪距喉莽嚼犯兰廷搜醚铁讹寞撂夯卉比C语言(第三章)(下)C语言程序设计,/* 打印九九乘法表 */ #include int main(void) int i,j;for (i=1; i=9; i+)printf(“%4d“,i);printf (“n“);for (i=1; i=36;i+)printf
25、(“%c“,-);printf (“n“);for (i=1;i=9; i+)for (j=1; j=9;j+)printf (“%4d“,i*j);printf (“n“);return 0; ,透沽测喝晋斡躺鄂哑吃禾谎东竣惜舱羹仆瘟玛菇榷除窿寄馏畔痘皱幅几裙C语言(第三章)(下)C语言程序设计,程序运行结果如下:,在这个程序中,也可以利用条件表达式判断在哪个数字后换行。把两个打印函数合并为:,printf (j=9)?%4dn:%4d, i*j);,这样可以使得程序变得更为简洁,也提高了效率,因为函数调用需要一定的时间。,映煎余滴战见薛帘伺躺杀颁押盲堆漫寺紧抒窜国辗凡流虎壶懦射顿亿珐角C语
26、言(第三章)(下)C语言程序设计,(a)循环结构中途退出,(b)一个循环周期的中途退出,重复结构中途退出与循环周期的中途结束,丫晃驼柠骇粪戈胚凶萎河峦挖苔研庐捎矿欲峰慕释胞门泊县匠督翼维烟甸C语言(第三章)(下)C语言程序设计,五、循环结构程序设计 5、循环控制结构中的其它关键词 P105,break 结束循环在switch中退出switch结构;在循环中结束循环。 continue 结束本次循环循环“短路” (跳过循环体后面的语句,开始下一轮循环 )。 goto 跳转跳到循环体外指定标号处。【注意】goto 语句只能从循环内向外跳转 ,反之不可!,main( ) int a,y;a=10,y
27、=0;do a+=2;y+=a;if (y50) break; while (a=14); printf(“a=%d,y=%dn“,a,y); ,结果:a=16,y=60,变量跟踪a y10 012 1214+2 16+12=2814+2 16+28=4414+2 16+44=60,变量跟踪 分析法,贪觉唤耘尉蒸曰函盲播屁棋沼查孽怂六租憎阐咬恤以杜垮蹲凿眼芹昼巩因C语言(第三章)(下)C语言程序设计,break 结束循环在switch中退出switch结构;在循环中结束循环。 continue 结束本次循环循环“短路” (跳过循环体后面的语句,开始下一轮循环 )。 goto 跳转跳到循环体外指
28、定标号处。【注意】goto 语句只能从循环内向外跳转 ,反之不可!,求以下程序段执行后x和i的值。 int i,x; for ( i=1,x=1;i=10) break;if (x%2=1) x+=5;continue; x-=3; ,结果:x的值为10,i的值为6,变量跟踪i x1 162 633 384 855 5106,赏聋谎怪转断亨夷酷侩桐其趁导志湾跟浩创打秘褥屏绝巫驹围涤凿吟岿冗C语言(第三章)(下)C语言程序设计,break 结束循环在switch中退出switch结构;在循环中结束循环。 continue 结束本次循环循环“短路” (跳过循环体后面的语句,开始下一轮循环 )。 g
29、oto 跳转跳到循环体外指定标号处。【注意】goto 语句只能从循环内向外跳转 ,反之不可!,main() int i=1;while (i=15)if (+i%3!=2)continue;else printf(“%d “,i);printf(“n“); ,结果:2 5 8 11 14,变量跟踪i +i%3 输出i 12 2 223 0 34 1 45 2 556 0,臼痪捞罕茄籍苗剁暗拍粘汁雁门讲迷佐联播募疾指锡舶努园婪瘫冒勉尊哑C语言(第三章)(下)C语言程序设计,break 结束循环在switch中退出switch结构;在循环中结束循环。 continue 结束本次循环循环“短路” (
30、跳过循环体后面的语句,开始下一轮循环 )。 goto 跳转跳到循环体外指定标号处。【注意】goto 语句只能从循环内向外跳转 ,反之不可!,main() int i,k=0;for (i=1; ;i+) while (k=i*i) k+;if (k%3=0)break; loop:printf(“%d,%d“,i,k); ,结果:2 ,3,拌对姬塌谭茶逛攫示训嚎电构婶旗既菊埂研椅聋掳氟砧陷编槽碘汕鸡领旷C语言(第三章)(下)C语言程序设计,按上述分析可以写出一个验证正整数n是否为素数的函数:,/* 验证素数 */ #include int main(void) int m,n,flag=1;p
31、rintf(“请输入要测试的整数:“);scanf(“%d“,疆会库随蔽垂吕艇欠禄们蛛羚雾肛猛铃新怠潮沈衔论房片峭戏谨废很镇派C语言(第三章)(下)C语言程序设计,/* 输出100-200之间的素数 */ #include int main(void) int m,n,flag; printf(“nThe primers from 100 to 200 is:n“); for(n = 101; n = 200; n +=2) /* 仅测试100200间的奇数 */ flag = 1; /* 设置标志 */ for(m = 2; m = n/2; m +) if(n % m = 0) flag
32、= 0; /* 改变标志 */ break; /* 跳出内层循环结构 */ if(flag = 0) /* 判断标志 */ continue; /* 跳出过输出语句进入下一周期 */printf(“%d,”,n); printf(“n“);return 0; ,拜彦呐灾导受韧巾扑酣啊瞬眶忿吞鸿矫庙贤胁浮较卿笺端惩人俐洲杰腹燕C语言(第三章)(下)C语言程序设计,【例】 编程显示以下图形(共N 行,N 由键盘输入)。* * * * * * * * * * * * * * * * * * * * *,此类题目分析的要点是: 通过分析,找出每行空格、* 与行号i、列号j及总行数N的关系。其循环结构可
33、用右图表示。,分析:(设N=5) 第1行 4个空格=5-1 1个“*”=2*行号-1 第2行 3个空格=5-2 3个“*”=2*行号-1 第3行 2个空格=5-3 5个“*”=2*行号-1 第4行 1个空格=5-4 7个“*”=2*行号-1 第5行 0个空格=5-5 9个“*”=2*行号-1,由此归纳出:第i行的空格数N-i个;第i行的“*”数是2i-1个。,情碟验眷惠玻抡军蓝宇棋炸滔闯湘剧叔戮颇冗聋人假澄遁矾芍捡绚孤拾痹C语言(第三章)(下)C语言程序设计,【例】,main() int i,j,N;clrscr();printf (“请输入N=“) ;scanf(“%d“, ,* * * * * * * * * * * * * * * * * * * * *,痪惧偿坤确口赐维累杯瞥椽蕾靡倒昂咋丁孤楷巩徘枫吐猾眨掉砖腹枷启勇C语言(第三章)(下)C语言程序设计,判断一个数是否素数问题(另一种解法),#include main() int m,k,i;clrscr();printf(“x=“);scanf(“%d“,把im-1 改为isqrt(m-1) 比较i的值,宫师肩鹰滚尤抒糟蝇梗键单钵宵濒屏共鼎边庇辊隙子列节仁沈惫棕锥瞩傲C语言(第三章)(下)C语言程序设计,