[工学]第05章-循环结构程序设计课件.ppt

上传人:牧羊曲112 文档编号:4013538 上传时间:2023-04-01 格式:PPT 页数:73 大小:1.11MB
返回 下载 相关 举报
[工学]第05章-循环结构程序设计课件.ppt_第1页
第1页 / 共73页
[工学]第05章-循环结构程序设计课件.ppt_第2页
第2页 / 共73页
[工学]第05章-循环结构程序设计课件.ppt_第3页
第3页 / 共73页
[工学]第05章-循环结构程序设计课件.ppt_第4页
第4页 / 共73页
[工学]第05章-循环结构程序设计课件.ppt_第5页
第5页 / 共73页
点击查看更多>>
资源描述

《[工学]第05章-循环结构程序设计课件.ppt》由会员分享,可在线阅读,更多相关《[工学]第05章-循环结构程序设计课件.ppt(73页珍藏版)》请在三一办公上搜索。

1、2023/4/1,1,第五章 循环结构,5.1 while语句5.2 do-while语句5.3 for 语句5.4 break、continue和goto语句5.5 循环的嵌套5.6 复合结构程序举例,2,2023/4/1,C语言有while、do-while、和for语句三种循环结构语句。前两个称为条件循环,即根据条件来决定是否继续循环;后一个称为计数循环,即根据设定的执行次数来执行循环。,在许多问题中需要用到循环控制。例如,要输入全校学生成绩;求若干个数之和;迭代求根等。几乎所有实用的程序都包含循环。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本

2、构造单元。因此熟练掌握选择结构和循环结构的概念及使用是程序设计的最基本的要求。,3,2023/4/1,5.1 while语句,1While语句的一般形式,while(表达式)语句,首先计算表达式,当表达式为非0时,执行while语句中的内嵌语句;然后重新计算表达式,如果表达式的值为0,则跳出循环。,2while语句的执行流程,注意:如果表达式的值一开始就为0,则语句一次也会被不执行。,4,2023/4/1,特点:先判断表达式,后执行循环体说明:循环体有可能一次也不执行循环体可为任意类型语句下列情况,退出while循环条件表达式不成立(为零)循环体内遇break,return,goto无限循环:

3、while(1)循环体;,5,2023/4/1,while语句举例,例1:求n,100,n1,main()int i,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(“%d”,sum);,6,2023/4/1,例2:显示110的平方,#include main()int i=1;while(i=10)printf(%d*%d=%dn,i,i,i*i);i+;,运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=100,7,2023/4/1,注意:,(1)循环体如果包含一个以上的语句,应该

4、用花括弧括起来,以复合语句形式出现。如果不加花括弧,则 while语句的范围只到 while后面第一个分号处。,(2)在循环体中应有使循环趋向于结束的语句。如果无此语句,则i的值始终不改变,循环永不结束。,8,2023/4/1,5.2 dowhile语句,1dowhile语句的一般形式为:,do 循环体语句 while(表达式);,2dowhile语句的执行流程,9,2023/4/1,dowhile语句执行过程,首先执行语句,再计算表达式。如果表达式的值为非零,继续下一次循环,如果表达式的值为0,则跳出循环。,如果表达式的值一开始就为0,也会执行一次语句。,10,2023/4/1,例 用dow

5、hile循环求,#include main()int i,sum=0;i=1;do sum+=i;i+;while(i=100);printf(%d,sum);,11,2023/4/1,例 while和dowhile比较,#include main()int i,sum=0;scanf(%d,#include main()int i,sum=0;scanf(%d,思考:这两个程序完全一样吗?,12,2023/4/1,结论:,当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同,否则两者结果不相同(指两者具有相同的循环体的情况)。,13,2023/4/1,例如:i=1;whil

