C程序设计课件第5章.ppt

上传人:小飞机 文档编号:6503653 上传时间:2023-11-07 格式:PPT 页数:110 大小:843KB
返回 下载 相关 举报
C程序设计课件第5章.ppt_第1页
第1页 / 共110页
C程序设计课件第5章.ppt_第2页
第2页 / 共110页
C程序设计课件第5章.ppt_第3页
第3页 / 共110页
C程序设计课件第5章.ppt_第4页
第4页 / 共110页
C程序设计课件第5章.ppt_第5页
第5页 / 共110页
点击查看更多>>
资源描述

《C程序设计课件第5章.ppt》由会员分享,可在线阅读,更多相关《C程序设计课件第5章.ppt(110页珍藏版)》请在三一办公上搜索。

1、第五章 流程控制,顺序结构分支结构循环结构程序设计实例本章小结,顺序结构,属性某部分若执行,则语句顺序全部被执行若不执行,则全部语句一个也不执行形式 DS DS DS,分支结构,逻辑分支结构,语法if语句 if(表达式)语句 if(表达式)语句 else 语句形式if(e)S1 else S2if(e)S,执行过程与PAD图 if(e)S1 else S2,例5.1 float max(float a,float b)if(ab)return a;elsereturn b;,形式二if(e)S,if语句应注意的问题,布尔表达式可以嵌套else归属问题if(ab)if(bc)x=0;else x

2、=1;,else 属于最前边的 if,则if(ab)if(bc)x=0;else x=1;相当于 if(ab)if(bc)x=0;else x=1;前述的问题的答案是:若 ab 且 b=c什么也不执行,else 属于第二个 if,则 if(ab)if(bc)x=0;else x=1;相当于if(ab)if(bc)x=0;else x=1;上述的问题的答案是 若 ab 且 b=c 执行 x=1。,两义性C标准规定:else部分与前面最邻近的一个没有配对 的 if 配对第二种方案解释。若想描述第一种方案的结构只好用、将中间的“if()语句”括起来,构成复合语句。,if(ab)if(bc)x=0;e

