4.2.1while语句4.2.2do-while语句4.2.3for语句4.2.4转移语句4.2.5循环的嵌套4.2.6循环结构程序举例4.2循环结构程序循环的概念特点:在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件-----循环(控制)条件反复执行的程序段-----循环体。C语言共提供了3种循环语句,可以组成各种不同形式的循环结构。4.2.1while语句(当型)形式:while(表达式)语句特点:先判断,后执行例求1到100的和main(){inti,sum;sum=0;i=1;while(i=100){sum=sum+i;i++;}printf(%d\n,sum);}sum=0,i=1i=100sum=sum+ii++输出累加和sum【例4.10】用while语句求阶乘n!main(){intn;floatfact=1;printf(Inputn:);scanf(%d,&n);while(n0){fact*=n;n--;}printf(n!=%.0f\n,fact);}注意:(1)表达式:关系或逻辑表达式-----可以是任何类型,值为真(非0)即可继续循环(2)循环体:一条语句------一个以上,须用{}括起来(3)循环体中应改变循环控制变量的值,使循环趋于结束,以避免出现死循环。(4)允许循环嵌套。例:main(){inti=1,j=1;while(i++6)++j;printf(“i=%d,j=%d\n”,i,j);}输出:i=7,j=64.2.2do-while语句(当型)-------可用来实现直到型循环结构形式:do语句while(表达式);特点:先执行,后判断while和do-while区别:若条件一开始就不满足,while循环体一次也不执行,do-whie循环体至少执行一次【例4.11】用do-while语句求阶乘n!main(){intn;floatfact=1;printf(Inputn:);scanf(%d,&n);dowhile(n0)fact*=n--;fact*=n--;while(n0);printf(n!=%.0f\n,fact);}注意:(1)if和while语句的表达式后面不能加分号,而do-while语句的表达式后面则必须加分号(2)循环体:一条语句------一个以上,须用{}括起来(3)用do-while实现“直到型”循环时,循环控制条件要取反(4)允许循环嵌套例求两个数的最大公约数。main(){intm,n,r;scanf(%d,%d,&m,&n);r=m%n;while(r!=0){m=n;n=r;r=m%n;}printf(%d\n,n);}do{r=m%n;m=n;n=r;}while(r!=0);printf(%d\n,m);4.2.3for语句(当型)形式:for(表达式1;表达式2;表达式3)语句;表达式1:给循环控制变量赋初值---------可以是逗号表达式表达式2:关系或逻辑表达式-----任何类型当值为真是执行循环表达式3:改变循环控制变量的值---------可以是逗号表达式语句:多条需用{}YN表达式2求解表达式1语句循环的后续语句求解表达式3【例4.12】用for语句求阶乘n!main(){intn,i;floatfact=1;printf(Inputn:);scanf(%d,&n);for(i=1;i=n;i++)fact*=i;printf(n!=%.0f\n,fact);}例:求1到100的和main(){inti,s;s=0;for(i=1;i=100;i++)s=s+i;printf(%d\n,s);}注意:(1)省表达式1:应在for之前给循变量赋初值fact=1;scanf(%d,&n);for(;n0;n--)fact*=n;(2)省表达式2:不判断条件,死循环-------应在循环体中加判断跳出语句for(i=1;;i++){fact*=i;if(i=n)break;}(3)省表达式3:应在循环体中改变循变量的值for(i=1;i=n;)fact*=i++;(4)三个表达式均可省,2个分号一个都不能少i=1;for(;;)等价于while(1){fact*=i;if(i=n)break;i++;}(5)循环体可以是空语句for(i=1,fact=1;i=n;fact*=i,i++);for(i=1,j=100,s=0;ij;s+=i+j,i++,j--);注:表达式1,表达式3可以是逗号表达式4.2.4转移语句1.break;作用:跳出本层循环(或switch),转去执行后面的程序。【例4.13】计算s=1+2+3+…+100,若s=1000,则跳出循环。main(){intn=1,s=0;for(;n=100;n++){s+=n;if(s=1000)break;}printf(s=%d\n,s);}例:main(){intk=10;charc=‘b’;doswitch(c++){case‘a’:k++;case‘b’:k--;case‘c’:k+=3;break;case‘d’:k=k%4;}while(c!=‘c’);printf(“%d\n”,k);}输出:12例:main(){inti,s=0;for(i=1;i=10;i++)switch(i%5){case1:case2:s++;break;case3:case4:s--;break;default:s++;}printf(“%d\n”,s);}输出:22.continue;作用:结束本次循环即不再执行循环体中continue之后的语句,转入下一次循环条件的判断与执行。注意:while和do-while-------是转到表达式处判断for-----是转到表达式3处进行计算,再判断表达式2是否为真【例4.14】输出100以内能被7整除的数。main(){intn;for(n=7;n=100;n++){if(n%7!=0)continue;printf(%d,n);}}3.goto语句标号;作用:使程序流程转到语句标号所标识的语句处继续执行语句标号:标识符,放在某一语句行的前面,起标识语句的作用,标号后加冒号。注:goto语句常与if配合构成循环或跳出循环【例4.19】用goto语句配合使用if语句求阶乘n!main(){intn;floatfact=1;printf(Inputn:);scanf(%d,&n);loop:if(n0){fact*=n--;gotoloop;}printf(n!=%.0f\n,fact);}例:main(){intx,y;for(x=1,y=1;x=100;x++){if(y=15)break;if(y%3==1){y+=3;continue;}y-=5;}printf(“x=%d,y=%d\n”,x,y);}输出:x=1,y=14.2.5循环的嵌套循环的嵌套:一循环的循环体内包含另一个循环结构若被嵌入的循环又嵌套其他的循环,这就是多重循环。例:for(){…while(){…}…}或while(){…for(){…}…}例:1!+2!+3!+…+10!main(){inti,j;floatf,sum=0;i=1;while(i=10){f=1;for(j=1;j=i;j++)f*=j;sum+=f;i++;}printf(“sum=%.0f\n,sum);}改:1!+3!+5!+…+19!2!+4!+6!+…+20!可用单重循环实现:main(){inti,j;floatf=1,sum=0;for(i=1;i=10;i++){f*=i;sum+=f;i++;}printf(“sum=%.0f\n,sum);}【例4.16】利用公式+…求的近似值,直到最后一项的绝对值小于10-6为止。#includemath.hmain(){intsign=1;floatn=1,t=1,pi=0;while(fabs(t)1e-6){pi+=t;n+=2;sign*=-1;t=sign/n;}pi*=4;printf(pi=%10.2f\n,pi);}4.2.6程序举例71513114【例4.17】输出100以内的素数#includemath.hmain(){intn,i,k,m;for(n=2;n=100;n++){k=sqrt(n);m=1;i=2;while(i=k&&m==1)if(n%i==0)m=0;elsei++;if(m==1)printf(\t%3d,n);}}【例4.18】求Fibonacci数列的前40项F1=F2=1Fn=Fn-1+Fn-2(n=3)main(){longf1,f2;inti;f1=f2=1;for(i=1;i=20;i++){printf(%12ld%12ld,f1,f2);if(i%2==0)printf(\n);f1=f1+f2;f2=f1+f2;}}【例4.19】求解百鸡百钱问题(穷举法)公元钱五世纪,我国古代数学家张丘建在《算经》一书中提出了“百鸡百钱”问题:鸡翁一只钱五,鸡母一值值钱三,鸡雏三只钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?#includestdio.hmain(){intx,y,z;printf(解百鸡百钱问题\n);for(x=0;x20;x++)for(y=0;y=33;y++){z=100-(x+y);if(z%3==0&&x*5+y*3+z/3==100)printf(公鸡有%d只,母鸡有%d只,小鸡有%d只\n,x,y,z);}}例:36块砖36人搬,男子一人一次搬4块,女子一人一次搬3块,小孩2人一次搬1块,问男子、女子、小孩各几人,正好一次搬完?main(){intx,y,z;for(x=0;x9;x++)for(y=1;y12;y++){z=36-(x+y);if(z%2==0&&x*4+y*3+z/2==36)printf(“man=%d,woman=%d,child=%d\n,x,y,z);}}例:百匹马驮百担货,大马驮3担,中马驮2担,2匹小马驮1担,问大马、中马、小马各几匹,正好一次驮完?main(){inti=1,j,k;while(i33){_________;while(j50){k=100-i-j;if(i*3+j*2+k/2==100&&________)printf(“big=%d,mid=%d,small=%d\n,i,j,k);___________}i++;}}