第五章循环结构程序设计.ppt

上传人:本田雅阁 文档编号:3118339 上传时间:2019-07-12 格式:PPT 页数:71 大小:852.53KB
返回 下载 相关 举报
第五章循环结构程序设计.ppt_第1页
第1页 / 共71页
第五章循环结构程序设计.ppt_第2页
第2页 / 共71页
第五章循环结构程序设计.ppt_第3页
第3页 / 共71页
第五章循环结构程序设计.ppt_第4页
第4页 / 共71页
第五章循环结构程序设计.ppt_第5页
第5页 / 共71页
点击查看更多>>
资源描述

《第五章循环结构程序设计.ppt》由会员分享,可在线阅读,更多相关《第五章循环结构程序设计.ppt(71页珍藏版)》请在三一文库上搜索。

1、第五章循环结构程序设计,往前走,直到到达目标为止,没到?,往前走,Y,N,只要.,5.1 程序中需要用循环结构,什么是循环?为什么要使用循环?,问题1:,问题2:求学生平均成绩 分数相加后除以课数,在许多问题中需要用到循环控制。循环结构就是用来处理需要重复处理的问题的,所以又称重复结构。它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。,循环条件 (结束条件) 循环的内容,循环要素:,实现循环的方式:,while do while for,计算1+2+3+100,5.2 用while语句和do-while语句实现循环 5.2.1 用while语句实现循环,while语句用来实现“当型”

2、循环结构 一般形式: while (表达式) 语句 当表达式为非0值时,执行while语句中的内嵌语句。其特点是:先判断表达式,后执行循环体,即内嵌语句。,while语句,循环体,while(表达式) 语句;,while语句,int main( ) int i,sum=0; i=1; while(i=100) sum+=i; i+; printf(“%dn”,sum); return 0; ,循环体,说明: (1)循环体如果包含一个以上的语句,应该用花括号括起来,以复合语句形式出现. (2)在循环体中应有使循环趋向于结束的语句。,运行结果: 5050,5.2.2 do while语句,格式:

3、do 语句串; while(表达式); 语义: 执行语句串直到表达式为假,do while语句,循环体,do 语句串; while(表达式);,int main( ) int i=1,sum=0; do sum+=i+; while(i=100); printf(“%d”,sum); return 0; ,do while语句,循环体,while和 do-while循环的比较,凡是能用while循环处理,都能用dowhile循环处理。dowhile循环结构可以转换成while循环结构。 在一般情况下,用while语句和用do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果

4、也一样。但是如果while后面的表达式一开始就为假(0值)时,两种循环的结果是不同的。,例5.11 while和do-while循环的比较 (1) (2) #include #include void main ( ) void main( ) int sum=0,i; int sum=0,i; scanf(“%d, ,运行结果: 1 sum=55 再运行一次: 11 sum=0,运行结果: 1 sum=55 再运行一次: 11 sum=11,说明:当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同。否则,二者结果不相同。,两类循环的对比,当型循环,直到型循环,说明:设计循

5、环结构,要考虑两个问题: 一是循环体,二是循环结束条件。注意while循环中判断的条件是循环继续的条件,而不是结束条件。,例如: for(i=1;i=100;i+) sum=sum+i;,相当于: i=1; while(i=100) sum=sum+i; i+; ,5.3 用for语句实现循环 5.3.1 for语句的一般形式和执行过程,格式: for(e1;e2;e3) s 语义: e1; while(e2) s; e3;,循环体,for(循环变量赋初值;循环条件;循环变量增值),for(e1;e2;e3) s,sum=0; for(i=1; i=100; i+) sum=sum+i;,fo

6、r(i=1,sum=0; i=100; sum=sum+i+);,for(i=1,sum=0; i=100; i+) sum=sum+i;,循环体,C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。 可以把循环体和一些与循环控制无关的操作也作为表达式1或表达式3出现,这样程序可以短小简洁。但过分地利用这一特点会使for语句显得杂乱,可读性降低,最好不要把与循环控制无关的内容放到for语句中。,16,在for和while语句之后一般没有分号 有分号表示循环体就是分号之前的内容,即循环体不存在

