收藏 分销(赏)

第6章-循环结构.ppt

上传人:丰**** 文档编号:7440224 上传时间:2025-01-04 格式:PPT 页数:35 大小:949KB
下载 相关 举报
第6章-循环结构.ppt_第1页
第1页 / 共35页
第6章-循环结构.ppt_第2页
第2页 / 共35页
第6章-循环结构.ppt_第3页
第3页 / 共35页
第6章-循环结构.ppt_第4页
第4页 / 共35页
第6章-循环结构.ppt_第5页
第5页 / 共35页
点击查看更多>>
资源描述

1、,单击此处编辑母版标题样式,单击此处编辑母版文本样式,*,第,6,章 循环结构,第,6,章 循环结构,6.1,概述,6.2 while,语句,6.3 do while,语句,6.4 for,语句,6.6,循环控制语句和,goto,转移语句,6.5,循环嵌套,1,6.1,概述,循环结构用来描述具有规律性的重复工作。例如,求若干个数的累积;输入全班所有学生的成绩等。,几乎所有实用的程序都包含循环。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。,2,6.2 while,语句,1.while,语句是当型循环控制语句,一般形式为,:,while,循环体

2、,;,说明:,(,1,)、“表达式”可以是任意表达式,用来判定循环是否终止(或者说判定循环体是否执行)。表达式的值要么为真,要么为假;如果其值为一个数值,则非,0,的任何数都为真,而,0,代表假。如果第一次执行时,“表达式”的值为假,则“循环体”中的语句一次都不执行。,(,2,)、“循环体”中可以是单语句,也可以是空语句(只有一个,;,的语句)或复合语句,如果是复合语句,则必须括在,之中。,while,语句的流程图见图,6-1,,其特点是先判断,后执行,若条件不成立,有可能一次也不执行。,3,2.,举例应用,例,6.1,求,sum=1+2+3+.+100,。,分析:解决这类累加、累积问题,关键

3、是要找出通用计算公式,即找到循环体中的部分。,sum=sum+i,是本例的通用性计算公式。公式中,,sum,既作为一个加数使用,也用于存放累加后的结果,其初值为,0,;,i,既作为另一个,4,加数使用,也作为循环变量,其取值范围是,1,到,100,。对于每个,i,值,要进行一次,sum=sum+i,的计算。如,当,i=1,时,,sum=0+1=1,;当,i=2,时,,sum=1+2=3,;当,i=3,时,,sum=3+3=5,;,依此类推下去,就可以得到结果,sum,。,#include,void main(),int i,,,sum=0;,i=1;,while(i=100),sum=sum+

4、i;,i+;,printf(%d,,,sum);,图,6-2,求,1+2+,+100,算法描述,5,例,6.2,将输入的一串字符显示在屏幕上,遇到字符“,$”,时停止。,#include,void main(),char c;,printf(nPlease input a string:n);,c=getchar();,while(c!=$),putchar(c);,c=getchar();,6,6.3 do while,语句,1.do while,语句的语法和框图,do while,循环语句的语法是:,do,循环体语句;,while(,表达式,),;,(,1,)、说明:,1,)“表达式”可以

5、是任意表达式,用来判定循环是否终止(或者说判定循环体是否执行)。表达式的值要么为真,要么为假;如果其值为一个数值,则非,0,的任何数都为真,而,0,代表假。即使第一次执行时“表达式”的值为假,“循环体”中的语句最少会被执行一次。,2,)“循环体”中可以是单语句,也可以是空语句(只有一,7,个,;,的语句)或复合语句,如果是复合语句,则必须括在,之中。,3,),do-while,作为一个语句,必须以分号(;)结束,所以在,while(,表达式,),后一定要有分号。,(,2,)、执行顺序:,执行“循环体语句”,计算表达式的值,如果表达式的值非零(真),继续执行“循环体语句”,直到表达式的值为零(假

6、),循环结束。程序结构流程图如图:,8,例,6.3,用,do while,语句求,s=1+2+3+.+100,#include,void main(),int i,,,sum=0;,i=1;,do,sum=sum+i;,i+;,while(i=1e-7);,printf(sin(%lf)=%lf,,,x,,,s);,运行结果如下:,please input x:1.5753,sin(1.575300)=0.999990,11,2.do while,与,while,语句的区别,do while,总是要先做一遍循环体,再做表达式的判断,因此循环体中的语句肯定要做一次。在设计程序时,如果不知道重复执

