第5章C语言循环结构程序设计

上传人:cn****1 文档编号:568560523 上传时间:2024-07-25 格式:PPT 页数:64 大小:269KB
返回 下载 相关 举报
第5章C语言循环结构程序设计_第1页
第1页 / 共64页
第5章C语言循环结构程序设计_第2页
第2页 / 共64页
第5章C语言循环结构程序设计_第3页
第3页 / 共64页
第5章C语言循环结构程序设计_第4页
第4页 / 共64页
第5章C语言循环结构程序设计_第5页
第5页 / 共64页
点击查看更多>>
资源描述

《第5章C语言循环结构程序设计》由会员分享,可在线阅读,更多相关《第5章C语言循环结构程序设计(64页珍藏版)》请在金锄头文库上搜索。

1、第第5 5章章 循环结构程序设计循环结构程序设计 第第5章章 循环结构程序设计循环结构程序设计 5.1 循环语句概述循环语句概述 5.2 for语句和语句和while语句语句 5.3 直到型循环直到型循环do-while语句语句 5.4 循环结构的嵌套循环结构的嵌套 5.5 break和和continue语句对循环控制的影响语句对循环控制的影响 5.6 goto语句语句 5.7 循环结构程序设计应用循环结构程序设计应用 第第5 5章章 循环结构程序设计循环结构程序设计 5.1 循环语句概述循环语句概述在C语言中,可用以下语句实现循环:for语句do-while语句while语句goto语句第第

2、5 5章章 循环结构程序设计循环结构程序设计 从功能上说,for语句可完全代替当型循环语句while,所以while语句也不是必需的。因此,本章只详细介绍for语句和直到型循环语句do-while语句,简述while语句。第第5 5章章 循环结构程序设计循环结构程序设计 5.2 for语句和语句和while语句语句5.2.1for语句在三条循环语句中,for语句最为灵活,不仅可用于循环次数已经确定的情况,也可用于循环次数虽不确定,但给出了循环条件的情况,它可以完全代替while语句。所以for语句也是最为常用的循环语句。第第5 5章章 循环结构程序设计循环结构程序设计 for语句的一般格式如下

3、:(p90)for(表达式1;表达式2;表达式3)语句1for语句的执行过程(1)求解表达式1。第第5 5章章 循环结构程序设计循环结构程序设计 图5-1for语句执行流程图第第5 5章章 循环结构程序设计循环结构程序设计 (2)求解表达式2。如果其值非0(逻辑真),则执行for语句中指定的内嵌语句,然后执行第(3)步;否则,转至第(4)步。(3)求解表达式3,然后转向第(2)步。(4)执行for语句后面的语句。执行过程如图5-1所示。第第5 5章章 循环结构程序设计循环结构程序设计 for语句最简单的应用形式如下:for(循环变量赋初值;循环条件;循环变量增值)语句从上述执行过程可知,“循环

4、变量赋初值”表达式只求解1次,而“循环继续条件”、“循环变量增值”和循环体语句组则要执行若干次(具体次数由“循环继续条件”表达式决定)。第第5 5章章 循环结构程序设计循环结构程序设计 2说明(1)“循环变量赋初值”、“循环继续条件”和“循环变量增值”部分均可缺省,甚至全部缺省,但其间的分号不能省略。(2)当循环体语句组仅由一条语句构成时,可以不使用复合语句形式。(3)“循环变量赋初值”表达式既可以是给循环变量赋初值的赋值表达式,也可以是与此无关的其他表达式(如逗号表达式)。例如:第第5 5章章 循环结构程序设计循环结构程序设计 for(i=1;i=100;i+)sum+=i;/*有关的赋值表

5、达式*/for(sum=0;i=100;i+)sum+=i; /*无关的表达式(i在for之前赋值)*/for(sum=0,i=1;i=100;i+)sum+=i;/*逗号表达式*/(4)“循环继续条件”部分是一个逻辑量,除一般的关系表达式或逻辑表达式外,也允许是数值或字符表达式。第第5 5章章 循环结构程序设计循环结构程序设计 【例5.1】求1100的累计和。/*程序功能:求1100的累计和*/main()inti,sum=0;/*将累加器sum初始化为0*/for(i=1;i=100;i+)sum+=i;/*实现累加*/printf(sum=%d/n,sum);程序运行情况如下:sum=5