7、while (i 100); i+; for (i = 0; i 100; i+); printf(“%d“, i); for通常有一个循环变量控制循环的次数,不要在循环体内改变这个变量,注意,17,如果循环次数已知,用for 如果循环次数未知,用while 如果循环体至少要执行一次,用do-while 只是思路,不是定律,选择三种循环的一般思路,18,输入全班N个人的分数,求出最高分,#include #define N 10 main( ) int i,max=0,score; printf(“input %d score:”, N); for(i=0; imax) max=score;

8、printf(“max=%dn”,max); ,19,输入全班N个人的分数,求出最高分,#define N 10 main( ) int i,max=0,score; printf(“input %d score:”,N); i=1; while(imax) max=score; i+; printf(“max=%dn”,max); ,人口增长预测。据2005年末统计,我国人口为 130756万人,如果人口的年增长率为1%,请计算到 哪一年中国总人口超过15亿。,例题 5.5,解题思路,计算人口增长和计算存款利息的公式是相同的。假 设原来人口为p0 ,则一年后的人口: 其中r是年增长率。用此公

9、式依次计算出每年的人 口,每算出一年的人口后就检查一下是否达到或超 过15亿?如果未达到或超过15亿,就再计算下一年 的人口,直到某一年的人口达到或超过15亿为止。,编写程序,#include void main() double p=1.30756e9,r=0.01; int y; for(y=2006; p1.5e9; y+) /* 赋值号两侧的变量p代表不同含义 */ p=p*(1+r); printf(“year=%d,p=%en“,y-1,p); ,运行结果: year=2019,p=1.503007e+009,说明: y代表年份。循环体中只有一个语句,用来计算从2006年开始的各年

10、的人口数。在for语句中设定的循环条件是p15亿,当某一年的p达到或超过15亿,就停止循环,输出年份和当年的人口数。由于在最后结束循环前y又加了1,因此在输出年份时应输出y-1的值而不是y的值。,一个变量开始时有一初值,通过一定的运算, 可以推算出一个新的值,再从这个新值又推出下一 个新值,即不断用计算出的新值去取代原有的值, 这种方法称为迭代。上面的计算公式p=p*(1+r)称迭 代公式。迭代算法一般是用循环来实现的。迭代是一 种常用的算法,用人工实现很麻烦,而用计算机实现 却十分方便。,总结: 要写出一个正确的循环结构, 对循环控制变量要做三方面的工作: 1、对循环控制变量赋初值。 2、将

11、循环控制变量写入正确的控制条件。 3、对循环控制变量值的更新。 如 x=1; /* 给x赋初值 */ while(x10) /*循环条件*/ s=s+x; x+; /*对x的值做更新、调整*/ ,找问题:,(1) while(count!=10); count=1; sum=sum+x; count=count+1; ,(2) name=10; doname=name+1; printf(“ok”); while(name=1),5.4 循环的嵌套,一个循环体内又包含另一个完整的循环结构称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。 三种循环(while循环、do-while循环

12、和for循环)可以互相嵌套。,5.4 循环的嵌套,下面几种都是合法的形式: (1) while( ) (2) do (3) for(;) while( ) do for(;) while( ); while( );,5.4 循环的嵌套,(4) while( ) (5) for(;) (6) do do while( ) for(;) while( ) while( ),s=0; for(i=0; i10; i+) for(j=0; j10; j+) s+=i*10+j; printf(“s=%dn”,s);,读程序?,s=0; for(i=0; i10; i+); for(j=0; j10;

13、j+); s+=i*10+j;,区别!,s=0; for(i=0; i10; i+) for(i=0; i10; i+) s+=i*10+i;,s=0; for(i=0; i10; i+) for(j=0; j10; j+) s+=i*10+j;,31,编程输出如下形式的乘法九九表,32,#include main() int m, n; for (m=1; m10; m+) printf(“%4d“, m); /*打印表头*/ printf(“n“); for (m=1; m10; m+) printf(“ -“); printf(“n“); for (m=1; m10; m+) for (