3、lse x=1;,例5.3 求方程 ax2+bx+c=0 的根是一元二次方程(a0)有实根(0)两个不同的实根(0)两个相同的实根(=0)有虚根(0)是一元一次方程(a=0,b0)是恒等式(a=0,b=0)恒等式成立(c=0)恒等式不成立(c0),读入 a,b,c,求解 x1,x2,输出 x1,x2,二次方程,一次方程,一次方程,常数等式,x=c/b,否则,if(a!=0)delta=b*b-4*a*c;if(delta0)printf(x1=%g,x2=%gn,(-b+sqrt(delta)/(2*a),(-b-sqrt(delta)/(2*a);else if(delta=0)printf

4、(x1=x2=%fn,-b/(2*a);elseprintf(x1=%g+%gi,x2=%g-%gin,-b/(2*a),sqrt(-delta)/(2*a),-b/(2*a),sqrt(-delta)/(2*a);else/以下处理a=0的情况 if(b!=0)printf(x=%gn,-c/b);elseif(c=0)printf(0=0!n);else printf(%g=0n,c);,演示例5.3程序,算术值控制多分支结构,switch(e)case C1:S1 break;case C2:S2 break;.case Cn:Sn break;default:S0,switch(e)c

5、ase C1:S1 case C2:S2.case Cn:Sn default:S0,例5.4 高速公路每公里的收费标准按不同种类汽车如下:小汽车(car)0.50 元 卡车(truck)1.00 元 大客车(bus)1.50 元编程序,为某高速公路收费站计算各种车辆的收费额。,#include stdio.henum tsort car,truck,bus sort;/车种说明int i;float mileage,price;/里程、费用void main()/输入车种 printf(“please choose(1.car 2.truck 3.bus):”);scanf(“%d”,/输出

6、,演示例5.4程序,计算数列 的前n项和。,循环结构,循环指程序的某部分被反复的重复执行多次循环程序设计编写重复执行的程序循环体被重复执行的部分,C 的三种不同的重复性语句,它们是while 语句 先判断条件的循环;do 语句 后判断条件的循环;for 语句 也是先判断条件的循环。需要弄清楚的循环控制方式是什么?控制条件是什么?重复执行部分(称为“循环体”)是什么?,先判断条件的循环结构,语法 while 语句 while(表达式)语句一般形式while(e)S,计算数列 的前n项和。,void main()int n,k=1;float s=0;printf(“please input n:

7、n”);scanf(“%d”,s=0.0;k=1;n=3s=0+0.5;k=2;n=3s=0.5+0.1667;k=3;n=3s=0.6667+0.0833;k=4;n=3,例5.5 编一个函数,求自然对数底 e 的近似值。e的计算公式,由于不能进行无穷项的计算,所以只能进行近似计算,当余项,余项计算可利用前后项之间的递推关系,float logari(float eps)int n;float e,r;e=1.0;n=1;r=1.0;while(reps)e=e+r;n=n+1;r=r/n;return e;,e=1.0;n=1;r=1.0;e=2.0;n=2;r=0.5;e=2.5;n=3

8、;r=0.1667;e=2.6667;n=4;r=0.0417;.,后判断条件的循环结构,语法do 语句 do 语句 while(表达式);一般形式do S while(e);,例5.6 考虑本节开始的问题,编一个函数 s(n),计算数列的ak的前 n 项和,float s(int n)int k;float sum;sum=0;k=1;do sum+=1.0/(k*(k+1);k+;while(k=n);return sum;,sum=0.0;k=1;n=3sum=0+0.5;k=2;n=3sum=0.5+0.1667;k=3;n=3sum=0.6667+0.0833;k=4;n=3,例5.

9、7 编程序,输入一个年份,求该年以后的 n 个闰年。,某年(yy)是闰年的条件是:,(yy%4=0)&(yy%100!=0)|(yy%400=0),/*PROGRAM find leap year*/#include stdio.hvoid main()int yy,n;printf(please input begin year:);scanf(%d,演示例5.7程序,例5.8 简单迭代法,g(x)=0,x=f(x),采用迭代法方法求解x=f(x)方程的根选定一个 x的初值 x0;以 x0 代入右端计算出一个值 x1=f(x0)若 x1 等于x0,显然 x0 为根,转向否则若 x1x0 则令

10、 x0=x1,转向结束,停止计算,f(x),y=x,f(x0),x0,x1,f(x1),x*,x2,可以使用简单迭代的情况,f(x2),f(x),y=x,f(x1),x2,x1,f(x0),x*,x0,不可以使用简单迭代的情况,f(x2),简单迭代方法使用条件 对于方程xf(x),当任意x(a,b)存在0 L 1,使|f(x)|L1 则方程x=f(x)在(a,b)上有唯一的根x*且对任意初值x0(a,b)时 迭代序列xk+1=f(xk)(k=0,1,)收敛于x*在实际工作中,决大部分计算都是近似计算,只要求 X1X0 即X1-X0使用条件,#include stdio.h#include ma

11、th.h#define eps 1e-6void main()float x0,x1;x0=0.0;x1=0.0;do x0=x1;x1=2*x0*x0*x0+0.5*x0*x0+0.093;while(fabs(x1-x0)eps);printf(x=%fn,x0);,演示例5.8程序,比较两种while语句,for 语句,一般形式 for(e1;e2;e3)Se1初值表达式 用于设置该循环开始的一些初值e2终值表达式 用于控制循环结束e3增量表达式 用于每次循环体执行后对控制条件的修正,执行与PAD图,for与while 语句,e=1.0;n=1;r=1.0;while(reps)e=e+

12、r;n=n+1;r=r/n;,e=1.0;n=1;for(r=1.0;reps;r=r/n)e=e+r;n=n+1;,sum=0;k=1;r=1.0;while(k=n)sum=sum+1.0/(k*(k+1);k+;,sum=0;for(k=1;k=n;k+)sum=sum+1.0/(k*(k+1);,例5.9 编程序求向量内积。由终端输入两个n维向量X,Y.计算其内积XY。,float S(int n)int i;float xy,xi,yi;xy=0;for(i=1;i=n;i=i+1)scanf(“%f%f”,return xy;,0,x,y,0,-1,1,2,例5.10编程序,画函数

13、 y=f(x)=e-x sin(2X)在0,2区间上的图形,#define dx 0.05#define dy 0.05#define pi 3.14159265#define y0 40#define endx 40void main()int n,i,j;float x,y;x=0;for(i=0;i=endx;i+)y=exp(-x)*sin(2*pi*x);n=y0+(int)(y/dy);for(j=0;j=n;j+)printf();printf(*n);x=x+dx;,演示例5.10程序,程序设计实例,打印99表打印100以内素数模拟计算器十六进制数翻译,打印99表,1 12 2

14、 43 3 6 94 4 8 12 165 5 10 15 20 256 6 12 18 24 30 367 7 14 21 28 35 42 498 8 16 24 32 40 48 56 649 9 18 27 36 45 54 63 72 81*1 2 3 4 5 6 7 8 9,1 12 2 43 3 6 94 4 8 12 165 5 10 15 20 256 6 12 18 24 30 367 7 14 21 28 35 42 498 8 16 24 32 40 48 56 649 9 18 27 36 45 54 63 72 81,打印前9行,打印第i行,6 6 12 18 24

15、 30 36,9 9 18 27 36 45 54 63 72 81,9 9 18 27 36 45 54 63 72 81,6 6 12 18 24 30 36,*1 2 3 4 5 6 7 8 9,打印底行,/*PROGRAM print table9*9*/#include stdio.hvoid main()int i,j;for(i=1;i10;i+)printf(%4d,i);for(j=1;j=i;j+)printf(%4d,i*j);printf(n);printf(%4c,*);for(i=1;i10;i+)printf(%4d,i);,演示例5.11程序,打印100以内素数

16、,bool prime(int n)int j;for(j=n/2;j=2;j-)if(n%j=0)return false;return true;,bool prime(int);void main()int i;for(i=2;i=2;j-)if(n%j=0)flag=false;return flag;,演示例5.12程序,bool prime(int n)int j;for(j=n/2;j=2;j-)if(n%j=0)return false;return true;,bool prime(int);void main()int i,x;printf(“input x:”);scan

17、f(“%d”,演示例程序,模拟计算器,假设该计算器只能对一位整数进行加、减、乘、除运算,且运算符不带优先级,也没括号。例3*7-3/9*2=4,void main()float a,b;char w;scanf(%f,演示例5.13程序,十六进制数翻译,编一个函数convert,从终端读入一个十六进制数,把它翻译成十进制。若翻译正确,则convert返回true否则若翻译错误,则convert返回false,十六进制数的形式AB.1f.ef 12f12f.,主程序中若convert()返回真值,则说明翻译成功若intflag为真,打印整数值(n中保存)否则,打印实数数值(f中保存)打印“suc

18、cessful!”否则打印“fail”,判断字符是否是十六进制数字对应的字符bool isdigit(char ch)return(ch=0),解法一:直接翻译十六进制数具有如下三种形式翻译成十进制数的公式,滤掉前导空白,并读出第一个数字=ch,翻译整数部分,翻译小数部分,返回真,合并整数,小数部分,返回操作,f=n+f,返回假,/*PROGRAM convert hexadecimal number to decimal number*/#include stdio.h#define radix 16/确定是哪种进制int n;/全局保存整数float f;/全局保存实数bool intfl

19、ag;/标志是否是整数int calculate_char(char ch);/进算十六进制字符对应的数值bool isdigit(char ch);/判断字符是否是十六进制字符bool convert();/翻译函数void main()if(convert()if(intflag)printf(%d n,n);elseprintf(%f n,f);printf(Successful!n);elseprintf(Fail!n);,/*翻译函数*/bool convert()char ch;float g;intflag=true;ch=getchar();/*滤掉前导空白字符*/while(

20、ch=)ch=getchar();/*翻译整数部分*/n=0;while(isdigit(ch)n=n*radix+calculate_char(ch);ch=getchar();,if(ch=.)intflag=false;/*翻译小数部分*/f=0.0;g=1.0;ch=getchar();while(isdigit(ch)g=g/radix;f=f+g*calculate_char(ch);ch=getchar();/*整数部分与小数部分合并*/f=f+n;if(ch=r|ch=n)return true;elsereturn false;,演示例5.14-1程序,前导空白字符部分;整数

21、部分;小数点;小数部分;,解法二 状态图(矩阵)方法,S0,S1,S2,S3,S4,其他字符,数字,小数点,小数点,数字,数字,空白字符,空白字符其他字符小数点,空白字符其他字符,数字,空白字符其他字符小数点,状态矩阵,处理前导字符状态(S0);处理整数部分状态(S1);处理小数点部分状态(S2);处理小数部分状态(S3);处理错误状态和结束状态(S4),/*十六进制翻译函数2*/#include stdio.h#define radix 16int n;/*整数部分*/float f;/*小数部分*/bool intflag,errflag;/*整数标志、错误标志*/char ch;/*当前

22、读入字符*/int num;/*ch 对应的数值*/float g;/*翻译小数部分权值*/int s,sort;/*状态、字符类*/void com_integer(void);/*翻译整数部分*/void com_real(void);/*翻译小数部分*/int sort_char(char);/*字符分类、形成 sort*/int calculate_char(char);/*计算合法字符的数值*/void com_error(int);/*错误处理*/,void com_integer(void)/*翻译整数部分*/n=n*radix+num;void com_real(void)/*

23、翻译小数部分*/g=g/radix;f=f+num*g;,bool convert2()/*状态矩阵方法翻译函数*/intflag=true;/*首先假设翻译的是整数*/errflag=true;/*首先假设翻译正确*/s=0;/*状态初值*/g=1.0;/*小数部分的权值*/n=0;/*整数单元*/f=0;/*实数单元*/while(s4)ch=getchar();/读入字符 sort=sort_char(ch);/为字符分类 if(sort=0)num=calculate_char(ch);/字符对应的数值,switch(s)/状态操作 case 0:switch(sort)case 0:

24、com_integer();遇到数字翻译整数 s=1;break;case 1:s=2;遇到小数点 break;case 2:break;前导字符 case 3:com_error(1);break;,case 1:switch(sort)case 0:com_integer();翻译整数 break;case 1:s=2;翻译整数时遇到小数点 break;case 2:s=4;翻译整数时遇到空白字符 break;case 3:com_error(2);翻译整数遇其它字符 break;,case 2:switch(sort)case 0:com_real();翻译小数 s=3;break;ca

25、se 2:s=4;翻译整数时遇到空白字符 intflag=false;break;case 1:com_error(3);存在两个以上小数点 break;case 3:com_error(4);遇到非法字 break;,case 3:switch(sort)case 0:com_real();翻译小数 break;case 2:s=4;翻译整数时遇到空白字符 intflag=false;f=n+f;break;case 1:com_error(3);存在两个以上小数点 break;case 3:com_error(4);翻译小数遇非法字符 break;,/*switch(s)*/*while(

26、s4)*/return errflag;/*bool convert2*/,/*字符分类、形成 sort*/int sort_char(char ch)if(isdigit(ch)/数字字符return 0;elseif(ch=.)/小数点return 1;else if(ch=|ch=t|ch=n)return 2;/空白字符 else return 3;/非法字符,void com_error(int errnum)errflag=false;s=4;switch(errnum)case 1:printf(#error1:数开始符非法!n);break;case 2:printf(#err

27、or2:整数部分输入非法字符!n);break;case 3:printf(#error3:输入两个或以上小数点!n);break;case 4:printf(#error4:小数部分输入非法字符!n);break;,演示例5.14-2程序,程序化简,处理前导字符状态(S0);处理整数部分状态(S1);处理小数部分状态(S2);处理错误状态和结束状态(S3),化简后的状态图,本章小结,结构化的标准流程控制。包括顺序结构分支结构重复结构重点使用这些控制结构编写程序解决实际问题,作业,5.15.55.75.105.11,5.155.225.315.485.69,习题5.9,习题5.18,F(n),

28、结束,r=0,while(n/10=0|n0),r+=(n%10)!,n=n/10,return r,r+=s,int f(int n)int r,s,t;r=0;while(n/100|n0)t=n%10;s=1;while(t0)s=s*t;t=t-1;r=r+s;n=n/10;return r;,习题5.29,/*PROGRAM writeprime*/#include stdio.hbool prime(int m)int j;for(j=m/2;j=2;j-)if(m%j=0)return false;return true;int u,v,n;void main()n=0;u=3;

29、v=u+2;while(n10)if(prime(u),习题8.29,H(int x,int n),结束,return 1,n=0,计算Hn(x),return 2*x,n=1,返回Hn(x)的值,h0=1;h1=2*x,int H(int x,int n)int h0,h1,h2;if(n=0)return 0;if(n=1)return 2*x;h0=1;h1=2*x;for(int i=2;i=n;i+)h2=2*x*h1-2*(i-1)*h0;h0=h1;h1=h2;return h2;,习题5.34,want(),结束,x=0;y=0;z=0;,x+,x=?,(,),x-,y+,y-

30、,z+,z+,ch!=r&ch!=n,ch=getchar(),x,y,z某个不是零,return false,return true,bool want()int x=0,y=0,z=0;char ch;doch=getchar();switch(ch)case:x+;break;case:x-;break;case:y+;break;case:y-;break;case(:z+;break;case):z-;break;while(ch!=r,习题5.48,main,结束,打印,big*B+mid*M+sm*S=SUM,for(big=0;big=SUM/B;big+),for(mid=0

31、;mid=SUM/M;mid+),#include stdio.h#define SUM 100#define B 3#define M 2#define S 0.5void main()int big,mid,sm;for(big=0;big=SUM/B;big+)for(mid=0;mid=SUM/M;mid+)sm=SUM-big-mid;if(big*B+mid*M+sm*S=SUM)printf(big=%d,mid=%d,small=%dn,big,mid,sm);,习题5.1,1)if(i=1)r=1;i=1是赋值表达式,不是布尔表达式6)switch(j)case 1.0:r=

32、1;case 2.0:s=1;case 后的常量必须是整型13)for(j=1;j10;j+)k=k+j;for(j=10;j20;j+)r=k r=k语句后缺分号,习题5.5,int fact(int n)int ans=1;while(n0)ans=ans*n;n=n-1 return ans;,习题5.11,A B C D E F G A B C D E F G AB C D E F G A B B B C D E F G A BC D E F G A B C C C C C D E F G A B CD E F G A B C D D D D D D D E F G A B C DE

33、F G A B C D C C C C C F G A B C D EF G A B C D E B B B G A B C D E FG A B C D E F A A B C D E F G,A B C D E F G A B C D E F G AB C D E F G A B B B C D E F G A BC D E F G A B C C C C C D E F G A B CD E F G A B C D D D D D D D E F G A B C DE F G A B C D C C C C C F G A B C D EF G A B C D E B B B G A B

34、 C D E FG A B C D E F A A B C D E F G,A B C D E F G A B C D E F G AB C D E F G A B B B C D E F G A BC D E F G A B C C C C C D E F G A B CD E F G A B C D D D D D D D E F G A B C DE F G A B C D C C C C C F G A B C D EF G A B C D E B B B G A B C D E FG A B C D E F A A B C D E F G,习题5.22,bool gcd(int u,int v)int r;r=v;while(r!=0)r=u%v;u=v;v=r;if(u=1)return true;else return false;,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号