第四章循环结构程序设计循环语句在迭代、累计等运算中经常用到,循环语句的使用,能提高程序的代码效率,但要注意“死循环”的问题。实际上循环有好几种方式,如:对于以上的循环,我们将通过具体的例子来阐明。goto和if构成的循环do-while构成的循环while构成的循环for构成的循环(重点)4.1while语句和do-while语句4.1.1while语句1.一般形式:while(表达式)循环体语句;表达式循环体语句0(假)非0(真)2.执行流程:先判断表达式的值,非0(真)再执行循环体语句——实现“当型”循环。3.特点:先判断表达式,后执行循环体。4.说明:⑴循环体有可能一次也不执行⑵循环体可为任意类型语句⑶循环如果包含一个以上的语句,要用{}括起来,以复合语句形式出现。否则while语句的范围只到while后面第一个分号处。⑷下列情况,退出while循环条件表达式不成立(为零)循环体内遇break,return⑸无限循环:while(1)循环体;#includestdio.hmain(){inti,sum=0;i=1;while(i=100){sum=sum+i;i++;}printf(%d,sum);}循环初值循环终值循环变量增值循环条件循环体例1:用while循环求#includestdio.hmain(){inti=1;while(i=10){printf(%d*%d=%d\n,i,i,i*i);i++;}}运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=100例2:显示1~10的平方4.1.2do-while语句1.一般形式:do循环体语句;while(表达式);2.执行流程:先执行循环体语句,后判断表达式——实现“直到型”循环。do循环体表达式假(0)真(非0)while3.特点:先执行循环体,后判断表达式。4.说明:⑴do~while至少执行一次循环体,而while语句可以一次都不执行。⑵do~while可转化成while结构表达式循环体假(0)真(非0)循环体While循环#includestdio.hmain(){inti,sum=0;i=1;do{sum+=i;i++;}while(i=100);printf(%d,sum);}例3:用do-while循环求main(){inti,sum=0;scanf(“%d”,&i);do{sum=sum+i;i++;}While(i=10);printf(“sum=%d”,sum);}main(){inti,sum=0;scanf(“%d”,&i);While(i=10){sum=sum+i;i++;}printf(“sum=%d”,sum);}运行结果:1(回车)sum=5511(回车)sum=0运行结果:1(回车)sum=5511(回车)sum=11例4:while和do-while循环的比较1.一般形式:for(表达式1;表达式2;表达式3)内嵌语句循环前先求解每次执行完循环体后求解非0时执行循环体for(循环初值表达式;循环结束表达式;循环变化表达式){循环体语句;}通常:for语句可用如下易理解的形式来描述4.2for语句4.2.1for语句for语句的流程图求解表达式1表达式2(内嵌)语句求解表达式3for的下一个语句FT演示:用for语句编写1+2+3……+1002.执行流程:3.说明:⑴for语句中表达式1,表达式2,表达式3类型任意,都可省略,但分号;不可省。变成无限循环:for(;;)⑵表达式1可以省略,如for(;i=10;i++)s=s+i;⑶表达式2一般不能省略,否则无法使循环停止,无停止条件⑷表达式1和3均省略,只有表达式2,如:for(;i=100;)二者等同while(i=100){s=s+i;i++;}{s=s+i;i++;}⑸表达式2一般是关系表达式(i=100)或逻辑表达式(ab&&xy)或数值表达式或字符表达式#includestdio.hmain(){inti,sum=0;for(i=1;i=100;i++)sum+=i;printf(%d,sum);}例5:用for循环求4.嵌套循环的跳转禁止:从外层跳入内层跳入同层的另一循环向上跳转1.三种循环可互相嵌套,层数不限2.外层循环可包含两个以上内循环,但不能相互交叉3.嵌套循环的执行流程(1)while(){……while(){……}…...}(3)while(){……do{……}while();…….}(2)do{……do{……}while();…...}while();(4)for(;;){……do{……}while();……while(){……}…...}内循环外循环内循环4.2.2循环的嵌套请同学写出该程序的运行结果#includestdio.hmain(){inti=1,j,k;while(i=0){printf(”thevalueofiis%d\n,i);for(j=1;j=i;j++){k=i+j;printf(”k=%d\n,k);}i++;}}结果:为死循环4.2.3break和continue语句1.break语句⑴形式:break;⑵功能:在循环语句和switch语句中,终止并跳出循环体或开关体。⑶说明:break只能终止并跳出最近一层的结构;break不能用于除循环语句和switch语句之外的任何其它语句之中。表达式……break;……假(0)真(非0)whiledo……break;…...表达式假(0)真(非0)while表达式2……break;...假(0)真(非0)for表达式1表达式3switch表达式语句组1break;语句组2break;语句组nbreak;语句组break;...const1const2constndefaultcase例6:break举例:输出圆面积,面积大于100时停止#definePI3.14159main(){intr;floatarea;for(r=1;r=10;r++){area=PI*r*r;if(area100)break;printf(r=%d,area=%.2f\n,r,area);}}例7:break举例:小写字母转换成大写字母,直至输入非字母字符#includestdio.hmain(){charc;while(1){c=getchar();if(c='a'&&c='z')putchar(c-'a'+'A');elsebreak;}}2.continue语句⑴形式:continue;⑵功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断。仅用于循环语句中。⑶说明:break与continue的区别break使程序从循环体和switch语句内跳出,继续执行逻辑上的下一条语句。不能用在别处。而continue语句结束本次循环,接着进行是否执行下一次循环的判断。表达式2……continue;…...假(0)真(非0)for表达式1表达式3真(非0)do……continue;…...表达式假(0)whilemain()/*y=a*x^2+b*x+c*/{inta,b,c,x,y;a=5;b=10;c=15;for(x=1;x=10;x++){y=a*x*x+b*x+c;if(y250&&y350)break;printf(break---x=%d,y=%d\n,x,y);}for(x=1;x=10;x++){y=a*x*x+b*x+c;if(y250&&y350)continue;printf(continue--x=%d,y=%d\n,x,y);}}continue结束本次循环,即满足条件时,就跳过下面的语句,进入下一个循环;break结束的是整个循环例8:求值y=ax2+bx+c例9:输入两个整数n1,n2,求其最大公约数和最小公倍数。分析:用辗转相除法。用较大数除较小数,若除尽,则除数就是这两个数的最大公约数,若除不尽,把除数当成被除数,余数当成除数,再进行相除,如此反复,直到余数为0,此时的除数就是原来两个数的最大公约数。4.3循环结构程序设计main(){intn1,n2,temp,a,b;scanf(“%d,%d”,&n1,&n2);if(n1n2){temp=n1;n1=n2;n2=temp;}a=n1;b=n2;while(b!=0){temp=a%b;a=b;b=temp;}printf(“Thebigis:%d”,a);/*最大公约数*/printf(“Thesmallis:%d”,n1*n2/a);/*最小公倍数*/}例10:编程求Fibonacci数列前40个数)3()2(12)1(1121nFFFnFnFnnn#includestdio.hmain(){longintf1,f2;inti;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;}}f1=1,f2=1fori=1to20输出f1,f2f1=f1+f2f2=f2+f1运行结果如下:(20个)运行结果如下:(40个)综合举例目的:结合前面所学内容,掌握用顺序结构、选择结构、循环结构编写程序,解决实际问题。难点:循环的嵌套。