6、050第第5 5章章 循环结构程序设计循环结构程序设计 5.2.2while语句while语句的一般格式为while(表达式)语句与for语句一样,如果循环体语句组仅由一条语句组成,可以不使用复合语句形式。第第5 5章章 循环结构程序设计循环结构程序设计 图5-2While语句执行流程图第第5 5章章 循环结构程序设计循环结构程序设计 while语句的执行过程如图5-2所示。(1)求解表达式。如果其值为非0,转第(2)步,否则转第(3)步。(2)执行while语句中的内嵌语句,然后转第(1)步。(3)执行while语句后面的语句。比较for循环和while循环的执行过程可知,while循环是f

7、or循环的一种简化形式(缺省“循环变量赋初值”和“循环变量增值”表达式)。第第5 5章章 循环结构程序设计循环结构程序设计 【例5.2】用while语句求1100的累计和。/*程序功能:求1100的累计和*/main()inti=1,sum=0;/*初始化循环控制变量i和累加器sum*/while(i=100)sum+=1;/*实现累加*/i+;/*循环控制变量i增1*/printf(sum=%dn,sum);第第5 5章章 循环结构程序设计循环结构程序设计 程序运行结果如下:sum=5050通过【例5.1】和【例5.2】可知,对于计次循环,使用for语句的程序比使用while语句的程序简洁。

8、第第5 5章章 循环结构程序设计循环结构程序设计 5.3 直到型循环直到型循环do-while语句语句do-while语句的特点是先执行循环体,然后判断循环条件是否成立。do-while语句的一般格式为do循环体语句组;while(循环继续条件);/*本行的分号不能缺省*/第第5 5章章 循环结构程序设计循环结构程序设计 图5-3do-while语句执行流程图第第5 5章章 循环结构程序设计循环结构程序设计 当循环体语句组仅由一条语句构成时,可以不使用复合语句形式。do-while语句的执行过程如图5-3所示。(1)执行循环体语句组。(2)计算“循环继续条件”表达式。如果“循环继续条件”表达式

9、的值为非0(真),则转向(1)继续进行,否则,转向(3)。(3)执行do-while下面的语句。第第5 5章章 循环结构程序设计循环结构程序设计 【例5.3】用do-while语句求解1100的累计和。/*程序功能:求1100的累计和*/main()inti=1,sum=0;/*定义并初始化循环控制变量以及累加器*/dosum+=1;/*累加*/i+;while(i=100);/*循环继续条件:i=100*/printf(sum=%dn,sum);第第5 5章章 循环结构程序设计循环结构程序设计 5.4 循环结构的嵌套循环结构的嵌套若循环语句中的循环体内又完整地包含另一个或多个循环语句,称为循

10、环嵌套。前面介绍的三种循环都可以相互嵌套。循环的嵌套可以多层,但每一层循环在逻辑上必须是完整的。例如,二层循环嵌套(又称二重循环)结构如下:第第5 5章章 循环结构程序设计循环结构程序设计 for(;)/*for()称为外循环*/语句1while()/*while称为内循环*/循环体/*for()中嵌套一个while循环*/语句2第第5 5章章 循环结构程序设计循环结构程序设计 【例5.4】在屏幕上输出下三角九九乘法表。程序如下:main()inti,j;for(i=1;i=9;i+)for(j=1;j=i;j+)printf(%d*%d=%d,i,j,i*j);printf(n);第第5 5

11、章章 循环结构程序设计循环结构程序设计 运行结果如下:1*1=12*1=22*2=43*1=33*2=63*3=94*1=44*2=84*3=124*4+165*1=55*2=105*3=155*4=205*5=256*1=66*2=126*3=186*4=246*5=306*6=367*1=77*2=147*3=217*4=287*5=357*6=427*7=498*1=88*2=168*3=248*4=328*5=408*6=488*7=568*8=649*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=81第第5 5章章 循环结构程序设计