6、e(i=100)putchar(*);i+;思考:这个程序段有如何的运行结果?,14,2023/4/1,注意:循环控制变量值在循环体内必须有所改变。,例如:i=1;while(i=100)putchar(*);i+;,这个循环永远不会结束,因为循环控制变量i没有在循环体内被改变,i+;不属于循环语句。,i+应该在循环体内改变:,i=1;while(i=100)putchar(*);i+;,15,2023/4/1,举例:,#include main()float score,average=0;int n=0;do scanf(“%f”,思考:该程序是什么功能?,16,2023/4/1,for循

7、环语句是C语言中功能最强的循环语句,它有多个变化形式,并且可以很方便的代替其它的循环语句。,5.3 for语句,for语句的一般形式 for(表达式1;表达式2;表达式3)循环体语句,17,2023/4/1,先计算初值表达式1,它主要用于循环开始前设置变量初值;接着计算循环控制逻辑表达式2,它控制循环条件,决定循环次数;如果表达式2为真,则执行循环体语句,否则结束for循环;求解表达式3,它主要是对循环控制变量进行修改。转步骤执行。,for执行流程,18,2023/4/1,求 1+2+99,#include(stdio.h)main()int i,s=0;/*s清0*/for(i=1;i100

8、;i+)s=s+i;printf(“s=%d”,i;),例:,19,2023/4/1,for语句说明,(1)for语句的一般形式中的“表达式1”可以省略,注意省略表达式 1时,其后的分号不能省略。如 for(;i=100;i)sum=sumi;执行时,跳过“求解表达式1”这一步,其他不变。,(2)如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。例如:for(i=1;i+)sum=sum+i;它相当于:i=1;while(1)sum=sum+1;i+;,20,2023/4/1,for语句说明2,(3)表达式3也可以省略,但此时程序设计者应另外设法保证循环能正

9、常结束。如:for(il;i100;)sum=suml;i;,(4)可以省略表达式1和表达式3,只有表达式2,即只给循环条件。如:for(;i100)while(i100)sumsuml;相当于 sumsuml;i;i;,21,2023/4/1,for语句说明3,(5)3个表达式都可省略,如:for(;)语句 相当于 while(1)语句 即不设初值,不判断条件(认为表达式2为真值),循环变量不增值。无终止地执行循环体。,(6)表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。如:for(sum=0;i=100;i)sum=sum+i;表达式1和表达式3可以是一个

