c语言PPT课件 第五章 循环结构程序设计.ppt

上传人:小飞机 文档编号:1375704 上传时间:2022-11-16 格式:PPT 页数:88 大小:736KB
返回 下载 相关 举报
c语言PPT课件 第五章 循环结构程序设计.ppt_第1页
第1页 / 共88页
c语言PPT课件 第五章 循环结构程序设计.ppt_第2页
第2页 / 共88页
c语言PPT课件 第五章 循环结构程序设计.ppt_第3页
第3页 / 共88页
c语言PPT课件 第五章 循环结构程序设计.ppt_第4页
第4页 / 共88页
c语言PPT课件 第五章 循环结构程序设计.ppt_第5页
第5页 / 共88页
点击查看更多>>
资源描述

《c语言PPT课件 第五章 循环结构程序设计.ppt》由会员分享,可在线阅读,更多相关《c语言PPT课件 第五章 循环结构程序设计.ppt(88页珍藏版)》请在三一办公上搜索。

1、第五章 循环结构程序设计,循环就是满足一定条件是重复执行一段程序。,第五章 循环结构程序设计,教学目的与要求:1 领会程序设计中构成循环的方法 2 掌握 while 、 do-while 、 for 语句的用法 3 了解 break 、 continue 在循环语句中的作用 教学内容:1.概述 2 .构成循环的语句 ifgoto 、while、dowhile、for 3.几种循环的比较 3. 循环的嵌套4. break 语句与 continue 语句 重点: C 构成循环方法、 break 与continue 语句的基本作用。,5.1 概述,实现循环的语句 (四种): 1.用goto语句和if

2、语句构成循环。 不提倡。 2. 用while语句。当型循环先判断后执行。 3.用do-while语句。直到型循环先执行后判断。 4.用for语句构成的。多功能。,5.2 goto语句及用goto构成循环,一、goto语句goto语句的一般形式:goto 语句标号语句标号:用于定义程序中的某个位置 用标识符表示,不能只用数字如:goto start(对) goto 20(错)goto语句的功能是无条件地转到标号所指的语句。 因为滥用goto语句会破坏结构化,所以应该限制使用goto语句。,5.2 goto语句及用goto构成循环,二、用if_goto语句构成循环例:计算1+2+3+100的和。,

3、void main()int i=1,sum=0; loop: sum+=i; i+; if(i100)goto PRT; goto loop; PRT: printf(sum=%d,sum); ,5.3 while语句(当型循环),while语句的一般形式是:,while(表达式)语句;或:while(表达式) 语句序列;,循环体,循环条件,5.3 while语句(当型循环),用while语句实现当型循环,当条件(循环条件)成立(为真),循环执行语句(循环体)” ,然后再回过头来判断表达式的值,如此重复,当表达式为假时结束循环。,5.3 while语句(当型循环),例:如k=1; while

4、(k=100)s=s+k;k+;,循环控制表达式,循环控制变量,循环体,5.3 while语句(当型循环),例:在while(x)语句中的x与下面条件表达式等价的是:,A)x=0 B)x=1; C)x!=1; D)x!=0,5.3 while语句(当型循环),注意: (1)while语句的特点是先计算表达式的值,然后根据表达式的值决定是否执行循环体中的语句。因此,如果表达式的值一开始就为“假”,那么循环体一次也不执行。 (2)当循环体为多个语句组成,必须用 括起来,形成复合语句。 (3)循环三要素:循环控制变量赋初值、循环条件、循环控制变量更新。(下接),5.3 while语句(当型循环),注

5、意: (4)循环体可以为空。如:while(c=getchar( )!=A);表示从键盘上输入字符,直到输入的字符为A为止。 等价于:c=getchar( ); while(c!=A) c=getchar( );,5.3 while语句(当型循环),例:利用while语句编写程序计算1+2+3+100。,算法:S0: sum=0,i=1(循环初值)S1: sum=sum+i, i=i+1(循环体)S2: 如果i小于或等于100,返回重新执行步骤S1及S2;否则,算法结束(循环控制)。sum中的值就是1+2+100的值。 从算法可以看出这是一个典型的循环结构程序 。,5.3 while语句(当型

6、循环),例:利用while语句编写程序计算1+2+3+100。,include void main() int i=1,sum=0; while(i=100) sum=sum+i; i+; printf(“%dn”,sum); ,5.3 while语句(当型循环),循环控制变量:在循环条件中控制条件是真是假的变量,如源程序中的变量i。 要写出一个正确的循环结构,对控制变量做三方面工作:一是控制变量赋初值;二是把控制变量写入正确的循环条件;三是控制变量的更新调整。,5.3 while语句(当型循环),例:读程序,5.3 while语句(当型循环),考虑:s=1!+2!+3!+n!,5.3 whi

