第4章信息学院计算机基础组循环结构程序设计while语句do—while语句for语句循环嵌套break和continue语句本章主要内容:4.1引例例4-1一行打印60个*程序代码如下:#includestdio.hvoidmain(){inti;i=1;while(i=60)/*重复输出*60次——循环*/{printf(“*”);i=i+1;}printf(“\n”);}4.2while语句表达式?循环体语句真假while(表达式){循环体语句;}任意类型while(表达式)循环体语句;当表达式的初值为假时,循环体语句不执行说明:(1)可以是一个单语句,也可是一个复合语句(2)循环体中应有使循环趋于结束的语句例4-2:求的值#includestdio.hvoidmain(){inti=1,sum=0;/*设循环初值*/while(i=100)/*循环条件判断*/{sum=sum+i;/*循环主体:累加求和*/i++;/*修改循环控制变量*/}printf(“sum=%d\n”,sum);/*输出结果*/}1001100321ii4.2while语句while语句的作用范围:循环体如果包含一个以上的语句,应该用花括号括起来作为复合语句,否则while循环体的作用范围只到while后面的第一个分号处。例如:while(a1);{a++;}复合语句{a++;}不是循环体,while(a1);后的分号所代表的空语句才是这里的循环体内嵌语句。条件循环结构三要素:1、循环初值:要正确;2、循环条件:要正确;3、循环体内部必须有一条改变循环条件变量的语句。(该语句使循环条件趋于结束,避免死循环。)4.2while语句例4-3求300~800之间7的倍数和采用穷举法求解程序代码如下:#includestdio.hvoidmain(){inti=300,sum=0;/*设循环控制变量初值为300*/while(i=800)/*循环条件;小于800*/{if(i%7==0)/*寻找7的倍数,进行筛选*/sum=sum+i;/*循环主体:累加求和*/i=i+1;/*修改循环变量*/}printf(“sum=%d\n”,sum);/*输出结果*/}4.2while语句例4-4依次输入一批正数,并求所有输入的正数之和,当输入负数或0时结束。分析:此题是循环次数不固定的实例。读入一数x,判断其值0?0累加之;(非负数)≤0结束循环,打印结果。设:读入值为x,和值为sum,其初值为0。程序代码如下:voidmain(){floatx,sum;sum=0.0;scanf(“%f”,&x);/*循环初值*/while(x0.0)/*循环条件*/{sum=sum+x;/*循环主体:累加求和*/scanf(“%f”,&x);/*再次读入一个新的x值*/}printf(“sum=%f\n”,sum);*输出结果*/}4.3do-while语句循环体语句表达式假真do{循环体语句;}while(表达式);程序形式程序流程do{循环体语句}while(表达式);注:条件表达式在循环语句组执行完后计算,因此循环语句组至少会执行一次说明:(1)do-while先执行循环体,后判断循环条件(2)do-while作为一个整体,while后必须加;上节例4-2:求1+2+3+....+100的值#includestdio.hvoidmain(){inti,sum=0;i=1;do{sum=sum+i;i++;}while(i=100);printf(”sum=%d\n”,sum);}上节例4-4#includestdio.hvoidmain(){floatx,sum;sum=0.0;do{scanf(“%f”,&x);sum=sum+x;}while(x=0.0);printf(“sum=%f\n”,sum);}sum-x4.3do-while语句例4-6利用公式求π的近似值,直到最后一项的绝对值小于10-6为止。程序代码如下:#includestdio.h#includemath.hvoidmain(){floatn,s,t,pi;t=1;pi=0;n=1.0;s=1;/*循环初值*/do{pi=pi+t;/*累加t*/n=n+2;/*循环变量增值*/s=-s;/*求符号位s,正负号变化*/t=s*1./n;/*求一个数列项的值t*/}while((fabs(t))1e-6);/*fabs(t)为绝对值函数*/pi=pi*4;printf(“pi=%f\n”,pi);}71513114715131144.4for语句for(表达式1;表达式2;表达式3){循环体语句;}for(表达式1;表达式2;表达式3)循环语句;–常见用法for(i=0;i10;i++)……表达式2循环体语句表达式3表达式1假真程序形式循环初值循环条件循环体调整过程例4-7:计算1+2+3+……+100。(用for)sum=0;for(i=1;i=100;i++)sum=sum+i;for(sum=0,i=1;i=100;i++)sum=sum+i;do{sum=sum+i;i++;}while(i=100);inti=1,sum=0;while(i=100){sum=sum+i;i++;}for(赋初值;循环条件;循变增值)语句for语句可改写为:表达式1;while(表达式2){语句表达式3;}说明:(1)“表达式1”可以为空,此时应在for语句之前给循变赋初值。例:for(;i=100;i++)sum=sum+i;4.4for语句(2)“表达式3”省略,应另外设法使循环正常结束例:for(sum=0,i=1;i=100;){sum=sum+i;i++;}(3)“表达式1”和“表达式3”可以省略例:for(;i=100;){sum=sum+i;i++;}(4)“表达式1”和“表达式3”可以是一个简单的表达式,也可以是一个逗号表达式。例:for(i=0,j=100;i=j;i++,j--)k=i+j;4.4for语句例4-8:打印Fibonacci数列:1,1,2,3,5,8……的前20个数,并按每行打印5个数的格式输出。分析:Fibonacci数列问题起源于一个古典的有关兔子繁殖的问题。……这样,各月的兔子对数为:1,1,2,3,5,8,…。此题是循环次数固定的实例。数列单项变化规律为:F1=1,F2=1,Fn=Fn-1+Fn-2,(n=3)。设n为循环控制变量,Fibonacci数列前2个数列值为1,则n从3到20的变化,Fn用f3表示,按数列变化规律,每次等于前两项之和,即f3=f1+f2。采用迭代法解题,每次迭代改变f1、f2的值,即f1=f2,f2=f3,f3=f1+f2。程序代码如下:#includestdio.hvoidmain(){intn=3,f1=1,f2=1,f3;/*前2个数列值1,n从3开始*/printf(“%14d%14d”,f1,f2);/*输出前两个数列值*/for(n=3;n=20;n++)/*n从3到20的变化*/{f3=f1+f2;/*按照规则,得到下一个数列值f3*/f1=f2;f2=f3;/*迭代f1、f2的值*/printf(“%14d”,f3);/*输出一个数列值*/if(n%5==0)/*每行打印5个数*/printf(\n);}}4.4for语句运行结果:11235813213455891442333776109871597258441816765例求n的阶乘n!。#includestdio.hvoidmain(){inti,n,s=1;scanf(“%d”,&n);for(i=1;i=n;i++)s=s*i;printf(“n!=%d”,s)}4.4for语句例4-9计算1!+2!+3!+...+n!,其中n=1,2,...20程序代码如下:#includestdio.hvoidmain(){floatt,s;intn;for(s=0,n=1,t=1;n=20;n++)/*n从1到20的变化*/{t=t*n;/*计算n!,累乘积t*/s=s+t;/*计算n!的累加和s*/}printf(“1!+2!+3!+...+n!=%e\n”,s);}循环语句的比较–for(e1;e2;e3)子语句–等价于–e1;while(e2){子语句e3;}for(i=0;i10;i++)S;等价于i=0;while(i10){S;i++;}4.4for语句循环语句的比较–当初始条件不满足时两种循环语句有所区别inta=10;while(a10){printf(“a=%d\n”,a);a++;}输出结果:inta=8;while(a10){printf(“a=%d\n”,a);a++;}输出结果:a=8a=9inta=10;do{printf(“a=%d\n”,a);a++;}while(a10);输出结果:a=10inta=8;do{printf(“a=%d\n”,a);a++;}while(a10);输出结果:a=8a=94.4for语句4.5循环嵌套(多重循环)一、嵌套[嵌套]一个循环体内又包含另一个完整的循环结构,又叫多重循环。例:while()for(;;)for(;;){{{while()for(;;)while(){}{}{}}}}注意:为使程序结构清晰,采用逐层缩进的方式。二、执行过程例4-10打印九九乘法表。程序代码如下:#includestdio.hvoidmain(){inti,j;for(i=1;i=9;i++)/*外循环打印1~9行*/{for(j=1;j=9;j++)printf(%4d,i*j);/*内循环打印在一行,打印1~9列*/printf(\n);/*退出内循环,打印换行符*/}}4.5循环嵌套(多重循环)1×1=1,1×2=2,……1×9=92×1=2,2×2=4,……2×9=18……9×1=9,9×2=18,……9×9=81嵌套循环(多重循环)–如例:for(a=0;a10;a++)for(b=0;b10;b++)for(c=0;c10;c++)printf(“%d%d%d”,a,b,c);注:1)内循环必须完全嵌套在外循环内,不得互相交叉;2)嵌套循环的循环控制变量不可同名,并列循环的循环控制变量可以同名;例4-11中国古代数学家张丘建在“算经”里曾提出一个世界数学史上有名的百鸡问题:“鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问鸡翁、母、雏各几何?”已知:公鸡:X只方程:X+Y+Z=100母鸡:Y只5X+3Y+Z/3=100小鸡:Z只15X+9Y+Z=300#includestdio.hvoidmain()/*法一*/{intx,y,z;for(x=0;x=100;x++)for(y=0;y=100;y++)for(z=0;z=100;z++)if(x+y+z==100&&15x+9y+z==300)printf(“%d%d%d\n”,x,y,z);}运行次数:106#includestdio.hvoidmain()/*法二*/{intx,y,z;for(x=0;x=20;x++)for(y=0;y=33;y++){z=100-x-y;if(15*x+9*y+z==300)printf(“%d%d%d\n”,x,y,z);}}4.6break和continue语句1、作用可用于循环的中途退出2、break中断循环,退到包含它的循环体之外3、continue中断本次循环,继续下次循环For(i=0;i5;i++){for(j=0;j6;j++){…..Break;}}For(i=0;i5;i++){for(j=0;j6;j++){…..continue;}}4.6.1break语句功能:跳