您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第5章-循环结构程序设计-谭浩强第五版
第5章循环结构程序设计5.1程序中需要用循环结构5.2用while语句和do…while语句实现循环5.3用for语句实现循环5.4循环的嵌套5.5提前结束循环5.6几种循环的比较5.7程序举例5.8提高部分35.1程序中需要用循环结构现实生活中许多问题是需要重复处理计算一个班50学生每人的平均成绩工厂各车间的生产日报表全国各省市的人口统计分析各大学招生情况统计全校教职工工资报表45.2用while语句和do…while语句实现循环5.2.1用while语句实现循环5.2.2用do…while语句实现循环while语句的一般形式如下:while(表达式)语句“真”时执行循环体语句“假”时不执行循环条件表达式while循环的特点是:先判断条件表达式后执行循环体语句语句非0(真)表达式0(假)65.2.1用while语句实现循环例5.1求1+2+3+…+100,即解题思路:这是累加问题,需要先后将100个数相加要重复100次加法运算,可用循环实现后一个数是前一个数加1而得加完上一个数i后,使i加1可得到下一个数1001nn75.2.1用while语句实现循环sum=sum+ii=i+1非0(真)i1000(假)i=1#includestdio.hvoidmain(){inti,sum=0;i=1;while(i=100){sum=sum+i;i++;}printf(%d\n,sum);}复合语句能改为i100?95.2.2用do…while语句实现循环do---while语句的特点:先无条件地执行循环体,然后判断循环条件是否成立一般形式为:do循环体语句while(表达式);表达式非0(真)0(假)循环体语句当表达式的值为真循环体语句105.2.2用do…while语句实现循环例5.2用do…while循环求:1+2+3+…+100,即1001nn115.2.2用do…while语句实现循环解题思路:i≤100非0(真)0(假)sum=sum+ii=i+1sum=0i=1sum=0;i=1;do{sum=sum+i;i++;}while(i=100);i≤100sum=sum+ii=i+1sum=0,i=1#includestdio.hvoidmain(){inti,sum=0;i=1;do{sum=sum+i;i++;}while(i=100);printf(“%d\n”,sum);}5050#includestdio.hvoidmain(){inti,sum=0;i=1;while(i=100){sum=sum+i;i++;}printf(%d\n,sum);}135.8.1while和do…while循环的比较例5.11while和do…while循环的比较以下两个程序,循环体是相同的程序(1)用while循环程序(2)用do-while循环运行时,在有的情况下结果相同,而另一些情况下结果不同,请仔细分析。程序(1)#includestdio.hvoidmain(){ints=0,i;scanf(“%d”,&i);while(i=10){s=s+i;i++;}printf(“s=%d”,s);}程序(2)#includestdio.hvoidmain(){ints=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当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同;否则,二者结果不相同(相同循环体时)155.3用for语句实现循环5.3.1for语句的一般形式和执行过程5.3.2for循环程序举例for语句不仅可以用于循环次数已经确定的情况,还可以用于循环次数不确定而只给出循环结束条件的情况for语句完全可以代替while语句165.3.1for语句的一般形式和执行过程for语句的一般形式为for(表达式1;表达式2;表达式3)语句设置初始条件,只执行一次。可以为零个、一个或多个变量设置初值执行循环条件表达式,用来判定是否继续循环。在每次执行循环体前先执行此表达式,决定是否继续执行循环作为循环的调整器,例如使循环变量增值,它是在执行完循环体后才进行的17for语句的执行过程:(1)先求解表达式1(2)求解表达式2,若其值为真,执行循环体,然后执行下面第(3)步。若为假,则结束循环,转到第(5)步(3)求解表达式3(4)转回上面步骤(2)继续执行(5)循环结束,执行for语句下面的一个语句表达式2非0(真)0(假)求解表达式3求解表达式1语句for(i=1;i=100;i++)sum=sum+i;等价于i=1;while(i=100){sum=sum+i;i++;}用for语句更简单、方便195.4循环的嵌套一个循环体内又包含另一个完整的循环结构,称为循环的嵌套内嵌的循环中还可以嵌套循环,这就是多层循环3种循环(while循环、do…while循环和for循环)可以互相嵌套205.5提前结束循环5.5.1用break语句提前退出循环5.5.2用continue语句提前结束本次循环215.5.1用break语句提前退出循环在执行循环语句时,在正常情况下只要满足给定的循环条件,就应当一次一次地执行循环体,直到不满足给定的循环条件为止。但是有些情况下,需要提前结束循环。22break语句的一般形式为:break;只能用于循环语句和switch语句之中,而不能单独使用假表达式1真表达式2假真…………break语句强行退出循环while(表达式1){┇if(表达式2)break;┇}24例5.6统计各班级学生的平均成绩。已知各班人数不等,但都不超过30人。编一个程序能处理人数不等的各班学生的平均成绩。解题思路:输入的成绩是负数时,表示本班数据已结束接收到一个负的分数时就提前结束循环用break语句实现提前结束循环#includestdio.hvoidmain(){floatscore,sum=0,ave;inti,n;for(i=1;i31;i++){scanf(“%f”,&score);if(score0)break;sum=sum+score;}n=i-1;ave=sum/n;printf(“n=%d,ave=%7.2f\n”,n,ave);}负值,跳出循环非负,累加100↙80↙70↙-1↙n=3,ave=90.00265.5.2用continue语句提前结束本次循环continue语句的一般形式为:continue;其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判断。275.5.2用continue语句提前结束本次循环continue语句和break语句的区别:continue语句只结束本次循环,而不是终止整个循环的执行break语句结束整个循环过程,不再判断执行循环的条件是否成立假表达式1真表达式2假n=n+1真…………continue语句只结束本次循环while(表达式1){┇if(表达式2)continue;┇}假表达式1真表达式2假……真…………continue语句只结束本次循环假表达式1真表达式2假真…………break语句强行退出循环30例5.7输入一个班全体学生的成绩,把不及格的学生成绩输出,并求及格学生的平均成绩。解题思路:在进行循环中,检查学生的成绩,把其中不及格的成绩输出,然后跳过后面总成绩的累加和求平均成绩的语句用continu语句处理#includestdio.hvoidmain(){floatscore,sum=0,ave;inti,n=0;for(i=1;i6;i++){printf(“score:);scanf(“%f”,&score);if(score60){printf(“Fail:%7.2f\n”,score);continue;}sum=sum+score;n=n+1;}ave=sum/n;printf(“n=%d,ave=%7.2f\n”,n,ave);}不及格输出成绩跳过下面语句score:89↙score:56↙Fail:56score:76↙score:58↙Fail:58score:98↙n=3ave=87.67325.6几种循环的比较(1)一般情况下,3种循环可以互相代替(2)在while和do---while循环中,循环体应包含使循环趋于结束的语句。(3)用while和do---while循环时,循环变量初始化的操作应在while和do---while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。33例5.3募集慈善基金10000元,有若干人捐款,每输入一个人的捐款数后,计算机就输出当时的捐款总和。当某一次输入捐款数后,总和达到或超过10000元时,即宣告结束,输出最后的累加值。解题思路:设计一个循环结构,在其中输入捐款数,求出累加值,然后检查此时的累加值是否达到或超过预定值,如果达到了,就结束循环操作5.7程序举例#includestdio.hvoidmain(){floatamount,sum=0;do{scanf(%f,&amount);sum=sum+amount;}while(sum10000);printf(sum=%9.2f\n,sum);}循环执行的条件1000↙1850↙1500↙2600↙2500↙1200↙sum=10650.00例5.4在象棋的棋盘第1个格子中放1粒麦子,第2个格子中放2粒麦子,第3个格子中放4粒麦子,以后按此比例每一格加一倍,一直放到第64格(象棋的棋盘是8×8=64格),共放多少?麦子总粒数=1+2+22+23+…+2631m3=1.42×108粒#includestdio.hvoidmain(){doublep=1,t=1,v;inti;for(i=1;i64;i++){p=p*2;t=t+p;}v=t/1.42e8;printf(“total=%e\n”,t);printf(“volume=%e\n”,v);}p是当前一个格子中麦子粒数t是当前麦子总粒数v是总体积total=1.844674e+019volnme=1.299066e+011改为i=1;i=64;i++会怎样?改为i=0;i64;i++会怎样?例5.5人口增长预测。据2005年末统计,我国人口为130756万人,如果人口的年增长率为1%,请计算到哪一年中国总人口超过15亿。解题思路:假设原来人口为p0,则一年后的人口为:p=p0*(1+r),r是年增长率每算出一年的人口后就检查是否达到或超过15亿。如果未达到或超过,再计算下一年的人口,直到某一年的人口达到或超过15亿为止#includestdio.hvoidmain(){doublep=1.30756e9,r=0.01;inty;for(y=2006;p1.5e9;y++)p=p*(1+r);printf(year=%d,p=%e\n,y-1,p);}原来的值1年后的值year=2019,p=1.503007e+009注意不是y2019年达到15.03007亿人口计算1000年后的人口y=3006例5.8有一对兔子,出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假设所有兔子都不死,问40个月的兔子总数为多少?每个月的兔子总数依次为1,1,2,3,5,8,13…是费波那西(Fibonacci)数列特点:第1、2两个数为1、1从第3个数开始,该数是其前面两个数之和)3()2(1)1(12121nFFFnFnFnnnf1=f1+f2f2=f2+f1fori=1to38f1=1,f2=1输出f1,f2#includestdio.hvoidmain()
本文标题:第5章-循环结构程序设计-谭浩强第五版
链接地址:https://www.777doc.com/doc-3688754 .html