14、n=1; n10; n+) printf(“%4d“, m*n); printf(“n“); ,33,将上例输出格式改成如下的下三角格式打印,34,#include main() int m, n; for (m=1; m10; m+) printf(“%4d“, m); /*打印表头*/ printf(“n“); for (m=1; m10; m+) printf(“ -“); printf(“n“); for (m=1; m10; m+) for (n=1; n=m; n+) printf(“%4d“, m*n); printf(“n“); ,5.5 提前结束循环 5.5.1 用break

15、语句提前退出循环,break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。 一般形式: break; 说明: break语句不能用于循环语句和switch语句之外的任何其他语句中。,统计各班级的学生的平均成绩。已知各班人数 不等,但都不超过30人。编一个程序能处理人数不 等的各班学生的平均成绩。,例题 5.6,解题思路,如果各班人数相同,问题比较简单,只需用一 个for语句控制即可: for(i=1;i31;i+) 但是现在有的班不足30人,应当设法告诉计算 机本班的人数,使程序也能统计出该班的平均成绩 。可以约定,当输入的成绩是负数时,就表示本班 数据已结束(一般

16、情况下成绩不会是负数)。在程序 接收到一个负的分数时就提前结束循环,计算出本 班平均成绩。 用break语句可以用来实现提前结束循环。,5.5 提前结束循环,编写程序,5.5 提前结束循环,#include void main() float score,sum=0,average; int i,n; for(i=1; i31; i+) scanf(“%f“, ,运行结果: 100 (输入一个学生成绩) 80 70 -1 (输入负数,表示本班数据结束) n=3,average= 90.00,说明: 如果一个班有30人,则输入完30人的成绩后累计总分后自动结束循 环,不必再输入负数作为结束标志。

17、在结束循环后i的值等于31(因为执 行完30次循环后,i再加1,变成31,此时才终止循环),因此学生数n应 该等于i-1。 如果一个班人数少于30人,则在输入完全班学生的成绩后,输入一 个负数,此时程序就跳过循环体其余的语句,也不再继续执行其余的几 次循环。直接跳到循环下面的语句(n=i-1;)继续执行。刚输入的数不进 行累加(不执行sum=sum+score;)。注意此时i的值,假如已输入了25个 有效分数,在第26次循环时输入一个负数,此时i的值是26,而学生数n 应是i-1。,5.5 提前结束循环,5.5 提前结束循环 5.5.2 用continue语句提前结束本次循环,continue

18、语句作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定. 一般形式: continue;,5.5 提前结束循环 5.5.2 用continue语句提前结束本次循环,continue语句和break语 句的区别: continue语句只结束本 次循环,而不是终止整个 循环的执行。,while(表达式1) if(表达式2) continue; ,continue语句和break语 句的区别: break语句则是结束整个 循环过程,不再判断执行循 环的条件是否成立。,while(表达式1) if(表达式2) break; ,5.5 提前结束循环 5.5.2 用co

19、ntinue语句提前结束本次循环,输入一个班全体学生的成绩,把不及格的学生 成绩输出,并求及格学生的平均成绩。,例题 5.7,解题思路,在进行循环中,检查学生的成绩,把其中不及 格的成绩输出,然后跳过后面总成绩的累加和求平 均成绩的语句。用continu语句即可处理此问题。,5.5 提前结束循环,#include void main() float score,sum=0,average; int i,n=0; for(i=1; i6; i+) /* 假设有5个学生 */ printf(“please enter score:“); scanf(“%f“, /* 及格学生平均分数 */ /*