7、le语句(当型循环),结论: 编制循环程序要注意下面几个方面 (1)遇到数列求和,求积的一类问题,一般可以考虑使用循环解决。 (2)注意循环初值的设置。一般对于累加器常常设置为0,累乘器常常设置为1。 (3)循环体中做要重复的工作,同时要保证使循环倾向于结束。循环的结束由while中的表达式(条件)控制。,5.3 while语句(当型循环),例:求100以内奇数、偶数之和。,5.3 while语句(当型循环),例:求100以内奇数、偶数之和。,5.3 while语句(当型循环),例:输入两个正整数m和 n,求其最大公约数(common divisor) 和最小公倍数(common multip

8、le)。分析:用辗转相除法求最大公约数。,5.3 while语句(当型循环),5.3 while语句(当型循环),例:利用while语句计算1+1/2+1/4+1/6+1/50. 解:观察数列1,1/2,1/4,1/6,1/50。 分子全部为1,分母除第一项外,全部是偶数。 同样考虑用循环实现。 其中累加器用sum表示(初值设置为第一项1,以后不累加第一项),循环控制用变量i(i:2-50)控制,数列通项:1/i。,5.3 while语句(当型循环),例:利用while语句计算机1+1/2+1/4+1/6+1/50.,include void main() float sum=1; int i

9、=2; while(i=50) sum=sum+1.0/i; i+=2; printf(“%fn”,sum);,5.3 while语句(当型循环),例:若从终端上由第一列开始输入以下数据 right?yes回车 则程序运行的结果为:,include void main( ) char c; c=getchar( ); while(c!=?) putchar(c); c=getchar( ); ,5.4 do-while语句(直到型循环),do-while语句的一般形式是 :,do 语句序列; while(表达式);,循环体,循环条件,注意:分号不可丢,5.4 do-while语句(直到型循环)

10、,while语句表达的是:“当满足条件的时候,一直做某事”do while 语句表达的是:“一直做某事,直到不满足条件为止”,5.4 do-while语句(直到型循环),例:利用do-while语句计算机1+1/2+1/4+1/50。,include void main( ) float sum=1; int i=2; do sum=sum+1.0/i; i+=2; while(i=50); printf(“%fn”,sum);,5.4 do-while语句(直到型循环),说明: (1)do-while循环,总是先执行一次循环体,然后再求表达式的值,因此,无论表达式是否为“真”,循环体至少执行

