1、 1 a1第六章第六章 循环控制循环控制 熟练掌握熟练掌握for、while、do_while三种循三种循环结构环结构 掌握循环的嵌套掌握循环的嵌套学习要点学习要点学习建议学习建议难点难点循环的嵌套循环的嵌套break和和continue语句的正确使用语句的正确使用l上机编程,设计简单的循环结构,注意上机编程,设计简单的循环结构,注意设计错误并调试设计错误并调试 2 a2第六章第六章 循环控制循环控制 6.1 概述概述 6.2 goto语句以及用语句以及用goto语句构成循环语句构成循环(略略)6.3 while语句语句 6.4 do-while语句语句 6.5 for语句语句(重点重点!)6
2、.6 循环的嵌套循环的嵌套(重点重点!)6.7 几种循环的比较几种循环的比较(略略)6.8 break语句和语句和continue语句语句 6.9 程序举例程序举例 3 a36.1循环概述循环概述n一般需要使用循环的情况是一般需要使用循环的情况是:n有重复的操作有重复的操作(循环体循环体);循环次数可以控制循环次数可以控制n例例 有有60个学生个学生,将成绩在将成绩在80分以上者的学号和成绩打印出来分以上者的学号和成绩打印出来.什么是循环?什么是循环?为什么要使用循环?为什么要使用循环?n表示学生学号,表示学生学号,ni代表第代表第i个学生的学号;个学生的学号;g表示学生表示学生的成绩,的成绩
3、,gi代表第代表第i个学生的成绩个学生的成绩 S1:i=1 S2:如果如果gi=80,则打印则打印ni、gi S3:i=i+1 S4:如果如果i=60,返回返回S2,否则,算法结束,否则,算法结束循环体循环体循环条件循环条件循环控制变量循环控制变量i 4 a46.1循环概述循环概述当型循环当型循环直到型循环直到型循环n在在C语言中可以用下列语句实现循环语言中可以用下列语句实现循环.ngoto和和if结合结合nwhilenforndo-whilereturn 操作Aab成立p循环结构(当型)操 作 Aab成 立p不 成 立循 环 结 构(直 到 型)5 a56.2 goto语句以及用语句以及用g
4、oto语句构成语句构成循环循环注意注意:结构化程序设计方法,主张限制使用:结构化程序设计方法,主张限制使用goto语句。语句。无条件转向语句无条件转向语句格式:格式:goto 语句标号;语句标号;例:例:goto loop1;用途:用途:(1)与与if语句一起构成循环结构语句一起构成循环结构;(2)从多层循环的内层循环跳到外层循环从多层循环的内层循环跳到外层循环 6 a66.2 goto语句以及用语句以及用goto语句构成语句构成循环循环例例6.1求求1 0 01nn#includevoid main()int i=1,sum=0;/*初始化循环控制变量初始化循环控制变量i和累计器和累计器su
5、m*/printf(“sum=%dn”,sum);returnloop:if(i=100)sum=sum+i;i+;goto loop;7 a76.3 while 语句 实现当型循环,一般实现当型循环,一般形式如下:形式如下:while (表达式表达式)语句组语句组表达式表达式语句组语句组真假假 8 a8例例6.2 用用while语句求语句求1 0 01=1+2+3+.+1 0 0nn循环体内如果有一个以上的语句,则必须用循环体内如果有一个以上的语句,则必须用 构构成复合语句成复合语句;return#include void main()int i=1,sum=0;/*初始化循环控制变量初始化
6、循环控制变量i和累计器和累计器sum*/while(i=100)sum=sum+i;i+;/*循环控制变量循环控制变量i增增1*/printf(“sum=%dn”,sum);要有修改循环变量、使循环趋于结束的语句要有修改循环变量、使循环趋于结束的语句.9 a9 6.4 用用do-while语句实现循环语句实现循环n一般形式如下:一般形式如下:n do 循环体语句循环体语句 while(表达式表达式);循环体语句循环体语句表达式表达式yesno 10 a10例例6.3 用用do-while语句求语句求#include void main()int i=1,sum=0;do sum=sum+i;/
7、*累加累加*/i+;while(i=100);/*循环继续条件:循环继续条件:i=100*/printf(“sum=%dn”,sum);1 0 01nn 11 a11whilewhile语句和用语句和用do-whiledo-while语句的比较语句的比较:在一般情况下,用在一般情况下,用whilewhile语句和用语句和用do-whiledo-while语语句处理同一问题时,若二者的循环体部分是一句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。样的,它们的结果也一样。但是如果但是如果whilewhile后面后面的表达式一开始就为假的表达式一开始就为假(0(0值值)时,时,两种循
8、环的结两种循环的结果是否相同呢果是否相同呢?12 a12#include void main()int sum=0,i;scanf(“%d”,&i);while(i=10)sum=sum+i;i+;printf(“sum=%dn”,sum);#include void main()int sum=0,i;scanf(“%d”,&i);do sum=sum+i;i+;while(i=10);printf(“sum=%dn”,sum);returni=1时时,sum=55;i=1时时,sum=55;while语句和用语句和用do-while语句的比较语句的比较:i=1i=11时时,sum=0;i=
9、11时时,sum=11;i=11 13 a13 6.5 用用for语句实现循环语句实现循环 for语句的一般形式语句的一般形式 for(表达式表达式1;表达式;表达式2;表达式;表达式3)语句语句循环变量赋初值循环变量赋初值循环终止条件循环终止条件循环变量增量循环变量增量 forfor语句最简单的应用形式,也就是最易理解的形式语句最简单的应用形式,也就是最易理解的形式.14 a14 执行过程如图所示。执行过程如图所示。(1)求解)求解“变量赋初值变量赋初值”表达式。表达式。(2)求解)求解“循环继续条件循环继续条件”表达表达式。如果其值非式。如果其值非0,执行(,执行(3););否则,转至(否
10、则,转至(4)。)。(3)执行循环体语句组,并求解)执行循环体语句组,并求解“循环变量增值循环变量增值”表达式,然表达式,然后转向(后转向(2)。)。(4)执行)执行for语句的下一条语句。语句的下一条语句。6.5 for语句求表达式求表达式1表达式表达式2?语句语句表达式表达式3yesnofor(表达式表达式1;表达式;表达式2;表达式;表达式3)语句语句循环变量赋初值循环变量赋初值循环终止条件循环终止条件循环变量增量循环变量增量 15 a15 例例 求求1100的累计和。的累计和。#include void main()int i,sum=0;printf(sum=%dn,sum);6.5
11、 for语句例例 求求1100的累计和。的累计和。#include void main()int i,sum=0;i=1;do sum=sum+i;i+;while(i=100);printf(“sum=%dn”,sum);for(i=1;i=100;i+)sum=sum+i;16 a16 例例 求求1100的累计和。的累计和。#include void main()int i,sum=0;for(i=1;i=100;i+)sum=sum+i;/*实现累加实现累加*/printf(sum=%dn,sum);6.5 for语句for循环执行流程:循环执行流程:i=1i+-i=2 i100 退出循
12、环退出循环 i=100 sum=0+1=1 17 a17#include void main()int i,sum=0;/*将累加器将累加器sum初始化为初始化为0*/for(;i=100;i+)sum=sum+i;/*实现累加实现累加*/printf(sum=%dn,sum);for语句应用说明:语句应用说明:for(i=1;i=100;i+)sum=sum+i;表达式表达式1可以省略可以省略,此此时应在循环前初始化,时应在循环前初始化,分号不能省略分号不能省略 i=1;循环变量赋初值循环变量赋初值循环终止条件循环终止条件循环变量增量循环变量增量 18 a18#include void ma
13、in()int i,sum=0;i=1;for(;i=100;)sum=sum+i;/*实现累加实现累加*/printf(sum=%dn,sum);for(i=1;i=100;i+)sum=sum+i;表达式表达式3可以省略可以省略,此时此时应在循环体内进行处理应在循环体内进行处理 i+;19 a19#include void main()int i,sum=0;for(i=1;i+)sum=sum+i;/*实现累加实现累加*/printf(sum=%dn,sum);for(i=1;i100)break;/*break语句的功能是退出它所在的循环语句的功能是退出它所在的循环*/20 a20 表
14、达式表达式1和表达式和表达式3可以是和初值、可以是和初值、增量无关的逗号表达式增量无关的逗号表达式for(表达式表达式1;表达式;表达式2;表达式;表达式3)语句)语句循环变量赋初值循环变量赋初值循环终止条件循环终止条件循环变量增量循环变量增量sum=0;for(i=1;i=100;i+)sum=sum+i;for(i=1,sum=0;i=100;sum=sum+i,i+);求表达式求表达式1表达式表达式2语句语句表达式表达式3yesno 21 a21 表达式表达式1和表达式和表达式3可以是和初值、增量无关的逗号表达可以是和初值、增量无关的逗号表达式式for(表达式表达式1;表达式;表达式2;
15、表达式;表达式3)语句)语句循环变量赋初值循环变量赋初值循环终止条件循环终止条件循环变量增量循环变量增量sum=0;for(i=1;i=100;i+)sum=sum+i;for(i=1,sum=0;i=100;sum=sum+i,i+);for(i=1,sum=0;i=100;sum=sum+i+);for(i=1,sum=0;i=100;i+,sum=sum+i);22 a22 以下程序的输出结果以下程序的输出结果(!)main()int n;for(n=1;n=5;n+=2)printf(“n=%dn”,n);main()int n;for(n=1;n=5;n+=2);printf(“n=
16、%dn”,n);运行结果运行结果n=1n=3n=5运行结果运行结果n=7 23 a23 for 语句和语句和while语句是可以互换的语句是可以互换的.表达式表达式1;while(表达式表达式2)语句组语句组;表达式表达式3;for(表达式表达式1;表达式表达式2;表达式表达式3)语句组语句组;6.5 for语句return显然,用显然,用forfor语句简单、语句简单、方便。方便。24 a24 6.6 循环的嵌套循环的嵌套(多重循环多重循环)一个循环体内可以包含另一个完整的循环一个循环体内可以包含另一个完整的循环结构,称为循环的嵌套。结构,称为循环的嵌套。(1)while()(2)for(;
17、)(3)do do while()for(;)while()while()25 a251 1=11=12 1=21=22 2=42=49 1=91=99 2=182=189 3=273=279 9=819=81.循环的嵌套循环的嵌套(多重循环多重循环)输出第输出第9行行(用用for如何实现?如何实现?):for(i=1;i=9;i+)printf(“9%d=%d ”,i,9*i)输出第输出第n行行(用用for如何实现?如何实现?):for(i=1;i=n;i+)printf(“%d%d=%d ”,n,i,n*i)例:编程,输出下例:编程,输出下图的九九乘法表。图的九九乘法表。26 a261 1
18、=11=12 1=21=22 2=42=49 1=91=99 2=182=189 3=273=279 9=819=81.循环的嵌套循环的嵌套(多重循环多重循环)输出乘法表输出乘法表(如何实现?如何实现?):for(n=1;n=9;n+)for(i=1;i=n;i+)printf(“%d%d=%d ”,n,i,n*i);printf(“n”);输出第输出第n行:行:for(i=1;i=n;i+)printf(“%d%d=%d ”,n,i,n*i);for(9次次 )for(n 次次)问题问题1 1:外循:外循环、内循环环、内循环的循环次数的循环次数是多少?是多少?27 a27循环的嵌套循环的嵌套
19、例:打印九九表例:打印九九表#include stdio.hvoid main()int i,n;for(n=1;n=9;n+)for(i=1;i=n;i+)printf(%d%d=%d,n,i,i*n);printf(n);for(9次次 )for(n 次次)1 1=11=12 1=21=22 2=42=49 1=91=99 2=182=189 3=273=279 9=819=81.28 a28*循环的嵌套循环的嵌套 分析分析:行的控制行的控制 i:18 *的个数与当前行的关系的个数与当前行的关系 j=2*i-1 *前面的空格前面的空格k与行的关系与行的关系:开始时开始时,第一行有第一行有7
20、个空格个空格 每多一行每多一行,少一个空格少一个空格k=8-iwhile(i=8)for(k=1;k=8-i;k+)输出空格输出空格;for(j=1;j=(2*i-1);j+)输出输出*;i+;29 a29#includemain()int i,j,k;i=1;while(i=8)for(k=1;k=8-i;k+)printf(“”);for(j=1;j=(2*i-1);j+)printf(“*”);printf(“n”);i+;循环的嵌套循环的嵌套return*30 a30 6.7几种循环的比较几种循环的比较 (2)for(2)for语句的功能更强,凡用语句的功能更强,凡用whilewhil
21、e循环能完成循环能完成的,用的,用forfor循环都能实现。循环都能实现。(1)四种循环都可以用来处理同一问题,一般情况四种循环都可以用来处理同一问题,一般情况下它们可以互相代替。但一般不提倡用下它们可以互相代替。但一般不提倡用goto型循型循环。环。return 31 a31为了使循环控制更加灵活,语言提供了为了使循环控制更加灵活,语言提供了break语语句和句和continue语句。语句。1一般格式:一般格式:break;continue;6.8 break 和continue2功能功能(1)break:强行结束循环,转向执行循环语句的下一:强行结束循环,转向执行循环语句的下一条语句。条语
22、句。(2)continue:结束:结束本次本次循环。循环。即跳过循环体中尚未执行的语句,接着进行下一次即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判断。是否执行循环的判断。32 a32 break语句用来从循环体里退出,中止循环 continue用来跳过剩下的语句,回到循环开始表达式表达式1表达式表达式2循环的下一个语句循环的下一个语句语句语句语句语句breaknyyn表达式表达式1表达式表达式2循环的下一个语句循环的下一个语句语句语句语句语句continuenyynbreak语句和continue语句 33 a333说明说明(1)break能用于循环语句和能用于循环语句和swi
23、tch语句中,语句中,continue只能用于循环语句中。只能用于循环语句中。6.8 break 和continue(2)循环嵌套时,)循环嵌套时,break和和continue只影响包含它们只影响包含它们的最内层循环,与外层循环无关。的最内层循环,与外层循环无关。34 a34 例例:计算计算r=1,2,.10r=1,2,.10的圆面积的圆面积,只到面积大于只到面积大于100100为止为止;n#includenvoid main()int r;float area;for(r=1;r100.0)printf(“Area is%fn”,area);break;35 a35 把把100200之间的
24、不能被之间的不能被3整除的打印出来整除的打印出来.6.8 break 和continuenvoid main()int n;for(n=100;n=200;n+)n if(n%3=0)printf(“不能被不能被3整除的数是整除的数是:%dn”,n);returncontinue;36 a36 6.9 程序举例程序举例例例6.6用用/4 1-1/-1/3+1/5-1/7+的公式求的公式求 的近似值,的近似值,直到最后一项的绝对值小于直到最后一项的绝对值小于106为止为止t=1,pi=0,n=1,s=1t=1,pi=0,n=1,s=1当当|t|t|1010-6-6pi=pi+tpi=pi+tn=
25、n+2n=n+2s=-s;s=-s;t=s/nt=s/npi=pipi=pi*4 4输出输出pipi#include#include#include include main()main()int s;float n,t,pi;int s;float n,t,pi;t=1;pi=0;n=1.0;s=1;t=1;pi=0;n=1.0;s=1;while(fabs(t)=1e-6)while(fabs(t)=1e-6)pi=pi+t;n=n+2;pi=pi+t;n=n+2;s=-s;s=-s;t=s/n;t=s/n;pi=pi pi=pi*4;4;printf(“pi=%10.6fn”,pi);p
26、rintf(“pi=%10.6fn”,pi);下一个例程 37 a37 P129 6.1 输入两个正整数输入两个正整数m和和n,求其最大公约数和最小公求其最大公约数和最小公倍数。倍数。例:m=4,n=6,其最大公约数为其最大公约数为i=2最小公倍数最小公倍数46/2=12。试探法试探法下一个例程 38 a38#includevoid main()int m,n,i;printf(please input two integers n,mn);scanf(%d,%d,&n,&m);if(n=1;i-)if(m%i=0)&(n%i=0)break;printf(“最大公约数是:最大公约数是:%d.
27、n,i);printf(“最小公倍数是:最小公倍数是:%d.n,m*n/i);下一张 39 a39#includevoid main()int m,n,k,i,leap=1;printf(please input two integers n,mn);scanf(%d,%d,&n,&m);if(n=1)&leap;i-)if(m%i=0)&(n%i=0)leap=0;i+;下一张printf(“最大公约数是:最大公约数是:%d.n,i);printf(“最小公倍数是:最小公倍数是:%d.n,m*n/i);40 a40 例例6.10 译密码。输入若干字符译密码。输入若干字符,若为字母字符则将它若
28、为字母字符则将它们变成其后的第四个字母们变成其后的第四个字母,A-E,w-a.非字母字非字母字符不变符不变.思路思路:1.建立循环建立循环,循环控制条件是什么?循环控制条件是什么?41 a41 例例6.10 译密码。输入若干字符译密码。输入若干字符,若为字母字符则将它若为字母字符则将它们变成其后的第四个字母们变成其后的第四个字母,A-E,w-a.非字母字非字母字符不变符不变.思路思路:1.建 立 循 环建 立 循 环,循 环 结 束 以 输 入 回 车 符 为 准循 环 结 束 以 输 入 回 车 符 为 准 while(while(c=getchar()c=getchar()!=n)!=n)
29、循环体。循环体。对比:对比:while(c=getchar()!=n)while(c=getchar()!=n)42 a42 例例6.10 译密码。输入若干字符译密码。输入若干字符,若为字母字符则将它若为字母字符则将它们变成其后的第四个字母们变成其后的第四个字母,A-E,w-a.非字母字非字母字符不变符不变.思路思路:2.判断输入是否是字母判断输入是否是字母 a b.z98.122A B.Z97 65 66.90if(c=a&c=A&if(c=a&c=A&c=Z)cE,w-a.非字母字非字母字符不变符不变.思路思路:4.若变换后超出若变换后超出z时时,要轮回要轮回.(如何判断是否要轮回?如何轮
30、回?如何判断是否要轮回?如何轮回?)a b.z 98.122 123A B.Z 97 65 66.90 913.3.变成其后的第四个字母?变成其后的第四个字母?c=c+4;c=c+4;if(cZ&cz)c=c-26;c=c-26;例:例:W W:8787,Z Z:9090,W-A,则:则:W426 44 a44 例例6.10 译密码。输入若干字符译密码。输入若干字符,若为字母字符则将它若为字母字符则将它们变成其后的第四个字母们变成其后的第四个字母,A-E,W-A.非字母字非字母字符不变符不变.思路思路:3.3.变成其后的第四个字母变成其后的第四个字母 c=c+4;c=c+4;4.若变换后超出若
31、变换后超出z时时,要轮回要轮回.if(cZ&cz)c=c-26例:例:W W:8787,Z Z:9090,W-A,则:则:W4262.判断输入是否是字母判断输入是否是字母 if(c=a&c=A&if(c=a&c=A&c=Z)c=Z)1.建 立 循 环建 立 循 环,循 环 结 束 以 输 入 回 车 符 为 准循 环 结 束 以 输 入 回 车 符 为 准 while(c=getchar()!=n)while(c=getchar()!=n)45 a45#includeincludevoid main()void main()char c;char c;while(c=getchar()!=n)
32、while(c=getchar()!=n)if(c=a&c=A&if(c=a&c=A&c=Z)cZ&cz)c=c-if(cZ&cz)c=c-26;26;printf(“%c”,c);printf(“%c”,c);abdEgWabdEgWefhIkAefhIkA 46 a46例例6.8 6.8 判断判断m m是否素数。是否素数。素数素数:只能被只能被1和其自已整除的数和其自已整除的数算法思想算法思想:让让m m被被2 2到到 除,如果除,如果m m能被能被2 2k k之中之中任何一个整数整除,则任何一个整数整除,则说明说明m m不是素数不是素数,提前结束循,提前结束循环,此时环,此时i i必然小
33、于或等于必然小于或等于k k;如果;如果m m不能被不能被2 2k k之间之间的任一整数整除,则在完成最后一次循环后,的任一整数整除,则在完成最后一次循环后,i i还要还要加加1 1,因此,因此i=k+1i=k+1,然后才终止循环。在循环之后判,然后才终止循环。在循环之后判别别i i的值是否大于或等于的值是否大于或等于k+1k+1,若是,则表明未曾被,若是,则表明未曾被2 2k k之间任一整数整除过,因此输出之间任一整数整除过,因此输出“是素数是素数”。km 47 a47例例6.8 6.8 判断判断m m是否素数。是否素数。算法思想算法思想:让让m m被被2 2到到 除,如果除,如果m m能被
34、能被2 2k k之中任何一个整数整除,则之中任何一个整数整除,则说明说明m m不是素数不是素数,提前结束循环,此时,提前结束循环,此时i i必然小于或等于必然小于或等于k k;如果;如果m m不能被不能被2 2k k之间的任一整数整除,则在完成最后一次循环后,之间的任一整数整除,则在完成最后一次循环后,i i还要加还要加1 1,因此,因此i=k+1i=k+1,然后才终止循环。在循环之后判别,然后才终止循环。在循环之后判别i i的值是否大于或等于的值是否大于或等于k+1k+1,若,若是,则表明未曾被是,则表明未曾被2 2k k之间任一整数整除过,因此输出之间任一整数整除过,因此输出“是素数是素数
35、”。如图所示如图所示:km 48 a48#include#include void main()int m,i,k;scanf(%d,&m);if(ik)printf(%d 是素数是素数n,m);else printf(%d 不是素数不是素数n,m);k=sqrt(m);for(i=2;i=k;i+)if(m%i=0)break;运行结果:运行结果:17 17 是素数是素数 演示例题演示例题6-8 49 a49循环的嵌套循环的嵌套 例例6.9 把把100200之间的素数打印出来之间的素数打印出来.算法设计要点:算法设计要点:显然,只要设计出判断某数显然,只要设计出判断某数m是否是素数的算法,外
36、是否是素数的算法,外面再套一个面再套一个for循环即可。循环即可。50 a50#include#include main()int i,m,k,n=0;printf(“100-200间的素数有:间的素数有:n”);for(m=101;m=200;m=m+2)k=sqrt(m);for(i=2;ik)printf(“%d ”,m);n+;if(n%10=0)printf(“n”);例例6.9 把把100200之之间的素数打印出来间的素数打印出来.问题:问题:(1)为什么循环中是为什么循环中是m=m+2(2)变量变量n的作用?的作用?(3)做什么用的?做什么用的?51 a51#include#in
37、clude main()int i,m,k,n=0;printf(“100-200间的素数有:间的素数有:n”);for(m=101;m=200;m=m+2)k=sqrt(m);for(i=2;ik)printf(“%d ”,m);n+;if(n%10=0)printf(“n”);例例6.9 把把100200之之间的素数打印出来间的素数打印出来.运行结果:运行结果:100-200间的素数有:间的素数有:101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 52 a52本章要点本章要点 本章介绍的三种循环语句一般可实现同一问本章介绍的三种循环语句一般可实现同一问题的求解,但有不同的特点。题的求解,但有不同的特点。while,for 属于属于“先判断,后执行循环先判断,后执行循环”,而,而do-while语句语句则则“先执行循环,后判断先执行循环,后判断”。if和和goto语句也能构成循环结构,但效率不如语句也能构成循环结构,但效率不如循环语句,且会破坏结构化程序,通常不使循环语句,且会破坏结构化程序,通常不使用该方法构成循环结构用该方法构成循环结构 break和和continue能改变循环的执行流程,能改变循环的执行流程,注意两者的区别。注意两者的区别。