20、输出及格学生人数和平均分数 */ printf(“nn=%d,average=%7.2fn“,n,average ,运行结果: please enter score:89 please enter score:56 Fail:56 please enter score:76 please enter score:58 Fail:58 please enter score:98 n=3 average=87.67,5.5 提前结束循环,编写程序,说明: 输入不及格学生成绩后,输出该成绩,然后跳过循 环体中未执行的语句,即不参加累计总分sum,也 不累计合格学生数n。但是,继续执行后面的几次 循环

21、。,5.5 提前结束循环,5.6 几种循环的比较,(1)三种循环都可以用来处理同一问题,一般情 况下它们可以互相代替。 (2)在while循环和do-while循环中,只在while 后面的括号内指定循环条件,因此为了使循环 能正常结束,应在循环体中包含使循环趋于结 束的语句(如i+,或i=i+1等)。,5.6 几种循环的比较,for循环可以在表达式3中包含使循环趋于结 束的操作,甚至可以将循环体中的操作全部 放到表达式3中。因此for语句的功能更强, 凡用while循环能完成的,用for循环都能实 现。 (3)用while和do-while循环时,循环变量初 始化的操作应在while和do-

22、while语句之前完 成。而for语句可以在表达式1中实现循环变 量的初始化。,5.6 几种循环的比较,(4) while循环、dowhile循环和for循 环,都可以用break语句跳出循环,用 continue语句结束本次循环 。,有一对兔子,出生后第3个月起每个月都生一对兔 子。小兔子长到第3个月后每个月又生一对兔子。假 设所有兔子都不死,问40个月的兔子总数为多少?,例题 5.8,解题思路,5.7 程序举例,可以看到每个月的兔子总数依次为 1,1,2,3,5,8,13 这就是有名的费波那西(Fibonacci)数列。,5.7 程序举例,编写程序,5.7 程序举例,#include vo

23、id main() long int f1,f2; int i; f1=1;f2=1; for(i=1; i=20; i+) printf(“%12ld %12ld “,f1,f2); if(i%2=0) printf(“n“); f1=f1+f2; f2=f2+f1; ,运行结果: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5

24、7022887 9227465 14930352 24157817 39088169 63245986 102334155,说明: (1)变量f1和f2用长整型,在printf函数中输出格式 符用“%12ld”,而不是用“%12d”,这是由于在第 23个数后,整数值已超过整数最大值32767,因此必 须用长整型变量才能容纳,并用“%ld”格式输出。 (2)if语句的作用是使输出4个数后换行。i是循环变 量,当i为偶数时换行,而i每增值1,就要计算和输 出2个数(f1,f2),因此i每隔2换一次行相当于每输 出4个数后换行输出。,5.7 程序举例,给一个整数m,判断它是否素数。,例题 5.9,解

25、题思路,5.7 程序举例,让m被i(i由2变到k= )除,如果m能被某一个 i(2k之间的任何一个整数)整除,则m必然不是素 数,不必再进行下去。此时的i必然小于或等于k; 如果m不能被2-k之间的任一整数整除,则m应是素 数,此肘在完成最后一次循环后,使i再加1,因此 i的值就等于k+1,这时才终止循环。在循环结束之 后判别i的值是否大于或等于k+1,若是,则表明未 曾被2-k之间任一整数整除过,因此输出“是素数”。,53,判断m是否是素数,输入m,判断m是否是素数,输出结果,一个自然数,若除了1和它本身外不能被其他整数整除,则称为素数。,54,k=sqrt(m),i=2,i=k,i能被m整

26、除,m不是素数,i+,y,N,m是素数,y,N,ik,y,N,#include #include void main() int m,i,k; printf(“please enter a integer number:”); scanf(“%d”, ,编写程序,5.7 程序举例,运行结果: please enter a integer number: 17 17 is a prime number.,译密码。为使电文保密,往往按一定规律将 其转换成密码,收报人再按约定的规律将其译回 原文。,例题 5.10,解题思路,5.7 程序举例,可以按以下规律将电文变成密码:将字母A变成字母E,a变成e

27、,即变成其后的第4个字母,W变成A,X变成B,Y变成C,Z变成D。,ABCDEFGHIJKLMNOPQRSTUVWXYZ,#include void main() char c; while(c=getchar()!=n) /* 判定c是否字母 */ if(c=a ,编写程序,5.7 程序举例,运行结果: China! Glmre!,说明: 内嵌的if语句不能写成: if( cZ| cz) /* 请和程序笫7行比较 */ c=c-26; 因为如果所有小写字毋都满足“cZ”的条件, 从而也都执行“c=c-26;”语句,这就会出错。因此 必须限制其范围为“cZ & c=Z+4”,即 原字母为W到Z

28、。只有符合此条件才减26,否则,不 应按此规律转换。,5.7 程序举例,5.8 提高部分 5.8.2 for语句的各种形式,for语句相当灵活,形式变化多样: (1) for语句的一般形式中的“表达式1”可以省略, 此时应在for语句之前给循环变量赋初值。注意省 略表达式1时,其后的分号不能省略。如: for(;i=100;i+) sum=sum+i; 执行时,跳过“求解表达式1”这一步,其他不变。,(2) 如果表达式2省略,即不判断循环条件,循 环无终止地进行下去。也就是认为表达式2始终 为真。如: for(i=1; ;i+) sum=sum+i; 表达式1是一个赋值表达式,表达式2空缺。

29、它相当于: i=1; while(1) sum=sum+1;i+;,5.8 提高部分 5.8.2 for语句的各种形式,(3) 表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如: for(i=1;i=100;) sum=sum+i;i+; 在上面的for语句中只有表达式1和表达式2,而没有表达式3。i+的操作不放在for语句的表达式3的位置处,而作为循环体的一部分,效果是一样的,都能使循环正常结束。,5.8 提高部分 5.8.2 for语句的各种形式,(4) 可以省略表达式1和表达式3,只有表达式2,即 只给循环条件。如: for(;i=100;) while(i=100)

30、 sum=sum+i; 相当于 sum=sum+i; i+; i+; 在这种情况下,完全等同于while语句。可见for 语句比while语句功能强,除了可以给出循环条件外 ,还可以赋初值,使循环变量自动增值等。,5.8 提高部分 5.8.2 for语句的各种形式,(5) 3个表达式都可省略,如: for(; ;) 语句 相当于 while(1) 语句 即不设初值,不判断条件(认为表达式2为真 值),循环变量不增值。无终止地执行循环体。,5.8 提高部分 5.8.2 for语句的各种形式,(6) 表达式1可以是设置循环变量初值的赋值表达 式,也可以是与循环变量无关的其他表达式。如: for (

31、sum=0;i=100;i+) sum=sum+i; 表达式3也可以是与循环控制无关的任意表达式。,5.8 提高部分 5.8.2 for语句的各种形式,表达式1和表达式3可以是一个简单的表达式,也 可以是逗号表达式,即包含一个以上的简单表达 式,中间用逗号间隔。如: for(sum=0,i=1;i=100;i+) sum=sum+i; 或 for(i=0,j=100;i=j;i+,j-) k=i+j; 表达式1和表达式3都是逗号表达式,各包含两个 赋值表达式,即同时设两个初值,使两个变量增 值。,5.8 提高部分 5.8.2 for语句的各种形式,在逗号表达式内按自左至右顺序求解,整个 逗号表

32、达式的值为其中最右边的表达式的值。如: for(i=1;i=100;i+,i+) sum=sum+i; 相当于 for(i=1;i=100;i=i+2) sum=sum+i;,5.8 提高部分 5.8.2 for语句的各种形式,(7) 表达式一般是关系表达式(如i=100)或逻辑 表达式(如ab & xy),但也可以是数值表达式 或字符表达式,只要其值为非零,就执行循环体。,5.8 提高部分 5.8.2 for语句的各种形式, for(i=0;(c=getchar()!=n;i+=c); 在表达式2中先从终端接收一个字符赋给c,然后判 断此赋值表达式的值是否不等于n(换行符), 如果不等于n,

33、就执行循环体。 注意:此for语句的循环体为空语句,把本来要在循 环体内处理的内容放在表达式3中,作用是一样的。 可见for语句功能强,可以在表达式中完成本来应在 循环体内完成的操作。,5.8 提高部分 5.8.2 for语句的各种形式, for( ;(c=getchar()!=n;) printf(%c,c); for语句中只有表达式2,而无表达式1和表达式3 。其作用是每读入一个字符后立即输出该字符,直到 输入一个“换行”为止。请注意,从终端键盘向计算机输入时,是在按Enter键以后才将一批数据一起送到内存缓冲区中去的。,运行情况: Computer (输入) Computer (输出) 而不是 Ccoommppuutteerr,5.8 提高部分 5.8.2 for语句的各种形式,实验五-1 循环结构程序设计 1、输入并运行教材第5章中的例题5.1,5.3,5.5并分析观察运行结果。 2、教材第5章中的习题 6。,实验五-2 循环结构程序设计 1、输入并运行教材第5章中的例题5.7,5.9并分析观察运行结果。 2、教材第5章中的习题 1。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1