《CH程序控制结构实用.pptx》由会员分享,可在线阅读,更多相关《CH程序控制结构实用.pptx(79页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、【例】已知华氏温度,求对应的摄氏温度-顺序结构程序设计顺序结构程序设计摄氏温度 C=(5/9)(F-32)1.1.问题分析与算法设问题分析与算法设计计 算法描述.自然语言表示:自然语言表示:()输入华氏温度值()输入华氏温度值()根据公式计算()根据公式计算()输出摄氏温度()输出摄氏温度第1页/共79页输入半径fahr计算celsius输出celsius开始输入fahr计算celsius输出celsius结束scanf(“%d”,&fahr);celsius=5*(fahr-32)/9;printf(fahr=%d,celsius=%dn,fahr,celsius);传统流程图图第2页/共7
2、9页2.编写代码编写代码#includevoidmain()intcelsius,fahr;/变量定义scanf(%d,&fahr);/变量使用celsius=5*(fahr-32)/9;printf(fahr=%d,celsius=%dn,fahr,celsius);/输出结果3.编辑编译连接运行编辑编译连接运行分析结果是否分析结果是否与实际问题相与实际问题相符合符合?第3页/共79页编程序风格讨论编程序风格讨论?在上述程序中很显然与用户交互在上述程序中很显然与用户交互性不好性不好.若希望上述程序的运行情况若希望上述程序的运行情况如图所示如图所示,应如何修改程序应如何修改程序第4页/共79页
3、可将上述程序改为可将上述程序改为#includevoidmain()intcelsius,fahr;/变量定义printf(请输入华氏温度:n);scanf(%d,&fahr);/变量使用celsius=5*(fahr-32)/9;printf(华氏温度%d对应的摄氏温度是%dn,fahr,celsius);/输出结果第5页/共79页【实例1】编写程序求分段函数的值1.问题分析与算法设计问题分析与算法设计根据x的值选择不同的函数计算,要求输出结果保留2位小数算法方法1自然语言输入计算分段函数输出分支结构程序设计分支结构程序设计 第6页/共79页X X1515成立成立不成立不成立y=4x/3y=
4、4x/3z=2.5xz=2.5x-10.5-10.5输入输入x x输出输出y y算法方法2N-S图第7页/共79页#include#include void main()void main()double x,y;double x,y;printf(printf(请输入请输入x:nx:n);/);/输入提示输入提示 scanf(scanf(%lf%lf,&x);/,&x);/输入数据输入数据 if(x=15)if(x=15)/if/if else else语句语句 y=4*x/3;y=4*x/3;else else y=2.5*x-10.5;y=2.5*x-10.5;printf(y=f(%f
5、)=%.2fn,x,y);printf(y=f(%f)=%.2fn,x,y);2.编写代码编写代码3.调试运行第8页/共79页若用if语句实现#includevoidmain()doublex,y;printf(请输入x:n);/输入提示scanf(%lf,&x);/输入数据if(x15)/if语句y=2.5*x-10.5;printf(y=f(%f)=%.2fn,x,y);第9页/共79页温馨提示温馨提示1-1-软件测试的基本思软件测试的基本思想想 软件测试精心设计一批测试用例输入数据,预期输出结果,然后分别用这些测试用例运行程序,看程序的实际运行结果与预期输出结果是否一致。if(x=15)
6、y=4*x/3;elsey=2.5*x-10.5;9.5f(9.500000)=12.6715f(15.000000)=20.0021.3f(21.300000)=42.75第10页/共79页if(表达式)语句1else语句2if(x=15)y=4*x/3;elsey=2.5*x-10.5;语句1表达式语句2真假温馨提示温馨提示2-if2-if语句一般形式语句一般形式(P(P4949)第11页/共79页课堂思考:比较P47-49【例3.1】、【例3.2】在结构上以及实现方法与上述例子异同?第12页/共79页【实例3】分段计算水费1问题分析与算法设计思路:第13页/共79页2.2.编写代码编写代
7、码#includevoidmain()doublex,y;printf(请输入x:n);scanf(%lf,&x);if(x0)y=0;elseif(x=15)y=4*x/3;elsey=2.5*x-10.5;printf(y=f(%.2f)=%.2fn,x,y);3.调试运行第14页/共79页if(表达式1)语句1elseif(表达式2)语句2elseif(表达式n-1)语句n-1else语句n温馨提示温馨提示1-1-if-elseifif-elseif语句一般形式语句一般形式假表达式1表达式2语句1语句2语句n-1语句n真表达式n-1真假真假假第15页/共79页#includevoidma
8、in()inta=0,b=0,c=0,d=0,k;scanf(%d,&k);if(k=1)a+;elseif(k=2)b+;elseif(k=3)c+;elsed+;printf(a=%d,b=%d,c=%d,d=%d,a,b,c,d);a=1,b=0,c=0,d=0a=1,b=0,c=0,d=0当输入的值为当输入的值为2,2,结果是多少结果是多少?当输入的值为当输入的值为1,1,结果是多少结果是多少?课堂思考:a=1,b=0,c=0,d=0a=1,b=0,c=0,d=0第16页/共79页【例例3 3】依据教材依据教材P50 P50【例例3.33.3】从键盘上输入两个实数,根据需要选择运算类从
9、键盘上输入两个实数,根据需要选择运算类型。其运行情况如图所示型。其运行情况如图所示输入两个实数输入两个实数输出选择菜单输出选择菜单选择运算类型选择运算类型进行相应运算进行相应运算并输出并输出1.问题分析与算法设计问题分析与算法设计第17页/共79页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(请输
10、入两个实数(之间用,分隔)n);scanf(%lf,%lf,&real_num1,&real_num2);第18页/共79页printf(请选择运算种类(选择1/2/3/4):);scanf(%d,&chioce);选择运算类型选择运算类型进进行行相相应应运运算算并并输输出出switch(chioce)/根据选择的运算种类进行相应的运算case1:real_num=real_num1+real_num2;printf(%.2f+%.2f=%.2fn,real_num1,real_num2,real_num);break;case2:real_num=real_num1-real_num2;pr
11、intf(%.2f-%.2f=%.2fn,real_num1,real_num2,real_num);break;default:printf(没有该运算!n);第19页/共79页#includevoidmain()doublereal_num1,real_num2,real_num;intchioce;printf(请输入两个实数(之间用,分隔)n);scanf(%lf,%lf,&real_num1,&real_num2);printf(nn%20s,运算列表菜单n);printf(%20s,1.和运算(+)n);printf(%20s,2.差运算(-)n);printf(%20s,3.积运
12、算(*)n);printf(%20s,4.除运算(/)n);printf(请选择运算种类(选择1/2/3/4):);scanf(%d,&chioce);2.2.编写代码编写代码第20页/共79页switch(chioce)/根据选择的运算种类进行相应的运算case1:real_num=real_num1+real_num2;printf(%.2f+%.2f=%.2fn,real_num1,real_num2,real_num);break;case2:real_num=real_num1-real_num2;printf(%.2f-%.2f=%.2fn,real_num1,real_num2,
13、real_num);break;case3:real_num=real_num1*real_num2;printf(%.2f*%.2f=%.2fn,real_num1,real_num2,real_num);break;case4:real_num=real_num1/real_num2;printf(%.2f%.2f=%.2fn,real_num1,real_num2,real_num);break;default:printf(没有该运算!n);第21页/共79页3.调试运行测试用例第22页/共79页switchswitch(表达式)(表达式)casecase常量表达式常量表达式1:1:语
14、句语句1 1casecase常量表达式常量表达式2:2:语句语句2 2casecase常量表达式常量表达式n:n:语句语句n ndefault :default :语句语句n+1n+1 温馨提示温馨提示1-1-switch语句(p52)第23页/共79页按照考试成绩的等级输出百分制分数段按照考试成绩的等级输出百分制分数段#includevoidmain()charch;ch=getchar();ch=(ch=a&ch=z)?ch-32:ch;switch(ch)caseA:printf(85100n);caseB:printf(7084n);caseC:printf(6069n);caseD:
15、printf(85100n);default:printf(errorn);是否达到目标?break;break;break;break;课堂思考1:第24页/共79页运输公司对用户计算运费。运输公司对用户计算运费。路程()越远,每公里运费越低。标准如下:路程()越远,每公里运费越低。标准如下:没有折扣没有折扣 折扣折扣 折扣折扣 折扣折扣 折扣折扣 折扣折扣设每公里每吨货物的基本运费为,货物重为,距离为,设每公里每吨货物的基本运费为,货物重为,距离为,折扣为,则总运费的计算公式为:折扣为,则总运费的计算公式为:*()()课堂思考2:第25页/共79页分析折扣变化的规律性:分析折扣变化的规律性
16、:折扣的折扣的“变化点变化点”都是的倍数都是的倍数 sc=s/250折扣d250km00250s50012500s10002,351000s20004,5,6,782000s30008,9,10,1110 300012,13,.15l1问题分析与算法设计第26页/共79页#includevoidmain()intc,s;floatp,w,d,f;scanf(%f,%f,%d,&p,&w,&s);c=(s=3000)?12:s/250;switch(c)case0:d=0;break;case1:d=2;break;case2:case3:d=5;break;case4:case5:case6:
17、case7:d=8;break;case8:case9:case10:case11:d=10;break;case12:d=15;break;f=p*w*s*(1-d/100.0);printf(freight=%15.4fn,f);2.算法描述(省略).代码描述第27页/共79页 -1 (x0)算法1:输入x若x0,则y=1输出y 1.问题分析与算法设计问题分析与算法设计可用三个可用三个ifif语句实现语句实现第28页/共79页算法2#includevoidmain()intx,y;printf(请输入整数x:n);scanf(%d,&x);if(x=0)if(x0)y=1;else y=0
18、;else y=-1;程序4:y=0;if(x=0)if(x0)y=1;else y=-1;程序3:y=-1;if(x!=0)if(x0)y=1;else y=0;正确?正确?正确?课堂思考1:第30页/共79页if()if()if()if()语句语句1 1elseelse 语句语句2 2elseelseif()if()语句语句3 3elseelse 语句语句4 4内嵌内嵌ifif在在ifif语句中又包含一个或多个语句中又包含一个或多个ifif语句称为语句称为ifif语句的嵌套。形式:语句的嵌套。形式:温馨提示温馨提示-if的嵌套(p52)第31页/共79页匹配规则:匹配规则:elseelse
19、总是与它上面最近的、未配对的总是与它上面最近的、未配对的ifif语句配对。语句配对。例:if()if()语句1elseif()语句2else 语句3if()if()语句1elseif()语句2 else 语句3当当ifif和和elseelse数目不同时,可以加花括号来确定配对关系。数目不同时,可以加花括号来确定配对关系。希望希望配对配对第32页/共79页课堂思考:比较P52-53【例3.4】在结构上以及实现方法与上述例子异同?第33页/共79页【例例5 5】依据教材依据教材P50 P50【例例3.53.5】5555位学生排成位学生排成4 4排排,学号学号1-551-55号号,按照按照1-1-4
20、 4报数报数.任意给定一个学号任意给定一个学号,显示学生在显示学生在第几列第几列1.问题分析与算法设计问题分析与算法设计用switch语句第34页/共79页2.编编写写代代码码#includevoidmain()inti,n;i=0;printf(请输入学号:n);scanf(%d,&n);if(n55)printf(Error!);elsei=n%4;switch(i)case1:printf(%d号同学在第1列!n,n);break;case2:printf(%d号同学在第2列!n,n);break;case3:printf(%d号同学在第3列!n,n);break;case0:print
21、f(%d号同学在第4列!n,n);break;第35页/共79页循环结构程序设计循环结构程序设计 【实例实例6 6】求求1 1到到100100的和依据的和依据p56p56【例例3.63.6】1 1问题分析与算法设计问题分析与算法设计 求在一定范围内(求在一定范围内(1 1n n)、满足一定条件)、满足一定条件(不超过不超过n)n)的若干整数的和,求累加的若干整数的和,求累加和。和。思路:设置一个变量思路:设置一个变量(s)(s),其初值为,其初值为0 0,然后在,然后在1 1n n中的所有数,将它们一个一中的所有数,将它们一个一个累加到个累加到s s中。中。一步累加:一步累加:s=s+i;s=
22、s+i;i i 值的变化通过值的变化通过i=i+1i=i+1实现实现第36页/共79页实例分析3si612336i=i+1s=s+is=s+i实际上实际上:就是重复执行就是重复执行下列操作下列操作:s=s+Ii=i+1直到直到i i超过超过100100第37页/共79页s=0,i=1i=100s=s+ii=i+1输出s算法描述:将上述算法思想用N-S图描述为:当当型型循循环环第38页/共79页s=0,i=1i=100s=s+ii=i+1输出ss=0;i=1;while()i=100s=s+i;i=i+1;循环体循环结构循环结构printf(“100以内的和是:%d“,s);可用for、whil
23、e、do-while实现用用while语句描述语句描述第39页/共79页void main()s=0;i=1;while(i=100)s=s+i;i+;printf(s=%dn,s);int s,i;#include stdio.h主函数的首部主函数的首部算法实现算法实现数据类型数据类型2编程序编程序第40页/共79页#include stdio.hvoid main()int s,i;printf(s=%dn,s);s=0;i=1;while()i=100s=s+i;i=i+1;i=1,s=0for(;);s=s+ii=100 i+#include stdio.hvoid main()int
24、 s,i;printf(s=%dn,s);用用for语句描述语句描述第41页/共79页#include stdio.hvoid main()int s=0,i=1;printf(s=%dn,s);dowhile(i=100);s=s+i;i+;用用do-while语句实现语句实现第42页/共79页while(条件)循环体语句;真假while下一条语句表达式循环体语句循环条件循环条件循环体循环体一条语句一条语句温馨提示温馨提示1-1-while语句(p57)第43页/共79页do循环体语句while(表达式)先循环后判断真假表达式循环体语句do-while的下一条语句温馨提示温馨提示2-2-do
25、-while语句(p58)第44页/共79页 while 是先判别条件,再决定是否循环;do-while 是先至少循环一次,然后再根据循环的结果决定是否继续循环。while和do-while的比较真假表达式循环体语句do-while的下一条语句真假while的下一条语句表达式循环体语句第45页/共79页格式:for(表达式1;表达式2;表达3)语句;温馨提示温馨提示3-3-for语句(p60)第46页/共79页100以内的自然数求和#include“stdio.h”Voidmain()inti,sum;for(i=1,sum=0;i=100;i+)sum=sum+i;printf(sum=%d
26、n,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=sum+i;第47页/共79页【实例7】编程实现编程实现S=1!+2!+10!循环嵌套(p62)从1!逐个求到10!,每求到一个阶乘就求和求求解解思思路路?第48页/共79页t=1;for(j=1;j=i;j+)/求i!t=t*j;s=s+t;
27、/阶乘求和for(i=1;i=10;i+)s=0;这就是一个循环嵌套结构这就是一个循环嵌套结构第49页/共79页#includestdio.h#includemath.hvoidmain()inti,j;longt,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);程程序序代代码码第50页/共79页单重循环实现与双重循环实现的比较单重循环实现与双重循环实现的比较s=0;t=1;s=0;t=1;for(i=1;i=10;i+)for(i=1;i=10;i+)t=t*
28、i;s=s+t;t=t*i;s=s+t;#includestdio.hvoidmain()inti,j;longt,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);用单重循环如何实现?第51页/共79页思考:思考:编程实现编程实现S=1+(1+2)+(1+2+3)+(1+2+10)?第52页/共79页请比较请比较P62【例例3.9】(中国古典算术问题(中国古典算术问题-搬砖问题)某工地需要搬运砖块,)某工地需要搬运砖块,36块砖,块砖,36人搬,已人搬,已知男人
29、一人搬知男人一人搬4块,女人一人搬块,女人一人搬3块,小孩两人搬块,小孩两人搬1块。块。问男、女、小孩各需多少人?问男、女、小孩各需多少人?第53页/共79页用三重循环实现-完整代码见备注for(men=0;men=36;men+)for(women=0;women=36;women+)for(child=0;child=36;child+)if(men+women+child=36)&(men*4+women*3+child*0.5=36)printf(men=%d women=%d child=%dn,men,women,child);第54页/共79页for(men=0;men=9;me
30、n+)for(women=0;women=12;women+)child=36womenmen;if(men*4+women*3+child*0.5=36)printf(men=%dwomen=%dchild=%dn,men,women,child);比较循环次数比较循环次数?用双重循环实现-完整代码见备注第55页/共79页思考:思考:P63【例例3.10】2008!的末尾有多少个!的末尾有多少个0?第56页/共79页在在whilewhile、forfor、do-whliedo-whlie语语句句的的循循环环体体内内中中又又包包含含了了另另一一个个完完整整的的循循环环结结构构,以以forfor
31、为例为例内循环体内循环体 for(A1;A2;A3)B1for(A11;A21;A31)B2B3外循环体外循环体 温馨提示:温馨提示:什么是循环嵌套什么是循环嵌套?第57页/共79页求解求解A1A1求解求解A2A2执行执行B1B1求解求解A11A11求解求解A21A21执行执行B2B2求解求解A31A31结束循环结束循环YNYN执行执行A3A3第58页/共79页三、三、非正常结束循环(非正常结束循环(p65p65)求求解解思思路路?范围:if(n%7=0)printf(%d,n);for(n=1;n=100;n+)条件:n能够被7整除【实例8】找出1100中能够被7整除的数.(p66【例3.1
32、2】)第59页/共79页程序编写#include#includevoid main()void main()int n;int n;for(n=1;n=100;n+)for(n=1;n=100;n+)continuecontinuebreakbreak结果如何?结果如何?if(n%7=0)printf(%d,n);if(n%7!=0)printf(%d,n);第60页/共79页2、continue格式:continue;语义:结束本次循环1、break语句形式:break;语义:结束循环温馨提示:温馨提示:beakbeak和和continuecontinue的含义的含义?第61页/共79页【实
33、例9】输出100200之间的素数(P70【例3.16】)。关键是判断素数!何谓素数?只能被1和它本身整除的数!问题分析与算法设计第62页/共79页 for(i=2;i=n-1;i+)if(n%i=0)break;if(i=n)printf(“n是素数是素数);若若n%i!=0,n%i!=0,继续循环继续循环直到所有直到所有i i的值取完的值取完,n n是不是是不是素数?素数?又这样判断又这样判断n n是是素数?素数?第63页/共79页for(i=2;i=n-1;i+)if(n%i=0)break;if(i=n)printf(“n是素数是素数);思考:若思考:若n n的值是,共循环多少次?的值是
34、,共循环多少次?次思考:循环结束后思考:循环结束后i i的值是多少?的值是多少?次改进!如如果果n n是是更更大大的的一一个个素素数数,效效率率就就会降低!怎么办?会降低!怎么办?第64页/共79页 k=sqrt(n);for(i=2;i=k+1)printf(“n是素数是素数);与上述算法等价的算法第65页/共79页k=(int)sqrt(n);for(i=2;i=k+1)printf(t%2d,n);for(n=101;n=200;n+=2)voidmain()intn,i,k;#includemath.h#includestdio.h你认为这个程序最难理解的是什么?怎么办?第66页/共7
35、9页引入标志变量引入标志变量f f来表示来表示n n是否是素数是否是素数在已学过的知识中用到过没有?在已学过的知识中用到过没有?第67页/共79页ff=0;f=1;/假设f为1时,n为素数,f为0时,n不是素数#includestdio.h#includemath.hvoidmain()intn,i,k,;for(n=101;n=200;n+=2)k=(int)sqrt(n);for(i=2;i=k+1f=1f第68页/共79页#includestdio.h#includemath.hvoidmain()intn,i,k,f;for(n=101;n=200;n+=2)k=(int)sqrt(n
36、);f=1;for(i=2;i=k;i+)if(n%i=0)f=0;break;if(f)printf(%8d,n);每行输出多少个数?如果每行输出个数怎么办?10个第69页/共79页#includestdio.h#includemath.hvoidmain()intn,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=0;break;if(f)printf(%8d,n);m+;if(m%5=0)printf(n);本例题主要讨论了几个问题:.素数的算法实现.标志变量的使用.格式控制方法第70
37、页/共79页【实例10】编程求60个Fibonacci数输出。假设每行输出6个数,。Fibonacci数列的初值分别是0和1。P59【例3-8】分析:任意第三个数是它前面两个数的和。即分析:任意第三个数是它前面两个数的和。即 f(n)=f(n-1)+f(n-2)f(n)=f(n-1)+f(n-2)。求解的方法有:求解的方法有:(1 1)每次计算两个每次计算两个FibonaciiFibonacii数数(2 2)每次计算一个)每次计算一个FibonaciiFibonacii数数(3 3)用数组来实现(第章)用数组来实现(第章)(4 4)用递归的方法来实现(第)用递归的方法来实现(第1010章)章)
38、-10.2-10.2 第71页/共79页aba=a+bb=a+b21358132134输出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;第72页/共79页#includestdio.h#includemath.hvoidmain()inti,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
39、);每行输出个数怎么办?第73页/共79页abc1112123235.c=a+ba=0;b=1;printf(%10d%10d,a,b);for(j=1;j=38;j+)c=a+b;printf(%10d,c);a=b;b=c;a=bb=c方法2第74页/共79页#includestdio.h#includemath.hvoidmain()longa,b,c,k/*k为输出的Fibonacci数的个数*/;intj;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
40、);a=b;b=c;第75页/共79页【例11】找出1-10000中的水仙花数。P79习题关键在于如何分离正整数n的各位数字i=n%10/分离个位j=(n/10)%10/分离十位k=n/100/分离个位如何描述算法?如何延伸到任意位整数,如何修改?如何延伸到任意位整数,如何修改?为理解,以三位整数为例分析第76页/共79页#includestdio.h#includemath.hvoidmain()intn,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);/*输出满足条件的数*/第77页/共79页思考题从键盘上任意输入20个正整数,将其每位数字的平方和输出找出100以内所有满足条件的数这个数出现在这个数的平方的最右边3.从键盘上读入一个整数,统计该数的位数小结:算法很多,请大家掌握算法第78页/共79页感谢您的欣赏!第79页/共79页