《C程序设计课件第5章.ppt》由会员分享,可在线阅读,更多相关《C程序设计课件第5章.ppt(110页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第五章第五章 流程控制流程控制n n顺序结构顺序结构n n分支结构分支结构n n循环结构循环结构n n程序设计实例程序设计实例n n本章小结本章小结顺序结构顺序结构n n属性属性某部分若执行某部分若执行,则语句顺序全部被执行则语句顺序全部被执行若不执行,则全部语句一个也不执行若不执行,则全部语句一个也不执行n n形式形式形式形式 DS DS DS DS DS DS 分支结构分支结构逻辑分支结构逻辑分支结构n n语法语法if if语句语句语句语句 if (if (表达式表达式表达式表达式)语句语句语句语句 if (if (表达式表达式表达式表达式)语句语句语句语句 else else 语句语句语
2、句语句n n形式形式if(if(e e)S1 S1 elseelse S2 S2if(if(e e)S Sn n执行过程与执行过程与PAD图图 if(if(e e)S1 S1 elseelse S2 S2eS1FS2TS1eS2n n例例例例5.15.1 float float max max(float(float a,a,float float b b)if(if(abab)returnreturn a;a;elseelsereturnreturn b;b;return aabreturn bn n形式二形式二if (if (e e)S SeSF Seif语句应注意的问题语句应注意的问题n
3、 n布尔表达式布尔表达式n n可以嵌套可以嵌套n nelse归属问题归属问题if (ab)if (bc)x=0;else x=1;abx=1 x=0bcabx=1 x=0bcn nelse else 属于最前边的属于最前边的属于最前边的属于最前边的 if if,则,则,则,则if (ab)if (bc)x=0;else x=1;if (ab)if (bc)x=0;else x=1;相当于相当于相当于相当于 if(if(abab)if(if(bc bc)x=0;x=0;elseelse x=1;x=1;n n前述的问题的答案是前述的问题的答案是前述的问题的答案是前述的问题的答案是:若若若若 a=
4、b ab ab 且且且且 b=c bbx=1 x=0bcn nelse else 属于第二个属于第二个属于第二个属于第二个 if if,则,则,则,则 if (ab)if (bc)x=0;else x=1;if (ab)if (bc)x=0;else x=1;相当于相当于相当于相当于if (if (ab ab)if (if (bcbc)x=0;x=0;elseelse x=1;x=1;n n上述的问题的答案是上述的问题的答案是上述的问题的答案是上述的问题的答案是 若若若若 a=b ab ab 且且且且 b=c bbx=1 x=0bcn n两义性两义性C C标准规定标准规定标准规定标准规定:el
5、se部分与前面最邻近的一个没有配对部分与前面最邻近的一个没有配对 的的 if 配对配对第二种方案解释。第二种方案解释。第二种方案解释。第二种方案解释。若想描述第一种方案的结构只好用若想描述第一种方案的结构只好用若想描述第一种方案的结构只好用若想描述第一种方案的结构只好用 、将中间将中间将中间将中间的的的的“if()“if()语句语句语句语句”括起来,构成复合语句。括起来,构成复合语句。括起来,构成复合语句。括起来,构成复合语句。abx=1 x=0bcif (ab)if (bc)if (ab)if (bc)if (ab)if (bc)if (ab)if (bc)x=0;else x=1;x=0;
6、else x=1;x=0;else x=1;x=0;else x=1;n n例例例例5.3 5.3 求方程求方程求方程求方程 ax ax2 2+bx+c=0 +bx+c=0 的根的根的根的根是一元二次方程是一元二次方程是一元二次方程是一元二次方程(a0)(a0)有实根有实根有实根有实根(0)0)两个不同的实根两个不同的实根两个不同的实根两个不同的实根(0)0)两个相同的实根两个相同的实根两个相同的实根两个相同的实根(=0)=0)有虚根有虚根有虚根有虚根(0)0)是一元一次方程是一元一次方程是一元一次方程是一元一次方程(a=0,b0)(a=0,b0)是恒等式是恒等式是恒等式是恒等式(a=0,b=
7、0)(a=0,b=0)恒等式成立恒等式成立恒等式成立恒等式成立(c=0)(c=0)恒等式不成立恒等式不成立恒等式不成立恒等式不成立(c0)(c0)解二次方程解二次方程读入读入 a,b,c求解求解 x1,x2输出输出 x1,x2结束结束二次方程二次方程a0b0一次方程一次方程退化退化0=0c=0矛盾矛盾c=0一次方程一次方程常数等式常数等式x=c/b=0两实根两实根:x1=x2两虚根两虚根:x1,x2二实根二实根:x1,x20计算计算否则否则if(a!=0)delta=b*b-4*a*c;if(delta0)printf(x1=%g,x2=%gn,(-b+sqrt(delta)/(2*a),(-
8、b-sqrt(delta)/(2*a);else if(delta=0)printf(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 (switch (e e)
9、case case C1 C1:S1S1 break;break;casecase C2 C2:S2S2 break;break;.case case Cn Cn:SnSn break;break;default default:S0S0 switch (switch (e e)case case C1 C1:S1S1 case case C2 C2:S2S2 .casecase Cn Cn:SnSn default default:S0S0 第一种形式多分支第一种形式多分支第一种形式多分支第一种形式多分支第二种形式多分支第二种形式多分支第二种形式多分支第二种形式多分支switch (e)ca
10、se C1:S1 break;case C2:S2 break;.case Cn:Sn break;default:S0 其他其他计算计算 e 值值e=?S1 S2 S3 S4 S5S0C1C2C3C4C5结束结束计算计算 e 值值e=C1S1e=C2S2e=C3S3e=C4S4e=C5S5S0switch (e)case C1:S1 case C2:S2 .case Cn:Sn default:S0S1S2S3S4S5e=?C1C2C3C4C5S6其它其它S1S2S3S4S5e=?C1C2C3C4C5S6其它其它n n例例例例5.45.4 高速公路每公里的收费标准按不同种类汽车如下高速公路每
11、公里的收费标准按不同种类汽车如下高速公路每公里的收费标准按不同种类汽车如下高速公路每公里的收费标准按不同种类汽车如下:小汽车(小汽车(小汽车(小汽车(car car)0.50 0.50 元元元元 卡车(卡车(卡车(卡车(truck truck)1.00 1.00 元元元元 大客车(大客车(大客车(大客车(bus bus)1.50 1.50 元元元元编程序,为某高速公路收费站计算各种车辆的收费额。编程序,为某高速公路收费站计算各种车辆的收费额。编程序,为某高速公路收费站计算各种车辆的收费额。编程序,为某高速公路收费站计算各种车辆的收费额。单价单价=0.50单价单价=1.00单价单价=1.50车型
12、车型小汽车小汽车卡车卡车大客车大客车录入车型、行驶里程录入车型、行驶里程输出:行驶费单价输出:行驶费单价里程里程#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”,&i);switch(i)case 1:sort =car;break;case 2:sort =truck;break;case 3:sort
13、 =bus;printf(“please input mileage:“);/输入里程输入里程 scanf(“%f”,&mileage);switch (sort)/计算计算 case car:price =0.50;break;case truck:price =1.00;break;case bus:price =1.50;printf(“cost=%.2fn”,price*mileage);/输出输出 演示例演示例5.4程序程序n n计算数列计算数列计算数列计算数列 的前的前的前的前n n项和。项和。项和。项和。s=0;k=1;开始开始k=n结结束束FTs=s+ak;k=k+1;s=0;
14、k=1;s=s+ak;k=k+1;开始开始k=n结束结束FT循环结构循环结构n n循环循环指程序的某部分被反复的重复执行多次指程序的某部分被反复的重复执行多次指程序的某部分被反复的重复执行多次指程序的某部分被反复的重复执行多次n n循环程序设计循环程序设计编写重复执行的程序编写重复执行的程序编写重复执行的程序编写重复执行的程序n n循环体循环体被重复执行的部分被重复执行的部分被重复执行的部分被重复执行的部分n nC 的三种不同的重复性语句的三种不同的重复性语句,它们是它们是while while 语句语句语句语句 先判断条件的循环;先判断条件的循环;先判断条件的循环;先判断条件的循环;do d
15、o 语句语句语句语句 后判断条件的循环;后判断条件的循环;后判断条件的循环;后判断条件的循环;for for 语句语句语句语句 也是先判断条件的循环。也是先判断条件的循环。也是先判断条件的循环。也是先判断条件的循环。n n需要弄清楚的需要弄清楚的循环控制方式是什么?循环控制方式是什么?循环控制方式是什么?循环控制方式是什么?控制条件是什么?控制条件是什么?控制条件是什么?控制条件是什么?重复执行部分(称为重复执行部分(称为重复执行部分(称为重复执行部分(称为“循环体循环体循环体循环体”)是什么?)是什么?)是什么?)是什么?先判断条件的循环结构先判断条件的循环结构n n语法语法语法语法 whi
16、le while 语句语句语句语句 while (while (表达式表达式表达式表达式)语句语句语句语句n n一般形式一般形式一般形式一般形式while(e)S SSeFwhile eSn n计算数列计算数列计算数列计算数列 的前的前的前的前n n项和。项和。项和。项和。s=0;k=1;开始开始k=n结结束束FTs=s+ak;k=k+1;s=0;while k=ns+=1/(k*(k+1);开始开始结结束束k=1;k+=1;void main()int n,k=1;float s=0;printf(“please input n:n”);scanf(“%d”,&n);while(keps结结
17、束束FTe=e+r;n=n+1;r=r/n;e=1;n=1;r=1;while r epse=e+r;开始开始结结束束r=r*1/n;n=n+1;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=1.0;n=1;r=1.0;e=2.0;n=2;r=0.5;e=2.0;n=2;r=0.5;e=2.5;n=3;r=0.1667;e=2.5;n=3;r=0.1667;e=2.6667;n=4;r=0.0417;e=2.6667;n
18、=4;r=0.0417;.后判断条件的循环结构后判断条件的循环结构n n语法语法do do 语句语句语句语句 do do 语句语句语句语句 while(while(表达式表达式表达式表达式 ););n n一般形式一般形式do do S S while(while(e e););SeTdo-while eS 例例例例5.6 5.6 考虑本节开始的问题,编一个函数考虑本节开始的问题,编一个函数考虑本节开始的问题,编一个函数考虑本节开始的问题,编一个函数 s(n)s(n),计算数列的计算数列的计算数列的计算数列的a ak k的前的前的前的前 n n 项和项和项和项和 sum=0;k=1;do-whi
19、le k=n返回返回s(n)return sumsum+=1/(k*(k+1);k=k+1sum=0;k=1;sum+=ak;k=k+1;开始开始k=n结束结束FTfloat s(int n)int k;float sum;sum=0;k=1;do sum+=1.0/(k*(k+1);k+;while(k 0yy=yy+4开始开始结束结束求求 yy 后第一个闰年后第一个闰年yy 是闰年是闰年输出输出yyn=n-1/*PROGRAM find leap year*/#include stdio.hvoid main()int yy,n;printf(please input begin year
20、:);scanf(%d,&yy);printf(please input the number of the leap year:);scanf(%d,&n);yy=(yy/4+1)*4;doif(yy%4=0)&(yy%100!=0)|(yy%400=0)printf(year%dt,yy);n-;yy=yy+4;while(n0);演示例演示例5.7程序程序例例5.8 简单迭代法简单迭代法g(x)=0 x=f(x)等价变换等价变换n n采用迭代法方法求解采用迭代法方法求解采用迭代法方法求解采用迭代法方法求解x=f(x)x=f(x)方程的根方程的根方程的根方程的根选定一个选定一个选定一个选定
21、一个 x x的初值的初值的初值的初值 x0 x0;以以以以 x0 x0 代入右端计算出一个值代入右端计算出一个值代入右端计算出一个值代入右端计算出一个值 x1=f(x0)x1=f(x0)若若若若 x1 x1 等于等于等于等于x0 x0,显然,显然,显然,显然 x0 x0 为根,转向为根,转向为根,转向为根,转向否则若否则若否则若否则若 x1x0 x1x0 则令则令则令则令 x0=x1 x0=x1,转向,转向,转向,转向结束,停止计算结束,停止计算结束,停止计算结束,停止计算f(x)y=xf(x0)x0 x1f(x1)x*x2可以使用简单迭代的情况可以使用简单迭代的情况f(x2)f(x)y=xf
22、(x1)x2x1f(x0)x*x0不可以使用简单迭代的情况不可以使用简单迭代的情况f(x2)n n简单简单简单简单迭代方法迭代方法迭代方法迭代方法使用条件使用条件使用条件使用条件 对于方程对于方程对于方程对于方程x xf(x)f(x),当任意当任意当任意当任意x x (a,b)(a,b)存在存在存在存在0 L 10 L 1,使,使,使,使|f(x)|L1|f(x)|L1 则方程则方程则方程则方程x=x=f f(x)(x)在在在在(a,b)(a,b)上有唯一的根上有唯一的根上有唯一的根上有唯一的根x x*且对任意初值且对任意初值且对任意初值且对任意初值x x0 0 (a,b)(a,b)时时时时
23、迭代序列迭代序列迭代序列迭代序列x xk+1k+1=f f(x(xk k)(k=0,1,)(k=0,1,)收敛于收敛于收敛于收敛于x x*n n在实际工作中,决大部分计算都是近似计算,只要在实际工作中,决大部分计算都是近似计算,只要在实际工作中,决大部分计算都是近似计算,只要在实际工作中,决大部分计算都是近似计算,只要求求求求 X1X0 X1X0 即即即即X1-X0X1-X0X0=X1X1=f(X0)开始开始结束结束#include stdio.h#include math.h#define eps 1e-6void main()float x0,x1;x0=0.0;x1=0.0;do x0=
24、x1;x1=2*x0*x0*x0+0.5*x0*x0+0.093;while(fabs(x1-x0)eps);printf(x=%fn,x0);演示例演示例5.8程序程序比较两种比较两种while语句语句SeFwhile eSSeTdo-while eSfor 语句语句n n一般形式一般形式 for(for(e1 e1;e2 e2;e3 e3)S Se1初值表达式初值表达式 用于设置该循环开始的一些初值用于设置该循环开始的一些初值e2终值表达式终值表达式 用于控制循环结束用于控制循环结束e3增量表达式增量表达式 用于每次循环体执行后对控制条件的修正用于每次循环体执行后对控制条件的修正n n执行
25、与执行与PAD图图e1e2Se3F结结束束for(e1;e2;e3)Sn nfor与与while 语句语句 e=1.0;n=1;r=1.0;while(reps)e=e+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 5.9 编程序求向量内积。由终端输入两个编程序求向量内积。由终端输入两个n n维向量维向量X,Y.X,Y.计算其内积计算
26、其内积XY XY。xy=0 for(i=1;i=n;i+)scanf(“%f%f”,&xi,&yi)s(n)返回返回return xy xy=xy+xi*yifloat S(int n)int i;float xy,xi,yi;xy=0;for(i=1;i=n;i=i+1)scanf(“%f%f”,&xi,&yi);xy =xy+xi*yi;return xy;0 xy0-112n n例例5.10编程序,画函数编程序,画函数 y=f(x)=e-x sin(2X)在在0,2区间上的图形区间上的图形*x=0;for(i=1;i=40;i+)开始开始结束结束计算计算 y=f(i*0.05)确定确定
27、y 坐标,在相应位置印坐标,在相应位置印*#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程序程序程序设计实例程序设计实例n n打印打印99表表n n打印打印100以内素数以内素数n n模拟计算
28、器模拟计算器n n十六进制数翻译十六进制数翻译打印打印99表表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*1 2 3 4 5 6 7 8 9 打印前打印前 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
29、 40 48 56 649 9 18 27 36 45 54 63 72 81打印前打印前9行行打印前打印前9行行结束结束打印第打印第 i 行行 for(i=1;i=9;i+)打印第打印第i行行6 6 12 18 24 30 369 9 18 27 36 45 54 63 72 81行号行号本行数值本行数值打印第打印第i行行结束结束打印行标打印行标 i for(j=1;j=i;j+)打印打印 i*j9 9 18 27 36 45 54 63 72 816 6 12 18 24 30 36*1 2 3 4 5 6 7 8 9打印底行打印底行打印底行打印底行结束结束 for(i=1;i=9;i+)
30、印印 i印印*/*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以内素数以内素数 for(i=2;i=2;j-)flag=true i%j=0bool prime(int n)int j;for(j=n/2;j=2;j-)if(n%j=0)return fal
31、se;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:”);scanf(“%d”,&x);for(i=2;i A读字符读字符=w W是运算符是运算符+-*/WA=A+BA=A-BA=A*
32、BA=A/B显示显示 A读数读数=B读字符读字符=W结束结束void main()float a,b;char w;scanf(%f,&a);scanf(%c,&w);while(w=+)|(w=-)|(w=*)|(w=/)scanf(%f,&b);switch(w)case+:a=a+b;break;case-:a=a-b;break;case*:a=a*b;break;case/:a=a/b;printf(%.2f,a);scanf(%c,&w);演示例演示例5.13程序程序十六进制数翻译十六进制数翻译n n编一个函数编一个函数convert,从终端读入一个十六进,从终端读入一个十六进制数
33、,把它翻译成十进制。制数,把它翻译成十进制。若翻译正确,则若翻译正确,则convert返回返回true否则若翻译错误,则否则若翻译错误,则convert返回返回falseDX.Dn n十六进制数的形式十六进制数的形式十六进制数的形式十六进制数的形式AB.1f AB.1f .ef .ef 12f12f12f.12f.n主程序中主程序中若若convert()返回真值,则说明翻译成功返回真值,则说明翻译成功若若intflag为真,打印整数值(为真,打印整数值(n中保存)中保存)否则,打印实数数值(否则,打印实数数值(f中保存)中保存)打印打印“successful!”否则打印否则打印“fail”ma
34、inconvert()打印打印“失败失败”打印打印“成功成功”结束结束intflag打印整数打印整数打印浮点数打印浮点数n n判断字符是否是十六进制数字对应的字符判断字符是否是十六进制数字对应的字符判断字符是否是十六进制数字对应的字符判断字符是否是十六进制数字对应的字符bool isdigit(char ch)bool isdigit(char ch)return(ch=0)&(ch=0)&(ch=A)&(ch=A)&(ch=a)&(ch=a)&(ch=0)&(ch=0)&(ch=A)&(ch=A)&(chch 翻译整数部分翻译整数部分返回返回翻译小数部分翻译小数部分读读(ch)读读(ch)c
35、h=空白空白ch=r或或n返回真返回真合并整数,小数部分合并整数,小数部分,返回操作返回操作f=n+fn=0n=n*16+value(ch)读读(ch)ch是数字是数字ch=.f=0;g=1.0读读(ch)ch是数字是数字f=f+g*value(ch)读读(ch)g=g/16返回假返回假/*PROGRAM convert hexadecimal number to decimal number*/#include stdio.h#define radix 16/确定是哪种进制确定是哪种进制int n;/全局保存整数全局保存整数float f;/全局保存实数全局保存实数bool intflag;
36、/标志是否是整数标志是否是整数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
37、=true;ch=getchar();/*滤掉前导空白字符滤掉前导空白字符*/while(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
38、;if(ch=r|ch=n)return true;elsereturn false;演示例演示例5.14-1程序程序n n前导空白字符部分;前导空白字符部分;前导空白字符部分;前导空白字符部分;n n整数部分;整数部分;整数部分;整数部分;n n小数点;小数点;小数点;小数点;n n小数部分;小数部分;小数部分;小数部分;解法二解法二解法二解法二 状态图状态图状态图状态图(矩阵矩阵矩阵矩阵)方法方法方法方法 DX.DS0S1S2S3S4其他字符其他字符S0S2S1S4数字数字小数点小数点小数点小数点数字数字数字数字空白字符空白字符空白字符空白字符其他字符其他字符小数点小数点空白字符空白字符其
39、他字符其他字符S3数数字字空白字符空白字符其他字符其他字符小数点小数点n n状态矩阵状态矩阵 数字数字数字数字sort=0sort=0小数点小数点小数点小数点sort=1sort=1空白字符空白字符空白字符空白字符sort=2sort=2其他字符其他字符其他字符其他字符sort=3sort=3S0S0拼整数拼整数拼整数拼整数/S1/S1/S2/S2/S0/S0Err1/S4Err1/S4S1S1拼整数拼整数拼整数拼整数/S1/S1/S2/S2整数整数整数整数 结束结束结束结束/S4/S4Err2/S4Err2/S4S2S2拼小数拼小数拼小数拼小数/S3/S3Err3/S4Err3/S4实数实数
40、实数实数 结束结束结束结束/S4/S4Err4/S4Err4/S4S3S3拼小数拼小数拼小数拼小数/S3/S3Err3/S4Err3/S4合并合并合并合并 结束结束结束结束/S4/S4Err4/S4Err4/S4处理前导字符状态处理前导字符状态(S0);处理整数部分状态处理整数部分状态(S1);处理小数点部分状态处理小数点部分状态(S2);处理小数部分状态处理小数部分状态(S3);处理错误状态和结束状态处理错误状态和结束状态(S4)开始开始初始化:初始化:s=0;n=0;f=1.0;g=1;s4结束结束形成形成 sort读读(ch)s01230错误错误(3);s=4合并整数、小数;合并整数、小
41、数;s=4sort12拼小数拼小数;s=33错误错误(4);s=40s=2;sort12拼整数拼整数;s=13错误错误(1);s=40s=2s=4sort12拼整数拼整数;s=13错误错误(2);s=40错误错误(3);s=4s=4sort12拼小数拼小数;s=33错误错误(4);s=4/*十六进制翻译函数十六进制翻译函数2*/#include stdio.h#define radix 16int n;/*整数部分整数部分*/float f;/*小数部分小数部分*/bool intflag,errflag;/*整数标志、错误标志整数标志、错误标志*/char ch;/*当前读入字符当前读入字符
42、*/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
43、)/*翻译整数部分翻译整数部分*/n=n*radix+num;void com_real(void)/*翻译小数部分翻译小数部分*/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();/读入字符读入字符 s
44、ort=sort_char(ch);/为字符分类为字符分类 if(sort=0)num=calculate_char(ch);/字符对应的数值字符对应的数值switch(s)/状态操作状态操作 case 0:switch(sort)case 0: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
45、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;case 2:s=4;翻译整数时遇到空白字符翻译整数时遇到空白字符 intflag=false;break;case 1:com_error(3);存在两个以上小数点存在两个以上小数点 break;case 3:com_error(4);遇到非法字遇到
46、非法字 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(s=0|n0)r+=(n%10)!n=n/10return rr+=st=n%10while(t0)s=1s=s*tt=t-1int f
47、(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 n=2;j-)prime(int m)结束结束return falsem%j=0return true/*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;v=u+2;whi
48、le(n10)if(prime(u)&prime(v)&(v-u)=2)printf(%5d%5dn,u,v);n+;u+;v+;习题习题8.29H(int x,int n)结束结束return 1n=0计算计算Hn(x)return 2*xn=1返回返回Hn(x)的值的值h0=1;h1=2*x for(i=2;i=n;i+)h2=2*x*h1-2*(i-1)*h0h0=h1h1=h2return h2int 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+)h
49、2=2*x*h1-2*(i-1)*h0;h0=h1;h1=h2;return h2;习题习题5.34want()结束结束x=0;y=0;z=0;x+x=?()x-y+y-z+z+ch!=r&ch!=nch=getchar()x,y,z某个某个不是零不是零return falsereturn truebool 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;whil
50、e(ch!=r&ch!=n);if(x!=0|y!=0|z!=0)if(x!=0)printf(is wrong!n);if(y!=0)printf(is wrong!n);if(z!=0)printf(is wrong!n);return false;else return true;习题习题5.48main结束结束打印打印big*B+mid*M+sm*S=SUMfor(big=0;big=SUM/B;big+)for(mid=0;mid=SUM/M;mid+)#include stdio.h#define SUM 100#define B 3#define M 2#define S 0.5