资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,C,程序设计(第三版),http:/,*,第六章,循环控制,主要内容,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,语句,无条件转向语句,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,语句将使程序流程无规律、可读性差,。,一般来说,可以有两种用途:,(1),与,if,语句一起构成循环结构;,(2),从循环体中跳转到循环体外。,但是这种用法不符合结构化原则,一般不宜采用,只有在不得已时,(,例如能大大提高效率,),才使用。,6.3,用,while,语句实现循环,while,语句用来实现“当型”循环结构。,一般形式:,while(,表达式,),语句,当表达式为非,0,值时,执行,while,语句中的内嵌语句。其特点是,:,先判断表达式,后执行语句。,例,6,2,#include,void main(),int,i,sum,=0;,i=1;,while(i=100),sum=,sum+i,;,i+;,printf(%dn,sum,);,注意:,循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现。,在循环体中应有使循环趋向于结束的语句。如果无此语句,则,i,的值始终不改变,循环永不结束。,6.3,用,while,语句实现循环,6.4,用,do-while,语句实现循环,do-while,语句的特点,:,先执行循环体,然后判断循环条件是否成立。,一般形式,:,do,循环体语句,while,(,表达式,),;,执行过程:,先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零,(“,真”,),时,返回重新执行循环体语句,如此反复,直到表达式的值等于,0,为止,此时循环结束。,例,6,3,#include,void main(),int,i,sum,=0;,i=1;,do,sum=,sum+i,;,i+;,while(i,=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,&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,);,6.5,用,for,语句实现循环,C,语言中的,for,语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替,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,(,循环变量赋初值;循环条件;循环变量增量,),语句,如:,for(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,循环的嵌套,一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套,循环,这就是多层循环。,三种循环,(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),四种循环都可以用来处理同一问题,一般情况下它们可以互相代替。但一般不提倡用,goto,型循环。,(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,语句之前完成。而,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,语句和,continue,语句,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 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,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%12ld,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,不能被,2,k(,即,),之间的任一整数整除,则在完成最后一次循环后,,i,还要加,1,,因此,i=k+1,,,然后才终止循环。在循环之后判别,i,的值是否大于或等于,k+1,,,若是,则表明未曾被,2,k,之间任一整数整除过,因此输出“是素数”。,#include,#include,void main(),int,m,i,k,;,scanf(%d,&m,);,k=,sqrt(m,);,for(i=2;ik),printf(%d,is a prime number,n,m,);,else,printf(%d,is not a prime number,n,m,);,#include,#include,void main(),int,m,i,k,;,int,flag=0;,scanf(%d,&m,);,k=,sqrt(m,);,for(i=2;i=,k;i,+),if(m%i,=0),_,break;,if(flag,
展开阅读全文