《第5章循环结构程序设计优秀PPT.ppt》由会员分享,可在线阅读,更多相关《第5章循环结构程序设计优秀PPT.ppt(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第5 5章章 循环结构程序设循环结构程序设计计现在学习的是第1页,共26页北京邮电大学出版社北京邮电大学出版社5.1 while语句语句1.While语句的一般形式:while(表达式)语句;2.while语句的执行过程:说明:1表达式部分可以是任意类型的表达式。2语句部分为循环体,表示在循环条件成立时要反复执行的部分操作,可称为循环体语句。3设计循环结构的程序时要注意让循环体执行若干次数后能够结束循环,避免出现死循环。现在学习的是第2页,共26页北京邮电大学出版社北京邮电大学出版社例例5.1 5.1 分析以下程序,写出程序的执行结果。分析以下程序,写出程序的执行结果。#includemai
2、n()int i,s;s=0;i=1;while(i=3)s=s+i;i+;printf(s=%d,i=%dn,s,i);分析循环执行的过程:循环语句while执行前 s=0,i=1循环条件成立第一次执行循环体后 s=1,i=2循环条件仍成立第二次执行循环体后 s=3,i=3循环条件仍成立第三次执行循环体后 s=6,i=4循环条件不成立循环语句结束,执行下一条语句,输出结果:s=6,i=4与循环控制有关的三个要素与循环控制有关的三个要素:变量赋初值;判断循环条件;对变量取值的修正。现在学习的是第3页,共26页北京邮电大学出版社北京邮电大学出版社例例5.2 5.2 输输入入全全班班5050个个学
3、学生生某某门门课课程程的的成成绩绩,求求他他们们的的平平均分。均分。#includemain()int x,n=1;float sum=0,average;while(n=50)scanf(%d,&x);sum=sum+x;n+;average=sum/50;printf(averag=%5.2fn,average);这是一个比较典型的迭代算法。所谓迭代就是不断用变量的新值来取代变量的旧值,或由变量的旧值不断递推出变量的新值的过程。迭代算法的关键因素:迭代算法的关键因素:1.初值初值 2.迭代方式迭代方式 3.迭代条件迭代条件现在学习的是第4页,共26页北京邮电大学出版社北京邮电大学出版社例例
4、5.3 5.3 任意输入十个整数,找出其中的最大值。任意输入十个整数,找出其中的最大值。在十个数中找最大值,可以使用“打擂台”的方式,即先将输入的第一个数作擂主,其它的数作为挑战者,擂主与挑战者之间要进行9次的较量,每次较量后的胜者将成为新擂主#includeinclude main()main()int x,max,i;int x,max,i;scanf(scanf(“%d%d”,&max);/*,&max);/*将输入的第一个数作擂主将输入的第一个数作擂主*/*/i=0;i=0;while(i9)/*while(i9)/*进行进行9 9次比较次比较*/*/scanf(%d,&x);scan
5、f(%d,&x);if(maxx)if(maxx)max=x;/*max=x;/*挑战者胜,成为新擂主挑战者胜,成为新擂主*/*/i+;i+;printf(max=%dn,max);printf(max=%dn,max);现在学习的是第5页,共26页北京邮电大学出版社北京邮电大学出版社例例5.4 5.4 输入两个任意的正整数,求它们的最大公约数。输入两个任意的正整数,求它们的最大公约数。#includeincludemain()main()int m,n,r,t;int m,n,r,t;scanf(%d%d,&m,&n);scanf(%d%d,&m,&n);if(mn)if(mn)t=m;m=
6、n;n=t;t=m;m=n;n=t;r=m%n;r=m%n;while(r!=0)while(r!=0)m=n;m=n;n=r;n=r;r=m%n;r=m%n;printf(%dn,n);printf(%dn,n);求最大公约数可以使用“辗转相除”的方法,例如:被除数m 除数n 余数r82 24 1024 10 410 4 24 2 0这仍是一个迭代算法,请找出其中的三个要素:1.初值2.迭代公式3.迭代条件现在学习的是第6页,共26页北京邮电大学出版社北京邮电大学出版社5.2 do-while 语句语句1 1dodowhilewhile语句的一般形式:语句的一般形式:do语句;while(表
7、达式);2.dowhile语句的执行过程:例例5.5 5.5 分分析析以以下下程程序序,写写出出程程序序的的执执行行结结果。果。#includeincludemain()main()int i,s;int i,s;s=0;s=0;i=1;i=1;do do s=s+i;s=s+i;i+;i+;while(i=3)while(i=3)printf(s=%d,i=%dn,s,i);printf(s=%d,i=%dn,s,i);现在学习的是第7页,共26页北京邮电大学出版社北京邮电大学出版社例例5.65.6设有一个分数数列设有一个分数数列2/1,3/2,5/3,8/5,13/8,21/13,2/1,
8、3/2,5/3,8/5,13/8,21/13,编程编程求出这个数列的前求出这个数列的前2020项之和。项之和。#includeinclude main()main()int a=1,b=2,i=1;int a=1,b=2,i=1;float sum=0;float sum=0;do do sum=(float)b/a;sum=(float)b/a;b=a+b;b=a+b;a=b-a;a=b-a;i+;i+;while(i=20);while(i=20);printf(sum=%fn,sum);printf(sum=%fn,sum);分析这个分数数列可以发现,后一项的分母等于前一项的分子,后一项
9、的分子等于前一项的分子加分母。设当前项的分子为b,分母为a,各项的和为sum,i为循环计数。可找出迭代的三个要素:初值:i=1,a=1,b=2,sum=0;迭代条件:i=20迭代公式:sum=sum+b/a,b=a+b,a=b-a,i+;现在学习的是第8页,共26页北京邮电大学出版社北京邮电大学出版社例例5.7 输入全班学生某门课程的成绩,求他们的平均分,学生人输入全班学生某门课程的成绩,求他们的平均分,学生人数不确定,当输入负数时表示输入过程的结束。数不确定,当输入负数时表示输入过程的结束。#includeincludemain()main()int x,n=0;int x,n=0;floa
10、t sum=0,average;float sum=0,average;scanf(%d,&x);scanf(%d,&x);do do sum=sum+(float)x;sum=sum+(float)x;n+;n+;scanf(%d,&x);scanf(%d,&x);while(x=0);while(x=0);average=sum/n;average=sum/n;printf(averag=%5.2fn,average);printf(averag=%5.2fn,average);现在学习的是第9页,共26页北京邮电大学出版社北京邮电大学出版社5.3 for语句语句1.for语句的一般形式为
11、:for(表达式1;表达式2;表达式3)语句;2.for语句的执行过程:说明:说明:三个表达式一般起以下作用:表达式1,用于对循环变量赋初值;表达式2,用于表示循环的条件;表达式3,用于对循环变量进行修正现在学习的是第10页,共26页北京邮电大学出版社北京邮电大学出版社例例5.8 5.8 分分析析以以下下程程序序,写写出出程程序序的的执行结果。执行结果。#includemain()int i,s;s=0;for(i=1;i=3;i+)s=s+i;printf(s=%d,i=%dn,s,i);执行结果为:s=6,i=4例例5.9 5.9 求求n!n!。#includemain()long p=1
12、;int n,i,scanf(%d,&n);for(i=1;i=n;i+)p=p*i;printf(%ldn,p);现在学习的是第11页,共26页北京邮电大学出版社北京邮电大学出版社例例5.10 输出输出Fibonacci数列数列1,1,2,3,5,8,13的前的前20项,要求每输出项,要求每输出5项后换行。项后换行。分析数列可以发现以下规律,即前两项为1,从第三项开始,每一项都为前两项之和。设变量f表示要求的当前项,变量f1和f2依次表示当前项的前两项。可以找出这个迭代问题的三个要素:初值:i=3,f1=1,f2=1;迭代条件:i=20迭代公式:f=f1+f2,f1=f2,f2=f,i+;#
13、includeincludemain()main()int f1,f2,f,i;int f1,f2,f,i;f1=f2=1;f1=f2=1;printf(%10d%10d,f1,f2);printf(%10d%10d,f1,f2);for(i=3;i=20;i+)for(i=3;i1000)if(p1000)break;break;printf(%dn,n);printf(%dn,n);现在学习的是第14页,共26页北京邮电大学出版社北京邮电大学出版社例例5.13 判断一个任意输入的正整数判断一个任意输入的正整数m是否为素数。是否为素数。#include stdio.h#include std
14、io.h#include#include main()main()int m,i,k;int m,i,k;scanf(%d,&m);scanf(%d,&m);k=sqrt(m);k=sqrt(m);for(i=2;i=k;i+)for(i=2;i=k+1)if(i=k+1)printf(%d is a prime number.n,m);printf(%d is a prime number.n,m);else else printf(%d is not a prime number.n,m);printf(%d is not a prime number.n,m);现在学习的是第15页,共2
15、6页北京邮电大学出版社北京邮电大学出版社例例5.15 试写出以下程序的执行结果。试写出以下程序的执行结果。#include stdio.h#include stdio.hmain()main()int i,s=0;int i,s=0;i=1;i=1;while(i10)while(i5)if(s5)break;break;if(i%2=1)if(i%2=1)continue;continue;i+;i+;printf(s=%d,i=%dn,s,i);printf(s=%d,i=%dn,s,i);运行结果为:运行结果为:s=6,i=1s=6,i=1 分析:由于第一次执行循环体分析:由于第一次执行
16、循环体时,时,i=1,语句,语句if(i%2=1)continue;中的条件成立,执行中的条件成立,执行continue;语语句后,结束本次循环,开始下次循环,句后,结束本次循环,开始下次循环,程序的执行回到了程序的执行回到了while(i5)break;中的条件成立,执中的条件成立,执行行break;语句后,结束循环,语句后,结束循环,现在学习的是第16页,共26页北京邮电大学出版社北京邮电大学出版社5.4.2 continue 语句语句例例5.14 5.14 把把1 1100100之之间间能能被被3 3整整除除的数打印输出。的数打印输出。#include stdio.hmain()int
17、i;for(i=1;i=100;i+)if(i%3!=0)continue;printf(%4d,i);1.continue语句的一般形式为:continue continue;2.continue语句与break语句的区别是:break语句是结束整个循环,跳到循环外的下一条语句去执行。continue语句只是结束本次循环过程,转而进行下一次循环过程,并不终止整个循环的执行。现在学习的是第17页,共26页北京邮电大学出版社北京邮电大学出版社5.5循环的嵌套循环的嵌套 在一个循环结构的的循环体部分若包含有另一个完整的循环结构时,称为循环的嵌套。内嵌的循环叫内循环,外层循环叫外循环,这种结构也叫二
18、重循环。例如:for(i=1;i=2;i+)for(j=1;j=3;j+)外循环的循环体 printf(“%4d”,i*j);内循环的循环体 外循环由变量i控制循环2次,内循环由变量j控制循环3次,但是要注意的是整个内循环部分是外循环的循环体,所以外循环每执行一次,内循环的循环体部分就要执行3次,该程序段的运行结果为:123246现在学习的是第18页,共26页北京邮电大学出版社北京邮电大学出版社又如:for(i=1;i=2;i+)for(j=1;j=3;j+)printf(%4d,i*j);内循环的循环体 printf(n);外循环的循环体 这时要注意的是,printf(n);是外循环的循环体
19、部分,但不是内循环的循环体部分,因此该程序段的运行结果为:123246现在学习的是第19页,共26页北京邮电大学出版社北京邮电大学出版社例例5.16 5.16 求求 。对于这个问题可以采用自顶向下,逐步求精的结构化程序设计思想来分析。算法描述大致如下:1.设阶乘的累加和sum=02.for(i=1;i=10;i+)sum=sum+i!3.输出累加和sum对步骤2中的sum=sum+i!细化:2.1 设阶乘的结果p=12.2 for(j=1;ji;j+)p=p*j2.3 sum=sum+p#includeincludemain()long p,sum=0;int i,j;for(i=1;i=10
20、;i+)p=1;for(j=1;j=i;j+)p=p*j;sum=sum+p;printf(sum=%ldn,sum);现在学习的是第20页,共26页北京邮电大学出版社北京邮电大学出版社例例5.17 用穷举法解决搬砖问题:用穷举法解决搬砖问题:36块砖,块砖,36人搬,男搬人搬,男搬4,女,女搬搬3,两个小孩抬一砖,要求一次搬完,问需要男、女、小孩各,两个小孩抬一砖,要求一次搬完,问需要男、女、小孩各多少?多少?穷举法的基本思想是对问题的所有可能的状态一一测试,直到找到解或将全部的可能状态都测试过为止。对于搬砖问题,可设三个变量m,w,c分别表示男人、女人和小孩的人数,根据题意可列出以下二个方
21、程:m+w+c=36 4*m+3*w+c/2=36 这个问题可列二个方程,但是却有三个变量,是不能通过解方程的方法求解的,但是由于三个变量m,w,c都应该是整型变量,我们可以将各种可能的取值一一列举出来进行测试,从而找到这个问题的解。具体方法是:首先,确定各变量的取值范围,依题意可知:1=m9、1=w12 由于当变量m和w的值一旦确定,即可根据方程确定变量c的值为c=36-m-w。所以不用确定变量c的测试范围。然后,将变量m、w、c的各种可能的取值代入方程中,若等式成立,则这时变量m,w,c的值即是该问题的解。现在学习的是第21页,共26页北京邮电大学出版社北京邮电大学出版社 搬砖问题的具体程
22、序描述如下:搬砖问题的具体程序描述如下:#include stdio.h#include stdio.hmain()main()int m,w,c;int m,w,c;printf(%10s%10s%10sn,men,women,children);printf(%10s%10s%10sn,men,women,children);for(m=1;m9;m+)for(m=1;m9;m+)for(w=1;w12;w+)for(w=1;w12;w+)c=36-m-w;c=36-m-w;if(m*4+w*3+c/2.0=36)if(m*4+w*3+c/2.0=36)printf(%10d%10d%10
23、dn,m,w,c);printf(%10d%10d%10dn,m,w,c);程序运行程序运行结结果果为为:menwomenchildren3 3 30现在学习的是第22页,共26页北京邮电大学出版社北京邮电大学出版社例例5.18 编程打印以下图形:编程打印以下图形:分析该图形可知,图形分5行,每行是由若干个空格,若干个“*”和一个回车符构成。可用三个循环语句来实现,一个用于控制打印5行,一个用于控制每行输出的空格数,一个用于控制每行输出的“*”数。可设三个变量i、j、k用于控制这三个循环。具体程序如下:#include stdio.h main()int i,j,k;for(i=1;i=5;i
24、+)for(j=1;j=5-i;j+)printf();for(k=1;k=2*i-1;k+)printf(*);printf(n);现在学习的是第23页,共26页北京邮电大学出版社北京邮电大学出版社5.6 用用if和和goto语句构成的循环结构语句构成的循环结构 goto语句是无条件转向语句。它的一般形式为:goto goto 语句标号;语句标号;语句标号命名规则与变量的命名规则相同,即可由下标线、字母和数字组成,且第一个字符不能为数字。其功能是无条件转向标号所标识的语句行去执行。例如:goto loop;表示无条件转向loop所标识的语句行去执行。goto语句可以与if语句一起构成循环结构
25、。需要特别说明的是:由于goto语句不符合结构化程序设计的基本原则,因此除非某些特殊情况一般来用goto语句来构成循环。现在学习的是第24页,共26页北京邮电大学出版社北京邮电大学出版社例5.19 求 =1+2+3+100#include stdio.h main()main()int i,sum=0;int i,sum=0;i=1;i=1;loop:if(i=100)loop:if(i=100)sum=sum+i;sum=sum+i;i+;i+;goto loop;goto loop;printf(%dn,sum);printf(%dn,sum);程序运行结果:程序运行结果:50505050
26、现在学习的是第25页,共26页北京邮电大学出版社北京邮电大学出版社本章小结本章小结1本章主要介绍了三种构成循环的语句:while、do-while、for语句,读者首先应熟练掌握语句的一般形式和语句的执行过程。对于用if和goto语句构成的循环结构,只要作一般性的了解即可。2本章还重点介绍了循环程序设计的基本算法迭代法,在设计和分析这种程序时,应特点注意迭代算法的三个要素,即变量的初值、迭代公式以及迭代的条件。3本章还介绍了循环结构中常用到的二个语句break语句和continue语句,读者要注意两者的区别:break语句是结束整个循环,continue语句只是结束本次循环。4在介绍循环程序设计方法的同时,本章还介绍了循环嵌套的概念,读者应重点掌握用for语句构成的二重循环的应用,对于多重循环只要求作一般性的了解。在循环嵌套中还介绍了循环程序设计的另一种基本算法穷举法,对于穷举法读者也应掌握。现在学习的是第26页,共26页