12、循环结构程序设计 【例5.5】编程求s=1!+2!+3!+10!的和。程序如下:main()inti,j;longp,s=0;for(i=1;i=10;i+)p=1;for(j=1;j=i;j+)p=p*j;s+=p;printf(s=%ldn,s);第第5 5章章 循环结构程序设计循环结构程序设计 【例5.6】使用二重for循环编程打印下列图形。程序如下:第第5 5章章 循环结构程序设计循环结构程序设计 main()inti,j,k;for(i=1;i=i;j-)printf();/*打印一个空格*/for(k=1;k=2*i-1;k+)printf();printf(n);第第5 5章章

13、循环结构程序设计循环结构程序设计 5.5 break和和continue语句对循环语句对循环控制的影响控制的影响为了使循环控制更加灵活,C语言允许在特定条件成立时,使用break语句强行结束循环,或使用continue语句跳过循环体其余语句,转向循环继续条件的判定语句。break和continue语句的一般格式如下:break;continue;第第5 5章章 循环结构程序设计循环结构程序设计 1功能(1)break:强行结束循环,转向循环语句下面的语句。(2)continue:对于for循环,跳过循环体其余语句,转向循环变量增量表达式的计算;对于while和do-while循环,跳过循环体其

14、余语句,转向循环继续条件的判定语句。2break和continue语句对循环控制的影响continue语句和break语句的区别是:continue语句只结束本次循环,而不是终止整个循环的执行,而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。第第5 5章章 循环结构程序设计循环结构程序设计 以下两个循环结构:while(表达式1)while(表达式1)if(表达式2)breakif(表达式2)continue;程序的流程图如图5-4所示,而程序的流程图如图5-5所示。请注意图5-4和图5-5中当“表达式2”为真时流程图的转向。第第5 5章章 循环结构程序设计循环结构程序设

15、计 【例5.7】输入两个正整数,计算并输出它们的最大公约数。main()intm,n,r;scanf(%d,%d,&m,&n);if(mn)r=m;m=n;n=r;while(1)/*这是一个“死循环”的循环结构*/r=m%n;if(r=0)break;elsem=n;n=r;printf(%dn,n);第第5 5章章 循环结构程序设计循环结构程序设计 图5-4break语句对循环控制的影响第第5 5章章 循环结构程序设计循环结构程序设计 图5-5continue语句对循环控制的影响第第5 5章章 循环结构程序设计循环结构程序设计 【例5.8】统计并输出100999之间不能被2或3或7除尽的整

16、数。设计的程序清单如下:main()intn;for(n=100;n1000;n+)if(n%2=0)continue;/*n能被2除尽,继续循环*/elseif(n%3=0)continue;/*n能被3除尽,继续循环*/elseif(n%7=0)continue;/*n能被7除尽,继续循环*/elseprintf(%5d,n);第第5 5章章 循环结构程序设计循环结构程序设计 如果不用continue语句,则for循环的循环体可以改写成如下形式:if(n%2!=0)if(n%3!=0)if(n%7!=0)printf(%5d,n);其实,上述的循环体还可以改写成下列更为简单、清晰的语句:i

17、f(n%2!=0)&(n%3!=0)&(n%7!=0)printf(%5d,n);第第5 5章章 循环结构程序设计循环结构程序设计 注意:(1)break既能用于循环语句又能用于switch语句中,但continue只能用于循环语句中。(2)循环嵌套时,break和continue只影响包含它们的最内层循环,与外层循环无关。第第5 5章章 循环结构程序设计循环结构程序设计 5.6 goto 语语 句句 goto语句是一个特别的语句,在大部分高级语言中已被取消了。C语言中虽然保留了goto语句,但是建议在程序中最好不用。因为,goto语句会破坏结构化设计中的三种基本结构,给阅读和理解程序带来困难