7、行的次数,而且第一次必须执行时,常采用,do while,语句。,(1),为了避免编译系统把,do while,的,while,当做,while,语句的开始,,do while,的循环体即使是一句,也需要用括号括起。,#include,void main(),char c;,do,12,putchar(c=getchar();,while(c!=$);,但是,若将上例的,do while,语句写成:,do,putchar(c=getchar();,while(c!=$);,容易产生歧义和误解。,(2),由于,do while,语句是先做循环体,再判断表达式,所以有些程序不能用,do while

8、,语句编写。,例如:,输入某门功课的若干个同学的成绩,以,-1,作为终止的特殊成绩,计算平均成绩。也就是说,不能将,-1,计算在内。,13,例,6.5,求平均值的错误程序。,#include,void main(),int sum,i,a;,sum=0;,i=0;,do,scanf(%d,sum=sum+a;,i+;,while(a!=-1);,printf(aver=%fn,1.0*sum/i);,但程序的逻辑是错误的,因为,-1,也被累加到,sum,中了,并且不能解决输入的第一个数就是,-1,的问题。,14,6.4 for,语句,C,语言中的,for,语句使用最为灵活,不仅可以用于循环次数

9、已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替,while,语句。,for,循环语句的语法是:,for(,表达式,1,;表达式,2,;表达式,3),循环体语句;,执行过程:,(,1,)执行表达式,1,;,(,2,)计算表达式,2,的值;,(,3,)如果表达式,2,的值为真,则执行循环体,再执行表达式,3,,转到(,2,)步执行;,(,4,)如果表达式,2,的值为假,则结束循环的执行,转而去执行,for,语句后的语句。,15,例,6.6,用,for,语句求,s=1+2+3+.+n,#include,void main(),int i,sum,n;,print

