1、第5章循环结构程序设计5.1 程序中需要用循环结构程序中需要用循环结构现实生活中许多问题是需要重复处理现实生活中许多问题是需要重复处理u计算一个班计算一个班5050学生每人的平均成绩学生每人的平均成绩u工厂各车间的生产日报表工厂各车间的生产日报表u全国各省市的人口统计分析全国各省市的人口统计分析u各大学招生情况统计各大学招生情况统计u全校教职工工资报表全校教职工工资报表P1155.2 用用while语句和语句和dowhile语句实现循环语句实现循环5.2.1 5.2.1 用用whilewhile语句实现循环语句实现循环5.2.2 5.2.2 用用dodowhilewhile语句实现循环语句实现
2、循环P1155.2.1 用用while语句实现循环语句实现循环P115例例5.1求求1+2+3+100,即即解题思路:解题思路:u这是这是累加问题累加问题,需要先后将,需要先后将100100个数相加个数相加u要要重复重复100100次加法运算次加法运算,可用循环实现可用循环实现u后一个数是前一个数加后一个数是前一个数加1 1而得而得u加完上一个数加完上一个数i i后,使后,使i i加加1 1可得到下一个数可得到下一个数1001nn5.2.1 用用while语句实现循环语句实现循环P115sum=sum+ii=i+1非非0 0(真)(真)i 1000 0(假)(假)i=1#include voi
3、d main()int i,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(%dn,sum);复合语句复合语句能否改为能否改为i100?i100?while语句的一般形式如下语句的一般形式如下:while(表达式表达式)语句语句循环体循环体 while语句的一般形式如下语句的一般形式如下:while(表达式表达式)语句语句“真真”时时执行循环体语句执行循环体语句“假假”时不执行时不执行循环条件表达式循环条件表达式whilewhile循环的特点是:循环的特点是:先判断条件表达式先判断条件表达式后执行循环体语句后执行循环体语句语句语句非非0(0(真真)表达式表达
4、式0(0(假假)5.2.2 用用dowhile语句实现循环语句实现循环P117do-while语句的特点:先无条件地执语句的特点:先无条件地执行循环体,然后判断循环条件是否成立行循环体,然后判断循环条件是否成立一般形式为一般形式为:do 循环体循环体语句语句 while(表达式表达式);表达式表达式非非0(0(真真)0(0(假假)循环体语句循环体语句当表达式的值为真当表达式的值为真循环体语句循环体语句5.2.2 用用dowhile语句实现循环语句实现循环P117 例例5.2 用用dowhile循环循环求求:1+2+3+100,即即1001nn5.2.2 用用dowhile语句实现循环语句实现循
5、环P117解题思路解题思路:i 100非非0(0(真真)0(0(假假)sum=sum+ii=i+1sum=0i=1 sum=0;i=1;do sum=sum+i;i+;while(i=100);i 100sum=sum+ii=i+1sum=0,i=1#include void main()int i,sum=0;i=1;do sum=sum+i;i+;while(i=100);printf(“%dn”,sum);5050例例5.3 5.3 募集慈善基金募集慈善基金1000010000元,有若干人元,有若干人捐款,每输入一个人的捐款数后,计算机捐款,每输入一个人的捐款数后,计算机就输出当时的捐款
6、总和。当某一次输入捐就输出当时的捐款总和。当某一次输入捐款数后,总和达到或超过款数后,总和达到或超过1000010000元时,即元时,即宣告结束,输出最后的累加值。宣告结束,输出最后的累加值。解题思路:解题思路:u设计一个循环结构,在其中输入捐款数,设计一个循环结构,在其中输入捐款数,求出累加值,然后检查此时的累加值是否求出累加值,然后检查此时的累加值是否达到或超过预定值,如果达到了,就结束达到或超过预定值,如果达到了,就结束循环操作循环操作#include void main()float amount,sum=0;do scanf(%f,&amount);sum=sum+amount;wh
7、ile(sum10000);printf(sum=%9.2fn,sum);循环循环执行的条件执行的条件1000 1850 1500 2600 2500 1200 sum=10650.005.3 用用for语句实现循环语句实现循环P1195.3.1 for语句的一般形式和执行过程语句的一般形式和执行过程5.3.2 for循环程序举例循环程序举例forfor语句不仅可以用于循环次数已经确语句不仅可以用于循环次数已经确定的情况,还可以用于循环次数不确定定的情况,还可以用于循环次数不确定而只给出循环结束条件的情况而只给出循环结束条件的情况forfor语句完全可以代替语句完全可以代替whilewhile
8、语句语句5.3.1 for语句的一般形式和语句的一般形式和执行过程执行过程P120for语句的一般形式为语句的一般形式为 for(表达式表达式1;表达式表达式2;表达式表达式3)语句语句设置初始条件,只执行一次。设置初始条件,只执行一次。可以为零个、一个或多个变可以为零个、一个或多个变量设置初值量设置初值执行执行5.3.1 for语句的一般形式和语句的一般形式和执行过程执行过程P120for语句的一般形式为语句的一般形式为 for(表达式表达式1;表达式表达式2;表达式表达式3)语句语句循环条件表达式,用来判定是否继续循循环条件表达式,用来判定是否继续循环。在每次执行循环体前先执行此表达环。在
9、每次执行循环体前先执行此表达式,决定是否继续执行循环式,决定是否继续执行循环5.3.1 for语句的一般形式和语句的一般形式和执行过程执行过程P120for语句的一般形式为语句的一般形式为 for(表达式表达式1;表达式表达式2;表达式表达式3)语句语句作为循环的调整器,例如作为循环的调整器,例如使循环变量增值,它是在使循环变量增值,它是在执行完循环体后才进行的执行完循环体后才进行的forfor语句的执行过程语句的执行过程:(1)(1)先求解表达式先求解表达式1 1(2)(2)求解表达式求解表达式2 2,若,若其其值为真,执行循环体,值为真,执行循环体,然后执行下面第然后执行下面第(3)(3)
10、步。若为假,则结束循环,步。若为假,则结束循环,转到第转到第(5)(5)步步(3)(3)求解表达式求解表达式3 3(4)(4)转回上面步骤转回上面步骤(2)(2)继续执行继续执行(5)(5)循环结束,执行循环结束,执行forfor语句下面的一个语句语句下面的一个语句表达式表达式2非非0(0(真真)0(0(假假)求解表达式求解表达式3 3求解表达式求解表达式1语句语句for(i=1;i=100;i+)sum=sum+i;等价于等价于i=1;while(i=100)sum=sum+i;i+;用用forfor语句语句更更简单、方便简单、方便5.3.2 for循环程序举例循环程序举例例例5.4 在象棋
11、的棋盘第在象棋的棋盘第1 1个格子中放个格子中放1 1粒粒麦子,第麦子,第2 2个格子中放个格子中放2 2粒麦子,第粒麦子,第3 3个个格子中放格子中放4 4粒麦子,以后按此比例每一粒麦子,以后按此比例每一格加一倍,一直放到第格加一倍,一直放到第6464格格(象棋的棋象棋的棋盘是盘是8 88=648=64格格),共放多少?共放多少?P120麦子总粒数麦子总粒数=1+2+22+23+2631m3=1.42108粒粒#include void main()double p=1,t=1,v;int i;for(i=1;i64;i+)p=p*2;t=t+p;v=t/1.42e8;printf(“tot
12、al=%en”,t);printf(“volume=%en”,v);p p是当前一个格子中麦子粒数是当前一个格子中麦子粒数t t是当前麦子总粒数是当前麦子总粒数v v是总体积是总体积total=1.844674e+019volnme=1.299066e+011#include void main()double p=1,t=1,v;int i;for(i=1;i64;i+)p=p*2;t=t+p;v=t/1.42e8;printf(“total=%en”,t);printf(“volume=%en”,v);改为改为i=1;i=64;i+i=1;i=64;i+会怎样?会怎样?#include v
13、oid main()double p=1,t=1,v;int i;for(i=1;i64;i+)p=p*2;t=t+p;v=t/1.42e8;printf(“total=%en”,t);printf(“volume=%en”,v);改为改为i=0;i64;i+i=0;i64;i+会怎样?会怎样?例例5.5 人口增长预测。据人口增长预测。据20052005年末统计,年末统计,我国人口为我国人口为130756130756万人,如果人口的年增万人,如果人口的年增长率为长率为1%1%,请计算到哪一年中国总人口超,请计算到哪一年中国总人口超过过1515亿。亿。解题思路:解题思路:u假设原来人口为假设原来
14、人口为p p0 0 ,则一年后的人口,则一年后的人口为为:p=pp=p0 0*(1+r)(1+r),r r是年增长率是年增长率u每算出一年的人口后就检查是否每算出一年的人口后就检查是否达到或超过达到或超过1515亿亿。如果未达到或超过,再计算下一年的人口,如果未达到或超过,再计算下一年的人口,直到某一年的人口达到或超过直到某一年的人口达到或超过1515亿为止亿为止#include void main()double p=1.30756e9,r=0.01;int y;for(y=2006;p1.5e9;y+)p=p*(1+r);printf(year=%d,p=%en,y-1,p);原来的值原来
15、的值1 1年后的值年后的值year=2019,p=1.503007e+009注意不是注意不是y y20192019年达到年达到15.03007亿人口亿人口#include void main()double p=1.30756e9,r=0.01;int y;for(y=2006;p1.5e9;y+)p=p*(1+r);printf(year=%d,p=%en,y-1,p);计算计算10001000年后的人口年后的人口y=3006y=3006,p=2.767941e+01330063006年达到年达到276794276794亿人口亿人口#include void main()double p=1
16、.30756e9,r=0.01;int y;for(y=2006;p1.5e9;y+)p=p*(1+r);printf(year=%d,p=%en,y-1,p);迭代公式迭代公式5.4 循环的嵌套循环的嵌套P124一个循环体内又包含另一个完整的循环一个循环体内又包含另一个完整的循环结构,称为结构,称为循环的嵌套循环的嵌套内嵌的循环中还可以嵌套循环,这就是内嵌的循环中还可以嵌套循环,这就是多层循环多层循环3 3种循环种循环(while(while循环、循环、dodowhilewhile循环和循环和forfor循环循环)可以互相嵌套可以互相嵌套5.5 提前结束循环提前结束循环5.5.1 5.5.1
17、 用用breakbreak语句提前退出循环语句提前退出循环5.5.2 5.5.2 用用continuecontinue语句提前结束本次循环语句提前结束本次循环P1245.5.1 用用break语句提前退出循环语句提前退出循环在执行循环语句时,在正常情况下只要在执行循环语句时,在正常情况下只要满足给定的循环条件,就应当一次一次满足给定的循环条件,就应当一次一次地执行循环体,直到不满足给定的循环地执行循环体,直到不满足给定的循环条件为止。但是有些情况下,需要提前条件为止。但是有些情况下,需要提前结束循环。结束循环。P124 例例5.6 5.6 统计各班级学生的平均成绩。已统计各班级学生的平均成绩。
18、已知各班人数不等,但都不超过知各班人数不等,但都不超过3030人。编人。编一个程序能处理人数不等的各班学生的一个程序能处理人数不等的各班学生的平均成绩。平均成绩。解题思路:解题思路:u输入的成绩是负数时,表示本班数据已结束输入的成绩是负数时,表示本班数据已结束u接收到一个负的分数时就提前结束循环接收到一个负的分数时就提前结束循环u用用breakbreak语句实现提前结束循环语句实现提前结束循环#include void main()float score,sum=0,ave;int i,n;for(i=1;i31;i+)scanf(“%f”,&score);if(score0)break;su
19、m=sum+score;n=i-1;ave=sum/n;printf(“n=%d,ave=%7.2fn”,n,ave);负值,跳出循环负值,跳出循环非非负,负,累加累加100 80 70-1 n=3,ave=90.00break语句的一般形式为语句的一般形式为:break;只能用于循环语句和只能用于循环语句和switchswitch语句之中,而不能语句之中,而不能单独单独使用使用5.5.2 用用continue语句提前结束语句提前结束本次循环本次循环 continue语句的一般形式为语句的一般形式为:continue;其作用为结束其作用为结束本次本次循环,即跳过循环体循环,即跳过循环体中下面尚
20、未执行的语句,接着进行下一中下面尚未执行的语句,接着进行下一次是否执行循环的判断。次是否执行循环的判断。P1265.5.2 用用continue语句提前结束语句提前结束本次循环本次循环continuecontinue语句和语句和breakbreak语句的区别:语句的区别:ucontinuecontinue语句只结束语句只结束本次本次循环,而不是终止循环,而不是终止整个循环的执行整个循环的执行ubreakbreak语句结束语句结束整个整个循环过程,不再判断执循环过程,不再判断执行循环的条件是否成立行循环的条件是否成立 P126假假表达式表达式1 1真真表达式表达式2 2假假真真breakbrea
21、k语句语句强行退出循环强行退出循环while(while(表达式表达式1)1)if(if(表达式表达式2)2)breakbreak;假假表达式表达式1 1真真表达式表达式2 2假假真真continuecontinue语句语句只结束本次循环只结束本次循环while(while(表达式表达式1)1)if(if(表达式表达式2)2)continuecontinue;假假表达式表达式1 1真真表达式表达式2 2假假真真continuecontinue语句语句只结束本次循环只结束本次循环假假表达式表达式1 1真真表达式表达式2 2假假真真breakbreak语句语句强行退出循环强行退出循环 例例5.7
22、5.7 输入一个班全体学生的成绩,把不输入一个班全体学生的成绩,把不及格的学生成绩输出,并求及格学生的平及格的学生成绩输出,并求及格学生的平均成绩。均成绩。解题思路:解题思路:u在进行循环中,检查学生的成绩,把其在进行循环中,检查学生的成绩,把其中不及格的成绩输出,然后跳过后面总成中不及格的成绩输出,然后跳过后面总成绩的累加和求平均成绩的语句绩的累加和求平均成绩的语句u用用continucontinu语句处理语句处理#include void main()float score,sum=0,ave;int i,n=0;for(i=1;i6;i+)printf(“score:);scanf(“%
23、f”,&score);if(score60)printf(“Fail:%7.2fn”,score);continue;sum=sum+score;n=n+1;ave=sum/n;printf(“n=%d,ave=%7.2fn”,n,ave);不及格不及格输出成绩输出成绩跳过下面语句跳过下面语句score:89 score:56 Fail:56score:76 score:58 Fail:58score:98 n=3 ave=87.675.6 几种循环的比较几种循环的比较P128(1)(1)一般情况下一般情况下,3 3种循环可以互相代替种循环可以互相代替(2)(2)在在whilewhile和和d
24、o-whiledo-while循环中,循环循环中,循环体体应应包含使循环趋于结束的语句。包含使循环趋于结束的语句。(3)(3)用用whilewhile和和do-whiledo-while循环时,循环循环时,循环变量初始化的操作应在变量初始化的操作应在whilewhile和和do-do-whilewhile语句之前完成。而语句之前完成。而forfor语句可以在语句可以在表达式表达式1 1中实现循环变量的初始化。中实现循环变量的初始化。5.7 程序举例程序举例P128 例例5.8 5.8 有一对兔子,出生后第有一对兔子,出生后第3 3个月起每个个月起每个月都生一对兔子。小兔子长到第月都生一对兔子。
25、小兔子长到第3 3个月后每个月后每个月又生一对兔子。假设所有兔子都不死个月又生一对兔子。假设所有兔子都不死,问,问4040个月的兔子总数为多少?个月的兔子总数为多少?解题思路:这是一个有趣的古典数学问题解题思路:这是一个有趣的古典数学问题。可以从下表看出兔子繁殖的规律。可以从下表看出兔子繁殖的规律。第几个第几个月月小兔子小兔子对数对数中兔子中兔子对数对数老兔子老兔子对数对数兔子总兔子总数数1 11 10 00 01 12 20 01 10 01 13 31 10 01 12 24 41 11 11 13 35 52 21 12 25 56 63 32 23 38 87 75 53 35 513
26、13每个月的兔子总数依次为每个月的兔子总数依次为1,1,2,3,5,8,13是是费波那西费波那西(Fibonacci)数列数列特点:第特点:第1、2两个数为两个数为1、1 从第从第3个数开始个数开始,该数是其前面两个数之和该数是其前面两个数之和解题思路:这是一个有趣的古典数学问题解题思路:这是一个有趣的古典数学问题。可以从下表看出兔子繁殖的规律。可以从下表看出兔子繁殖的规律。每个月的兔子总数依次为每个月的兔子总数依次为1,1,2,3,5,8,13是是费波那西费波那西(Fibonacci)数列数列特点:第特点:第1、2两个数为两个数为1、1 从第从第3个数开始个数开始,该数是其前面两个数之和该数
27、是其前面两个数之和)3()2(1)1(12121nFFFnFnFnnnf1=f1+f2f2=f2+f1for i=1 to 20f1=1,f2=1输出输出f1,f2#include void main()long int f1,f2;int i;f1=1;f2=1;for(i=1;i i输出是素数输出是素数真真输出不是素数输出不是素数假假mm#include#include void main()int m,i,k;printf(“number:);scanf(“%d”,&m);k=(int)sqrt(m);for(i=2;ik)printf(%d primen,m);else printf(
28、%d not primen,m);number:17 17 prime 例例5.10 5.10 译密码。为使电文保密,往往按一译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定定规律将其转换成密码,收报人再按约定的规律将其译回原文。的规律将其译回原文。A B C D E F G W X Y ZA B C D E F G W X Y Z非字母字符保持原状不变非字母字符保持原状不变输入一行字符,要求输出其相应的密码输入一行字符,要求输出其相应的密码解题思路:解题思路:(1)(1)从字母从字母A A到到V V,只需将字,只需将字母母加上加上4 4就行就行 例如,例如,A+4A+4就是
29、就是EE(2)(2)从字母从字母W W到到Z Z,将字,将字母母加加4 4,再减去,再减去2626 W+4-26 W+4-26就是就是AA解题思路:解题思路:u输入一个字符给字符变量输入一个字符给字符变量c cu判定它是否字母判定它是否字母(包括大小写包括大小写),若不是字母,若不是字母,不改变不改变c c的值;若是字母,则使变量的值;若是字母,则使变量c c的值改变的值改变为其后第为其后第4 4个字母个字母u如果新的如果新的c c值值范围范围不在字母范围内,应减去不在字母范围内,应减去2626#include void main()char c;while(c=getchar()!=n)if
30、(c=a&c=A&cZ&cz)c=c-26;printf(%c,c);China!Glmre!5.8 提高部分提高部分5.8.1 while5.8.1 while和和dodowhilewhile循环的比较循环的比较5.8.2 for5.8.2 for语句的各种形式语句的各种形式P1325.8.1 while和和dowhile循环的比较循环的比较凡是能用凡是能用whilewhile循环处理循环处理的情况的情况,都能用,都能用dodowhilewhile循环处理循环处理dodowhilewhile循环结构可以转换成循环结构可以转换成whilewhile循循环结构环结构P1325.8.1 while
31、和和dowhile循环的比较循环的比较P132表达式表达式非非0(0(真真)0(假假)循环体语句循环体语句表达式表达式非非0(0(真真)0(假假)语句语句语句语句do while语句语句whilewhile语句语句5.8.1 while和和dowhile循环的比较循环的比较例例5.11 while5.11 while和和dodowhilewhile循环的比较循环的比较u以下两个程序,循环体是相同的以下两个程序,循环体是相同的u程序程序(1)(1)用用whilewhile循环循环u程序程序(2)(2)用用do-whiledo-while循环循环u运行时,在有的情况下结果相同,而另一些运行时,在有
32、的情况下结果相同,而另一些情况下结果不同,请仔细分析。情况下结果不同,请仔细分析。P132程序程序(1)#include void main()int s=0,i;scanf(“%d”,&i);while(i=10)s=s+i;i+;printf(“s=%d”,s);程序程序(2)#include void main()int s=0,i;scanf(“%d”,&i);do s=s+i;i+;while(i=10);printf(“s=%d”,s);1 s=55 再运行一次再运行一次:11 s=01 s=55 再运行一次再运行一次:11 s=11当当whilewhile后面的表达式的第一次的值
33、为后面的表达式的第一次的值为“真真”时,两种循环得到的结果相同;时,两种循环得到的结果相同;否则,二者结果不相同否则,二者结果不相同(相同循环体相同循环体时时)5.8.2 for语句的各种形式语句的各种形式在实际编程中,在实际编程中,forfor语句相当灵活,形式语句相当灵活,形式变化多样。变化多样。前面介绍过前面介绍过forfor语句的一般形式为语句的一般形式为for(for(表达式表达式1;1;表达式表达式2;2;表达式表达式3)3)语句语句P134for(表达式表达式1;表达式表达式2;表达式表达式3)语句语句表达式表达式1;for(;表达式表达式2;表达式表达式3)语句语句for(表达
34、式表达式1;表达式表达式3)if(表达式表达式2)语句语句for(表达式表达式1;表达式表达式2;)语句语句 表达式表达式3;for(表达式表达式1;表达式表达式2;表达式表达式3)语句语句表达式表达式1;for(;表达式表达式2;)语句语句 表达式表达式3;表达式表达式1;for(;)if(表达式表达式2)语句语句 表达式表达式3;for(表达式表达式1;表达式表达式2;表达式表达式3)语句语句可以是设置循环变量初值的赋值表达式可以是设置循环变量初值的赋值表达式也可以是与循环变量无关的其他表达式也可以是与循环变量无关的其他表达式for(表达式表达式1;表达式表达式2;表达式表达式3)语句语句
35、可以是与循环控制无关的任意表达式可以是与循环控制无关的任意表达式for(表达式表达式1;表达式表达式2;表达式表达式3)语句语句可以是一个简单的表达式可以是一个简单的表达式也可以是逗号表达式也可以是逗号表达式for(表达式表达式1;表达式表达式2;表达式表达式3)语句语句 一般是关系表达式或逻辑表达式一般是关系表达式或逻辑表达式也可以是数值表达式或字符表达式也可以是数值表达式或字符表达式只要其值为非只要其值为非0 0,就执行循环体,就执行循环体 for(i=0;(c=getchar()!=n;i+=c);作用:作用:不断输入字符,将它们的不断输入字符,将它们的ASCIIASCII码相加,直到输入一个码相加,直到输入一个“换行换行”符为止符为止for(表达式表达式1;表达式表达式2;表达式表达式3)语句语句 一般是关系表达式或逻辑表达式一般是关系表达式或逻辑表达式也可以是数值表达式或字符表达式也可以是数值表达式或字符表达式只要其值为非只要其值为非0 0,就执行循环体,就执行循环体 for(;(c=getchar()!=n;)printf(%c,c);作用作用:每读入一个字符后立即输出该每读入一个字符后立即输出该字符,直到输入一个字符,直到输入一个“换行换行”为止为止