10、简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。如:for(sum=0,i=1;i=100;i+)sum=sum+i;或 for(i=0,j=100;i=j;i+,j-)k=i+j;,22,2023/4/1,for语句说明4,(7)表达式2一般是关系表达式(如 i=100)或逻辑表达式(如ab&xy),但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。分析下面两个例子:,for(;(c=getchar()!=n;)printf(“%c”,c);,for(i=0;(c=getchar()!=n;i+=c);此 for语句的执行过程见图,它的作用是不断输

11、入字符,将它们的ASCII码相加,直到输入一个“换行”符为止。,23,2023/4/1,例:#include main()int i=0;for(i=0;i10;i+)putchar(a+i);,运行结果:abcdefghij,例:#include main()int i=0;for(;i10;i+)putchar(a+i);,24,2023/4/1,运行结果:abcdefghij,例:#include main()int i=0;for(;i10;)putchar(a+(i+);,例:#include main()int i=0;for(;i10;putchar(a+i),i+);,25,2

12、023/4/1,举例,问题:求 s=1/99+2/98+1,#include main()int i,j;float s=0.0;for(i=1,j=99;i=j;i+,j-)s=s+i/j;printf(“s=1/99+2/98+1=%f”,s);,思考:上面程序的运行结果是多少?,为什么?,26,2023/4/1,举例,问题:求 s=1/99+2/98+1,#include main()int i,j;float s=0.0;for(i=1,j=99;i=j;i+,j-)s=s+i/j;printf(“s=1/99+2/98+1=%f”,s);,思考:上面程序的运行结果是多少?,程序的运行

13、结果是:s=1/99+2/98+1=1.000000,为什么?,27,2023/4/1,5.4 break、continue、goto语句,这一类语句的功能是改变程序的结构,使程序从其所在的位置转向另一处。这类语句是非结构化语句,28,2023/4/1,非结构化语句之break,它的作用是把流程转向所在结构之后。在switch分支结构中,使用break语句可以使流程跳出switch分支结构。同样的,在循环结构中,使用break语句使流程跳出当前的循环层,转向执行该循环结构后面的语句。,简单的说就是跳出当前所在的结构,break语句不能用于循环语句和switch语句之外的任何其他语句中。brea

14、k只能终止并跳出最近一层的结构,29,2023/4/1,30,2023/4/1,31,2023/4/1,main()int s=0,i=1:for(;)s=s+i;i+;if(i100)break;/*如果 i100,则退出循环*/printf(“s=%d”,s);本程序中,当i100时,强行终止for循环,继续执行for语句下一条语句,例如:,32,2023/4/1,例 break举例:输出圆面积,面积大于100时停止,#define PI 3.14159main()int r;float area;for(r=1;r100)break;printf(r=%d,area=%.2fn,r,ar

15、ea);,33,2023/4/1,例 break举例:小写字母转换成大写字母,直至输入非字母字符,34,2023/4/1,例 break举例:小写字母转换成大写字母,直至输入非字母字符,#include main()int i,j;char c;while(1)c=getchar();if(c=a,35,2023/4/1,非结构化语句之continue,continue语句被称为继续语句。执行continue语句,使本次循环提前结束,即跳过循环体中continue语句下面的尚未执行的循环体语句,但不结束整个循环,继续进行下一次循环的条件判别,条件为真,继续进行执行循环语句。该语句形式为:con

16、tinue;,36,2023/4/1,continue语句功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断仅用于循环语句中,37,2023/4/1,例:显示输入的字符,如果按的是Esc键,则退出循环;如果按的是Enter键,则不做任何处理,继续输入下一个字符。,#include“conio.h”main()char ch;for(;)ch=getchar();/*字符输入函数*/if(ch=27)/*Esc键的ACSII码为27*/break;/*退出循环*/if(ch=13)continue;/*按的是Enter:键,跳过字符输出语句*/putchar(ch);

17、/*显示输入的字符*/getch();/*让程序停一下,拍任意键继续*/,38,2023/4/1,例 求输入的十个整数中正数的个数及其平均值,39,2023/4/1,例 求输入的十个整数中正数的个数及其平均值,/*ch5_12.c*/#include main()int i,num=0,a;float sum=0;for(i=0;i10;i+)scanf(%d,40,2023/4/1,非结构化语句之goto,goto被称为无条件转移语句。由两部分组成goto 标号;和 标号:语句,它最大的好处就是可以一下子跳出多重循环,而break却不能做到这点。,41,2023/4/1,#include“s

18、tdio.h”main()float score,average=0;int n=0;scanf(“%f”,&score);/*输入第一个学生的分数*/if(score=0)/*表达式为非0,转移到loop标号处*/goto loop;average=average/n;/*求平均成绩average*/end:printf(“%6.2f”,average);/*输出平均成绩,保留两位小数*/,42,2023/4/1,例:,main()int i,sum=0;i=1;loop:if(i=100)sum=sum+i;i+;goto loop;printf(“%d”,sum);,运行结果如下:505

19、0,43,2023/4/1,程序举例(P124 例6.6),分子:1,-1,1,-1分母:1,3,5,7,.,44,2023/4/1,例 求Fibonacci数列:1,1,2,3,5,8,的前40个数,45,2023/4/1,程序如下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;,46,2023/4/1,例 判断m是否素数,47,2023/4/1,5.5 循环的嵌套,在循环体语句中又有另一个完整的循环结构的形式,

20、称为循环的嵌套。嵌套在循环体内的循环语句称为内循环,外面的循环语句称为外循环。如果内循环体中又有嵌套的循环语句,称为多层循环。While、do-while、for三种循环都可以互相嵌套。循环嵌套的程序中,要求内循环必须被包含在外层循环的循环体中,不允许出现内外层循环体交叉的情况。,48,2023/4/1,下面几种情况均为合法的形式,while()while(),(2)do do while();while();,(3)for(;)for(;),(4)while()do while();.,49,2023/4/1,(5)for(;).while().,(6)do for(;)while();,注

21、意:在循环嵌套中,内循环必须在外循环开始循环之前结束。,50,2023/4/1,循环嵌套举例,问题:输出图形*,分析:一共6行,每行的*数目与行号相同算法:行用 i 表示,当 i=6 则输出 i 个*换行,int i,j;for(i=1;i7;i+)printf(n);for(j=1;j=i;j+)putchar(*);,51,2023/4/1,输出结果:,执行语句段:for(i=0;i6;i+)for(j=0;j6;j+)printf(“%3d%3d”,i,j);putchar(n);,例:,52,2023/4/1,00 01 02 03 04 0510 11 12 13 14 1520 2

22、1 22 23 24 2530 31 32 33 34 3540 41 42 43 44 4550 51 52 53 54 55,输出结果:,执行语句段:for(i=0;i6;i+)for(j=0;j6;j+)printf(“%3d%3d”,i,j);putchar(n);,例:,53,2023/4/1,问题:输出图形*,分析:一共4行,每行*个数是1,3,5,7,如果考虑第4行输出不空格,则每行输出*之前的空格数为3,2,1,如果用i表示每行输出*的个数,则输出空格数与i的关系为(7-i)/2,所以:,#include main()int i,j;for(i=1;i=7;i+=2)print

23、f(“n”);for(j=1;j=(7-i)/2;j+)putchar();/*输出(7-i)/2个空格*/for(j=1;j=i;j+)putchar(*);/*输出i 个*/,2023/4/1,54,方法二:若将行号k看成是1,2,3,4;那么可以发现每行的空格数3,2,1,0即为4-k;每行的*数目1,3,5,7即为2*k-1;所以可以编程如下:Main()int k,j;printf(“n”);for(k=1;k0;j-)printf(“);for(j=1;j=2*k-1;j+)printf(“*”);printf(“n”);,55,2023/4/1,5.6 几种循环的比较,(1)四种

24、循环都可以用来处理同一问题,一般情况下它们可以互相代替。但一般不提倡用goto型循环。,(2)while和 dowhile循环,只在 while后面指定循环条件,在循环体中应包含使循环趋于结束的语句(如 i,或i=i1等)。for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。,56,2023/4/1,比较,(4)while循型、dowhile循环和 for循环,可以用 break语句跳出循环,用 continue语句结束本次循环。而对用 goto语句和 if语句构成的循环,不

25、能用break语句和continue语句进行控制。,(3)用 while和 dowhile循环时,循环变量初始化的操作应在 while和dowhile语句之前完成。而 for语句可以在表达式 1中实现循环变量的初始化。,57,2023/4/1,5.7复合程序结构及举例,C语言允许循环语句与分支结构语句联用,即在循环体包含一个完整的分支结构,这样的程序结构被称为复合程序结构。复合程序结构同样必须做到嵌套层次清楚,决不允许出现嵌套层次之间相互交叉的情况。,58,2023/4/1,例1,用C语言编程打印1到10的乘法表。,main()int j,k;printf(1 2 3 4 5 6 7 8 9

26、10 n);printf(-n);for(j=1;j=10;j+)printf(%4d|,j);for(k=1;k=10;k+)printf(%4d|,j*k);printf(n);,59,2023/4/1,例2,用C语言编程实现从键盘输入一个数字串,然后把它变成一个实数输出。,分析:首先要判断输入的是否是数字还是.;使用函数isdigit()。采用getchar()函数进行输入,输入的字符常量是ASCII码的值,怎样转换成对应的十进制数字?先输入的是高位数字,后输入的是低位数字,怎样处理?整数与小数的不同处理方式:123=1*102+2*10+3,0.456=4*10-1+5*10-2+6*

27、10-3,60,2023/4/1,例4解,#include#include#define POINT./*注意不能是“.”*/main()int c,j,digitcount=0;double value=0,fracdigit;while(isdigit(c=getchar()value=value*10;value=value+(c-0);if(c=POINT)while(isdigit(c=getchar()digitcount+;fracdigit=c-0;for(j=0;jdigitcount;j+)fracdigit=fracdigit/10;value=value+fracdig

28、it;printf(n%fn,value);,61,2023/4/1,例3,猴子吃桃子问题。P129 6.10,猴子一天摘下若干个桃子,当即吃了一半,还不过瘾又多吃了一个;第二天又将剩余的桃子吃掉一半,后又多吃了一个;以后每天都吃前天剩余的一半另多吃一个;到第10天想吃时,发现只剩下一个桃子,求它第一天共摘了多少桃子?,分析:第10天 1 第9天 4 第8天 10 第7天 22,则:第i天桃子数应该是第(i+1)天桃子数加1后的2倍。即知道第10天可以求出第9天,知道第9天可以求出第8天,这样迭代下去,可以求出第1天。,62,2023/4/1,例5解,main()int day,x1,x2;d

29、ay=10;x1=1;while(day0)x2=(x1+1)*2;x1=x2;day-;printf(“Total=%dn,x2);,63,2023/4/1,例 译密码,例如 Hello,world!译成密码:Lipps,asvph!,64,2023/4/1,#includemain()char c;while(c=getchar()!=n)if(c=a,2023/4/1,65,例:求n!main()float t=1;int j,n;scanf(“%d”,例:求1!+2!+20!(p129 6.4),2023/4/1,66,main()float t=1,s=0;int k,j;for(j

30、=1;j=20;j+)t=1;for(k=1;k=j;j+)t=t*k;s=s+t;printf(“result is%f”,s);,2023/4/1,67,例:因子之和等于本身的数称为完数。如28的因子为1,2,4,7,14,且1+2+4+7+14=28,则28是完数。判断用户输入的数是否为完数。/求2,1000中的完数。main()int x,j,sum=0;scanf(“%d”,2023/4/1,68,main()int k,j,sum=0;For(k=2;k=1000;k+)sum=0;for(j=1;jk;j+)if(k%j=0)sum=sum+j;if(sum=k)printf(“

31、%d is a wanshun”,k);else printf(“%d is not a wanshun”,k);,2023/4/1,69,求解爱因斯坦长阶问题:有一长台阶,若每步跨2阶则最后剩1阶;若每步跨3阶则最后剩2阶;若每步跨5阶则最后剩4阶;若每步跨6阶则最后剩5阶;只有每步跨7阶才正好走完,问这个台阶最少有多少阶?思路:可以从台阶数为1开始依次反复测试,直到找到一个数可以满足上面的要求。for(j=1;j+)If(j%2=1)想想:还能否简化程序的循环次数?,2023/4/1,70,例:输入两个正整数m和n,求其最大公约数和最小公倍数。(辗转相除法)思路:将输入的两个数中大者放在n

32、中,小的放在m中,而r是两者相除的余数。以12 和8为例,来求它们的最大公约数和最小公倍数。将n反复除以m,取出余数存在r中,若m不等于0,然后m作为新的n值,r作为新的m值,再重复上述操作。等循环结束,n值即是最大公约数,而12*8/n值即为最小公倍数。n m r 12 8 4 8 4 0 4 0 所以,最大公约数=4,最小公倍数=12*8/4=24,2023/4/1,71,Main()int p,r,n,m;scanf(“%d%d”,如何保证大的数放在n中呢?该如何修改程序实现?,2023/4/1,72,例:输出以下图案:*,思考图形有何规律?,2023/4/1,73,例:行号(j)空格(4-j)星号(2j-1)*1 3 1*2 2 3*3 1 5*4 0 7*1 1(j)5(7-2j)*2 2 3*3 3 1,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号