第五章本章要点循环的基本概念不同形式的循环控制多重循环问题5.1程序中需要用循环结构5.2用while语句和do-while语句实现循环5.3用for语句实现循环5.4循环的嵌套5.5用break语句和continue语句改变循环状态5.6几种循环的比较5.7程序举例5.8提高部分主要内容5.1程序中需要用循环结构什么是循环?为什么要使用循环?1001nyn问题1:问题2:求学生平均成绩分数相加后除以课数•在许多问题中需要用到循环控制。循环结构就是用来处理需要重复处理的问题的,所以又称重复结构。它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。•循环分为两种:无休止循环和有终止循环•构成有效循环的条件:循环体和循环结束条件5.2用while语句和do-while语句实现循环5.2.1用while语句实现循环while语句用来实现“当型”循环结构一般形式:while(表达式)语句当表达式为非0值时,执行while语句中的内嵌语句。其特点是:先判断表达式,后执行循环体,即内嵌语句。1001nn例题5.1求1+2+3+…+100的和解题思路(1)开始时使sum的值为0,被加数i第一次取值为1。开始进入循环结构。(2)判别“i≤100”条件是否满足,由于i小于100,因此“i≤100”的值为真。所以应当执行其下面矩形框中的操作。(3)执行sum=sum+i,此时sum的值变为1了,然后使i的值加1,i的值变为2了,这是为下一次加2作准备。流程返回菱形框。(4)再次检查“i≤100”条件是否满足,由于i的值为2,小于100,因此“i≤100”的值仍为真,所以应执行其下面矩形框中的操作。(5)执行sum=sum+i,由于sum的值已变为1,i的值已变为2,因此执行sum=sum+i后sum的值变为3。再使i的值加1,i的值变为3。流程再返回菱形框。(6)再次检查“i≤100”条件是否满足……,如此反复执行矩形框中的操作,直到i的值变成了100,把i加到sum中,然后i又加1变成101了。当再次返回菱形框检查“i≤100”条件时,由于I已是101,大于100,“i≤100”的值为假,不再执行矩形框中的操作,循环结构结束。5.2用while语句和do-while语句实现循环#includestdio.hvoidmain(){inti,sum=0;/*sum是用来存放累加和的变量*//*初值为0*/i=1;while(i=100)/*当I小于或等于100时*//*执行下面花括号中的复合语句*/{sum=sum+i;/*将i的当前值累加到变量sum中*/i++;/*使i的值加1*/}printf(″%d\\n″,sum);}1001nn说明:(1)循环体如果包含一个以上的语句,应该用花括号括起来,以复合语句形式出现.(2)在循环体中应有使循环趋向于结束的语句。运行结果:5050编写程序5.2用while语句和do-while语句实现循环5.2用while语句和do-while语句实现循环5.2.2用do-while语句实现循环do-while语句的特点:先执行循环体,然后判断循环条件是否成立。执行过程:先执行一次指定的循环体语句,然后判别“表达式”,当表达式的值为非0(“真”)时,返回重新执行循环体语句,如此反复,直到表达式的值等于0(“假”)为止,此时循环结束。while语句和do-while语句的关系:同一个问题既可以用while循环处理,也可以用do-while循环来处理。二者是可以互相转换的。一般形式:do循环体语句while(表达式);例题5.2求1+2+3+…+100的和#includestdio.hvoidmain(){inti,sum=0;i=1;do/*在循环开始时不检查条件,先执行一次循环体*/{sum=sum+i;i++;}while(i=100);printf(%d\\n″,sum);}运行结果:50501001nn说明:可以看到,结果和例5.1完全相同。编写程序5.2用while语句和do-while语句实现循环1001nn例题5.3募集慈善基金10000元,有若干人捐款,每输入一个人的捐款数后,计算机就输出当时的捐款总和。当某一次输入捐款数后,总和达到或超过10000元时,即宣告结束,输出最后的累加值。解题思路解此题的思路是设计一个循环结构,在其中输入捐款数,求出累加值,然后检查此时的累加值是否达到或超过预定值,如果达到了,就结束循环操作。5.2用while语句和do-while语句实现循环#includestdio.hvoidmain(){floatamount,sum=0;/*变量sum用来存放累加和*/do{scanf(%f,&amount);/*输入一个捐款金额*/sum=sum+amount;/*求出当前的累加和*/}while(sum10000);/*如未达10000元继续循环*/printf(sum=%9.2f\n,sum);}运行结果:1000↙(输入捐款额)1850↙1500↙2600↙2500↙1200↙sun=10650.001001nn说明:设计循环结构,要考虑两个问题:一是循环体,二是循环结束条件。注意while循环中判断的条件是循环继续的条件,而不是结束条件。5.2用while语句和do-while语句实现循环编写程序5.3用for语句实现循环5.3.1for语句的一般形式和执行过程•C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。•一般形式:for(表达式1;表达式2;表达式3)语句5.3用for语句实现循环5.3.1for语句的一般形式和执行过程•for语句的执行过程:(1)先求解表达式1。(2)求解表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下面第(3)步。若为假(值为0),则结束循环,转到第(5)步。(3)求解表达式3。(4)转回上面第(2)步骤继续执行。(5)循环结束,执行for语句下面的一个语句。•for语句最简单的形式:for(循环变量赋初值;循环条件;循环变量增值)例如:for(i=1;i=100;i++)sum=sum+i;相当于:i=1;while(i=100){sum=sum+i;i++;}5.3用for语句实现循环5.3.1for语句的一般形式和执行过程5.3用for语句实现循环5.3.2for循环程序举例国王的小麦。相传古代印度国王舍罕要褒赏他的聪明能干的宰相达依尔(国际象棋的发明者),国王问他要什么?达依尔回答说:“国王只要在国际象棋的棋盘第1个格子中放1粒麦子,第2个格子中放2粒麦子,第3个格子中放4粒麦子,以后按此比例每一格加一倍,一直放到第64格(国际象棋的棋盘8*8=64格),我感恩不尽,其他什么都不要了。”国王想,这有多少!还不容易!让人扛来一袋小麦,但不到一会儿全用没了,再来一袋很快又用完了。结果全印度的粮食全部用完还不够。国王纳闷,怎样也算不清这笔账。现在我们用计算机来算一下。1F例题5.41001nn解题思路麦子的总粒数是:分别计算出每一格的麦子粒数,把它们加起来,就得到总粒数。据估算,1小麦约有1.42粒,可以计算出小麦的体积。可以用for语句实现循环。6332222215.3用for语句实现循环#includestdio.hvoidmain(){doublep=1,t=1,v;inti;for(i=1;i64;i++)/*执行63次循环*/{p=p*2;/*p是当前一个格子中的麦子粒数*/t=t+p;/*t是当前麦子总粒数*/}v=t/1.42e8;/*v是总体积*/printf(total=%e\n,t);/*用指数形式输出麦子总粒数*/printf(volume=%e\n,v);/*用指数形式输出麦子总体积*/}1001nn运行结果:total=1.844674e+019volnme=1.299066e+011编写程序5.3用for语句实现循环说明:变量i用来控制循环的次数,开始时i=1,在完成第1次循环后,i的值加1变为2,由于264,所以执行第2次循环,依此类推,当i变到63时,执行最后一次循环,i再变为64,由于i不再小于64了,不再执行循环。接着计算体积,输出结果。5.3用for语句实现循环5.3用for语句实现循环人口增长预测。据2005年末统计,我国人口为130756万人,如果人口的年增长率为1%,请计算到哪一年中国总人口超过15亿。1F例题5.5解题思路计算人口增长和计算存款利息的公式是相同的。假设原来人口为,则一年后的人口:其中r是年增长率。用此公式依次计算出每年的人口,每算出一年的人口后就检查一下是否达到或超过15亿?如果未达到或超过15亿,就再计算下一年的人口,直到某一年的人口达到或超过15亿为止。)1(0rpp1001nn编写程序5.3用for语句实现循环#includestdio.hvoidmain(){doublep=1.30756e9,r=0.01;inty;for(y=2006;p1.5e9;y++){/*赋值号两侧的变量p代表不同含义*/p=p*(1+r);}printf(year=%d,p=%e\n,y-1,p);}运行结果:year=2019,p=1.503007e+009说明:注意区分变量p在不同阶段中的不同含义。y代表年份。循环体中只有一个语句,用来计算从2006年开始的各年的人口数。在for语句中设定的循环条件是p15亿,当某一年的p达到或超过15亿,就停止循环,输出年份和当年的人口数。由于在最后结束循环前y又加了1,因此在输出年份时应输出y-1的值而不是y的值。5.3用for语句实现循环5.3用for语句实现循环5.3.2for循环程序举例一个变量开始时有一初值,通过一定的运算,可以推算出一个新的值,再从这个新值又推出下一个新值,即不断用计算出的新值去取代原有的值,这种方法称为迭代。上面的计算公式p*(1+r)称为迭代公式。迭代算法一般是用循环来实现的。迭代是一种常用的算法,用人工实现很麻烦,而用计算机实现却十分方便。1F5.4循环的嵌套•一个循环体内又包含另一个完整的循环结构称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。•三种循环(while循环、do-while循环和for循环)可以互相嵌套。5.4循环的嵌套•下面几种都是合法的形式:(1)while()(2)do(3)for(;;){…{…{while()dofor(;;){…}{…}{…}}while();}}while();5.4循环的嵌套(4)while()(5)for(;;)(6)do{…{…{…do{…}while()for(;;){}while(){}…{…}…}}}while()5.5提前结束循环5.5.1用break语句提前退出循环•break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。•一般形式:break;说明:break语句不能用于循环语句和switch语句之外的任何其他语句中。统计各班级的学生的平均成绩。已知各班人数不等,但都不超过30人。编一个程序能处理人数不等的各班学生的平均成绩。1F例题5.6解题思路如果各班人数相同,问题比较简单,只需用一个for语句控制即可:for(i=1;i31;i++)但是现在有的班不足30人,应当设法告诉计算机本班的人数,使程序也能统计出该班的平均成绩。可以约定,当输入的成绩是负数时,就表示本班数据已结束(一般情况下成绩不会是负数)。在程序接收到一个负的分数时就提前结束循环,计算出本班平均成绩。用break语句可以用来实现提前结束循环。5.5提前结束循环1001nn编写程序5.5提前结束循环#includestdio.hvoidmain(){floatscore,sum=