11、一次。 (2)do-while循环与while循环十分相似,它们的主要区别是:while循环先判断循环条件再执行循环体,循环体可能一次也不执行。do-while循环先执行循环体,再判断循环条件,循环体至少执行一次。 (3)其它:复合语句,避免死循环要求同while循环。具体例子见 p117。,5.5 for语句(当型循环),for语句的一般形式是 :,for(表达式1;表达式2;表达式3) 循环体;,表达式1;while(表达式2) 循环体; 表达式3;,for(循环变量赋初值;循环条件;循环变量修正) 循环体;,5.5 for语句(当型循环),for语句的一般形式是 :,5.5 for语句(

12、当型循环),for语句的一般形式是 :,5.5 for语句(当型循环),例:for(i=1;i=3;i+) sum=sum+3; ,5.5 for语句(当型循环),说明:for语句的其他形式(参看p.118-120) (1)for语句中表达式1,表达式2,表达式3都可以省略,甚至三个表达式都同时省略,但是起分隔作用的“;”不能省略。 (2) 省略表达式1可省略,则应该在for语句前给循环变量赋初值。,main() for(i=1; i=n; i+) fact=fact*i; ,main() i=1;fact=1; for(; i=n; i+) fact=fact*i; ,5.5 for语句(当

13、型循环),(3)表达式2可省略,不判断循环终止条件,循环无终止地进行,成为“死循环”。则应该在其它位置(如:循环体)安排检测及退出循环的机制。,main() for(i=1,fact=1.0; ; i+) fact=fact*i; if(i= =n)break; ,5.5 for语句(当型循环),(4)表达式3可省略,需要在循环体内安排使循环趋向于结束的工作。,main( ) for(i=1,fact=1.0; i=n; ) fact=fact*i; i+; ,5.5 for语句(当型循环),(5)同时省略表达式1、表达式3,只有表达式2,此时相当于while语句。如:,i=1for(; i=

14、3; ) s=s+k; i+; ,i=1while (i=3) s=s+k; i+; ,5.5 for语句(当型循环),(6)表达式2一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值不等于0就执行循环体。,如:for(k=1; k-4; k+ ) s=s+k; 仅当k的值等于4时终止循环,k-4是数值表达式,for( ; (c=getchar()!=n ; i+=c);,空语句,5.5 for语句(当型循环),(7)表达式1可以是设置循环变量初值的表达式(常用),也可以是与循环变量无关的其它表达式; 表达式1,表达式3可以是简单表达式,也可以是逗号表达式.,for(i=

15、1,fact=1.0; ; i+),for(i=0,j=100; i=j; i+,j-) aiaj,5.5 for语句(当型循环),小结: 从上面的说明可以看出,C语言的for语句功能强大,使用灵活,可以把循环体和一些与循环控制无关的操作也都可以作为表达式出现,程序短小简洁。但是,如果过分使用这个特点会使for语句显得杂乱,降低程序可读性。建议不要把与循环控制无关的内容放在for语句的三个表达式中,这是程序设计的良好风格。,5.5 for语句(当型循环),例:读程序,判断程序的功能 #include void main( ) char c; for(;(c=getchar( )!=n;) pu

16、tchar(c); 输入ok!,输出_,读入一个字符,当它不是回车符就输出.,5.5 for语句(当型循环),例:有以下程序 #include void main( ) int t=1,i=5; for(;i=0;i-) t*=i; printf(“%dn”,t); 执行后输出结果是【】,0,5.5 for语句(当型循环),例:求100以内奇数、偶数之和。,5.6几种循环的比较,同样一个问题,我们可以用while语句来解决,也可以用for 语句和do while 语句来解决但在实际应用中我们要根据不同的情况来选择不同的循环语句选用的一般原则如下: 一:如果是计数型的循环或确切知道循环次数的循环

17、,一般用for语句,如果循环次数是根据循环体的执行情况确定,一般用while/do-while循环。 二:当循环体至少执行一次用do while语句,反之如果循环体一次不执行用while语句,5.6几种循环的比较,例:将50-100之间的不能被3整除的数输出(用三种循环结构实现),/* 用while语句实现 */void main( ) int i=50; while(i=100) if(i%3!=0)printf(“%4d”,i); i+; ,/* 用do-while语句实现 */main( ) int i=50; do if(i%3!=0)printf(“%4d”,i); i+; whil

18、e(i=100);,5.6几种循环的比较,例:将50-100之间的不能被3整除的数输出(用三 种循环结构实现),/* 用for语句实现 */main( ) int i; for(i=50; i=100; i+) if(i%3!=0)printf(“%4d”,i);,5.6几种循环的比较,例:,#include void main( ) int i=100,s=1; while(i100) s=s+1; printf(“n%dn”,s); i+; printf(“n%dn,s); ,#include void main( ) int i=100,s=1; do s=s+1; printf(“n%

19、dn” ,s); i+; while (i100); printf(“n%dn”,s); ,5.6几种循环的比较,例:,#include void main( ) int i,s=1; for(i=100;i100;i+) s=s+1; printf(“n%dn”,s); printf(“n%dn”,s); ,5.7 循环嵌套,一个循环体内包含着另一个完整的循环结构。就称为循环嵌套。 内嵌的循环又可以嵌套循环,从而凑成多重循环,常用于解决矩阵运算、报表打印这类问题。 while,do-while,for这三种循环均可以相互嵌套。,5.7 循环嵌套,说明:什么 叫循环的嵌套?,for (h=0;

20、h=23;h+) for(m=0;m=59;m+) for(s=0;s=59;s+),时钟,分钟,秒钟,5.7 循环嵌套,说明:1、嵌套的循环控制变量不能相同;2、内循环变化快,外循环变化慢;3、正确确定循环体;4、循环控制变量常与求解的问题挂钩。,5.7 循环嵌套,例:试找出满足下列条件的所有的三位数。其百位数不大于2;将个位与百位对换,得到的三位数是原三位数的两倍多;分析:用三重循环分别表示百、十、个位数。百位数i取值范围12;十位数j取值范围09;个位数k取值29;n=100*i+10*j+k;m=100*k+10*j+i;如果m=2*n则n为满足条件的三位数。,5.7 循环嵌套,5.7

21、 循环嵌套,分析:用一重循环的循环变量i表示原来的三位数。 i=101299百位数 n1=i/100;十位数n2=(i-100*n1)/10;个位数n3=i-100*n1-10*n2 m=100*n3+10*n2+n1 如果m=2*i&m3*i,则i为满足条件的三位数,5.7 循环嵌套,5.7 循环嵌套,例:打印图形 * * * * *分析:图形每行的起始位置同;图形每行的位置相同;用一重循环控制循环的行数即可,5.7 循环嵌套,例:打印图形 #include void main( ) int row=1; for(; row=5; row +) printf( * n); ,5.7 循环嵌套

