《C语言程序设计06章循环结构程序设计.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计06章循环结构程序设计.ppt(32页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第六章第六章 循环结构程序设计循环结构程序设计6.1 概述概述循环结构主要有:循环结构主要有:(1)用)用goto语句和语句和if语句构成循环;语句构成循环;(2)用)用while语句;语句;(3)用)用do-while语句;语句;(4)用)用for语句。语句。16.2 goto语句以及用语句以及用goto语句构成循环语句构成循环 goto语句为无条件转向语句,它的一般形式为:语句为无条件转向语句,它的一般形式为:goto 语句标号语句标号;(1)语句标号用标识符表示。标识符的命名规则和变量名相)语句标号用标识符表示。标识符的命名规则和变量名相同,即由字母、数字和下划线组成,其第一个字符必须同
2、,即由字母、数字和下划线组成,其第一个字符必须为字母或下划线,不能用整数来作标号;为字母或下划线,不能用整数来作标号;(2)goto语句通常有两种用途:语句通常有两种用途:1.与与if语句一起构成循环结构;语句一起构成循环结构;2.从循环体中跳转到循环体外;从循环体中跳转到循环体外;(3)goto语句的使用不符合结构化程序的原则,一般尽量不语句的使用不符合结构化程序的原则,一般尽量不用,除非万不得已。用,除非万不得已。2例例6.1 用用if语句和语句和goto语句构成循环,求语句构成循环,求main()int i,sum=0;i=1;loop:if(i=100)sum=sum+i;i+;got
3、o loop;printf(“%d”,sum);36.3 while语句语句一般形式:一般形式:while(表达式)(表达式)内嵌语句内嵌语句特点:特点:先先判断表达式,当它为真(非判断表达式,当它为真(非0)时,)时,再再执行内嵌语执行内嵌语句;若为假(句;若为假(0),则不执行内嵌语句。这样的循环),则不执行内嵌语句。这样的循环结构我们称为结构我们称为“当型当型”循环结构循环结构。流程图:流程图:表达式内嵌语句非004例例6.2 求求main()int i,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(“%d”,sum);说明:说明:1)1)如果循环体
4、不只包如果循环体不只包含一条语句,则应用花括号含一条语句,则应用花括号括起来形成一个复合语句。括起来形成一个复合语句。2)2)在循环体中应有使在循环体中应有使循环趋于结束的语句循环趋于结束的语句,避免,避免出现死循环。在本例中,设出现死循环。在本例中,设置循环条件为置循环条件为i=100i=100,然后,然后有有 i+i+使循环趋于结束,这使循环趋于结束,这样就不会出现死循环。样就不会出现死循环。5main()main()int n=0;int n=0;while(n+=1)while(n+=1)printf(“%d n”,n);printf(“%d n”,n);printf(“%d n”,n
5、);printf(“%d n”,n);运行结果运行结果运行结果运行结果:说明:说明:(补充内容)(补充内容)3)3)用作循环条件的用作循环条件的表达式可以是各种类型的表达式可以是各种类型的表达式或数值类型。如表达式或数值类型。如:while(1)while(1)、while(while(2)2)、while(a)while(a)等。等。4)4)小心循环变量的小心循环变量的“边界值边界值”,注意循环次,注意循环次数。对条件表达式的计算数。对条件表达式的计算次数要比循环体的执行次次数要比循环体的执行次数多一次。如右例:数多一次。如右例:6 main()int i,sum=0;i=1;while(i
6、 =100);sum=sum+i;i+;printf(“%d”,sum);则程序将出现则程序将出现“死死”循环,无法得到正确结果。循环,无法得到正确结果。此分号使此分号使 while 的循环体为空的循环体为空 说明:说明:5)5)不要在不要在 while(while(表达式表达式)后加分号。如例后加分号。如例6.26.2若误写成:若误写成:76.4 do-while语句语句一般形式:一般形式:do 循环体语句循环体语句 while(表达式表达式);循环体语句表达式非00流程图:流程图:8例例 6.3 用用do-while语句求语句求main()int i,sum=0;i=1;do sum=su
7、m+i;i+;while(i=100);/*别忘了,这里有分号别忘了,这里有分号*/printf(“%d”,sum);9讨论:讨论:while语句与语句与do-while语句之间的异同点语句之间的异同点1)对对同同一一问问题题可可以以用用while语语句句处处理理,也也可可以以用用do-while语语句句处处理理。do-while结结构构和和while结结构构可可以以相相互互转转换换。我我们们可可以以认认为为do-while结结构构是是由由一一个个复复合合语语句句(while结结构构的循环体的循环体)加一个加一个while结构构成。比如:结构构成。比如:do sum=sum+i;i+;whil
8、e(i=100);sum=sum+i;i+;while(i=100)sum=sum+i;i+;等价于等价于102 2)在一般情况下,用)在一般情况下,用whilewhile语句和用语句和用do-whiledo-while语句处语句处理同一问题时,若二者的循环体部分一样,则它们的结果理同一问题时,若二者的循环体部分一样,则它们的结果也一样。但是,对于也一样。但是,对于whilewhile后面的表达式一开始就为后面的表达式一开始就为0 0值时值时,两种循环结构的两种循环结构的执行结果是不同的执行结果是不同的。对于对于whilewhile语句,循环体可能语句,循环体可能一次也不执行一次也不执行;而;
9、而do-do-whilewhile语句,循环体语句,循环体至少要执行一次至少要执行一次。对于对于whilewhile语句,循环体的执行次数要比循环条件的判语句,循环体的执行次数要比循环条件的判断次数断次数少一次少一次;而;而do-whiledo-while语句,循环体的执行次数和循语句,循环体的执行次数和循环条件的判断次数是环条件的判断次数是相同的相同的。116.5 for语句语句一般形式:一般形式:for(表达式表达式1;表达式表达式2;表达式表达式3)语句语句for(表达式表达式1;表达式表达式2;表达式表达式3)语句语句执行过程:执行过程:12例:例:for(i=1;i=100;i+)s
10、um=sum+i;i=1i=100真sum=sum+ii+假14说明:说明:(1)表达式表达式1可以省略,此时应在可以省略,此时应在for语句之前给循环变语句之前给循环变量赋初值(设定量赋初值(设定循环初始条件循环初始条件)。比如:)。比如:for(i=1;i=100;i+)sum=sum+i;可写为:可写为:i=1;for(;i=100)break;15(3)表达式表达式3可以省略,但此时应另外设法可以省略,但此时应另外设法修改循环变修改循环变量量,保证循环能正常结束。比如:,保证循环能正常结束。比如:for(i=1;i=100;i+)sum=sum+i;可写为:可写为:for(i=1;i1
11、00)break;16(5)表达式表达式1、2、3都可以为都可以为任何表达式任何表达式。比如:表达式。比如:表达式1和和表达式表达式3可以是可以是逗号表达式逗号表达式,即包含一个以上的简单表,即包含一个以上的简单表达式,中间用逗号间隔。达式,中间用逗号间隔。例例1:for(i=1,sum=0;i=100;i+)sum=sum+i;例例2:for(i=0;(c=getchar()!=n;i+);/*分号不能少分号不能少*/请问:此语句的作用是什么?请问:此语句的作用是什么?此语句的作用是不断读入字符,并统计所输入字符的此语句的作用是不断读入字符,并统计所输入字符的个数,直到输入一个个数,直到输入
12、一个“换行符换行符”为止。为止。17例如:例如:int i,j,k=0;for(i=0,j=100;i=j;i+,j-)k+=i+j;printf(“%d,%d,%d”,i,j,k);输出结果是什么?循环体可以被执行多少次?输出结果是什么?循环体可以被执行多少次?输出结果为:输出结果为:51,49,5100 循环体被执行循环体被执行51次。次。0,1,2,49,50,50,51,98,99,10019讨论:讨论:for语句与语句与while语句之间的异同点语句之间的异同点1)for语句简单、方便,使用灵活,不仅可以用于循环次语句简单、方便,使用灵活,不仅可以用于循环次数已经确定的情况,还可以用
13、于循环次数不确定而只数已经确定的情况,还可以用于循环次数不确定而只给出循环结束条件的情况,它给出循环结束条件的情况,它完全可以取代完全可以取代while语句语句。在使用上,在使用上,for语句更灵活,功能更强。语句更灵活,功能更强。2)for语句和语句和while语句之间是可以相互转换的。当省略语句之间是可以相互转换的。当省略for语句的表达式语句的表达式1、3,而只给出表达式,而只给出表达式2时,就等同时,就等同于一个于一个while语句。比如:语句。比如:for(;i=100;)sum=sum+i;i+;while(i=100)sum=sum+i;i+;206.6 循环的嵌套循环的嵌套C语
14、言中,允许三种循环结构(语言中,允许三种循环结构(while循环、循环、do-while循环循环和和for循环)相互嵌套和进行多层嵌套。循环)相互嵌套和进行多层嵌套。例如:例如:for(i=0;i10;i+)for(j=0;j10;j+)for(k=0;k10;k+)printf(“i=%d,j=%d,k=%dn”,i,j,k);此程序运行后,屏幕上将输出多少行信息?此程序运行后,屏幕上将输出多少行信息?这些信息分别是什么?这些信息分别是什么?216.7 四种循环结构之间的比较(前已提及)四种循环结构之间的比较(前已提及)6.8 break语句和语句和continue语句语句6.8.1 bre
15、ak语句语句一般形式:一般形式:break;作用:只能用于作用:只能用于循环结构循环结构和和switch结构结构,使执行流程从相应,使执行流程从相应结构中跳出,程序继续往后执行。结构中跳出,程序继续往后执行。例:例:for(r=1;r100)break;printf(“%f”,area);226.8.2 continue6.8.2 continue语句语句一般形式:一般形式:continue;作用:结束作用:结束本次本次循环,即跳过循环体中下面尚未执行的语循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环体的判断。句,接着进行下一次是否执行循环体的判断。contiune语句和语
16、句和break语句的区别是:语句的区别是:contiune语句只是语句只是结束本次循环结束本次循环,即跳过本次循环,即跳过本次循环体中下面尚未执行的部分;而体中下面尚未执行的部分;而break语句是语句是终止整终止整个循环个循环,即退出循环结构。,即退出循环结构。详细的流程图分析,可参见详细的流程图分析,可参见教科书教科书P115之图之图6.10和图和图6.11.例如:例如:23例例6.5 输出输出100200之间的不能被之间的不能被3整除的所有数;整除的所有数;main()int n;for(n=100;n=10-6pi=pi+tn=n+2s=-st=s/npi=pi*4输出输出pi变量说明
17、:变量说明:s为分子,也用来切换正负号;为分子,也用来切换正负号;n为分母;为分母;t为相加项;为相加项;25源程序如下:源程序如下:#include main()int s;float n,t,pi;t=1;pi=0;n=1.0;s=1;while(fabs(t)1e-6)pi=pi+t;n=n+2;s=-s;t=s/n;pi=pi*4;printf(“pi=%10.6fn”,pi);注意几点:注意几点:1、s 和和n 可同时定义为可同时定义为int 或或者者float 型吗?为什么?型吗?为什么?(P116.c)2、若将、若将n、t、pi 定义为定义为double 型,精度提高到型,精度提
18、高到1e 8,会有什么效果?,会有什么效果?(P116_2.c)26例例6.7 求求Fibonacci数列的前数列的前40个数。个数。Fibonacci数列通式为:数列通式为:f1=1,f2=1for i=1 to 20输出输出f1,f2f1=f1+f2f2=f2+f1例如,前面几项分别为:例如,前面几项分别为:1,1,2,3,5,8,13,1,1,2,3,5,8,13,这是一个古典的数学问这是一个古典的数学问题,比较简单。在题,比较简单。在P116P116117117和和P124P124均有论述。均有论述。请同学们掌握。请同学们掌握。N-S 流程图为:流程图为:27源程序为:源程序为:mai
19、n()long int 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;/*后一个数后一个数*/28例例6.8 判断判断m是否为素数。是否为素数。读入读入mk=sqrt(m)i=2当当i=真真k+1假假输出:输出:m是是素数素数输出:输出:m不是不是素数素数定义:定义:m 是素数的条件是是素数的条件是不能被不能被2,3,m-1整除整除。这也是素数的原始定。这也是素数的原始定义。据此,有如下判断素数的算法:义。据此
20、,有如下判断素数的算法:算法算法1:直接采用定义,用直接采用定义,用m去除以去除以2 到到m-1。但是,当。但是,当m很大时此算法的运算很大时此算法的运算量也很大,效率不高。量也很大,效率不高。29源程序如下:源程序如下:#includemain()int m,i,k;scanf(“%d”,&m);k=sqrt(m);for(i=2;i=k+1)/*请问用请问用i=k+1或或i k可以吗?可以吗?*/printf(“%d is prime numbern”,m);else printf(“%d is not prime numbern”,m);30例例6.10 译密码。对字符的处理办法为:译密
21、码。对字符的处理办法为:先判定它是大写字符还是小写字符,然后再将其值先判定它是大写字符还是小写字符,然后再将其值加加4,变成其后的第四个字母。如果加变成其后的第四个字母。如果加4后字符值大于后字符值大于Z或或z,则在加,则在加4的基础上的基础上减去减去26,转换为字母表前面的字母。,转换为字母表前面的字母。(参见(参见P119图图6.15)#include main()char c;while(c=gechar()!=n)if(c=a&c=A&cZ&cz)c=c-26;printf(“%c”,c);例例6.9 求求100-200间的全部素数。(算法同例间的全部素数。(算法同例6.8)这里为什么要这样写,请看附录I ASCII码表。31第六章第六章 循环控制循环控制 小结小结6.1 6.1 概述概述 6.2 goto6.2 goto语句以及用语句以及用gotogoto语句构成循环语句构成循环6.3 while6.3 while语句语句 6.4 do-while6.4 do-while语句语句6.5 for6.5 for语句语句 6.6 6.6 循环的嵌套循环的嵌套 6.7 6.7 几种循环的比较几种循环的比较6.8 break6.8 break和和continuecontinue语句语句 6.9 6.9 程序举例程序举例 32
限制150内