第六章循环控制6.1概述6.2goto语句以及用goto语句构成循环6.3while语句6.4do-while语句6.5for语句6.6循环的嵌套6.1概述C语言描述循环结构的方法:1)goto语句与if语句配合(可构成当型、直到型)2)while语句(当型循环)3)do–while语句(直到型循环)4)for语句(当型循环)6.3while语句一般形式:while(表达式)语句其中:表达式表示循环条件;可是任何表达式。内嵌语句为循环体;是一条语句。执行流程:首先求解表达式并进行逻辑判断,为真执行内嵌语句;再次求解表达式并判断,为真再次执行内嵌语句;当表达式值为假时,退出while循环。例:求#includestdio.hintmain(){inti=1,sum=0;while(i=100){sum=sum+i;i=i+1;}printf(%d\n,sum);return0;}1001nnsum+=i;i++;易错点:累加变量在循环体外初值使用说明:1)循环变量应该在循环体外初值;2)在while的循环体中一定要有改变循环变量的值以使循环条件为假的语句,否则将形成死循环;1)循环变量、累加变量、累乘变量都要在循环体外初值;2)在循环体中要有改变循环变量的值的语句。例:累加求:1+22+32+……+102的值#includestdio.hintmain(){inti=1,sum=0;while(i11)printf(%d,sum);return0;}{sum=sum+i*i;i++;}求:4i1000的i的最大值#includestdio.hintmain(){inti=0,p=1;while(p1000){i++;p=p*4;}printf(%d,i-1);return0;}6.4do-while语句一般形式:do语句while(表达式);其中:表达式表示了循环条件,可以是任何表达式。内嵌语句为循环体;单条、复合。执行流程:首先执行内嵌语句,之后求解表达式并对其值进逻辑判断,为真再次执行内嵌语句,如此反复,直到表达式的值为假退出do-while循环。例:求5!#includestdio.hintmain(){inti,p;i=1,p=1;do{p=p*i;i++;}while(i=5);printf(%d\n,p);return0;}6.9程序举例例:用公式求的近似值,直到某项的绝对值小于10-6为止。算法设计:这是一个累加问题。设:累加变量为pi;级数中的项用变量t来表示;...71513114t=1,pi=0|t|=1e-6pi=pi+t计算下一项tpi=pi*4输出pi#includemath.hintmain(){ints;floatn,t,pi;n=1.0;s=1;t=1.;pi=0;/*判断某项*/{pi=pi+t;/*累加*/n=n+2.0;/*求下一项*/s=-s;t=s/n;}printf(PI=%10.6f\n,pi*4);return0;}直到某项的绝对值小于10-6为止。while(fabs(t)=1e-6)6.5for语句一般形式:for(表达式1;表达式2;表达式3)语句其中:内嵌语句为循环体;可以是单条、复合;表达式1~3可是任何形式的表达式;循环类型:当型例:求任意10个三角形的面积.intmain(){floata,b,c,s,area;printf(Entera,b,c:);scanf(%f,%f,%f,&a,&b,&c);if(a+bc&&a+cb&&b+ca){s=(a+b+c)/2.0;area=sqrt(s*(s-a)*(s-b)*(s-c));printf(area=%-8.3f\n,area);}elseprintf(DATAERROR!\n);return0;}intmain(){floata,b,c,s,area;inti;for(i=1;i=10;i++){printf(Entera,b,c:);scanf(%f,%f,%f,&a,&b,&c);if(a+bc&&a+cb&&b+ca){s=(a+b+c)/2.0;area=sqrt(s*(s-a)*(s-b)*(s-c));printf(area=%-8.3f\n,area);}elseprintf(DATAERROR!\n);}return0;}6.8break语句和continue语句(循环的附加控制)1.break语句一般形式:break;常用形式:if(表达式)break;功能:以if(表达式)break;的形式放在while、do-while、for语句的循环体中,用于跳出(结束)循环语句.以break;的形式放在switch语句中,用于跳出(结束)switch构成的多路分支结构。例:判断m是否素数素数:除1和它本身之外再无别的约数;m算法:判断m%i==0成立否?i取值:2~(m-1)或:2~#includemath.hintmain(){intm,i,k;printf(Enterm:);scanf(%d,&m);k=sqrt(m);for(i=2;i=k;i++)if(m%i==0)break;if(i==k+1)printf(%disaprimenumber.\n,m);elseprintf(%disnotprimenumber.\n,m);return0;}2.continue语句一般形式:continue;常用形式:if(e)continue;功能:用于while、do-while、for的循环体中,跳过本次循环体后面尚未执行的语句,继续循环流程的下一步。例:例:for中用continuewhile中用continuefor(e1;e2;e3)while(e1){┇{┇if(e)continue;if(e)continue;┇┇}}do-while中用continuedo{┇if(e)continue;┇}while(e1)读下列程序:#includestdio.hIntmain(){intn;printf(\n);for(n=100;n=200;n++)例:把100_200之间不能被3整除的数输出.改写{if(n%3==0)continue;printf(%5d,n);}return0;}枚举(穷举)算法:采用枚举算法求解问题的基本思路为:(1)确定枚举对象,枚举范围和判定条件;(2)一一枚举该范围的对象,验证是否为问题的解。枚举算法的实现:用循环语句从可能的集合中一一枚举各个元素;在循环体中用选择语句判定哪些是所求的解。其基本格式如下:For(循环变量x取所有可能的值){if(满足指定的条件)处理语句}6.6循环的嵌套一个循环体内又包含一个完整的循环语句,称为循环的嵌套。C四种形式的循环可以互相嵌套,但绝不能出现交叉现象。正确的循环嵌套形式:外循环体┇内循环┇外循环体内循环1内循环2三重循环分辨循环语句之间的关系for(...){...for(...){...}...}内循环外循环for(....){...}for(...){...}并列循环嵌套循环交叉循环for(....){...for(...){...}}错误例:do-while嵌套例:do-while、for混合嵌套do{┇do{┇do{┇}for(e1;e2;e3)while(e1);{┇}┇┇}}while(e);while(e);1#includestdio.h2intmain()3{4inti,m;5scanf(%d,&m);7for(i=2;i=m-1;i++)8if(m%i==0)break;9if(i==m)printf(Yes\n);10elseprintf(No\n);11return0;12}判断一个整数为素数例:求100~200之间的全部素数。算法:枚举100~200之间的素数。#includestdio.hintmain(){inti,m;for(m=101;m200;m=m+2)for(i=2;i=m-1;i++)if(m%i==0)break;if(i==m)printf(Yes\n);elseprintf(No\n);return0;}例:某学院一年级共10个小班,求每一个班英语课的平均成绩。#includestdio.hIntmain(){floatsum,mark,aver;inti,num,j;for(j=1;j=10;j++){sum=0;printf(inputclass%dnum,j);scanf(%d,&num);/*输入人数*/for(i=1;i=num;i++)/*循环次数明确*/{scanf(%f,&mark);sum=sum+mark;}aver=sum/num;printf(class%davermarkis%.2f\n,j,aver);}return0;}【例3.14】百钱买百鸡问题:有人有一百块钱,打算买一百只鸡。公鸡一只5元,母鸡一只3元,小鸡3只1元,求应各买多少?枚举对象及范围:三种鸡的个数(设为x、y、z)。判定条件:三种鸡的总数(x+y+z)==100和买鸡用的钱的总数(5x+3y+z/3)=100。1#includestdio.h2intmain()3{4intx,y,z;5for(x=0;x=20;x++)6for(y=0;y=33;y++)7for(z=0;z=100;z++)8if(z%3==0&&x+y+z==100&&5*x+3*y+z/3==100)9printf(公鸡=%d,母鸡=%d,小鸡=%d\n,x,y,z);10return0;11}例3.145for(x=0;x=20;x++)6for(y=0;y=33;y++){7z=100-x-y;8if(z%3==0&&5*x+3*y+z/3==100)9printf(公鸡=%d,母鸡=%d,小鸡=%d\n,x,y,z);10}由于三种鸡的和是固定的,因此只要枚举二种鸡(x、y),第三种鸡就可以根据约束条件求得(z=100-x-y),这样就缩小了枚举范围变成双重循环。之所以选择z,是因为z的数量大,优化效果更好。此时循环体执行21x34=714次。ch0615#includestdio.hIntmain(){chari,j,k;for(i='x';i='z';i++)for(j='x';j='z';j++)for(k='x';k='z';k++)if(i!=j&&i!=k&&j!=k)if(i!='x'&&k!='x'&&k!='z')printf(A--%c\tB--%c\tC--%c\n,i,j,k);}T0611.CPP编写程序计算500~800区间内素数的个数cnt,并按所求素数的值从大到小的顺序,再计算其间隔减、加之和,即第1个素数-第2个素数+第3个素数-第4个素数+第5个素数……的值sum。#includestdio.h#includemath.hintmain(){intm,k,i,cnt=0,s=0,q=1;for(m=799;m=500;m=m-2)printf(cnt=%d,s=%d\n,cnt,s);return0;}{k=sqrt(m);for(i=2;i=k;i++)if(m%i==0)break;if(i==k+1){s=s+q*m;q=-q;cnt=cnt+1;}}迭代法是一种不断用变量的旧值递推新值的求解方法。采用迭代算法求解问题的基本思路为:(1)确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。(2)建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。(3)实现迭代算法。4.迭代算法【例3.15】求斐波那契(Fibonacci)数列前40个数。斐波那契数列公式为:(1)1(1