18、。1)语句标号语句标号是用户任意选取的标识符,其后跟一个“:”,可以放在程序中任意一条语句之前,作为该语句的一个代号。第第5 5章章 循环结构程序设计循环结构程序设计 2)goto语句goto语句格式如下:goto语句标号;其中的“语句标号”所标识的语句只能出现在本语句所在的函数或复合语句中。3)功能强制中断执行本语句后面的语句,跳转到语句标号标识的语句继续执行程序。第第5 5章章 循环结构程序设计循环结构程序设计 【例5.9】使用goto语句实现求解1100的累加和。main()intn=1,sum=0;loop:sum+=n;n+;if(n=100)gotoloop;printf(sum=

19、%d/n,sum);第第5 5章章 循环结构程序设计循环结构程序设计 程序中,“loop:”为语句标号(格式:标号:语句行),其命名遵循标识符命名规则。结构化程序设计方法主张限制使用goto语句,因为滥用goto语句将会导致程序结构无规律且可读性差。第第5 5章章 循环结构程序设计循环结构程序设计 5.7 循环结构程序设计应用循环结构程序设计应用5.7.1应用举例【例5.10】求n的阶乘n!(n!=1*2*n)。/*程序功能:求n!*/main()inti,n;longfact=1;/*将累乘器fact初始化为1*/第第5 5章章 循环结构程序设计循环结构程序设计 printf(Inputn:

20、);scanf(%d,&n);for(i=1;i=n;i+)fact*=i;/*实现累乘*/printf(%d!=%1d/n,n,fact);程序运行情况如下:Inputn:55!=120第第5 5章章 循环结构程序设计循环结构程序设计 【例5.11】输出10100之间的全部素数。显然,对此程序,只要设计出判断某数n是否是素数的算法,外面再套一个for循环即可。判断某数n是否是素数的算法:根据素数的定义,用2(n-1)之间的每一个数去整除n,如果都不能被整除,则表示该数是一个素数。判断一个数是否能被另一个数整除,可通过判断它们整除的余数是否为0来实现。第第5 5章章 循环结构程序设计循环结构程