10、f(nPlease input a integer:);,scanf(%d,for(i=1,sum=0;i=n;i+),sum=sum+i;,printf(sum=%dn,sum);,16,for,循环使用说明:,(,1,),for,语句的表达式使用比较灵活,表达式,1,,表达式,2,,表达式,3,都可以省略,但是即使是三个表达式都省略了,二个“;”也不可省略。,如下几种情形:,i=1,;,for(,;,i=100;i+)sum=sum+i;/*,省略表达式,1*/,for(i=1;i+)sum=sum+i;if(i=100)break;/*,省略表达式,2*/,i=1;for(;i=100;

11、)sum=sum+i;i+;,/*,省略表达式,1,和表达式,3 */,i=1;for(;)sum=sum+i;if(i=100)break;i+;/*,三个表达式均省略*,/,(2),在表达式和表达式中可以使用逗号运算符把执行语句并列在一起,并且循环体可以为空。,17,如:,for(i=1,sum=0;i=100;sum+=i,i+);,(,3,)表达式,2,一般是关系表达式,(,如,i=100),或逻辑表达式,(,如,ab&x=3,),即从第,3,个数开始,每个数等于前,2,个数之和。这是一个有趣的古典数学问题:有一对兔子,从出生后第,3,个月起每个月都生一对兔子。小兔子长到第,3,个月后

12、每个月又生一对兔子。假设所有兔子都不死,问每个月的兔子总数为多少?,编程思路:由题意可知,该数列的变化规律是第一项和第二项为,1,,从第三项起为前二项之和,令,f1,f2,分别为第一项和第二项,然后进入循环,首先输出,f1,f2,,接着执行语句“,f1=f1+f2;”,将二项所得和的值存入,f1,中,这就是数列的第三项,再执行语句“,f2=f2+f1”,(此时的,f1,代表第三项),将第二项和第三项所得和的值存入,f2,中,得到数列的第四项,重复以上步骤,每重复一次,变量,f1,、,f2,依次得到后面新的两项值,这是一个典型的递推法,,19,程序流程如图:,#include,void main

13、(),long int f1=1,f2=1,,,i;,for(i=1;i=20;i+),printf(“%-15ld%-15ld”,f1,f2);if(i%2=0),printf(“n”);f1+=f2;f2+=f1;,.,20,例,6.9,求,s=aaaa-aa-aa-a,,,即第一项由,n,个,a,组成,,,第二项由,n-1,个,a,组成,,,依次类推,,,最后一项为,a,,,a,为,1,9,的任一数。例如:当,n=4,a=2,,则表达式:,s=2222-222-22-2,。,编程思路:由表达式可知,该序列的规律是:前一项的数据比后一项大,10,倍,如果把前一项的数据对,10,进行整除,则

14、商数即为后一项数据的值。所以程序的设计过程分为两步:第一步运用,for,循环求出序列的第一项;第二步还是运用循环实现取数和求和的功能,流程图如图,:,21,源代码如下:,#include,void main(),int a,n,i;,long s=0,t=a;,scanf(a=%d,n=%d,for(i=1;in;i+)t=t*10+a;s=t;,for(i=1;in;i+),t=t/10;s=s-t;,printf(s=%ld,s);,22,6.5,循环嵌套,一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。一个循环外面仅包围一层循环叫二重循环;一个循环外面包围两层循环叫三重循环;一个

15、循环外面包围多层循环叫多重循环。,三种循环语句,for,、,while,、,do.while,可以互相嵌套自由组合。如下形式:,23,例,6.10,输出,10,100,之间的全部素数。,编程思路:,(,1,)显然,只要设计出判断某数,n,是否是素数的算法,外面再套一个,for,循环即可。,(,2,)判断某数,n,是否是素数的算法:根据素数的定义,用,2,(,n-1,)之间的每一个数去整除,n,,如果都不能被整除,则表示该数是一个素数。实际上用不到将,n,除至,n-1,,只要将,n,除以,2,即可,这是因为任一整数,n,若能被另一整数,a,整除,其商为,b,,则,a,和,b,中有一个必然大于或等

16、于,而另一个小于或等于,故只需将,n,依次除以,2,即可。程序流程如图:,24,源程序如下:,#include,#include,void main()int i=11,j,counter=0,,,k,,,flag;,for(;i=100;i+=2),k=sqrt(i),;,flag=1;,for(j=2;j=k j+),if(i%j=0),flag=0;,if(counter%10=0),printf(“n”);,if(flag),printf(“%6d”,i);,counter+;,25,例,6.11,输出乘法口决的下半三角,形如:,11=1,21=2 22=4,31=3 32=6 33=

17、9,41=4 42=8 43=12 44=16,.,从输出的形式可以知道,若用,i,表示行,用,j,表示列,则任一输出可表示为,i*j=i,与,j,的积,也可从图得到,i,与,j,的关系:第,i,行输出的列数等于,i,,程序流程如图,6-11,,源程序如下:,void main(),int i,j;,for(i=1;i=9;i+),for(j=1;j=i;j+),printf(%2d%d=%2d,i,j,i*j);,printf(n);,26,例,6.12,某幼儿园要用,100,元买,100,件玩具,若一只熊猫,3,元,一只小狗,2,元,一只小鸭,0.5,元,问三种玩具各买多少只,列出所有的解

18、。这是一个典型的使用穷举法的应用。,编程思路:根据题意可知,熊猫最多不能超过,20,只,小狗不能超过,30,只。设熊猫数为,x,,小狗数,y,,则小鸭数为,z=100-x-y,,程序流程如图:,void main(),int x,y,z;,for(x=1;x=20;x+),for(y=1;y=30;y+),z=100-x-y;,if(3*x+2*y+0.5*z=100),printf(,熊猫,=%dt,小狗,=%dt,小鸭,=%dn,x,y,z);,27,6.6,循环控制语句和,goto,转移语句,6.6.1 break,语句,功能:在循环语句和,switch,语句中,终止并跳出循环体或开关体

19、,。,break,语句的语法:,break;,例,6.13,打印半径为,1,到,10,的圆的面积,若面积超过,100,,则不予打印。,#include,void main(),int r;,floatarea;,for(r=1;r100.0),break;,printf(square=%fn,,,area);,printf(nowr=%dn,,,r);,28,例,6.14,将例,6.11,用,break,语句来改写。,#include,#include,void main()int i=11,j,counter=0,,,k;,for(;i=100;i+=2),k=sqrt(i),;,for(j

20、=2;j=k),printf(“%6d”,i);,counter+;,29,注意:,(,1,),break,通常要和,if,语句联用,能提前结束循环。在嵌套的循环中,,break,只能退出它所在的那一层循环。,(,2,)当循环体中包含,switch,语句,而,break,位于,switch,语句中时,,break,只强迫程序流程退出该,switch,而不退出,switch,所在的循环。在,switch,语句中的,break,只是退出,switch,语句,而对于循环结构无影响。,(,3,)当,break,处于循环嵌套结构中时,它将只跳出最内层结构,而对外层结构无影响。,(,4,),break,不

21、能用于循环语句和,switch,语句之外的任何其它语句之中,。,30,6.6.2 continue,语句,continue,语句的功能是结束本次循环的执行,转而去执行下一次循环(即去计算条件表达式),但不退出循环结构。,1.continue,的语法,continue,;,例,6.15,计算半径为,1,到,15,的圆的面积,仅打印出超过,50,的圆面积。,#include,void main(),intr;,floatarea;,for(r=1;r=5;r+),area=3.141593*r*r;,if(area50.0)continue;printf(square=%f,,,area);,31

22、,2.continue,语句和,break,语句的区别,continue,语句只结束本次循环,而不是终止整个循环的执行。而,break,语句则是结束整个循环过程,不再判断执行循环的条件是否成立。,3.,使用注意,(,1,),continue,语句只能用在循环结构中;,(,2,),continue,语句通常要和,if,语句联用,它只能提前结束本次循环,立即进入下一次循环条件的判断(如果是,for,语句,则先执行“表达式,3”,),并不能终止整个循环。,(,3,)如果循环体中包含,switch,语句,而且,continue,位于,switch,结构中,该,continue,也只对循环起作用。,32

23、,例,6.17,void main(),int k=0;,char c=A;,do,switch(c+),case A:k+;break;,case B:k-;,case C:k+=2;break;,case D:k=k%2;continue;,case E:k=k*10;break;,default:k=k/3;,k+;,while(cG);,printf(%dn,k);,程序中的,break,位于,switch,结构中,因此它只对,switch,语句起作用,而对循环不产生影响。,continue,虽然也位于,switch,结构中,但它只对,do-while,循环语句产生影响,而不影响,switch,语句。,33,6.6.3,goto,语句,goto,语句为无条件转向语句,它的一般形式为,goto,语句标号;,语句标号用标识符表示,它的定名规则与变量名相同,即由字母、数字和下划线组成,其第一个字符必须为字母或下划线。不能用整数来做标号。例如:,goto label_1;,是合法的,而,goto 123,;,是不合法的。,34,例,6.18,用,if,语句和,goto,语句构成循环,求,n,。,void main(),int i,,,sum=0;,i=1;,loop:if(i=100),sum=sum+i;,i+;,goto loop;,printf(%d,,,sum);,35,

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服