北京理工大学计算机学院2020/1/191第六章循环控制结构程序设计李书涛list37@sina.com北京理工大学计算机学院2020/1/192目录§1while语句§2do-while语句§3for语句§4break和continue语句§5循环嵌套§6几种循环结构比较§7循环结构综合实例§8本章小结第六章循环控制结构程序设计北京理工大学计算机学院2020/1/193什么是循环?为什么要使用循环?循环是有规律的重复操作。将复杂问题分解为简单的操作过程,程序只对简单过程描述,对过程的多次重复就可完成对问题的求解。问题2:求学生平均成绩,分数相加后除以课数。做99次加法。问题3:找出x以内能同时被3和7整除的数——找数。if—goto循环while循环for循环do-while循环先判断后循环(当型循环)先循环后判断(直到型循环)问题1:§1while语句§1while语句5.1.1循环的基本概念北京理工大学计算机学院2020/1/194循环的初始条件循环进入条件循环体循环变量的修订循环变量的初值满足条件则执行循环体重复执行的语句循环变量的改变,进一步测试条件二、循环结构1.当型循环循环体N条件Y入口出口条件NY循环体先循环后判断先判断后循环一、循环的基本要素2.直到型循环北京理工大学计算机学院2020/1/195while语句1.格式:while(表达式)循环体2.功能:先判断表达式的值,若为非零,重复执行循环体语句,再判断…….直到表达式的值为零,退出循环体即:测试-执行-测试-执行-while(条件){语句组}5.1.2while循环结构程序设计循环体N条件Y当表达式为真循环体N-S流程图流程图北京理工大学计算机学院2020/1/196while(条件){语句组}循环体N条件Yxnns1main(){①说明对象②输入数据③运算处理④输出结果}100求:s=1+2+3+…+100main(){ints,n;s=0;n=1;while(n=100){s=s+n;n++;}printf(“%d\n”,s);}课堂作业北京理工大学计算机学院2020/1/197(1)当循环体语句多于一条时,用{},否则,循环只对一个语句起作用。(2)循环体内部必须有对循环变量的修正语句,否则,易出现“死循环”。(3)条件表达式要有括号,后面不加分号。(4)注意边界值。例题:求(课堂作业)1+2+3…+n=10000的最大的n。main(){inta,k;a=k=0;while(a=10000){++k;a+=k;}printf(“1+2+3…..+%d=%d\n”,k-1,a-k);}注意事项main(){intnumber=0;while(number++=1)printf(“*%d\n”,number);printf(“**%d\n”,number);}循环进行了多少次?输出的值?结果:*1*2**3条件表达式执行次数123条件表达式中变量的值012执行哪个printf语句@@#@#输出的number的值123口头课堂作业starti=1;sum=0;i≤nsum=sum+k;i++;stop读入n读入k输出sumNY利用while语句实现:从键盘输入n个数(n0),求其和。main(){inti,n,k,sum;i=1;sum=0;printf(Inputn:);scanf(%d,&n);while(i=n){scanf(%d,&k);sum=sum+k;i++;}printf(\nsumis:%d\n,sum);}运行结果:Inputn:6123421195sumis:73北京理工大学计算机学院2020/1/19101.格式:do循环体while(表达式);2.功能:先执行循环体,再判断表达式的值,若为非零,重复执行循环体语句,再判断…….直到表达式的值为零,退出循环体do–while语句即:执行-测试-执行-测试-§2do-while循环结构程序设计§2do-while循环结构程序设计(b直到表达式为假循环体条件NY循环体N-S流程图流程图main(){intn=1,s=0,x;scanf(%d,&x);do{s=s+n;n++;}while(n=x);printf(s=%d\n,s);}求:s=1+2+3+…+100n=xs=s+nYn++开始初始化n,s,xN结束输入x输出sdo语句while(条件);xnns1北京理工大学计算机学院2020/1/1912main(){ints=0,x;scanf(%d,&x);while(x=10){s=s+x;x++;}printf(s=%d\n,s);}main(){ints=0,x;scanf(%d,&x);do{s=s+x;x++;}while(x=10);printf(s=%d\n,s);}输入:12输出:s=12循环至少执行一次循环没有被执行输入:12输出:s=0while与do-while的比较北京理工大学计算机学院2020/1/1913先计算e1初值;计算e2并判断,0时跳出循环,非0时执行循环;当e2非0,执行循环体语句,计算e3增量;自动转到第二步(计算e2)…...继续执行。for语句初值e1条件e2增量e3for(表达式1;表达式2;表达式3){语句组}1.格式:2.功能:§3for循环结构程序设计§3for循环结构程序设计北京理工大学计算机学院2020/1/1914for语句流程图表达式2不满足满足求解表达式1求解表达式1当表达式2为真循环体求解表达式3循环体求解表达式3N-S流程图流程图北京理工大学计算机学院2020/1/1915main(){intn,s=0;for(n=1;n=100;n++)s=s+n;printf(“%d\n”,s);}变量的增量循环体变量的初值循环条件求:s=1+2+3+…+100北京理工大学计算机学院2020/1/1916for工作流程可用while语句来表达表达式1while(表达式2){语句;表达式3;}for语句同while语句相似,与do-while语句不同。for(n=1;n=100;n++)s=s+n;可用下述while语句来表达n=1;while(n=100){s=s+n;n++;}北京理工大学计算机学院2020/1/1917例:输入a,b两个整数,计算从a到b的整数之和。main(){inta,b,sum;printf(inputa&b:);scanf(%d,%d,&a,&b);for(sum=0;a=b;a++)sum+=a;/*循环体*/printf(sum=%d\n\n,sum);}本例for语句的执行过程是:先使用赋值语句sum=0,使存放和数的变量sum置成0,接着判别a=b?,若成立则进行sum=sum+a,利用a++使a增1,然后再次判别a=b?,若成立,再进行sum=sum+a…,直到ab为止(即a=b为假)。北京理工大学计算机学院2020/1/1918for(;n100;n++)缺省e1,n应在循环之前赋初值for(n=0;;n++)缺省e2,造成死循环,不可使用!for(n=0;n100;)缺省e3,n增量应在循环体内进行for(;;)缺省e1,e2,e3死循环for(;n100;)缺省e1,e3分号始终不能缺省!说明不可用1.表达式1,表达式2和表达式3均可缺省北京理工大学计算机学院2020/1/1919for(初值;判断;增量)语句;for(初值;判断;增量){复合语句;}for(初值;判断;增量);for(s=0,n=1;n=100;s=s+n,printf(“%d”,s))n++;for(s=0;n100;s=s+n,n++){printf(“%d”,s);}求累加和n的初值在for之前完成增量在for之外完成for语句的形式2.表达式1和3可以是与初值,增量无关的逗号表达式北京理工大学计算机学院2020/1/1920间断语句格式:break;break语句的功能1.break语句只能用于switch结构或循环结构2.在switch语句中结束case子句,使控制转到switch语句之外。3.在循环结构中,break语句使流程转向该循环体的外层继续运行。向外退出一层循环§4break与continue语句§4break与continue语句一.间断语句#definePI3.1415926main(){intr;floatarea;for(r=1;r=10;r++){area=PI*r*r;if(area100)break;printf(r:%dareais:%f\n,r,area);}}计算r=1~10的圆面积,直到面积area大于100为止。北京理工大学计算机学院2020/1/1922r:1areais:3.1415930r:2areais:12.566370r:3areais:28.274334r:4areais:50.265480r:5areais:78.539818运行结果北京理工大学计算机学院2020/1/1923例题:求100以下的整数中为13的倍数的最大数。main(){inti;for(i=100;i=0;i--){if((i%13)==0)break;}printf(“%d\n”,i);}如何求100以下所有13的倍数程序举例北京理工大学计算机学院2020/1/1924例题:阅读下述程序,写出执行结果(5分)main(){inta=10,y=0;do{a+=2;y+=a;if(y50)break;}while(a=14);printf(a=%d,y=%d\n,a,y);}执行结果为:..程序举例a=16,y=60北京理工大学计算机学院2020/1/1925继续语句格式:continue;continue语句的功能:1.continue语句仅能在循环语句中使用。2.它的作用不是结束循环,而是结束当前一次循环,开始一次新的循环。即终止当前这一轮循环,跳过循环体中位于continue后面的语句,立即开始下一轮循环。3.对于for语句,将控制转到执行增量和条件测试部分。4.对于while和do-while语句,将控制转到条件测试部分。二.继续语句北京理工大学计算机学院2020/1/1926main(){intx,y,z;for(x=1;x=20;x++)for(y=1;y=34-x;y++){z=100-x-y;if(5*x+3*y+z/3==100){if(z%3!=0)continue;}printf(“%d,%d,%d\n”,x,y,z);}}将前面例题中,小鸡的数z中不能被3整除的解筛除?程序举例北京理工大学计算机学院2020/1/1927把100到150之间的不能被3整除的数输出,要求一行输出10个数。main(){intn,i=0;for(n=100;n=150;n++){if(n%3==0)continue;printf(%4d,n);i++;if(i%10==0)printf(\n);}}程序举例运行结果:100101103104106107109110112113115116118119121122124125127128130131133134136137139140142143145146148149北京理工大学计算机学院2020/1/1928例题:阅读下述程序,写出执行结果(5分)main(){inta,b;for(a=1,b=1;a=100;a++){if(b=20)break;if(b%3==1){b+=3;continue;}b-=5;}printf(a=%d,b=%d\n,a,b);}执行结果为:.程序举例a=8,b=22北京理工大学计算机学院2020/1/1929二、标号语句格式:标号标识符:语句功能:指示语句在程序中的位置,作为转移语句的转移目标。一、转移语句(无条件转向语句)格式:goto标号标识符;功能:将程序流程无条件地转向指定标号所在的语