资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第六章 循环控制,循环结构是一种重要的程序结构,它与顺序结构、分支结构一起构成三大基本结构。,循环是相似重复,,重复是完成工作的重要方法,:,实例,1.,考试后老师要对考试情况进行汇总,计算出全班,N,个学生的平均分。,实例,2.,到超市购物完毕发现小票上写着共计,22,件,实例,3.,听说某某书写得非常精彩,冲到书店按分类找到书架,循环的共同点:,重复发生前通常需要做一些准备工作。,被重复的操作是“相似”的而不是“相同”的,(,3,),重复一定有终止的时候。,对重复操作进行控制,条件判断,条件判断,操 作,操 作,C,语言中提供了三种循环控制语句:,for,语句、,while,语句和,do,while,语句,前两个是“先判断后循环”的模式,后一个是“先循环后判断”的模式。,概述,C,语言可实现循环的语句:,用,goto,和,if,构成循环,while,语句,do while,语句,for,语句,goto,语句及用,goto,构成循环,goto,语句一般格式:,goto,语句标号,;,.,标号:语句,;,功能:无条件转移语句,说明:,不能用整数作标号,标号只能出现在,goto,所在函数内,且唯一,标号只能加在可执行语句前面,限制使用,goto,语句,求,1,100,的累计和。,根据已有的知识,可以用“,1+2+100”,来求解,但显然很繁琐。现在换个思路来考虑:,首先设置一个累计器,sum,,其初值为,0,,利用,sum+=n,来计算(,n,依次取,1,、,2,、,、,100,),只要解决以下,3,个问题即可:(,1,)将,n,的初值置为,1,;(,2,)每执行,1,次“,sum+=n”,后,,n,增,1,;(,3,)当,n,增到,101,时,停止计算。此时,,sum,的值就是,1,100,的累计和。根据已有的知识,单独实现每一步都不难。但是,由于需要经常使用这种重复计算结构(称为循环结构),,C,语言提供了,3,条循环语句来实现,以简化、并规范循环结构程序设计。,在语言中,可用以下语句实现循环:,(,1,)用,for,语句。,(,2,)用,do-while,语句。,(,3,)用,while,语句。,(4),用,GOTO,语句,例 用,if,和,goto,语句构成循环,求,/*ch5_1.c*/,#include,main(),int i,sum=0;,i=1;,loop:if(i=100),sum+=i;,i+;,goto loop;,printf(%d,sum);,sum=0+1,sum=1+2=3,sum=3+3=6,sum=6+4,sum=4950+100=5050,循环初值,循环终值,循环变量增值,循环条件,循环体,例 从键盘输入一组数据,以,0,结束输入,求数据和,/*ch5_11.c*/,#include,main(),int number,sum=0;,read_loop:scanf(%d,if(!number)goto print_sum;,sum+=number;,goto read_loop;,print_sum:printf(The total sum is%dn,sum);,while,语句,一般形式,:,while(,表达式,),循环体语句;,执行流程,:,expr,循环体,假,(0),真,(,非,0),while,特点:先判断表达式,后执行循环体,说明:,循环体有可能一次也不执行,循环体可为任意类型语句,下列情况,退出,while,循环,条件表达式不成立(为零),循环体内遇,break,return,goto,无限循环,:while(1),循环体,;,例 用,while,循环求,/*ch5_2.c*/,#include,main(),int i,sum=0;,i=1;,while(i=100),sum=sum+i;,i+;,printf(%d,sum);,循环初值,循环终值,循环变量增值,循环条件,循环体,例 显示,110,的平方,/*ch5_21.c*/,#include,main(),int i=1;,while(i=10),printf(%d*%d=%dn,i,i,i*i);,i+;,运行结果:,1*1=1,2*2=4,3*3=9,4*4=16,5*5=25,6*6=36,7*7=49,8*8=64,9*9=81,10*10=100,dowhile,语句,一般形式:,do,循环体语句;,while(,表达式,);,执行流程,:,do,循环体,expr,假,(0),真,(,非,0),while,特点:先执行循环体,后判断表达式,说明:,至少执行一次循环体,dowhile,可转化成,while,结构,expr,循环体,假,(0),真,(,非,0),循环体,While,循环,例 用,dowhile,循环求,/*ch5_3.c*/,#include,main(),int i,sum=0;,i=1;,do,sum+=i;,i+;,while(i=100);,printf(%d,sum);,例,while,和,dowhile,比较,/*ch5_4.c*/,#include,main(),int i,sum=0;,scanf(%d,do,sum+=i;,i+;,while(i=10);,printf(%d,sum);,main(),int i,sum=0;,scanf(%d,while(i=10),sum+=i;,i+;,printf(%d,sum);,for,语句,一般形式:,for(,expr1,;,expr2,;,expr3,),循环体语句;,执行流程,:,expr2,循环体,假,(0),真,(,非,0),for,expr1,expr3,for,语句一般应用形式,:,for(,循环变量赋初值;循环条件;循环变量增值),循环体语句;,说明:,for,语句中,expr1,expr2,expr3,类型任意,都可省略,但分号;不可省,无限循环,:for(;),for,语句可以转换成,while,结构,expr1;,while(expr2),循环体语句;,expr3;,例 用,for,循环求,#include,main(),int i,sum=0;,for(i=1;i0,),c=a%b;,a=b;/*,把刚才的除数放到,a,中*,/,b=c;/*,把刚才的余数放到,b,中*,/,printf,(,%d,a,),;,(1),循环体中,a=b,的操作和,b=c,的操作能否颠倒次序?,(2),能不能把程序中的后两个,printf,合并到一起,写在,while,循环的后面?,(,3,),从键盘输入的两个数前大后小是正常情况,如果前小后大程序还能求出正确结果吗?,(,4,),在例,6.7,中并没有对键盘输入两个整数的正确性进行判断,如果输入数据有问题,比如输入的是负数或零,程序可能出现异常结果。你能否为该程序加上判断功能?,循环的嵌套,三种循环可互相嵌套,层数不限,外层循环可包含两个以上内循环,但不能相互交叉,嵌套循环的执行流程,(1)while(),while(),.,(2)do,do,while();,.,while();,(3)while(),do,while();,.,(4)for(;),do,while();,while(),.,嵌套循环的跳转,禁止:,从外层跳入内层,跳入同层的另一循环,向上跳转,例 循环嵌套,输出九九表,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,2,4,6,8,10,12,14,16,18,3,6,9,12,15,18,21,24,27,9,18,27,36,45,54,63,72,81,.,i,j,/*ch5_5.c*/,#include,main(),int i,j;,for(i=1;i10;i+),printf(%4d,i);,printf(n-n);,for(i=1;i10;i+),for(j=1;j10;j+),printf(j=9)?%4dn:%4d,i*j);,i10,printf,假,(0),真,(,非,0),i=1,j+,j=1,j10,真,(,非,0),假,(0),i+,for(i=1;i10;i+),for(j=1;j10;j+),printf(j=9)?%4dn:%4d,i*j);,外循环,内循环,为了使循环控制更加灵活,语言提供了,break,语句和,continue,语句。,1,一般格式:,break,;,continue,;,2,功能,(,1,),break,:强行结束循环,转向执行循环语句的下一条语句。,(,2,),continue,:对于,for,循环,跳过循环体其余语句,转向循环变量增量表达式的计算;对于,while,和,do-while,循环,跳过循环体其余语句,但转向循环继续条件的判定。,3,break,和,continue,语句对循环控制的影响如图,5-4,所示。,4,说明,(,1,),break,能用于循环语句和,switch,语句中,,continue,只能用于循环语句中。,(,2,)循环嵌套时,,break,和,continue,只影响包含它们的最内层循环,与外层循环无关。,break,语句与,continue,语句,expr,break;,假,(0),真,(,非,0),while,do,break;,.,expr,假,(0),真,(,非,0),while,expr2,break;,.,假,(0),真,(,非,0),for,expr1,expr3,switch,expr,语句组,1,break;,语句组,2,break;,语句组,n,break;,语句组,break;,.,const 1,const 2,const n,default,case,例,break,举例:输出圆面积,面积大于100时停止,#define PI 3.14159,main(),int r;,float area;,for(r=1;r100),break;,printf(r=%d,area=%.2fn,r,area);,continue,语句,功能:结束本次循环,跳过,循环体中,尚未执行的语句,进行下一次是否执行循环体的判断,仅用于循环语句中,expr,continue;,假,(0),真,(,非,0),while,真,(,非,0),do,continue;,.,expr,假,(0),while,expr2,continue;,.,假,(0),真,(,非,0),for,expr1,expr3,例 求输入的十个整数中正数的个数及其平均值,/*ch5_12.c*/,#include,main(),int i,num=0,a;,float sum=0;,for(i=1;i=10;i+),scanf(%d,if(a=0)continue;,num+;,sum+=a;,printf(%d plus integers sum:%6.0fn,num,sum);,printf(Mean value:%6.2fn,sum/num);,程序举例,t=1,pi=0,n=1.0,s=1,当,|t|,1e-6,pi=pi+t,n=n+2,s=-s,t=s/n,pi=pi*4,输出,pi,分子:,1,,,-1,,,1,,,-1,分母:,1,,,3,,,5,,,7,,,.,例 求,Fibonacci,数列:1,1,2,3,5,8,的前40个数,f1=1,f2=1,for i=1 to 20,输出,f1,f2,f1=f1+f2,f2=f2+f1,1,5,34,233,1597,10946,75025,514229,3524578,24157817,1,8,55,377,2584,17711,121393,832040,5702887,39088169,2,13,89,610,4181,28657,196418,1346269,9227465,63245986,3,21
展开阅读全文