21、序设计 参考源程序如下:/*程序功能:输出10100之间的全部素数。*/main()inti,j,counter=0;for(i=11;i=100;i+=2/*外循环:为内循环提供一个整数i*/for(j=2;j=i)/*整数i是素数:输出,计数器加1*/printf(%6d,i);counter+;第第5 5章章 循环结构程序设计循环结构程序设计 5.7.2穷举与迭代算法在循环算法中,穷举与迭代是两类具有代表性的基本算法。1穷举穷举的基本思想是:对问题的所有可能状态一一测试,直到找到解或将全部可能状态都测试过为止。穷举是一种重复型算法,重复操作(循环体)的核心是一次测试。循环控制有两种办法:

22、计数法与标志法。计数法要先确定循环次数,然后逐次测试,完成测试次数后循环结束。标志法是达到某一目标后,循环结束。第第5 5章章 循环结构程序设计循环结构程序设计 例如,录取新生问题。录取新生就是把考生中符合条件(如成绩达到分数线)的考生的名单打印出来。它要重复执行的操作是,对一个考生成绩进行判断测试,打印其中符合条件的考生姓名。循环控制采用计数法时,要先知道考生的总数,然后设置一个“计数器”变量。当计数器为1时,测试第一个考生成绩,当计数器为2时,测试第二个考生成绩,当计数器为n(考生总数为n)时,测试第n个考生成绩,之后结束循环。第第5 5章章 循环结构程序设计循环结构程序设计 计数法使用起

23、来很方便。但它要求在程序执行前必须先知道循环的总次数。工作人员必须事先先数一遍要穷举对象的个数,万一数错,便会导致程序的执行失败。这给操作人员增加了一个不必要的麻烦。在穷举中使用标志法则无须先去数数,而是采取一种“有多少算多少”的办法。具体方法是:在测试中使用一个标志变量,在测试开始前给标志变量赋值为“没有测试完”(可用“0”代表)。然后每测试一次,看一次标志变量的值有无变化。测试完最后一个对象,让标志变量变成“测试完”(可用“1”代表),于是跳出循环结构。也可以用其他条件确定是否还要穷举下去。第第5 5章章 循环结构程序设计循环结构程序设计 究竟使用哪一种方法来控制循环结构结束,应视具体情况

24、而定。第第5 5章章 循环结构程序设计循环结构程序设计 【例5.12】搬砖问题。36块砖,36人搬;男搬4,女搬3,两个小孩抬一砖。要求一次全搬完,问男、女、小孩各需若干?显然,这个问题与白鸡问题很相似,用穷举法是很自然的。它也将采用二重循环嵌套控制结构,并且用计数法进行控制。男人(men)的可能取值范围为08;女人(women)的可能取值范围为011;小孩(childs)的可能取值范围为036。第第5 5章章 循环结构程序设计循环结构程序设计 采用穷举法,首先考虑men分别取08中的各值时,找到符合题意的women,childs的值。得到:men=0;while(men9)找满足题意的wom

25、en,childs值;men+;这个算法也可以写为men=0;第第5 5章章 循环结构程序设计循环结构程序设计 while(men+9)找满足题意的women,childs值;但不可以写为men=0;while(+men9)找满足题意的women,childs值;第第5 5章章 循环结构程序设计循环结构程序设计 因为它少考虑了men为0的情况(即第一次循环时men的值为1)。下面再进一步细化,找每一个women下的childs值:men=0;while(men+9)women=0;while(women+12)找满足题意的childs值;第第5 5章章 循环结构程序设计循环结构程序设计 我们知

26、道,当men与women的值已知后:childs=36-women-men若这一childs值满足条件:4*men+3*women+childs/2=36则就找到了一组解。程序如下:main()/*36人搬36砖*/intmen=0,women,childs;while(men+9)第第5 5章章 循环结构程序设计循环结构程序设计 women=0;while(women+12)childs=36-women-men;if(4.0*men+3.0*women+childs/2.0=36)printf(nmenis%d,men);printf(towmenis%d,women);printf(tc

27、hildsis%dn,childs);第第5 5章章 循环结构程序设计循环结构程序设计 执行结果如下:menis1womenis6childsis29menis3womenis3childsis30第第5 5章章 循环结构程序设计循环结构程序设计 2迭代迭代是一个不断用新值取代变量的旧值,或由旧值递推出变量的新值的过程。【例5.13】人口增长问题。按年2的增长速度,现有12亿人,10年后将有多少人?设现人口数为m,则第一年后人口变为m=m*(1+2%)第第5 5章章 循环结构程序设计循环结构程序设计 要计算第二年后的人口,只需把上述赋值表达式再执行一次。要计算10年后的人口,就要把上述表达式执

28、行10次。这也是用循环结构实现,只不过要重复的操作是不断从一个变量的旧值出发计算它的新值。所以这种迭代与下列因素有关:第第5 5章章 循环结构程序设计循环结构程序设计 初值;迭代公式;迭代次数。例如:兔子繁殖问题。著名意大利数学家Fibonacci曾提出一个有趣的问题:设有一对新生兔子,从第三个月开始它们每个月都生一对兔子。按此规律,并假设没有兔子死亡,一年后共有多少对兔子?第第5 5章章 循环结构程序设计循环结构程序设计 人们发现每月的兔子数组成如下数列1,1,2,3,5,8,13,21,34,并把它称为Fibonacci数列。那么,这个数列如何导出呢?观察一下Fibonacci数列可以发现

29、这样一个规律:从第三个数开始,每一个数都是其前面两个相邻数之和。这是因为,在没有兔子死亡的情况下,每个月的兔子数由两部分组成:上一月的老兔子数,这一月刚生下的新兔子数。上一月的老兔子数即其前一个数。这一月刚生下的新兔子数恰好为上上月的兔子数。因为上一月的兔子中还有一部分到这个月还不能生小兔子,只有上上月已有的兔子才能每对生一对小兔子。第第5 5章章 循环结构程序设计循环结构程序设计 上述算法可以描述为fibn-1=fibn-2=1 (n=3)式即为迭代公式,式为初值。用C语言来描述式为fib=fib1+fib2;fib2=fib1;/*为下一次迭代作准备*/fib1=fib;第第5 5章章 循

30、环结构程序设计循环结构程序设计 最后,还要解决一个如何控制迭代次数的问题。由题意知道,重复的条件3n=3),即从第三个数开始,每个数等于前两个数的和。算法设计请参见第2.1节。参考源程序如下:/*程序功能:求Fibonacci数列的前40个数。*/第第5 5章章 循环结构程序设计循环结构程序设计 main()longintf1=1,f2=1;/*定义并初始化数列的前两个数*/inti=1;/*定义并初始化循环控制变量i*/for(;i=20;i+)/*1组2个,20组40个数*/printf(%151d%151d,f1,f2);/*输出当前的2个数*/if(i%2=0)printf(n);/*输出2次(4个数),换行*/f1+=f2;f2+=f1;/*计算下2个数*/

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号