第八讲循环语句教学目的与要求:了解循环作用及实现方法掌握while、do-while、for循环语句的格式和使用教学内容提要:1、循环的概述2、while循环语句3、do-while循环语句4、for循环语句教学重点:while、do-while、for循环语句的格式和使用教学难点:while、do-while、for循环语句的格式和使用教学进度:P115~P124教学过程:采用循环(或称重复)结构是计算机程序的一个重要特征。计算机运算速度快,最宜于用于重复性的工作。在循环算法中,穷举与迭代是两类具有代表性的基本应用。迭代与穷举算法1.迭代迭代是一个不断用新值取代变量的旧值,或由旧值递推出变量的新值的过程。例1:人口增长问题。按年0.2%的增长速度,现有13亿人,10年后将有多少人?设现人口数为m=13,则第1年后人口变为:m=m*(1+0.2%)即将m的值用m*(1+2%)替代。用循环结构实现,重复操作的内容是不断从一个变量的旧值出发计算它的新值。1、循环的概述迭代与下列因素有关:·初值;·迭代公式;·迭代次数或迭代终止标志。2.穷举穷举是另一种重复型算法。它的基本思想是,对问题的所有可能状态一一测试,直到找到解或将全部可能状态都测试过为止。循环控制有两种办法:计数法与标志法。计数法要先确定循环次数,然后逐次测试,完成测试次数后,循环结束。标志法是达到某一目标后,使循环结束。例3:输入10个数,将最大的一个数打印出来。目前还没有合适的方法来存储10个数。为此可以考虑类似打擂台一样的一种算法:S1:输入1个数,暂时作为擂主——最大数。S2:输入9个数——穷举这9个数,每输入一个,打一次擂台——把最大数与刚输入的数据进行比较,把大者作为新擂主——最大数。S3:输出最大数。在C语言中可以用以下语句来实现循环:1.用while语句;2.用do--while语句;3.用for语句。循环:就是在给定的条件成立时反复执行某一程序段,被反复执行的程序段称为循环体。真(非零)表达式循环体假(零)1)、while语句的形式:while(表达式)循环体;2)、while语句常称为“当型”循环语句。2、while循环语句:例求∑n用传统流程图和N-S结构流程图表示算法,见图(a)和图(b)。100n=1根据流程图写出程序:main(){inti,sum=0;i=1;while(i=100){sum=sum+i;i++;}printf(%d,sum);}3)、说明:先判断表达式,后执行语句。表达式同if语句后的表达式一样,可以是任何类型的表达式。循环体多于一句时,用一对{}括起。while循环结构常用于循环次数不固定,根据是否满足某个条件决定循环与否的情况。例:分析下列程序段的循环次数i=1;while(i=100)putchar(‘*’);i++;#includestdio.hvoidmain(){floatx;scanf(%f,&x);【例1】输入一系列数,判断其正负号,当输入0时,结束循环。输入数据,为第一次判断做准备while(x!=0)判断是否结束{if(x0)printf(+);elseprintf(-);scanf(%f,&x);}判断正负号4)、while循环语句程序举例#includestdio.hvoidmain(){charch;intnum=0;ch=getchar();【例2】统计从键盘输入的一行字符的个数(以回车键作为输入结束标记)。while(ch!='\n')判断是否输入结束{num++;ch=getchar();}printf(num=%d\n,num);}例3计算人口增长按照上一节的算法,可以很容易地得到下面的C程序。程序的主体结构是一个while重复结构。/******计算人口增长******/#includestdio.hintmain(void){doublem=13;inti=1;while(i=10){m=m*(1+0.002);i++;}printf(“Populationafter10yersis:%f\n”,m);return0;}例4Fibonacci算法C语言的程序实现。Fibonacci数列:1,1,2,3,5,8,13,21,34,…公式:fib1=fib2=1(1)fibn=fibn-1+fibn-2(n>=3)(2)/******计算Fibonacci数******/#includestdio.hintmain(void){intfib1=1,fib2=1,fib,i=3;while(i=12){fib=fib1+fib2;fib1=fib2;fib2=fib;i++;}printf(“TheFibonaccinumberafter1yeris:%d\n”,fib);return0;}注意表达式在判断前,必须要有明确的值。循环体中一般有改变条件表达式的语句。while(表达式)后面没有分号。3、do—while循环语句1)、do--while的形式:do{循环体;}while(表达式);2)、do--while语句常称为“直到型”循环语句。真(非零)表达式循环体假(零)例用do~while语句求∑n。先画出流程图,见图。100n=1程序如下:main(){inti,sum=0;i=1;do{sum=sum+i;i++;}while(i=100);printf(%d,sum);}3)、说明:先执行循环语句,后判断表达式。第一次条件为真时,while,do-while等价;第一次条件为假时,二者不同。【例1】用do-while语句编写程序统计从键盘输入的一行非空字符的个数(以回车键作为输入结束标记)。#includestdio.hvoidmain(){charch;intnum=0;ch=getchar();do{if(ch!=‘’)num++;ch=getchar();}while(ch!='\n');printf(num=%d\n,num);}if(ch!=‘\n’){}注意在if、while语句中,表达式后面都没有分号,而在do-while语句的表达式后面则必须加分号。do-while和while语句相互替换时,要注意修改循环控制条件。5、for循环语句1、for的形式:for(初始表达式1;条件表达式2;循环表达式3)循环体;表达式1:用于循环开始前为循环变量设置初始值。表达式2:控制循环执行的条件,决定循环次数。表达式3:循环控制变量修改表达式。循环体语句:被重复执行的语句。表达式3计算表达式1循环体判断表达式2零非零for的下一条语句2、执行过程for(i=1,sum=0;i=100;i++)sum=sum+i;例如:它相当于以下语句:i=1;while(i=100){sum=sum+i;i++;}表达式1;while(表达式2)表达式3;3、说明三个表达式都可以是逗号表达式。三个表达式都是任选项,都可以省略,但要注意省略表达式后,分号间隔符不能省略。for语句中表达式省略的形式(1)for语句一般形式中的“表达式1”可以省略;如:sum=0;i=1;for(;i=100;i++)sum=sum+i;(2)表达式2省略,即不判断循环条件,循环无终止地进行下去;如:for(sum=0,i=1;;i++){if(i100)break;sum=sum+i;}(4)可以省略表达式1和表达式3,只有表达式2,如:i=1;sum=0;for(;i=100;){sum=sum+i;i++;}i=1;sum=0;while(i=100){sum=sum+i;i++;}相当于for语句中表达式省略的形式(3)表达式3也可以省略,但此时保证循环能正常结束如:for(sum=0,i=1;i=100;){sum=sum+i;i++;}while(1)循环体;即不设初值,不判断条件,循环变量不增值。无终止地执行循环体。(5)三个表达式都可省略,如for(;;)循环体;for语句中表达式省略的形式如:sum=0,i=1;for(;;){if(i100)break;sum=sum+i;i++;}相当于(6)循环体为空语句对for语句,循环体为空语句的一般形式为:for(表达式1;表达式2;表达式3);如:for(sum=0,i=1;i=100;sum+=i,i++);for语句中表达式省略的形式求偶数和2+4+6+…+100思考(1)给累乘器赋初值,一般为1;(2)用循环语句实现累乘;for(循环变量赋初值;循环条件;循环变量改变规律)(3)循环体设计。累乘器当前值=累乘器原值*循环变量当前值;例4:求累乘积。如:1×2×3×...×100基本方法:属于“累乘器”类型问题。累乘器赋初值求n!=1×2×3×…n参考程序:voidmain(){doubles=1;intk;for(k=1;k=100;k++)s=s*k;printf(s=%lf,s);}累乘思考整数连乘结果一定是整数,而本例中结果数值相当大,用long型都无法存放,因此将存放累乘结果的变量s定义为double型。小结while循环语句的格式和使用do~while循环语句的格式和执行流程for循环语句的格式和执行流程作业:P1372,3