1、,第六章,循环控制,主要内容,6.1 概述 6.2 goto语句以及用goto语句构成循环 6.3 用while语句实现循环 6.4 用do-while语句实现循环 6.5 用for 语句实现循环 6.6 循环的嵌套 6.7 几种循环的比较 6.8 break语句continue和语句 6.9 程 序 举 例,6.1 概述,什么是循环? 为什么要使用循环?,问题1:,问题2:求学生平均成绩 分数相加后除以课数,在许多问题中需要用到循环控制。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。,6.2 goto语句以及用goto语句构成循环,goto
2、语句无条件转向语句goto 语句标号; 语句标号用标识符表示,它的定名规则与变量名相同,即由字母、数字和下划线组成,其第一个字符必须为字母或下划线。例如:goto label_1; 合法;goto 123; 不合法.,#include void main( ) int i, sum=0;i=1; loop: if(i=100)sum=sum+i;i+;goto loop;printf(“%dn“,sum); ,例:6.1,6.2 goto语句以及用goto语句构成循环,结构化程序设计方法主张限制使用goto语句,因 为滥用goto语句将使程序流程无规律、可读性差。 一般来说,可以有两种用途:
3、(1) 与if语句一起构成循环结构; (2) 从循环体中跳转到循环体外。但是这种用法不符合结构化原则,一般不宜采用,只有在不得已时(例如能大大提高效率)才使用。,6.3 用while语句实现循环,while语句用来实现“当型”循环结构。 一般形式:while (表达式) 语句当表达式为非0值时,执行while语句中的内嵌语句。其特点是:先判断表达式,后执行语句。,例62,#include void main() int i,sum=0;i=1;while (i=100) sum=sum+i;i+;printf(“%dn“,sum); ,注意: 循环体如果包含一个以上的语句,应该用花括弧括起来,
4、以复合语句形式出现。 在循环体中应有使循环趋向于结束的语句。如果无此语句,则i的值始终不改变,循环永不结束。,6.3 用while语句实现循环,6.4 用do-while语句实现循环,do-while语句的特点:先执行循环体,然后判断循环条件是否成立。一般形式: do 循环体语句while (表达式);,执行过程:先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零(“真”) 时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束。,例63,#include void main() int i,sum=0;i=1;do sum=sum+i;i+;while(i=
5、100);printf(“%dn“,sum);,6.4 用do-while语句实现循环,while语句和用do-while语句的比较: 在一般情况下,用while语句和用do-while语 句处理同一问题时,若二者的循环体部分是一 样的,它们的结果也一样。但是如果while后面 的表达式一开始就为假(0值)时,两种循环的结 果是不同的。,#include void main ( ) int sum=0,i; scanf(“%d“, ,#include void main( ) int sum=0,i;scanf(“%d“, ,6.5 用for 语句实现循环,C语言中的for语句使用最为灵活,不
6、仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。 一般形式:for(表达式1;表达式2;表达式3) 语句,for语句的执行过程:(1) 先求解表达式1。(2) 求解表达式2,若其值为真(值为非0),则执 行for语句中指定的内嵌语句,然后执行下 面第(3)步。若为假(值为0),则结束循环,转到第(5)步。(3) 求解表达式3。(4) 转回上面第(2)步骤继续执行。(5) 循环结束,执行for语句下面的一个语句,一般形式:for(表达式1;表达式2;表达式3) 语句,for(循环变量赋初值;循环条件;循环变量增量) 语句如:f
7、or(i=1;i=100;i+)sum+=i;,例:,for (i=1; i=100; i+)sum=sum+i;,i=1; while(i=100) sum=sum+1;i+; ,说明:见教材p118 三个表达式均能省略,但分号不能省,6.5 用for 语句实现循环,注意: C语言中的for语句比其他语言(如BASIC, PASCAL)中的FOR语句功能强得多。可以把循环体 和一些与循环控制无关的操作也作为表达式1或 表达式3出现,这样程序可以短小简洁。但过分 地利用这一特点会使for语句显得杂乱,可读性 降低,最好不要把与循环控制无关的内容放到 for语句中。,6.6 循环的嵌套,一个循环
8、体内又包含另一个完整的循环结构称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。 三种循环(while循环、do-while循环和for循环)可以互相嵌套。,下面几种都是合法的形式: (1) while( ) (2) do (3) for(;) while( ) do for(;) while( ); while( );,6.6 循环的嵌套,(4) while( ) (5) for(;) (6) do do while( ) for(;) while( ) while( ),6.7 几种循环的比较,(1)四种循环都可以用来处理同一问题,一般情况下它们可以互相代替。但一般不提倡用got
9、o型循环。 (2)在while循环和do-while循环中,只在while后面的括号内指定循环条件,因此为了使循环能正常结束,应在循环体中包含使循环趋于结束的语句(如i+,或i=i+1等)。for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现,for(循环变量赋初值;循环条件;循环变量增量) 语句如:for(i=1;i=100;i+)sum+=i;,6.7 几种循环的比较,(3)用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完
10、成。而for语句可以在表达式1中实现循环变量的初始化。4)while循环、do-while循环和for循环,可以用break语句跳出循环,用continue语句结束本次循环(break语句和continue语句见下节)。而对用goto语句和if语句构成的循环,不能用break语句和continue语句进行控制,6.8 break语句和continue语句,6.8.1 break语句 break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句一般形式:break; 注意:break语句不能用于循环语句和switch语句之外的任何其他语句中。,6.8 break语句和con
11、tinue语句,float pi=3.14159; for(r=1;r100) break;printf(r=%f,area=%fn,r,area); ,程序的作用是计算r=1到r=10时的圆面积,直到面积area大于100为止。从上面的for循环可以看到:当area100时,执行break语句,提前结束循环,即不再继续执行其余的几次循环。,例:,6.8 break语句和continue语句,6.8.2 continue语句 作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定. 一般形式:continue;,#include void main() int
12、n;for (n=100;n=200;n+)if (n%3=0)continue;printf(“%d “,n); ,如果将continue改为break,则程序运行后输出结果是什么?,6.8 break语句和continue语句,continue语句和break语句的区别continue语句只结束本次循环,而不是终止整个循环的执行。 break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。,6.9 程序举例,例6.6用/41-1/3+1/5-1/7+公式求的近似值,直到某一项的绝对值小于为止。,#include #include void main() int s;float n
13、,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 求Fibonacci数列前40个数。这个数列有如下特点:第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。即: F(1)=1 (n=1) F(2)=1 (n=2) F(n)=F(n-1)+F(n-2) (n3),void main() long int f1,f2;int i;f1=1;f2=1;for(i=1; i=20; i+) printf(“%12ld %12l
14、d “,f1,f2);if(i%2=0) printf(“n“);f1=f1+f2;f2=f2+f1; ,6.9 程序举例,例6.8 判断m是否素数。 算法思想:让m被2到除,如果m能被2之中任何一个整数整除,则提前结束循环,此时i必然小于或等于k(即);如果m不能被2k(即)之间的任一整数整除,则在完成最后一次循环后,i还要加1,因此i=k+1,然后才终止循环。在循环之后判别i的值是否大于或等于k+1,若是,则表明未曾被2k之间任一整数整除过,因此输出“是素数”。,#include #include void main() int m,i,k;scanf(“%d“, ,#include #i
15、nclude void main() int m,i,k;int flag=0;scanf(“%d“, ,6.9 程序举例,例6.10 译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。思路:可以按以下规律将电文变成密码:将字母A变成字母E,a变成e,即变成其后的第4个字母,W变成A,X变成B,Y变成C,Z变成D。,例:610,#include void main()char c;while(c=getchar()!=n)if(c=a ,作业:,将书本习题6.10改为:猴子第一天摘下了若干桃子,当即吃了桃子总数的2/5,觉得不过瘾,又多次了2个。第二天早上右键剩下的桃子总数的2/5吃掉,又多次了2个。以后每天早晨都吃到前一天剩下桃子的2/5零2个。到了第5天,早上想再吃时,就剩下1个桃子了。求第一天共摘了多少个桃子。,