《第6章__循环控制.ppt》由会员分享,可在线阅读,更多相关《第6章__循环控制.ppt(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第六章第六章 循环控制循环控制6.1 概述概述 循环结构是结构化程序设计的基本结构之一,它循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本和顺序结构、选择结构共同作为各种复杂程序的基本程序构造单元。同时,循环结构也是等级考试的一个程序构造单元。同时,循环结构也是等级考试的一个重点。重点。循环结构主要有:循环结构主要有:(1)用)用goto语句和语句和if语句构成循环;语句构成循环;(2)用)用while语句语句;(3)用)用do-while语句;语句;(4)用)用for语句。语句。6.2 goto语句以及用语句以及用goto语句构成循环语句构成循环 go
2、to语句为无条件转向语句,它的一般形式为:语句为无条件转向语句,它的一般形式为:goto 语句标号语句标号;(1)语句标号由字母、数字和下划线组成,其第一个)语句标号由字母、数字和下划线组成,其第一个字符必须为字母或下划线,不能用整数来做标号;字符必须为字母或下划线,不能用整数来做标号;(2)goto语句通常有两种使用方法:语句通常有两种使用方法:1.与与if语句一起构成循环结构;语句一起构成循环结构;2.从循环体中跳转到循环体外;从循环体中跳转到循环体外;(3)goto语句的使用不符合结构化程序的原则,一般语句的使用不符合结构化程序的原则,一般尽量不使用,除非不得已时;尽量不使用,除非不得已
3、时;例例6.1 用用if语句和语句和goto语句构成循环,求语句构成循环,求main()int i,sum=0;i=1;loop:if(i=100)sum=sum+i;i+;goto loop;printf(“%d”,sum);6.3 while语句语句一般形式:一般形式:while(表达式)语句表达式)语句功能:功能:当表达式为非当表达式为非0值时,执行值时,执行while语句中的内嵌语句语句中的内嵌语句。特点:特点:先判断表达式,后执行语句先判断表达式,后执行语句。流程图:流程图:表达式语句非00例例6.2 求求main()int i,sum=0;i=1;while(i=100)sum=s
4、um+i;i+;printf(“%d”,sum);说明:1)循环体中如果包含一个以上的语句,应该用花括号括起来;2)在循环体中应有使循环趋于结束的语句,避免进入死循环;在本例中,设置循环条件为i100,然后语句中有出i+,这样就不会出现死循环。6.4 do-while语句语句一般形式:一般形式:do 循环体语句循环体语句 while(表达式表达式);特点:特点:先执行循环体,然后判断条件是否成立,成立先执行循环体,然后判断条件是否成立,成立 继续执行,否则退出循环;继续执行,否则退出循环;流程图:流程图:循环体语句表达式非00例例 6.3用用do-while语句求语句求main()int i,
5、sum=0;i=1;do sum=sum+i;i+;while(i=100);printf(“%d”,sum);while语句与语句与do-while语句之间的区别和相同点语句之间的区别和相同点1)对同一问题可以用)对同一问题可以用while语句处理,也可以用语句处理,也可以用do-while语句处理。语句处理。do-while语句结构可以转换成语句结构可以转换成while结构结构,可以认为可以认为do-while结构是由一个语句加一个结构是由一个语句加一个while结构结构构成;构成;2)在一般情况下,用)在一般情况下,用while语句和用语句和用do-while语句处理同语句处理同一问题时
6、,若二者的循环体部分一样,它们的结果也一问题时,若二者的循环体部分一样,它们的结果也一样。但是对于一样。但是对于while后面的表达式一开始就为后面的表达式一开始就为0值值,两,两种循环的种循环的结果不同结果不同;产生这样的原因是:对于;产生这样的原因是:对于while语语句,当句,当while后面的表达式一开始为后面的表达式一开始为0值,则将马上退出值,则将马上退出循环,一次也不执行语句;而循环,一次也不执行语句;而do-while语句无论其语句无论其while后面的表达式一开始是否为真假,都将至少执行后面的表达式一开始是否为真假,都将至少执行一次语句;一次语句;6.5 for语句语句for
7、语句的一般形式为:语句的一般形式为:for(表达式表达式1;表达式;表达式2;表达式;表达式3)语句语句执行过程及流程图:执行过程及流程图:(1)先求解表达式先求解表达式1;(2)求解表达式求解表达式2,若其值为真,则执行,若其值为真,则执行for语句中指语句中指定的内嵌语句,然后执行第(定的内嵌语句,然后执行第(3)步。若为假,则结束)步。若为假,则结束循环,转到第(循环,转到第(5)步;)步;(3)求解表达式求解表达式3;(4)转回上面第(转回上面第(2)步骤继续执行;)步骤继续执行;(5)循环结束。循环结束。例:例:for(i=1;i=100;i+)sum=sum+i求解表达式1求解表达
8、式2真语句求解表达式3假for语句的下一语句i=1i=100真sum=sum+ii+假它相当于它相当于 i=1;while(i=100)sum=sum+i;i+;说明:说明:(1)for语句的一般形式中的语句的一般形式中的“表达式表达式1”可以省略,此时可以省略,此时应在应在for语句之前给循环变量赋初值。比如:语句之前给循环变量赋初值。比如:for(i=1;i=100;i+)sum=sum+i;可写可写为:为:i=1;for(;i=100;i+)sum=sum+i;(2)表达式表达式2不能省略,否则会导致死循环;不能省略,否则会导致死循环;(3)表达式表达式3可以省略,但此时应另外设法保证循
9、环能可以省略,但此时应另外设法保证循环能正常结束。比如:正常结束。比如:for(i=1;i=100;i+)sum=sum+i;可写为:可写为:for(i=1;i=100;)sum=sum+i;i+;(4)表达式表达式1可以为设置循环变量初值的赋值表达式,可以为设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他变量表达式。此外也可以是与循环变量无关的其他变量表达式。此外表表达式达式1和和表达式表达式3还可以是逗号表达式,即包含一个以还可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。上的简单表达式,中间用逗号间隔。例:例:for(sum=0;i=100;i+)sum=sum+
10、i;for(i=0,j=100;i=j;i+,j-)k=i+j;(5)表达式一般是关系表达式或逻辑表达式,也可以为表达式一般是关系表达式或逻辑表达式,也可以为数值表达式或字符表达式,只要其值为非零,就执行数值表达式或字符表达式,只要其值为非零,就执行循环体。循环体。例:例:for(;(c=getchar()!=n;)printf(“%c”,c);此句的此句的作用是每读入一个字符后输出该字符,直作用是每读入一个字符后输出该字符,直到输入一个到输入一个“换行符换行符”为止。为止。(6)for语句简单、方便,使用灵活,不仅可以用于循环语句简单、方便,使用灵活,不仅可以用于循环次数已经确定的情况,而且
11、可以用于循环次数不确定次数已经确定的情况,而且可以用于循环次数不确定只给出循环结束条件的情况,它完全可以取代只给出循环结束条件的情况,它完全可以取代while语语句。句。6.6 循环的嵌套循环的嵌套C语言中,允许三种循环(语言中,允许三种循环(while循环、循环、do-while循循环和环和for循环)相互嵌套和进行多层循环)相互嵌套和进行多层嵌套嵌套。6.8 break语句和语句和continue语句语句6.8.1 break语句语句break语句的一般形式:语句的一般形式:break;作用:只能用于作用:只能用于循环语句循环语句和和switch语句,用来从循环体语句,用来从循环体 内跳出
12、循环体,以提前结束循环。内跳出循环体,以提前结束循环。例:例:for(r=1;r100)break;printf(“%f”,area);6.8.2 continue语句语句一般形式:一般形式:continue;作用:结束作用:结束本次本次循环,即跳过循环体中下面尚未执行循环,即跳过循环体中下面尚未执行 的语句,接着进行下一次是否执行循环的判定。的语句,接着进行下一次是否执行循环的判定。contiune语句和语句和break语句的区别是:语句的区别是:contiune语句只是语句只是终止本次循环终止本次循环,不是终止整,不是终止整 个循环,而个循环,而break语句是语句是结束整个循环结束整个循
13、环;详细的流程图分析,可参见详细的流程图分析,可参见教科书教科书P123之图之图6.10和图和图6.11.例例6.5 把把100200之间的不能被之间的不能被3整除的数输出;整除的数输出;main()int n;for(n=100;n=10-6pi=pi+tn=n+2s=-st=s/npi=pi*4输出输出pi#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);例例6.7 求求Fibonacc
14、i数列的数列的40个数。个数。Fibonacci数列为:数列为:f1=1,f2=1for i=1 to 20输出f1,f2f1=f1+f2f2=f2+f1main()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;1,1,2,3,5,8,13,例例6.8 判断判断m是否为素数。是否为素数。分析:判断一个数是否为素数,通常的做法是让这个数被分析:判断一个数是否为素数,通常的做法是让这个数被从从2到它的平方根(取整)的数除
15、到它的平方根(取整)的数除,如果能被其中任何,如果能被其中任何一个数整除,则该数不是素数。一个数整除,则该数不是素数。读入读入mk=sqrt(m)i=2i=真真k+1假假输出:输出:m是素是素数数输出:输出:m不是不是素数素数#includemain()int m,i,k;scanf(“%d”,&m);k=sqrt(m);for(i=2;i=k+1)printf(“%d is prime numbern”,m);else printf(“%d is not prime numbern”,m);例6.9在此基础上提出求素数的范围,这种情况可嵌套一个for循环即可处理。例例6.10 译密码。对字符的处理办法为:译密码。对字符的处理办法为:先判定它是否为大写字符或小写字符,若是,则将其值加先判定它是否为大写字符或小写字符,若是,则将其值加4,变,变成其后的第四个字母。如果加成其后的第四个字母。如果加4后字符值大于后字符值大于Z或或z,则在加则在加4后再减去后再减去26,转换为字母表前面的字母。(参见,转换为字母表前面的字母。(参见P128图图6.15)#include main()char c;while(c=gechar()!=n)if(c=a&c=A&cZ&cz)c=c-26;printf(“%c”,c);
限制150内