资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第六章,循环控制,本章要点,循环的基本概念,不同形式的循环控制,多重循环问题,6.1,概述,什么是循环?,为什么要使用循环?,问题,1,:,问题,2:,求学生平均成绩,分数相加后除以课数,循环:反复执行称为“循环体”的程序段。,循环结构是结构化程序三种基本结构之一。,(顺序结构、分支结构)。,C,语言中用如下语句实现循环,1,、用,goto,语句和,if,语句构成循环。,2,、用,while,语句。,3,、用,do-while,语句。,4,、用,for,语句。,6.2,goto,语句以及用,goto,语句构成循环,1,goto,语句为无条件转向语句,它的一般形式为,goto,语句标号;,语句标号用标识符表示,它的定名规则与变量名相同,即由字母、数字和下划线组成,其第一个字符必须为字母或下划线。,例如:,goto,label_1;,合法,;,goto,123,;,不合法,.,结构化程序设计方法主张限制使用,goto,语句,因为滥用,goto,语句将使程序流程无规律、可读性差,.,一般来说,可以有两种用途:,(1),与,if,语句一起构成循环结构;,(2),从循环体中跳转到循环体外。,但是这种用法不符合结构化原则,一般不宜采用,只有在不得已时,(,例如能大大提高效率,),才使用,.,6.3,用,while,语句实现循环,while,语句用来实现“当型”循环结构。,一般形式:,while(,表达式,),语句,当表达式为非,0,值时,执行,while,语句中的内嵌语句。其特点是,:,先判断表达式,后执行语句。,所以是“条件成立时做”,,所以循环体有可能一次也不执行。,While,语句,while,语句,例,6.2,求,1,到,100,的和,#include void main(),int,i,,,sum=0;i=1;while(i=100)sum=sum+i;i+;,printf,(%dn,,,sum);,说明:,(1),循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现,.(2),在循环体中应有使循环趋向于结束的语句,否则程序进入,“,死循环,”,(不结束)。,运行结果:,5050,例 上述程序稍做修改,#include void main(),int,i,,,sum=0;i=1;while(i=100)i+;sum=sum+i;,printf,(%dn,,,sum);,说明:,循环体中语句的先后顺序必须符合逻辑,否则出错。,运行结果:?,示例:,掌握,“,连加,”,、,“,连乘,”,算法;,本书,P124,例,6.6,;,掌握类似的编程题目,,注意点,:先找出变,化规律,设置好初始值,注意循环体内语句先后顺序,最后考虑“终止”条件,避免死循环。,例,6.6,用,/41-1/3+1/5-1/7+,公式求,的近似值,直到某一项的绝对值小于为止。,例,6.6,求,pi,的近似值,#include#includevoid 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.6f,n,,,pi);,运行结果:,pi=3.141594,示例,:,回顾上章,我们求过“输入一个,5,位数,输出它的每一位数”,方法?,本章引申:若输入的数不确定位数,即输入任意一个数,逆序输出它的每一位数。怎么办?,main(),long y,n;,scanf,(%ld,&y),while(y!=0),n=y%10;,printf,(%ld,n);,y=y/10;,6.4,用,do-while,语句实现循环,do-while,语句的特点,:,先执行循环体,然后判断循环条件是否成立。,一般形式,:,do,循环体语句,while,(,表达式,),;,执行过程:,先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零,(“,真”,),时,返回重新执行循环体语句,如此反复,直到表达式的值等于,0,为止,此时循环结束。,所以也是条件成立时做。,注意,:do-while,语句与,N-S,图中“直到型”中的循环条件区别;,D0-While,语句,Do-while,语句,与课本,P27,不同,例,6.3,求,1,到,100,的和,#include void main(),int,i,,,sum=0;i=1;do sum=sum+i;i+;while(i=100);,printf,(%dn,,,sum),;,运行结果:,5050,6.4,用,do-while,语句实现循环,while,语句和用,do-while,语句的比较,:,在一般情况下,用,while,语句和用,do-while,语,句处理同一问题时,若二者的循环体部分是一,样的,它们的结果也一样。但是如果,while,后面,的表达式一开始就为假,(0,值,),时,两种循环的结,果是不同的。,6.5,用,for,语句实现循环,C,语言中的,for,语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替,while,语句。,一般形式,:,for,(,表达式,1,;表达式,2,;表达式,3),语句,其中:“表达式,1”,设置循环初始条件,“表达式,2”,判别循环条件,“表达式,3”,修改循环条件,关注,for,语句执行流程;,6.5,用,for,语句实现循环,表达式,2,?,执行,语句,成立,不成立,执行,for,循环之后的语句,执行表达式,3,执行表达式,1,循环初始条件,循环控制条件,循环体,for,语句等价于下列语句:,表达式,1,;,while,(,表达式,2,),语句;,表达式,3,;,6.5,用,for,语句实现循环,for,语句最简单的应用形式也就是最易理解的如下形式:已知循环次数。,for,(,循环变量赋初值;循环条件;循环变量增值,),例如,:,“,连加,”,for(sum=0,i=1;i=100;i+)sum=sum+i;,“,连乘,”,for(s=1,i=1;i=100;i+)s=s*i;,(,注意区别),显然,用,for,语句简单、方便。,6.5,用,for,语句实现循环,说明:,for,语句使用非常灵活,可以省略“表达式,1”,、“表达式,2”,、“表达式,3”,中的几个或全部表达式,,但,2,个,“,;,”,不可省,;,此部分可自学,P118,起。,6.5,用,for,语句实现循环,说明:,表达式,1,和表达式,3,可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。,如:,for(sum=0,,,i=1;i=100;i+)sum=sum+i;,或,for(i=0,,,j=100;i=j;i+,,,j-)k=i+j,;,6.5,用,for,语句实现循环,说明:,表达式,2,一般是关系表达式,(,如,i=100),或逻辑表达式,(,如,ab&xy),,,但也可以是数值表达式或字符表达 式,只要其值为非零,就执行循环体。,for(i=0;(c=,getchar,()!=n,;,i+=c),;,(,此表达重要,另见例,),6.6,循环的嵌套,一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套,循环,这就是多层循环。,三种循环,(while,循环、,do-while,循环和,for,循,环,),可以互相嵌套。,6.6,循环的嵌套,下面几种都是合法的形式:,(1),while()(2)do (3)for(;),while()do for(;),while();,while();,6.6,循环的嵌套,(4),while()(5)for(;)(6)do,do while()for(;),while(),while(),可考虑有,/,无嵌套,2,种方法,无嵌套:考虑到,n!=(n-1)!*n,for(s1=i=1,s=0;i=10;i+),s1=s1*i;,s=s+s1;,=1!+2!+10!,有嵌套:,for(i=1,s=0;i=10;i+),for(s1=j=1;j=i;j+),s1=s1*j;,s=s+s1;,(,注意:,赋初值时刻及,包括的范围,),另:为考虑阅读的方便,请务必注意书写时的缩进及层次,例:打印各种形状图形,*,*,*,*,*,*,考虑:,采用双重循环,一行一行输出。,每一行输出步骤:一般,3,步。,1,)光标定位,2,)输出图形,3,)每输完一行光标换行,(n),6.7,几种循环的比较,四种循环(,while,、,do-while,、,for,、,goto,),可以互相替换,但应尽量少用,goto,;,while,循环、,do-while,循环和,for,循环,可以,用,break,语句跳出循环,用,continue,语句结束本,次循环。,6.8 break,语句和,continue,语句,6.8.1 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,语句和,break,语句的区别,continue,语句只结束本次循环,而不是终止整个循环的执行。,break,语句则是结束整个循环过程,不再判断执行循环的条件是否成立。,例,6.5,把,100,200,之间的不能被,3,整除的数输出。,#include void main(),int,n;for(n=100;n=200;n+)if(n%3=0)continue;,printf,(%d ,,,n);,说明:,当,n,能被,3,整除时,执行,continue,语句,结束本次循环,(,即跳过,printf,函数语句,),,只有,n,不能被,3,整除时才执行,printf,函数。,6.9,程 序 举 例,例,6.8,判断,m,是否素数。,算法思想,:,让,m,被,2,到除,如果,m,能被,2,之中任何一个整数整除,则提前结束循环,此时,i,必然小于或等于,k(,即,),;如果,m,不能被,2,k(,即,),之间的任一整数整除,则在完成最后一次循环后,,i,还要加,1,,因此,i=k+1,,,然后才终止循环。在循环之后判别,i,的值是否大于或等于,k+1,,,若是,则表明未曾被,2,k,之间任一整数整除过,因此输出“是素数”。,例,6.8,判断,m,是否素数。,#include#include void main(),int,m,,,i,,,k;,scanf,(%d,,,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);,运行结果:,17,17 is a prime number,例,6.9,求,100,200,间的全部素数。,#include#include void main(),int,m,,,k,,,
展开阅读全文