22、,例:打印图形 * * * * *分析:图形每行的起始位置不同,空格数递增1;每行的字符数相同;用二重循环实现,外循环控制实现行数,内循环控制输出空格数;,5.7 循环嵌套,#include void main( ) int row,col; for(row=1; row=5;i+) for(col=1;col=5-row;col+) printf( ); printf( * ); printf(n); ,5.7 循环嵌套,例:下面程序的功能是输出以下形式的金字塔图案是 * * * * *分析:每行起始位置不同,(空格数)5-i;每行的字符数不同,(字符数)2*i-1;用二重循环实现;外循环控

23、制输出的行数;两个并列的内循环控制输出的空格数和字符数;,5.7 循环嵌套, void main( ) int i,j; for(i=1; i=5;i+) for(j=1;j=5-i;col+) printf(“ “); for(j=1;j= 2*i-1;j+) printf(“*”); printf(“n”); 考虑:起始位置是20程序怎么改?,5.7 循环嵌套,作业:考虑菱形怎么输出。 * * * * * * * for(i=1;i=3;i+) for(j=1;j=i;j+) printf( ); for(k=1;k=7-2*i;k+) printf(*); printf(n); ,5.7

24、 循环嵌套,作业(200903)20. 一下程序段中的变量已正确定义 for(i=0;i4;i+,j+)for(k=1;k3;k+);printf(*);程序段的输出结果是A)*B)*C)*D)*,5.8应用程序举例,例:我国古代的张丘建算经中有这样一道著名的百鸡问题:“公鸡每只5元,母鸡每只3元,小鸡3只一元。用100元买100只鸡,问公鸡、母鸡和小鸡各多少只?”分析:公鸡x最多可买20只母鸡y最多可买33只小鸡 100-x-yif (x*5+y*3+z*1.0/3=100)则满足条件输出,5.8应用程序举例,#include void main( )int x, y, z;for (x=0

25、; x20; x+)for (y=0; y33; y+) z=100-x-y; if (5*x+3*y+z/3=100) printf(cock=%4d hen=%4dchicken=%dn, x, y, z);,5.8应用程序举例,例:编程输出九九乘法表,5.8应用程序举例,2 3 4 5 6 7 8 9_1 2 3 4 5 6 7 8 92 4 6 8 10 12 14.3 6.4 .5 6 .7 8 9 ,5.8应用程序举例,#include void main() int i,j; for(i=1;i=9;i+) printf(%6d,i); printf(n); for(i=1;i=

26、9;i+) printf(_); printf(n); for(i=1;i=9;i+) for(j=1;j=9;j+) printf(%6d,i*j); printf(n); ,5.9break和continue语句,5.9.1 break语句,break;,break语句的一般形式为:,break语句的执行过程是:终止switch语句或循环语句的执行(跳出这两种语句),而转移到其后的语句处执行。,5.9break和continue语句,5.9.1 break语句,说明: (1)break语句只用于循环语句或switch语句中。在循环语句中,break常常和if语句一起使用,表示当条件满足时,

27、立即终止循环。注意break不是跳出if语句,而是跳出循环结构。 (2)循环语句可以嵌套使用,break语句只能跳出(终止)其所在的本层循环,而不能一下子跳出多层循环。要实现跳出多层循环可以设置一个标志变量,控制逐层跳出。,5.9break和continue语句,5.9.2 continue语句(翻译为“继续”(循环),continue;,continue语句的一般形式为:,continue语句的功能是结束本次循环。即跳过本层循环体中余下尚未执行的语句,接着再一次进行循环条件的判定。注意:执行continue语句并没有使整个循环终止。注意与break语句进行比较。,5.9break和conti

28、nue语句,5.9.3 break,continue主要区别:,break语句是终止循环,不再进行条件判断。 continue语句只终止本次循环,而不是终止整个循环结构的执行;,break语句跳出本层循环while(i100) break; . ,continue语句结束本次循环while(i100) continue; . ,5.9break和continue语句,例1: #include void main( ) int k=4,n=0;for( ; nk;) n+; if(n%3!=0) continue; k-; printf(%d,%dn,k,n);程序运行后的输出结果是A)1,1

29、B)2,2 C)3,3 D)4,4,5.9break和continue语句,例2: 有以下程序void main( ) int i,n=0; for(i=2;i5;i+) do if(i%3) continue; n+; while(!i); n+; printf(“n=%dn”,n);程序执行后的输出结果是A) n=5 B) n=2 C) n=3 D) n=4,5.10应用程序举例,例:求100至200间的全部素数,5.10应用程序举例,#include #include void main() int m,k,i,n=0;/*为什么要设n */ / 统计素数个数 for(m=101;m=k

