资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,#,第六章 循环控制,6.1,概述,6.2goto,语句以及用,goto,语句构成循环,6.3while,语句和,do-while,语句,6.4for,语句,6.5,循环的嵌套,6.6break,和,continue,语句,6.1,循环控制概述,循环结构,的特点:,在,给定条件,成立时,反复执行某,程序段,,直到条件不成立为止。,语言提供的循环结构类型如下,:,1,)用,goto,语句和,if,语句构成循环;,2,)用,while,语句;,3,)用,do-while,语句;,4,)用,for,语句;,循环条件,循环体,6.2 goto,语句以及用,goto,语句构成循环,6.2.1,形式:,goto,语句标号;,6.2.2,功能:,一进入执行,goto,语句、立即转向去执行其后面标号所指示的语句,goto jump;loop:,语句,1,语句,1,语句,2,语句,2,语句,n,语句,n,jump:,语句,n+1,goto loop;,用标识符表示,分号,冒号,冒号,6.2.3,注意:,结构化程序设计方法主张,限制使用,goto,语句,,一般只在下面两种结构中表示循环,一、,loop:if(,表达式,),语句,goto loop,;,表达式值为零时,立即停止循环,二、,loop:,语句,if(,!,表达式,)goto loop,;,表达式值非零时,立即停止循环,语句,当表达式值,非零,语句,直到表达式值,为零,例,:,用,goto,语句和,if,语句构成循环。,例,用,goto,语句和,if,语句构成循环。,void main(),int i,sum=0;,i=1;,loop:if(i=100),sum=sum+i;,i+;,goto loop;,printf(%dn,sum);,运行结果:,5050,i=101,形式:,while (,表达式,),语句,表达式值为零时,立即停止循环,形式:,do,语句,while (,表达式,),;,表达式值为零时,立即停止,循环,,至少,执行一次循环语句,语句,当表达式值,非零,语句,直到表达式值,为零,6.3,while,和,do while,语句,分号,while (,表达式,),do,语句,while (,表达式,),;,例,1.,写出下面程序的运行结果,(1),void,main(),int i=1;,while(i=3),printf(,”,%dn,”,i);i+;,(2),void,main(),int i=1;,while(i=10)k=0;,while(k=1),;,printf(,”,sum=%dn,”,sum);,改为,while(k=1),死循环,sum,n,0,1,1,2,3,3,6,4,10,结果,:sum=10,例,2,用,while,语句,和,do-while,语句求,传统流程图表示算法,不成立,成立,成立,不成立,N-S,图表示算法,100,100,void main(),int i,sum=0;,i=1;,运行结果:,5050,while(i=100),sum+=i;i+;,printf(%dn,sum);,void,main(),int i,sum=0;,i=1;,do sum+=i;i+;,while(i=100);,printf(%dn,sum);,注意:,i,和,sum,的初值,i,的终值,例,3,统计从键盘输入一行字符的个数。,#include,void main(),int n=0;,printf(input a string:n);,while(getchar()!=n)n+;,printf(%d,n);,只要从键盘输入的字符不是回车就继续循环,完成对输入字符个数计数。,输入,:,ascdf,输出:,5,例,4.,计算,p=123,n,void,main(),int i,n;long p;,scanf(,”,%d,”,i=1;p=1;,while(,i=n,),p*=i,;,i+,;,printf(,”,p=%ldn,”,p);,不用,long,会溢出,重复到,n,次,也可以写成,i0),void,main(),int i,n;long s,t;,scanf(,”,%d,”,i=1;t=1;s=0;,do,t*=i;s+=t;,i+;,while(,i=n,);,printf(,”,s=%ldn,”,s);,保证达到计算,n,次,t=11 2 3,S=1+1 2+1 2 3+,例,6.,计算下面二十个数的和:,13.8,、,-65,、,68.9,、,、,342.987,void,main(),int,i=1,;float x,sum=0;,while(i=20),scanf(,”,%f,”,i+;,printf(,”,sum=%fn,”,sum);,注:,执行程序时输入,13.8,65 68.9,342.987,i=40,i+=2,while,语句中的表达式一般是,关系表达,或,逻辑表达式,,也可以是其它表达式,只要表达式的值为真,(,非,0),即可继续循环。,例,7.,void main(),int a=0,n;,printf(,“,n input n:,”,);,scanf(%d,while(n-),printf(%d ,a+*2);,执行,n,次,每执行,1,次,,n,减,1,。,(a*2,;,a+),等价于,输入,:8,输出,:0 2 4 6 8 10 12 14,例,8.while,和,do-while,循环比较。,void main(),int sum=0,i;,scanf(,“,%d,”,while(i=10),sum=sum+i;,i+;printf(,“,sum=%d,”,sum);,do,sum=sum+i;,i+;,while(i=10);,输入,:,8,sum,i,0,8,8,9,17,10,27,11,输入,:,11,sum=0,sum=11,6.4,for,语句,代替,while,语句,6.4.1,形式:,for(,表达式,1;,表达式,2;,表达式,3),语句,要正确表达循环结构应,注意,三方面要求:,1,、循环控制变量的初始化。,2,、循环的条件。,3,、循环控制变量的值的更新,for,语句在书写形式上集中体现了这三方面要求,6.4.2,功能,for,语句,完全可以取代,while,语句,。,for(,表达式,1,;表达式,2,;表达式,3),语句,它的,执行过程,如下:,1,)先求解表达式,1,。,2,)求解表达式,2,,若其值为真(非,0,),则执行,for,语句中指定的内嵌语句,然后执行第,3,)步;若其值为假(,0,),则结束循环,转到第,5,)步。,3,)求解表达式,3,。,4,)转回第,2,)步继续执行。,5,)循环结束,执行,for,语句下面的一个语句。,(,用,for,语句改写前面的,例,2,、例,4,、例,5,、例,7),计算表达式,3,语句,当表达式,2,值非零,计算表达式,1,例,2,、求,void main(),int i,sum=0;,i=1;,do sum+=i;i+;,while(i=100);,printf(%dn,sum);,void main(),int i,sum=0;,for,(,i=1;i,=100;i+,),sum+=i;,printf(%dn,sum);,例,4,.,计算,p=123,n,void,main(),int i,n;long p;,scanf(,”,%d,”,i=1;p=1;,while(,i=n,),p*=i,;,i+,;,printf(,”,p=%ldn,”,p);,for(i=1,p=1;i=n;i+),P*=i;,中间用逗号,for(i=1,p=1;i0),void,main(),int i,n;long s,t;,scanf(,”,%d,”,i=1;t=1;s=0;,do,t*=i;s+=t;,i+;,while(,i=n,);,printf(,”,s=%ldn,”,s);,for(i=1,t=1,s=0;i=n;i+),t*=i;s+=t;,例,7,.,计算下面二十个数的和:,13.8,、,-65,、,68.9,、,、,342.987,void,main(),int,i=1,;float x,sum=0;,while(i=20),scanf(,”,%f,”,i+;,printf(,”,sum=%fn,”,sum);,for,(,i=1,;,i8,;,y=+i),printf(,”,%3d%3d,”,,,x-,y),;,A,10 1 9 2,B,9 8 7 6,C,10 10 9 1,D,10 9 9 0,表达式,1,只做一次,x,y,10,10,9,1,8,C,2,注意,:,1,),for,循环中的,“,表达式,1,”,、,“,表达式,2(,循环条件,),”,和,“,表达式,3,”,可以缺省,但,“,;,”,不能缺省。,2,)省略了,“,表达式,1,”,表示不对循环控制变量赋初值,可在,for,循环,里面或外面对其,赋初值,。,例如,:,i=1;,for,(,;i=20;i+,),scanf(,”,%f,”,3,)省略,“,表达式,2,”,则不做其它处理时成为死循环。,例如:,for(i=1;i+)sum=sum+i;,相当于:,i=1;,while(1),sum=sum+i;,i+;,4,)省略了,“,表达式,3(,循环变量增量,),”,则不对循环控制变量进行操作,这时,可在语句体中加入修改循环控制变量的语句,。,例如:,for(i=1;i=100;),sum=sum+i;,i+;,5,)省略了,“,表达式,1,”,和,“,表达式,3,”,。,例如:,for(;i=100;),sum=sum+i;,i+;,相当于:,while(i=100),sum=sum+i;,i+;,6,),3,个表达式都可以省略。,例如:,for(,;,),语句,相当于:,while(1),语句,7,)表达式,1,可以是设置循环变量的初值的赋值表达式,也可以是其他表达式。,例如:,for(sum=0;i=100;i+)sum=sum+i;,8,)表达式,1,和表达式,3,可以是一个简单表达式也可以是逗号表达式。,for(sum=0,i=1;i=100;i+)sum=sum+i;,或:,for(i=0,j=100;iy+z),for(k=1;k2;k+),if,(a5)w=1;,else,if,(a=5),switch,结构,else,for(s=0,n=0;n3;n+)s+=n;,6.6,break,语句和,continue,语句,switch,结构中的,break,:提前结束,该结构,循环结构中的,break,:提前结束,该结构,(while,循环、,do-while,循环、,for,循环,),循环结构中的,continue,:提前结束,本次循环,若在多层嵌套中使用,break,或,continue,它只影响包含它的最内层结构,例,1.,写出以下程序的运行结果:,void,main(),int n;,for(n=1;n=10;n+),if(n%3=0),break,;printf(,“,%4d,”,n);,printf(,“,!n,”,);,void,main(),int n;,for(n=1;n=10;n+),if(n%3=0),cotinue,;printf(,“,%4d,”,n);,printf(,“,!n,”,);,结果:,1 2!,结果:,1 2 4 5 7 8 10!,例,2.,把,100200,之间的不能被,3,整除的数输出。,#include,void,main(),int,n;,for(n=100;n=200;n+),if(n%3=0),continue;,printf(,”,%d,”,n);,printf(,”,n,”,);,能被,3,整除,则进行下一次循环,例,3.,计算下面若干个数的和:,13.8,、,-65,、,68.9,、,、,342.987,,并统计个数(个数,100,),#include,void,main(),int,i=1,;float x,sum=0;,while(i=100),scanf(,”,%f,”,if(fabs(x-1e36)0.0001)break;,sum+=x;,i+;,printf(,”,sum=%f,count=%dn,”,sum,);,注:执行程序时输入,13.8,65 68.9,342.987,1e36,求绝对值,理论上相等,实际上有误差,位置,不能,错,i-1,例,4.,void,main(),int k,,,j,,,x=0,;,for(k=1,;,k=4,;,k+),x+,;,if(k%3=0)break,;,for(j=k,;,j=5,;,j+)x+,;,x+,;,printf(,”,%dn,”,,,x),;,结果,?,14,k,j,x,1,1,1,2,2,3,3,4,4,5,5,6,7,2,8,2,9,3,10,4,11,5,12,13,3,14,程序举例,例,1:,输出,10,1000,中所有十位数为,3,的数,void,main(),int i;,for(i=10;i=1000;i+),if(,i/10%10,=3)printf(,“,%5d,”,i);,如,:i=1234,i/10=123,整数,123%10=3,if(,i/10%10,3)continue,;,printf(,“,%5d,”,i);,例,2:,void,main(),int k;,for(k=2;k=10;k+=3),printf(,”,%4d,”,k);,printf(,”,%4d,”,k);,运行结果,:,2 5 8,11,例,3:,void,main(),int k,j=99;,for(k=1;k=2;k+),printf(,”,(1)%d,5dn,”,k,j,);,for(j=5;j=7;j+),printf(,”,(2)%d,5dn,”,k,j);,printf(,”,(3)%d,5dn,”,k,j);,printf(,”,(4)%d,5dn,”,k,j);,第一遍,k,j,(1),1,99,(2),1,5,(2),1,6,(2),1,7,(3),1,8,第二遍,k,j,(1),2,8,(2),2,5,(2),2,6,(2),2,7,(3),2,8,(4),3,8,例,4,:,void main(),int i,j,k;,printf(i j kn);,for(i=0;i2;i+),for(j=0;j2;j+),for(k=0;k2;k+),printf(,“,%d%d%dn,i,j,k);,i,j,k,0,0,0,0,0,1,0,1,0,0,1,1,1,0,0,1,0,1,1,1,0,1,1,1,1,2,1,2,1,2,例,5,:输出,100,200,中所有素数,m,是素数,:,m,不被,2,、,3,、,4,、,、,m-1,中任一个整除,结果:,101 103 107 109 113 127 131 137 139 149,151 157 163 173 173 179 181 191 193 197,199,执行,m=11,;,m=,15,;,k=m-1;k=m-1;,for(i=2;i=k;i+)for(i=2;ik ik,结束,for,循环,k,i,m%i,3,2,1,3,0,m%i=0,break,void main(),int m,i,k;,for(m=100;m=200;m+),k=m-1;,for(i=2;i=k;i+),if(m%i=0)break;,if(i=k),printf(,“,%d is not a prime numbern,”,m);,else,printf(,“,%d is a prime numbern,”,m);,只要有一个整除,后面无需判断,强迫循环结束,此时,ik,说明都不能整除,改为输入一个数,判断是否为素数,.,m-1,#include,void main(),int m,i,k;,scanf(,“,%d,”,k=m-1;,for(i=2;i=k),printf(,“,%d is a prime numbern,”,m);,else,printf(,“,%d is not a prime numbern,”,m);,输入,:3,输入,:6,例,6,:,输出所有由,1,、,2,、,3,组成的三位数,111 211 311,112 212 312,113 213 313,121 221 321,122 222 322,123 223 323,131 231 331,132 231 332,133 233 333,void,main(),int i,j,k;,for(i=1;i=3;i+),for(j=1;j=3;j+),for(k=1;k=3;k+),printf(,“,%d%d%d,”,i,j,k);,%d%d%d,没有空格和逗号,起分隔符作用,i,j,k,1,1,1,1,1,2,1,1,3,1,2,1,1,2,2,1,2,3,1,3,1,1,3,2,1,3,3,2,1,1,1,2,上面改为不出现重复数字的三位数,void,main(),int i,j,k;,for(i=1;i=3;i+),for(j=1;j=3;j+),for(k=1;k=3;k+),if(i!=j&j!=k&k!=i),print(,“,%d%d%d,”,i,j,k);,上面改为不出现重复字母 的由,X,、,Y,、,Z,组成的三个子符的字符串,void,main(),int i,j,k;,for(i=,X,;i=,Z,;i+),for(j=,X,;j=,Z,;j+),for(k=,X,;k=,Z,;k+),if(i!=j&j!=k&k!=i),print(,“,%c%c%c,”,i,j,k);,与,int,一样,例,7:,P121 6.15,void,main(),甲队 乙队,int i,j,k;,X A,for(i=,X,;i=,Z,;i+),Y B,for(j=,X,;j=,Z,;j+),Z C,for(k=,X,;k1e-6),pi=pi+t;,n=n+2;,s=-s;,t=s/n;,pi=pi*4;printf(pi=%10.6fn,pi);,例,9“,斐波那契数列”是意大利中世纪数学家列昂纳多,斐波那契以兔子繁殖为例子而引入的:兔子在出生两个月后,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?经过分析:,经过月数:,-0-1-2-3-4-5-6-7-,兔子对数:,-1-1-2-3-5-8-13-21-,数字,1,,,1,,,2,,,3,,,5,,,8,,,13,,,构成了一个数列。,数字,1,,,1,,,2,,,3,,,5,,,8,,,13,,,有明显的特点:,前面相邻两项之和,构成了后一项。,我们可以得到递推公式如下:,程序运行结果为:,1 1 2 3,5 8 13 21,34 55 89 144,233 377 610 987,1597 2584 4181 6765,void main(),int i,x1=1,x2=1;,for(i=1;i=10;i+),/*,每次生成并输出两项,所以循环,10,次*,/,printf(,”,%10d%10d,”,x1,x2);,if(i%2=0)printf(,”,n,”,);,/*,当,i,为偶数时换行,即每四个数换行*,/,x1=x1+x2;,x2=x2+x1;,
展开阅读全文