1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,谭浩强 C程序设计 第四章,4,.1,概述,程序中凡涉及求阶乘、累加、排序等问题都要用循环解决,因为程序中的某一程序段要重复执行若干次。,C,语言实现循环的语句:,goto,和,if,组合,while,语句,do while,语句,for,语句,C语言程序设计,第四章 循环控制,重点,4,.2,goto,语句以及用,goto,语句构成循环,作用:无条件地转移到语句标号指向的语句去执行。,一般格式:,C语言程序设计,第四章 循环控制,goto,语句标号,;,.,标号,:,语句,;,说明:,语句标号由字母、数字
2、和下划线组成,定名规则同变量名,不能用数字开头。,goto,loop;,(,),goto,100;,(,),与循环语句配合使用时,,可从循环体内跳到循环体外,而不能从循环体外跳到循环体内,。,goto,语句转移的方向可前可后。,与,if,语句配合使用时可构成循环。,goto,语句违背结构化程序设计的原则,因此应限制使用。,C语言程序设计,第四章 循环控制,例4,.1,用,if 和goto语句构成循环,求,#include,void main(),int i,sum=0;,i=1;,loop:if(i=100),sum+=i;,i+;,goto loop;,printf(%d,sum);,sum
3、0+1,sum=1+2=3,sum=3+3=6,sum=6+4,sum=4950+100=5050,循环初值,循环终值,循环变量增值,循环条件,循环体,C语言程序设计,第四章 循环控制,例 从键盘输入一组数据,以,0结束输入,求数据和。,#include,void 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);,4,.3,while,语句,while,语句
4、实现,“当型”,循环结构。,一般形式:,C语言程序设计,第四章 循环控制,while(表达式),循环体语句;,没有,“,;,”,功能:,先判断表达式,若为真则执行循环体,再判断表达式,重复上述过程,直到表达式为假时退出循环。,求,sum=sum+i,i=i+1,i=1;sum=0,i100,假,真,i=1;sum=0,当,i100,sum=sum+i,i=i+1,C语言程序设计,第四章 循环控制,#include,void main(),int i,sum=0;,i=1;,while(i=100),sum=sum+i;,i+;,printf(%d,sum);,循环条件,循环体,例4,.2,用,
5、while语句构成循环,求,循环初值,循环终值,循环变量增值,关于,while,循环语句:,while,循环,先判断表达式,后执行循环体。循环体有可能一次也不执行。,循环体若包含一个以上语句,应该用,括起来。,循环体应包含有使循环趋向结束的语句;,下列情况,退出,while,循环,条件表达式不成立(为零),循环体内遇,break,goto,无限循环,while(1),循环体,;,C语言程序设计,第四章 循环控制,C语言程序设计,第四章 循环控制,例 用,while语句显示110的平方,#include,void main(),int i=1;,while(i=10),printf(%d*%d=
6、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,4,.4,do-while,语句,do-while,语句实现,“当型”,循环结构。,一般形式:,C语言程序设计,第四章 循环控制,功能:先执行循环体,然后判断表达式。若为真,则再次执行循环体,否则退出循环。,求,do,循环体语句;,while(表达式);,有,“,;,”,i=1,sum=0,sum=sum+i,i=i+1,i100,真,假,i=1,sum=0,sum=sum+i,i=i+1,直到,i100,C语言程序设计
7、第四章 循环控制,例4,.3,用,do-while语句构成循环,求,#include,void main(),int i,sum=0;,scanf(,%d,&i),;,do,sum+=i;,i+;,while(i=100);,printf(%d,sum);,循环条件,循环体,#include,void main(),int i,sum=0;,scanf(,%d,&i),;,while(i=100),sum+=i;,i+;,printf(%d,sum);,比较,do-while,循环,循环体至少执行一次;,while,和,do-while,可以解决同一问题,两者可以互换。,while,后的表达
8、式一开始就为假时,两种循环结果不同。,输入:,1,输出:,5050 5050,输入:,101,输出:,101 0,4,.5,for,语句,for,语句是,C,语言中,最为灵活,,,使用最广泛,的循环语句,可完全替代,while,,,do-while,语句。,一般形式,C语言,程序设计,第四章 循环控制,for(表达式1;表达式2;表达式3),循环体语句;,常用形式,for(循环变量赋初值;循环条件;循环变量增值),循环体语句;,C语言程序设计,第四章 循环控制,#include,void main(),int i,sum=0;,for(,i=1,;,i=100,;,i+,),sum+=i;,p
9、rintf(%d,sum);,i,100,sum=sum+i,N,Y,i=1,i+,for循环下面的语句,循环步长,例 用,for语句构成循环,求,几点说明:,for,语句中表达式,1,、,2,、,3,类型任意,都可省略,但分号“,;,”不能省。,无限循环:,for(;),不断执行循环体,循环不终止。,For,语句可以转换成,while,结构,C语言程序设计,第四章 循环控制,表达式,1;,while(表达式2),循环体语句;,表达式3;,几种形式:,C语言程序设计,第四章 循环控制,省略表达式,1,:应在,for,之前为变量赋初值。,/*正常形式*/,main(),int i,sum=0;,
10、for(i=1;i=100;i+),sum=sum+i;,printf(%d,sum);,/*省略表达式1*/,main(),int i,sum=0;,i=1;,for(;i=100;i+),sum=sum+i,printf(%d,sum);,省略表达式,2,:循环条件始终为“真”,循环不终止。,省略表达式,3,:应另外设法使程序能够结束。,/*省略表达式3*/,main(),int i,sum=0;,for(i=1;i=100;),sum=sum+i,i+;,printf(%d,sum);,省略表达式,1,、,3,:完全等同于,while,语句。,/*省略表达式1、3*/,main(),in
11、t i,sum=0;,i=1;,for(;i=100;),sum=sum+i,i+;,printf(%d,sum);,三个表达式都省略:,无初值,不判断条件,循环变量,不增值,死循环。,C语言程序设计,第四章 循环控制,表达式,1,、,3,可以是与循环无关的表达式,也可以是逗号表达式。,for(s=0,i=1;i=100;i+)s=,s+i,;,/*表达式是逗号表达式*/,main(),int i,j,k;,for(,i=0,j=100;,i=j,;i+,j-,),k=i+j;,printf(%d+%d=%dn,i,j,k);,表达式,2,可以是关系、逻辑、算术、字符表达式,非,0,时,执行循
12、环体,为,0,时退出循环。,#include,main(),char c;,for(;,(c=getchar()!=n;,),printf(%c,c);,#include,main(),int i,c;,for(i=0;,(c=getchar()!=n,;i+=c),printf(%d,i+c);,4,.6,循环的嵌套,定义:一个循环体内又包含了另一个,完整,的循环结构,称为循环的嵌套。,三种循环可以互相嵌套,层数不限。,嵌套循环的执行流程。,C语言程序设计,第四章 循环控制,(1)while(),while(),.,(2)do,do,while();,.,while();,(3)for(;)
13、for(;),(4)while(),do,while();,.,C语言程序设计,第四章 循环控制,(5),for(;),while(),.,(7),for(;),do,while();,while(),.,(6),do,for(;),.,while();,循环可以互相嵌套,但不能相互交叉。,for,for,.,.,for,for,.,.,C语言程序设计,第四章 循环控制,例 计算,3组14累加的和,#include,void main(),int i,j,s=0;,for(i=1;i=3;i+),for(j=1;j=4;j+),s=s+j;,printf(“s=%dn,s);,结果:,s=3
14、0,1 2 3,i j s=0,1 1 1,1 3 6,2 1 11,2 2 13,2 4 20,3 1 21,3 2 23,3 3 26,3 4 30,2 3 16,1 4 10,C语言程序设计,第四章 循环控制,例 循环嵌套,输出九九乘法表,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,void main(),int i,j;,for(i=1;i10;i+),printf(%4d,i);,printf(n-n
15、);,for(i=1;i10;i+),for(j=1;j10;j+),printf(j=9)?%4dn:%4d,i*j);,条件运算符:,j9,输出i*j,再回车换行。,j9,只输出i*j。,九九乘法表逻辑框图,C语言程序设计,第四章 循环控制,i10,printf,N,Y,i=1,j+,j=1,j10,Y,N,i+,for(i=1;i10;i+),for(j=1;j10;j+),printf(j=9)?%4dn:%4d,i*j);,外循环,内循环,4,.7,几种循环的比较,C语言程序设计,第四章 循环控制,语 句,适用范围,说 明,while,只知道结束条件,而,无法确定执行,次数,的情况下
16、循环变量初始化在循环体之前,循环体中应包含使循环结束的语句,可以用,break 和continue 语句控制,do-while,至少执行一次时,ifgoto,无条件循环,该循环,不能用,break 和continue 语句控制,for,已知执行次数,或,者已知初值,终,值,步长时。,使用比较灵活,4,.8,break,语句和,continue,语句,Break,语句,功能:,在循环语句和,switch,语句中,终止并跳出循环体或开关体,。,说明:,break,只能终止并跳出,最近一层,的结构。,break,不能用于循环语句和,switch,语句之外的任何其它语句之中。,一般形式:,brea
17、k,;,C语言程序设计,第四章 循环控制,流程形式:,C语言程序设计,第四章 循环控制,表达式,break;,假,(0),真,(非0),while,do,break;,.,表达式,假,(0),真,(非0),while,表达式,2,break;,.,假,(0),真,(非0),for,表达式,1,表达式,3,C语言程序设计,第四章 循环控制,switch,表达式,语句组,1,break;,语句组,2,break;,语句组,n,break;,语句组,break;,.,const 1,const 2,const n,default,case,C语言程序设计,第四章 循环控制,例,break举例:输出圆
18、面积,面积大于100时停止,#include,#define PI 3.14159,void main(),int r;,float area;,for(r=1;r100),break;,printf(r=%d,area=%f,r,area);,r,10,area=3.14*r*r,N,Y,r=1,i+,for循环下面的语句,area,100,N,Y,使用,break跳出整个循环,输出:,r=1,area=3.14,r=2,area=12.57,r=3,area=28.27,r=4,area=50.27,r=5,area=78.85,/*当 r=6时,,area=113.10,故此值没有被,输
19、出,*,/,C语言程序设计,第四章 循环控制,例,break举例:小写字母转换成大写字母,直至输入非字母字符,#include,void main(),char c;,while(1),c=getchar();,if(c=a,else,if(c=A,else break;,break 使无限循环结束,Continue,语句,功能:,结束本次循环,,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断。,continue,语句,仅用于循环语句中。,C语言程序设计,第四章 循环控制,break,和,continue,语句,的区别,continue,语句只结束本次循环,,break,语句则是结
20、束整个循环。,continue,语句只用于,while,do-while,for,循环语句中,,break,语句还可以用于,switch,语句中。,流程形式:,C语言程序设计,第四章 循环控制,表达式,continue;,假,(0),真,(非0),while,真,(非0),do,continue;,.,表达式,假,(0),while,表达式,2,continue;,.,假,(0),真,(非0),for,表达式,1,表达式,3,C语言程序设计,第四章 循环控制,例4,.5 把100200之间不能被3整除的数输出,#include,void main(),int i;,for(i=100;i=20
21、0;i+),if(i%3=0),continue;,printf(“%d”,n);,使用,continue 结束本次循环,i,200,N,Y,i=100,i+,for循环下面的语句,i%3=0,Y,printf,N,运行结果:,100,101,,103,104,,106,107,,109,110,,112,113,,115,116,,118,119,,C语言程序设计,第四章 循环控制,例,求输入的十个整数中正数的个数及其平均值,#include,void main(),int i,num=0,a;,float sum=0;,for(i=0;i10;i+),scanf(%d,if(a=0)con
22、tinue;,num+;,sum+=a;,printf(%d plus integers sum:%6.0fn,num,sum);,printf(Mean value:%6.2fn,sum/num);,4,.9,程序举例,C语言程序设计,第四章 循环控制,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,.,#include,#include,void main(),int s;,float n,t,pi;,t=1;pi=0;n=1.0;s=1;,while
23、fabs(t)=1e-6),pi=pi+t;,n=n+2;,s=-s;,t=s/n;,pi=pi*4;,printf(pi=%10.6fn,pi);,运行结果:,pi=3.141594,C语言程序设计,第四章 循环控制,例4,.7,求,Fibonacci数列:1、1、2、3、5、8前40个数。,Fibonacci数列可以用一个有趣的古典数学问题来描述:有一对兔子,出生三个月后每个月都生一对兔子。小兔子长到三个月后每个月又生一对兔子。假设所有的兔子都不死,问每个月的兔子总数是多少对?,月数,小兔,中兔,老兔,总数,1,1,1,1,1,1,1,1,1,1,1,2,3,4,5,0,2,0,0,0,
24、0,2,3,5,2,C语言程序设计,第四章 循环控制,f1=1,f2=1,for i=1 to 20,输出,f1,f2,f1=f1+f2,f2=f2+f1,#include,#include,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;,1,5,34,233,1597,10946,75025,514229,3524578,24157817,1,8,55,377,2584,17711,
25、121393,832040,5702887,39088169,2,13,89,610,4181,28657,196418,1346269,9227465,63245986,3,21,144,987,6765,46368,317811,2178309,14930352,102334155,C语言程序设计,第四章 循环控制,例4,.8 判断m是否素数。,#include,#include,void main(),int m,i,k;,scanf(%d,k=sqrt(m);,for(i=2;ik)printf(%d is a prime numbern,m);,else printf(%d is n
26、ot a prime numbern,m);,读入,m,k=,i=2,当,i,k,m被i整除,真,假,用,break,结束循环,i=i+1,i,k+1,真,假,输出”是素数”,输出”不是素数”,19,19,is a prime number,C语言程序设计,第四章 循环控制,例4,.9 求100200间的全部素数。,由于不是求一个数是否素数,因此需要使用双循环嵌套。外层第一个循环,用于在100200间提取一个数,然后内层第二个循环进行判断。,#include,#include,void main(),int m,k,i,n=0;,for(m=101;m=200;m=m+2),k=sqrt(m)
27、for(i=2;i=k+1)printf(%d,m);n=n+1;,if(n%10=0)printf(n);,printf(n);,运行结果:,101 103 107 109 113 127 131 137 139 149,157 163 167 173 179 181 191 193 197,199,C语言程序设计,第四章 循环控制,例4,.10 译密码。,按一定规律将电文变成密码:,将字母,A变为E、将字母a变为e,即变成其后的第四个字母,W将变成A。字母按上述规律转换,非字母字符不变。输入一行字符,输出相应密码。,分析:,由于字符和整数之间可以通用,所以,A,-,E,对应,A,-,A
28、4,可以定义一个字符型变量c,c接受输入,并c-c+4。,特殊之处是,W,-,Z,和,w,-,z,之间时,它们需要对应为,A,-,D,和,a,-,d,怎么办?,一种是用书上的办法,再减回去,即用c-c-26来解决。,ABCDEFGHIJKLMNOPQRSTUVWXYZ,C语言程序设计,第四章 循环控制,#include,void main(),char c;,while(c=getchar()!=n),if(c=a&c=A&c Z,printf(%c,c);,printf(“n);,Hello,world!,Lipps,asvph!,本章小结:,问题求解的过程和步骤叫算法,如求,值的算法、
29、验证素数的算法。算法分析是程序设计的第一步,也是最重要的步骤。用某种编程程序语言来表达算法是程序设计的目的。,用编程语言实现结构化算法就是结构化程序设计。,结构化算法中只包含顺序、分支和循环三种控制结构。,在,C,语言中实现上述三种结构的控制语句分别是顺序语句,分支语句和循环语句。,if/if else,语句在使用时应注意,else,和最近一个没有被,else,匹配的,if,匹配。,?,运算符相当于根据不同情况对同一变量赋值的,if/else,语句的简写形式。,C语言程序设计,第四章 循环控制,switch,语句实现多路选择,应用时应注意其条件表达式值为整型或字符型,且每个分支应用,break,语句结束。,while,和,do while,语句在应用时要注意后者,至少执行一次,循环体。,for,循环应用时要注意其控制结构中各个表达式的作用及执行次序。,for(,表达式,1,;,表达式,2;,表达式,3),表达式,1,是初始执行,仅执行一次;表达式,2,接下来执行,以判断是否退出循环,如果执行了循环,接下来执行表达式,3,,对循环条件进行某中改变,然后再到表达式,2,进行判断,注意,break,和,continue,的区别,,break,是,结束本层循环,,,continue,是,结束本次循环,。,C语言程序设计,第四章 循环控制,