30、+1)printf(%d,m);n=n+1; if(n%10=0)printf(n); printf(n);,5.10应用程序举例,例:Fibonacci数列,输出40个(p125),分析:Fibonacci数列从第1项开始依次为1,1,2,3,5,8,13,21的数列,它存在如下特点:第1,第2个数为1。从第3个数开始,该数是前面两个数之和。即该数列第n项的值满足如下公式:,5.10应用程序举例,例:Fibonacci数列,进行20次循环,每次计算并输出两项;F1、F2直接赋值并输出;F3=F1+F2,此时F1已无用,F3可存于F1中,可用F1=F1+F2表示;F4=F2+F3,F3已在F1

31、中,此后F2已无用,F4可存放在F2中,可用F2=F3+F4表示;以此类推,算出F5、F6,直到F39、F40;此数列增长很快,宜用长整形(ld),每行输出4个数.,5.10应用程序举例,#include void main( ) long int f1,f2; int i; f1=f2=1; for(i=1;i=20;i+) printf(%12ld,%12ld,f1,f2); if(i%2=0) printf(n); f1=f1+f2; f2=f1+f2; ,5.10应用程序举例,例:猴子吃桃!,猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾有多吃了一个,第二天早上又将剩下的桃子吃掉一半

32、又多吃了一个,以后每天早上都吃了前一天剩下的一半零一个第10天早上想在吃时,就只剩下一个桃子了,求第一天共摘了多少桃子?,5.10应用程序举例,例:猴子吃桃!,其实这是一个典型的数列问题:可以得出公式.设第n天的桃子数为pi,这也是第i-1天吃剩下的 则有:p10=1 pi=(pi-1/2)-1 下面用递推式得出一般项 :2(pi+1)=pi-1,#include void main( ) int i,x=1; for(i=9;i0;i-) x=(x+1)*2; printf(%dn,x); ,5.10应用程序举例,例:用二分法求方程2*x*x*x - 4*x*x +3x-6=0在(-10,1

33、0)之间的根.,采用精度作为循环结束标志是编程中经常使用的方法之一,5.10应用程序举例,分析:(1):输入x1,x2 的值.求出f(x1),f(x2).(2) 看fx1和fx2是否同符号,如果符号相同,则x1,x2区间无实根,返回(1)重新输入x1,x2 的值.如果符号不同,说明x1,x2区间必有一实根执行(3)(3)求出x1和x2的中间点x0: x0=(x1+x2)/2.求f(x0)(4)判断f(x0)和f(x1)是否同符号 如果符号相同x1=x0,f(x1)=f(x0) 如果符号不同x2=x0,f(x2)=f(x0)(5)判断f(x0)的绝对值是否小于某一指定的值(0.00001),若不

34、小于,返回执行(3),重复执行 (4)(5);若小于,执行(6)(6) 输出小x0 的值,它就是所求出的近似值,5.10应用程序举例,#include#includevoid main( ) float x1,x2,x0,fx1,fx2,fx0; doprintf(please input x1,x2:); scanf(%f,%f,5.10应用程序举例,do x0=(x1+x2)/2; fx0= 2*x0*x0*x0 - 4*x0*x0 +3*x0-6; if(fx0*fx1=1e-5);printf(x0=%6.2fn,x0);,5.10应用程序举例,作业(200903)22. 设变量已正确

35、定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是 A)n=0;while(ch=getchar()!=n)n+;B)n=0;while(getchar()!=n)n+;C)for(n=0;getchar()!=n;n+);D)n=0;for(ch=getchar();ch!=n;n+);,5.10应用程序举例,23. 有以下程序 #includemain( )inta1,a2;charc1,c2;scanf(%d%c%d%c,若通过键盘输入,使得a1的值为12,a2的值为34,c1的值为字符a,c2的值为字符b,程序输出结果是:12,a,34,b 则正确的输入格式是(以下_代表空格,代表回车)A)12a34b B)12_a_34_bC)12,a,34,b D)12_a34_b,5.10应用程序举例,9. 一下程序运行后的输出结果是【9】 #includemain()intk=1,s=0;doif(k%2)!=0)continue;s+=k;k+;while(k10);printf(s=%dn,s);,0,5.10应用程序举例,10. 下列程序运行时,若输入labcedf2df输出结果为【10】 #includemain()chara=0,ch;while(ch=getch()!=n)if(a%2!=0,1AbCeDf2dF,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号