资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第 四 章 循环结构,用于解决语句的重复执行,以克服一条语句只能执行一次的限制,。,while,语句,do-while,语句,break,和,continue,语句,循环嵌套,循环结构程序设计,4.1 用格里高利公式求,的近似值,【例4-1】,使用下列格里高利公式求,的近似值,要求精确到最后一项的绝对值小于10,5,。,分析:,sum=sum+,第,i,项,和以前不同之处在于循环条件,即没有显式地给出循环次数,而是提出了精度要求(|,item|10,5,),。,当|,item|,10,5,时,要循环累加,item,的值,直到|,item|=0.00001),item=flag*1.0/t;/*,计算第,i,项的值*/,pi=pi+item;/*,累加第,i,项的值*/,flag=-flag;/*,改变符号,为下一次循环做准备*/,t=t+2;/*,分母递增2,为下一次循环做准备*/,pi=pi*4;/*,循环计算结果是,pi/4*/,printf(“pi=%fn”,pi);,while,语句,while(,条件),循环体语句,;,假,真,循环体语句,;,后一语句,;,表达式,复合语句,从,while,语句和,for,语句的执行流程可以看出,它们的执行机制实质上是一样的,都是在循环前先判断条件,只有条件为“真”才进入循环。,可以把,for,语句改写成,while,语句:,表达式,1,;,while,(,表达式,2,),for,的循环体语句;,表达式,3,;,while,语句,while,语句,while,实现要点,如:,for(i=1;,i=10,;i+),sum=sum+i,;,可以写成,i=1;,循环变量必须有初值,while(,i=10,),继续循环的条件,sum=sum+i;,i+;,循环变量的改变,循环体,while,语句,for,语句与,while,语句比较,main(),int i,sum=0;i=1;,for(i=1;,i=10,;i+)while(,i=0,),/*,输入负数控制循环结束*/,average=average+mark;/*,累加成绩 */,num+;/*,计数 */,scanf(“%lf”,/*,读入一个新数据*/,if(num!=0),printf(The average mark is%.2fn,average/num);,else,printf(The average mark is 0n);,问题:如果第一个数据就输入-1,运行结果是什么?,4.2 统计一个整数的位数,【例4-3】,从键盘读入一个整数,统计该数的位数。例如,输入1234,输出4;输入0,输出1。,一个整数由多位数字组成,统计过程需要一位位地数,因此这是个循环过程,循环次数由整数本身的位数决定。由于需要处理的数据有待输入,故无法事先确定循环次数。,程序中引入循环语句,do-while,。,#,include,void main(),int count,number;/*count,记录,number,的位数*/,count=0;,printf(Input a number:);/*,输入提示*/,scanf(%d,if(number 0)number=-number;,/*,将输入负数转换为正数*/,do,/*,判断循环条件*/,number=number/10;,/*,整除后减少一位个位数,组成一个新数*/,count+;/*,位数加1 */,while(number!=0);,/*,判断循环条件*/,printf(It contains%d digits.n,count);,问题:如果将程序中的,do-while,语句改为,while,语句,效果相同吗?,do-while,语句,用,do-while,语句实现,do-while,语句格式:,do,循环体语句,;,while,(,表达式,),while,是先判别条件,再决定是否循环;,do-while,是先至少循环一次,然后再根据循环的结果决定是否继续循环。,do-while,语句,do-while,语句实现流程,循环体语句,表达式,真,假,下一条语句,先循环,后判断,while(,表达式),循环体语句;,假,真,循环体语句,后一语句,;,表达式,后循环,先判断,对比:,4.2.3 循环语句的选择,if(,循环次数已知),使用,for,语句,else /*,循环次数未知*/,if (,循环条件在进入循环时明确),使用,while,语句,else,/*,循环条件需要在循环体中明确*/,使用,do-while,语句,4.3 判断素数,【例4-4】,输入一个正整数,m,,判断它是否为素数。,分析,:判断一个数,m,是否为素数,需要检查该数是否能被除1和自身以外的其他数整除,即判断,m,能否能被2,m-1,之间的数整除。,设,i,取值 2,m-1,如果,m,不能被该区间上的任何一个数整除,即对每个,i,m%i,都不为0,则,m,是素数;,只要找到一个,i,,使,m%i,为0,则,m,肯定不是素数。,m,不可能被大于,m/2,的数整除,#,include,void main(),int i,m;,printf(Input a number:);/*,输入提示*/,scanf(%d,for(i=2;i=m/2)/*,如果循环正常结束,说明,m,不能被,任何一个,i,整除,则,m,是素数*/,printf(%d is a prime number!n,m);,else,printf(No!n);,#,include,void main(),int i,m;,printf(Input a number:);,scanf(%d,for(i=2;i m/2;i+),if(m%i=0),printf(No!n);,else,printf(%d is a prime number!n,m);,问题:该程序还能正确判断素数吗?,break,语句,当循环结构中出现多个循环条件时,可以由循环语句中的表达式和,break,语句共同控制。,break,语句强制循环结束,使循环提前结束,不再执行循环体中位于其后面的其他语句。,break,语句应该和,if,语句配合使用,即条件满足时,才执行,break,跳出循环。,必定是经条件判断后执行的,真(非0),break,流程,for,的下一条语句,假(0),表达式1,表达式2,语 句1,表达式,3,否,break,语 句2,循环体,是,程序:,for(,表1;表2;表3),语句1;,if (.)break;,语句2;,for,后的下一条语句;,continue,语句,continue,语句的作用是跳过循环体中,continue,后面的语句,继续下一次循环。,continue,语句一般也需要与,if,语句配合使用。,continue,语句和,break,语句的区别在于,,break,结束循环,而,continue,只是跳过后面语句,继续循环。,break,除了可以终止循环外,还用于,switch,语句;而,continue,语句只能用于循环,是,真(非0),continue,流程,for,的下一条语句,假(0),表达式1,表达式2,语 句1,表达式,3,否,continue,语 句2,循环体,程序:,for(,表1;表2;表3),语句1;,if (.),continue,;,语句2;,for,后的下一条语句;,4.4 求1!+2!+.+100!,【例4-5】,计算1!+2!+3!+100!。要求定义和调用函数,fact(n),计算,n,的阶乘。,分析,:这是一个求累加和的问题,共循环100次,第,i,项就是,i,的阶乘:,sum=sum+,第,i,项,在第2章中介绍了求阶乘的程序(例2-12),还定义了求阶乘的函数,fact(,例2-14),求,i,的阶乘可以直接调用,fact(i)。,sum=sum+fact(i),#,include,double fact(int n);/*,函数声明*/,void main(),int i;,double sum;,sum=0;,for(i=1;i=100;i+),sum=sum+,fact(i);,/*,调用,fact(i),求,i!,,共100次 */,printf(1!+2!+3!+100!=%en,sum);,double fact(int n),/*,定义求,n!,的函数*/,int i;,double result;/*,变量,result,中存放阶乘的值*/,result=1;/*,置阶乘,result,的初值为1*/,for(i=1;i=n;i+)/*,循环重复,n,次,计算,n!*/,result=result*i;,return result;/*,把结果回送主函数*/,4.4.2 嵌套循环,不使用函数也能实现该例,sum=sum+,第,i,项,求累加和的,for,语句为:,for(i=1;i=100;i+),sum=sum+,i!;,for(i=1;i=100;i+),item=i!;,sum=sum+item;,for(i=1;i=100;i+),item=1;,for(j=1;j=i;j+)item=item*j;,sum=sum+item;,#,include,void main(),int i,j;,double item,sum;/*,变量,item,中存放阶乘的值*/,sum=0;,/*,外层循环重复100次,求累加和*/,for(i=1;i=100;i+),item=1;,/*,置,item,的初值为1,以保证每次求阶,乘都从1开始连乘*/,for(j=1;j=i;j+),/*,内层循环重复,i,次,算出,item=i!*/,item=item*j;,sum=sum+item;,printf(1!+2!+3!+100!=%en,sum);,改成这样会有问题吗?,item=1,;,for(i=1;i=100;i+),for(j=1;j=i;j+),item=item*j;,sum=sum+item;,for(i=1;i=100;i+),item=1;,for(j=1;j=i;j+)item=item*j;,sum=sum+item;,4.4.2 嵌套循环,分析程序中二重循环的执行过程,首先外层循环变量,i,固定,在一个值上,然后执行内层循环,内层循环变量,j,变化,一个轮次;,外层循环变量,i,再加1,重新执行内层循环,,j,再变化一个轮次。,内外层循环变量不能相同,比如分别用,i,和,j。,例:,for(i=1;i=100;i+),for(j=1;j=i;j+),printf(%d%dn,i,j);,4.5 循环程序设计,循环程序的实现要点是:,归纳出,哪些操作需要反复执行?,循环体,这些操作在什么情况下重复执行,?,循环控制条件,一旦确定了循环体和循环条件,循环结构也就基本确定了,再,选用,C,语言提供的3种循环语句(,for,while,和,do-while),实现循环。,循环的具体实现又分两种情况,如果事先给定了循环次数,一般首选,for,语句;,如果循环次数不明确,需要通过其他条件控制循环,则考虑,while,语句或,do-while,语句。,【例4-7】,从键盘输入一批学生的成绩,找出最高分。,分析,:先假设输入的第1个成绩为最高分,然后在循环中读入下一个成绩,并与最高分比较,如果大于最高分,就设它为新的最高分,继续循环,直到所有的成绩都处理完毕。,循环体中进行的操作就是输入和比较,难点在于如何确定循环条件,由于题目没有指定输入数据的个数,需要自己增加循环条件:,先输入一个正整数,n,,然后再输入,n,个数据。即循环重复,n,次,属于指定了循环次数,用,for,语句实现。,设定一个特殊数据(伪数据)作为循环的结束标志,由于成绩都是正数,选用一个负数作为输入的结束标志。考虑使用,
展开阅读全文