,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,*,*,第,4.5,节 循环结构程序设计,循环语句的意义及三种格式,循环语句执行的流程图表示,循环初值,循环控制变量,循环结束值,循环体,如何构造循环结构,break,和,continue,语句,循环嵌套,计算机做事的优势:重复做同一件事情不怕累。且很喜欢重复的做。,学习循环一定要展开,思考每一次循环具体循环体是啥样。,本章教学目标:,循环的意义:,实际生活里:,重复:不停做同一件事,、从何时开始;,、重复着什么;,、何时结束;,程序设计:,循环:循环次数,,循环控制变量决定循环次数。,、循环变量初值;,、循环体;,、循环结束条件;,for,循环语句,问题,打印十个,打印整数110,打印整数1100,打印整数1,n,fori=1;i=N;i+循环体语句 ,意义:重复执行N次循环体内的语句。,执行过程:,1判断i是否小于等于N,假设成立,那么执行 循环体语句。,2i递增一次;,3再判断i是否小于等于N,假设成立再执行循环体语句,重复下去。,4直到i小于等于N这个条件不成立,即i大于N那么跳出循环.,5执行循环体后面的语句。,fori=1;i=10;i+,printfa;,上两行程序相当于10行printfa。,fori=1;i=100;i+,printf%d,i;,相当于:printf%d,1;,printf%d,2;,printf%d,3;,printf%d,100;,即打印整数1到100。,例4-18 求前50个自然数的和。,算法分析:,假设i表示任意一个自然数,sum表示和,可以把前50个自然数的和看作是把1至50累加到sum上。如图4-18。开始累加时让sum=0。在运算时sum等于前一次累加的和再加上本次的加数i,即sum=sum+i;重复50次。,+2,+1,sum,图,4-18,7 6 5 4 3,即:,i=1 sum=0+1,i=2 sum=0+1+2,i=3 sum=0+1+2+3,i=4 sum=0+1+2+3+4,i=50 sum=0+1+2+3+.+50,i=51 i=1;i-),控制变量从,7,变为,77,;增值为,7,for(i=7;i=2;i-=2),控制变量如下变化,2,,,5,,,8,,,11,,,14,,,17,,,20,for(i=2;i=0;i-=11),for,语句,for(exp1;exp2;exp3),语句;,exp2,非0,0,循环的条件,exp1,语 句,循环体,exp3,初始化循环,例,4-19,求,1-3+5-7+-99+101,的值,算法分析:,从每项绝对值来看,是,1+3+5+7+101,,只是要隔项取负,所以我们可以把它看成是,1,到,101,的累加,但需要根据负负为正、负正为负的乘法运算规律,在循环过程中处理各项的时候每次乘以,-1,。,(1),定义,sum,来保存结果,初始化为,0,。定义,i,来作循环控制变量,从,1,到,101,,每次增加,2,。定义,t,来控制符号,初始化为,1,;,(2),通过循环累加,用,t,控制符号;,(3)printf(),输出结果。,while,语句,while(,条件表达式),0,i=1;,while(i sum,sum+2 sum,sum+3 sum,sum+10 sum,sum=sum+?,int i,sum=0;,i=1;,while(i=10),sum=sum+i;,i+;,循环不变式,几个本卷须知:,1,、死循环:,while(1),.,2,、缩紧对齐;,3,、单句循环体可以省去,;,4,、循环控制变量一定要改变;,5,、善于把循环展开。,dowhile(),循环语句书写格式,格式:,do,循环体含控制变量变化规律;,while(表达式;,循环体,While,表达式,Y,N,先作后判断,即一直做到不能做。,do-while,语句,do,语句,while(,表达式);,i=1;,do,printf(%d,i);,i+;,while(i=10);,语 句,表达式,非0,0,while(,表达式),语句;,语 句,表达式,非0,0,while,和,do-while,do,语句,while(,表达式);,语 句,表达式,非0,0,先循环,后判断,先判断,后循环,例题,4-21,。,main(),int sum=0,i=1;,scanf(“%d,while(i=10),sum=sum+i;,i+;,printf(“%dn,sum);,main(),int sum=0,i=1;,scanf(“%d,do,sum=sum+i;,i+;,while(i0);,printf,(,sum=%d,sum);,void main(),int x,=0,sum=0;,while(x0),sum+=x;,scanf(%d,printf(sum=%d,sum);,输入 1 2 5 -10 =-2,输入-10 1 2 5,sum-x,输入一些数,求和,直到输入负数为止。,while(,表达式),语句;,语 句,表达式,非0,0,for(exp1;exp2;exp3),语句;,exp3,exp2,非0,0,exp1,语 句,exp1;,while(exp2),语句,;,exp3;,while,和,for,while,和,for,while(,表达式),语句;,for(exp1;exp2;exp3),语句;,exp1;,while(exp2),语句,;,exp3;,sum=0;,i=1;,while(i=10),sum=sum+i;,i+;,sum=0;,for(i=1;i=10;i+),sum=sum+i;,break,和,continue,break,循环没有结束时强制结束循环,跳到循环之外。,continue,某一次循环还没执行完时,终止本次循环,执行下一次循环。,break,和,continue,语句,#,include stdio.h,void main(),char c;,int i=0;,for(i=0;i10;i+),c=getchar();,if(c=n)break;,putchar(c);,循环何时结束?,c=getchar();,for(i=0;,i=10|c=n,)break;,putchar(c);,1,break,流程,结束循环,while(,exp,),语句1,if(,expb,)break;,语句2,非0,0,exp,语句1,0,e,xpb,语 句2,循环体,非0,c,ontinue,流程,跳过,continue,后面的语句,继续下一次循环,while(,exp,),语句1,if(,expc,)continue;,语句2,非0,0,exp,语句1,0,e,xpb,语 句2,循环体,非0,break,和,continue,#,include stdio.h,void main(),char c;,int i=0;,for(i=0;i10;i+),c=getchar();,if(c=n),break,;,putchar(c);,#,include stdio.h,void main(),char c;,int i=0;,for(i=0;i=A /*统计大写字母数量*/,printf(“sum=%d,sum);,例4-24 从键盘输入30个字符,并统计其中数字字符的个数。,#include,main(),char ch;/*用来存储输入的字符*/,int sum=0;/*用来存储数字字符的个数*/,printf(“请输入一个字母:);/*提示用户输入*/,for(int i=0;i30;i+)/*i从0到29,循环30次*/,ch=getchar();,if(ch9),continue;,/*如果不是数字字符,中止本次循环,即不执行循环体中剩余的语句 ,,直接进入下一次循环,*/,sum+;,printf(“sum=%d,sum);/*输出显示结果*/,循环嵌套,注意:完全包含,不能交叉。,外循环循环一次,内循环循环一个周期。,例题:打印乘法口诀表。,我们可以把它看作是9行,假设干列的一个二维表,每行的列数刚好是它对应行数的个数,如第三行的列数是3,第六行的列数是6,即每一行有与行数相同的列数,它构成了循环嵌套结构。这样的问题可以归结为:,(1)如何控制行:用fork=1;k=9;k+控制行数量。,(2)如何控制列:用for(j=1;j=k;j+)控制列数。列的个数随行数变而变,其规律是与行数相同,所以用j=a&c=A&c=0&c=1),scanf(%d,max=x;,for(i=1;in;i+),scanf(%d,if(max=a&c=A&c=0&c=9),digit+;,else,other+;,c=getchar();,printf(%d%d%d,letter,digit,other);,while(,(,c=getchar(),),!=n),循环嵌套,while(,表达式),语句;,循环语句,例,1!+2!+n!,s=0;,for(k=1;k=n;k+),s=s+f;,f=1;,/*n!*/,for(i=1;i=n;i+),f=f*i;,f=1;,for(i=1;i=k;i+),f=f*i;,算法:,k=1 to n,s=s+f,f=k!,k+,例,1!+2!+n!,算法:,k=1 to n,s=s+f,f=k!,k+,s=0;f=1;,for(k=1;k=n;k+),f=f*k;,s=s+f;,算法:,k=1 to n,s=s+f,f=f*k,k+,循环嵌套均是大循环嵌小循环,绝对不允许循环体交叉,!,for(),.,do,.,while(.),for(),.,do,while(),