CH3程序控制结构.ppt

上传人:小飞机 文档编号:5421341 上传时间:2023-07-05 格式:PPT 页数:80 大小:781.50KB
返回 下载 相关 举报
CH3程序控制结构.ppt_第1页
第1页 / 共80页
CH3程序控制结构.ppt_第2页
第2页 / 共80页
CH3程序控制结构.ppt_第3页
第3页 / 共80页
CH3程序控制结构.ppt_第4页
第4页 / 共80页
CH3程序控制结构.ppt_第5页
第5页 / 共80页
点击查看更多>>
资源描述

《CH3程序控制结构.ppt》由会员分享,可在线阅读,更多相关《CH3程序控制结构.ppt(80页珍藏版)》请在三一办公上搜索。

1、CH3 程序控制结构,主讲:邹显春,E-Mail:,分析问题构建算法,选择描述方法,描述算法,利用C程序语句描述算法中的操作,根据C程序结构完整C程序代码,调试程序,调试数据分析结果,1.问题分析与算法设计,2.编写程序,3.程序编译与运行调试,复习思考:编写C程序的基本过程?,【例】已知华氏温度,求 对应的摄氏温度-顺序结构程序设计,摄氏温度 C=(5/9)(F-32),1.问题分析与算法设计,算法描述,.自然语言表示:()输入华氏温度值()根据公式计算()输出摄氏温度,开始,输入fahr,计算celsius,输出celsius,结束,scanf(“%d”,celsius=5*(fahr-3

2、2)/9;,printf(fahr=%d,celsius=%dn,fahr,celsius);,传统流程图,图,2.编写代码,#include void main()int celsius,fahr;/变量定义 scanf(%d,/输出结果,3.编辑编译连接运行,分析结果是否与实际问题相符合?,编程序风格讨论?,在上述程序中很显然与用户交互性不好.若希望上述程序的运行情况如图所示,应如何修改程序,可将上述程序改为,#include void main()int celsius,fahr;/变量定义 printf(请输入华氏温度:n);scanf(%d,/输出结果,【实例1】编写程序求分段函数的

3、值,1.问题分析与算法设计 根据x的值选择不同的函数计算,要求输出结果保留2位小数,算法方法1自然语言,输入计算分段函数输出,分支结构程序设计,算法方法2N-S图,#include void main()double x,y;printf(请输入x:n);/输入提示 scanf(%lf,2.编写代码,3.调试运行,若用if语句实现,#include void main()double x,y;printf(请输入x:n);/输入提示 scanf(%lf,温馨提示1-软件测试的基本思想,软件测试精心设计一批测试用例 输入数据,预期输出结果,然后分别用这些测试用例运行程序,看程序的实际运行结果与预

4、期输出结果是否一致。,if(x=15)y=4*x/3;else y=2.5*x-10.5;,9.5f(9.500000)=12.67,15f(15.000000)=20.00,21.3f(21.300000)=42.75,if(表达式)语句1else 语句2,if(x=15)y=4*x/3;else y=2.5*x-10.5;,温馨提示2-if语句一般形式(P49),课堂思考:,比较P47-49【例3.1】、【例3.2】在结构上以及实现方法与上述例子异同?,【实例3】分段计算水费,1问题分析与算法设计 思路:,2.编写代码,#include void main()double x,y;prin

5、tf(请输入x:n);scanf(%lf,3.调试运行,if(表达式1)语句1else if(表达式2)语句2else if(表达式n-1)语句n-1else 语句n,温馨提示1-if-elseif语句一般形式,#include void main()int a=0,b=0,c=0,d=0,k;scanf(%d,a=1,b=0,c=0,d=0,当输入的值为2,结果是多少?,当输入的值为1,结果是多少?,课堂思考:,a=1,b=0,c=0,d=0,【例3】依据教材P50【例3.3】从键盘上输入两个实数,根据需要选择运算类型。其运行情况如图所示,输入两个实数,输出选择菜单,选择运算类型,进行相应运

6、算并输出,1.问题分析与算法设计,printf(nn%20s,运算列表菜单n);printf(%20s,1.和运算(+)n);printf(%20s,2.差运算(-)n);printf(%20s,3.积运算(*)n);printf(%20s,4.除运算(/)n);printf(请选择运算种类(选择1/2/3/4):);,输出选择菜单,输入两个实数,printf(请输入两个实数(之间用,分隔)n);scanf(%lf,%lf,printf(请选择运算种类(选择1/2/3/4):);scanf(%d,选择运算类型,进行相应运算并输出,switch(chioce)/根据选择的运算种类进行相应的运算

7、case 1:real_num=real_num1+real_num2;printf(%.2f+%.2f=%.2fn,real_num1,real_num2,real_num);break;case 2:real_num=real_num1-real_num2;printf(%.2f-%.2f=%.2fn,real_num1,real_num2,real_num);break;default:printf(没有该运算!n);,#include void main()double real_num1,real_num2,real_num;int chioce;printf(请输入两个实数(之间用

8、,分隔)n);scanf(%lf,%lf,2.编写代码,switch(chioce)/根据选择的运算种类进行相应的运算 case 1:real_num=real_num1+real_num2;printf(%.2f+%.2f=%.2fn,real_num1,real_num2,real_num);break;case 2:real_num=real_num1-real_num2;printf(%.2f-%.2f=%.2fn,real_num1,real_num2,real_num);break;case 3:real_num=real_num1*real_num2;printf(%.2f*%.

9、2f=%.2fn,real_num1,real_num2,real_num);break;case 4:real_num=real_num1/real_num2;printf(%.2f%.2f=%.2fn,real_num1,real_num2,real_num);break;default:printf(没有该运算!n);,3.调试运行测试用例,switch(表达式)case常量表达式1:语句1case常量表达式2:语句2case常量表达式n:语句ndefault:语句n+1,温馨提示1-switch语句(p52),按照考试成绩的等级输出百分制分数段,#include void main()

10、char ch;ch=getchar();ch=(ch=a,是否达到目标?,break;,break;,break;,break;,课堂思考1:,运输公司对用户计算运费。路程()越远,每公里运费越低。标准如下:没有折扣 折扣 折扣 折扣 折扣 折扣设每公里每吨货物的基本运费为,货物重为,距离为,折扣为,则总运费的计算公式为:*(),课堂思考2:,分析折扣变化的规律性:折扣的“变化点”都是的倍数,1问题分析与算法设计,#include void main()int c,s;float p,w,d,f;scanf(%f,%f,%d,case 4:,case 5:case 6:case 7:d=8;

11、break;case 8:case 9:case 10:case 11:d=10;break;case 12:d=15;break;f=p*w*s*(1-d/100.0);printf(freight=%15.4fn,f);,2.算法描述(省略),.代码描述,-1(x0),算法1:输入x若x0,则y=1输出y,1.问题分析与算法设计,可用三个if语句实现,算法2,#includevoid main()int x,y;printf(请输入整数x:n);scanf(%d,if的嵌套结构,程序段2if(x=0)if(x0)y=1;else y=0;else y=-1;,程序4:y=0;if(x=0)

12、if(x0)y=1;else y=-1;,程序3:y=-1;if(x!=0)if(x0)y=1;else y=0;,正确?,正确?,正确?,课堂思考1:,if()if()语句1else 语句2elseif()语句3else 语句4,内嵌if,在if语句中又包含一个或多个if语句称为if语句的嵌套。形式:,温馨提示-if的嵌套(p52),匹配规则:else总是与它上面最近的、未配对的if语句配对。,例:if()if()语句1elseif()语句2else 语句3,if()if()语句1elseif()语句2 else 语句3,当if和else数目不同时,可以加花括号来确定配对关系。,希望配对,课

13、堂思考:,比较P52-53【例3.4】在结构上以及实现方法与上述例子异同?,【例5】依据教材P50【例3.5】55位学生排成4排,学号1-55号,按照1-4报数.任意给定一个学号,显示学生在第几列,1.问题分析与算法设计,用switch语句,2.编写代码,#include void main()int i,n;i=0;printf(请输入学号:n);scanf(%d,循环结构程序设计,【实例6】求1到100的和依据p56【例3.6】,1问题分析与算法设计 求在一定范围内(1n)、满足一定条件(不超过n)的若干整数的和,求累加和。思路:设置一个变量(s),其初值为0,然后在1n中的所有数,将它们

14、一个一个累加到s中。一步累加:s=s+i;i 值的变化通过i=i+1实现,实例分析,3,6,1,2,3,3,6,i=i+1,实际上:就是重复执行下列操作:,s=s+Ii=i+1,直到i超过100,s=0,i=1,i=100,s=s+i,i=i+1,输出s,算法描述:将上述算法思想用N-S图描述为:,当型循环,s=0,i=1,i=100,s=s+i,i=i+1,输出s,s=0;i=1;,while(),i=100,s=s+i;i=i+1;,循环体,循环结构,printf(“100以内的和是:%d“,s);,可用for、while、do-while实现,用while语句描述,void main()

15、,s=0;i=1;while(i=100)s=s+i;i+;printf(s=%dn,s);,int s,i;,#include stdio.h,主函数的首部,算法实现,数据类型,2编程序,#include stdio.hvoid main()int s,i;printf(s=%dn,s);,s=0;i=1;,while(),i=100,s=s+i;i=i+1;,i=1,s=0,for(;);,s=s+i,i=100,i+,#include stdio.hvoid main()int s,i;printf(s=%dn,s);,用for语句描述,#include stdio.hvoid main

16、()int s=0,i=1;printf(s=%dn,s);,dowhile(i=100);,s=s+i;i+;,用do-while语句实现,while(条件)循环体语句;,循环条件,循环体,一条语句,温馨提示1-while语句(p57),do 循环体语句 while(表达式),先循环,后判断,真,假,表达式,循环体语句,do-while的下一条语句,温馨提示2-do-while语句(p58),while 是先判别条件,再决定是否循环;do-while 是先至少循环一次,然后再根据循环的结果决定是否继续循环。,while 和 do-while 的比较,格式:for(表达式1;表达式2;表达3)

17、语句;,温馨提示3-for语句(p60),100以内的自然数求和#include“stdio.h”Void main()int i,sum;for(i=1,sum=0;i=100;i+)sum=sum+i;printf(sum=%dn,sum);,for语句使用灵活、形式多样,for(i=1,sum=0;i=100;)sum=sum+i;i+;,for(i=1,sum=0;i=100;)sum=sum+i+;,for(i=1,sum=1;i+100;)sum=sum+i;,for(i=1,sum=1;+i=100;)sum=sum+i;,i=1,sum=1;for(;+i=100;)sum=s

18、um+i;,【实例7】编程实现S=1!+2!+10!,循环嵌套(p62),从1!逐个求到10!,每求到一个阶乘就求和,求解思路?,t=1;for(j=1;j=i;j+)/求i!t=t*j;,s=s+t;/阶乘求和,for(i=1;i=10;i+),s=0;,这就是一个循环嵌套结构,#includestdio.h#includemath.hvoid main()int i,j;long t,s;s=0;for(i=1;i=10;i+)t=1;for(j=1;j=i;j+)t=t*j;/求i!s=s+t;/阶乘求和 printf(1!+2!+3!+.+10!=%ld,s);,程序代码,单重循环实现

19、与双重循环实现的比较,s=0;t=1;for(i=1;i=10;i+)t=t*i;s=s+t;,#includestdio.hvoid main()int i,j;long t,s;s=0;for(i=1;i=10;i+)t=1;for(j=1;j=i;j+)t=t*j;/求i!s=s+t;/阶乘求和 printf(1!+2!+3!+.+10!=%ld,s);,用单重循环如何实现?,思考:,编程实现S=1+(1+2)+(1+2+3)+(1+2+10)?,请比较P62【例3.9】(中国古典算术问题-搬砖问题)某工地需要搬运砖块,36块砖,36人搬,已知男人一人搬4块,女人一人搬3块,小孩两人搬1

20、块。问男、女、小孩各需多少人?,用三重循环实现-完整代码见备注,for(men=0;men=36;men+)for(women=0;women=36;women+)for(child=0;child=36;child+)if(men+women+child=36),for(men=0;men=9;men+)for(women=0;women=12;women+)child=36 women men;if(men*4+women*3+child*0.5=36)printf(men=%d women=%d child=%dn,men,women,child);,比较循环次数?,用双重循环实现-完整

21、代码见备注,思考:P63【例3.10】2008!的末尾有多少个0?,在while、for、do-whlie语句的循环体内中又包含了另一个完整的循环结构,以for为例,内循环体,for(A1;A2;A3),B1for(A11;A21;A31)B2B3,外循环体,温馨提示:什么是循环嵌套?,求解A1,求解A2,执行B1,求解A11,求解A21,执行B2,求解A31,结束循环,Y,N,Y,N,执行A3,三、非正常结束循环(p65),求解思路?,范围:,if(n%7=0)printf(%d,n);,for(n=1;n=100;n+),条件:n能够被7整除,【实例8】找出1100中能够被7整除的数.(p

22、66【例3.12】),程序编写,#includevoid main()int n;for(n=1;n=100;n+),continue,break,结果如何?,if(n%7=0)printf(%d,n);,if(n%7!=0),printf(%d,n);,2、continue 格式:continue;语义:结束本次循环,1、break语句 形式:break;语义:结束循环,温馨提示:beak和continue的含义?,【实例9】输出100200之间的素数(P70【例3.16】)。,关键是判断素数!何谓素数?,只能被1和它本身整除的数!,问题分析与算法设计,for(i=2;i=n-1;i+),i

23、f(n%i=0)break;,if(i=n)printf(“n是素数);,若n%i!=0,继续循环直到所有i的值取完,n是不是素数?,又这样判断n是素数?,for(i=2;i=n-1;i+)if(n%i=0)break;if(i=n)printf(“n是素数);,思考:若n的值是,共循环多少次?,次,思考:循环结束后i的值是多少?,次,改进!,如果n是更大的一个素数,效率就会降低!怎么办?,k=sqrt(n);for(i=2;i=k+1)printf(“n是素数);,与上述算法等价的算法,k=(int)sqrt(n);for(i=2;i=k+1)printf(t%2d,n);,for(n=10

24、1;n=200;n+=2),void main()int n,i,k;,#includemath.h,#includestdio.h,你认为这个程序最难理解的是什么?,怎么办?,引入标志变量f来表示n是否是素数,在已学过的知识中用到过没有?,f,f=0;,f=1;,/假设f为1时,n为素数,f为0时,n不是素数,#includestdio.h#includemath.hvoid main()int n,i,k,;for(n=101;n=200;n+=2)k=(int)sqrt(n);for(i=2;i=k;i+)if(n%i=0)break;if()printf(%8d,n);,i=k+1,f

25、=1,f,#includestdio.h#includemath.hvoid main()int n,i,k,f;for(n=101;n=200;n+=2)k=(int)sqrt(n);f=1;for(i=2;i=k;i+)if(n%i=0)f=0;break;if(f)printf(%8d,n);,每行输出多少个数?,如果每行输出个数怎么办?,10个,#includestdio.h#includemath.hvoid main()int n,i,k,f,m=0;for(n=101;n=200;n+=2)k=(int)sqrt(n);f=1;for(i=2;i=k;i+)if(n%i=0)f=

26、0;break;if(f)printf(%8d,n);m+;if(m%5=0)printf(n);,本例题主要讨论了几个问题:,.素数的算法实现,.标志变量的使用,.格式控制方法,【实例10】编程求60个Fibonacci数输出。假设每行输出6个数,。Fibonacci数列的初值分别是0和1。P59【例3-8】,分析:任意第三个数是它前面两个数的和。即 f(n)=f(n-1)+f(n-2)。,求解的方法有:,(1)每次计算两个Fibonacii数,(2)每次计算一个Fibonacii数,(3)用数组来实现(第章)(4)用递归的方法来实现(第10章)-10.2,a=a+b,b=a+b,2,1,3

27、,5,8,13,21,34,输出a,b,方法,printf(%8d%8d,a,b);for(i=1;i=19;i+)printf(%8d%8d,a,b);a=a+b;b=a+b;,for(i=1;i=20;i+)printf(%8d%8d,a,b);a=a+b;b=a+b;,#includestdio.h#includemath.hvoid main()int i,a=0,b=1;for(i=1;i=20;i+)printf(%10d%10d,a,b);a=a+b;b=a+b;printf(n);,if(i%2=0)printf(n);,每行输出个数怎么办?,c=a+b,a=0;b=1;pri

28、ntf(%10d%10d,a,b);for(j=1;j=38;j+)c=a+b;printf(%10d,c);a=b;b=c;,a=b,b=c,方法2,#includestdio.h#includemath.hvoid main()long a,b,c,k/*k为输出的Fibonacci数的个数*/;int j;a=0;b=1;printf(%10d%10d,a,b);k=2;for(j=1;j=38;j+)c=a+b;printf(%10d,c);k+;if(k%6=0)printf(n);a=b;b=c;,【例11】找出1-10000中的水仙花数。P79习题,关键在于如何分离正整数n的各位

29、数字,i=n%10/分离个位j=(n/10)%10/分离十位k=n/100/分离个位,如何描述算法?,如何延伸到任意位整数,如何修改?,为理解,以三位整数为例分析,#includestdio.h#includemath.hvoid main()int n,i,r,s;for(i=1;i0,循环的功能是把n的个各位数字分离出来并求立方和*/r=n%10;/*求正整数n的个位数字*/s=s+r*r*r;n=n/10;if(s=i)printf(%5d,i);/*输出满足条件的数*/,思考题从键盘上任意输入20个正整数,将其每位数字的平方和输出找出100 以内所有满足条件的数这个数出现在这个数的平方的最右边3.从键盘上读入一个整数,统计该数的位数,小结:算法很多,请大家掌握算法,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号