资源描述
C程序设计(第三版)课后习题参考解答1.6写个程序,输入a,b,c三个值,输出其中最大者。解:main ()int a,b,c,max;printf(“请输入三个数 a,b,c: nM);scanf(t4%d,%d,%d,&a,&b,&c);max=a;if (maxb) max=b;if (maxc) max=c;printf(M 最大数为:%d”,max);(5) -111(6) 2483(7) -28654(8) 21003解:(10)I0=(12)g=(A) 16(2) (32)1o=(4O)8=(2O) 16(3) (75)10=(113)8=(4B) 16(4) (-617)10=(176627)8=(FD97) i6此题可以这样考虑:带符号数在计算机中采用补码表 示,正数的补码与原码相同,负数的补码=模+真值。 若使用!6位存储,模为2=65536。-617的补码 为 65536+ (-167) =64919= ( 176627) 8= (FD97)16(5) (-111)1O=(177621)8=(FF91)16(6) (2483)IO=(4663)8=(9B3) i6(7) (-28654)10=(l 10022)8=(9012) 16(8) (21003)kf(51013)8=(520B)63. 4将以下三各整数分别赋给不同类型的变量,请画出 赋值后数据在内存中的存储形式。第2章程序的灵魂算法2.1什么叫结构化的算法?为什么要提倡结构化的算法?解:由一些基本结构顺序组成的算法称为结构化的算法。 由于在基本结构之间不存在非顺序的跳转,流程的转移只 存在于一个基本结构范围之内,因而提高了算法的质量。2.7什么叫结构化程序设计?它的主要内容是什么?解:结构化程序就是用高级语言表示的结构化算法。它的主要内容包括“自顶向下,逐步细化”的分析方法和“模块化设计”的解决方法,以及“结构化编码”的实现方法。第3章数据类型、运算符与表达式3. 3请将下面各数用八进制和卜六进制数表示:(1) 10(2) 32(3) 75(4) -617变量的类型25-232769int型long 型sort 型signed char (8 位)unsigned int 型unsigned long 型unsigned short 型unsigned char 型注:如果没有学过二进制和补码,此题可以不做。 解:各数据在内存中的存储形式切下表所示:变量的类 型25-232769int型000000110018位111111111111111015100琬1(溢出)14long 型00-0000110012411111031000100-0011614short 型001111111111111110100-000011001815国1(溢出)14signed char ( 8位)000110011111111000000001(溢出)unsignedint型00000011001 811-1101510000114unsigned long 型000000110012411110310001000011614unsigned short 型00000011001811-110151000018unsigned char 型000110011111111000000001其中int和short类型,其取值范围是3276832767。 32769在这两种类型中实际表示负数,它是个负数的补 码,对其再求一次补码可得其真值,即一(6553632769) =-32767。char和unsigned char为8位,若将int或!ong类型数据赋 给这种类型,则截取数据低8位。同理,若将long赋给 int,则截取低16位。3. 5字符常量和字符串常量有什么区别?解:字符常量是个字符,用单引号括起来。字符串常量 是由。个或若干个字符组合而成,用双引号括起来,存储 时自动在字符串最后加一个结束符号、0,。4. 6写出以下程序运行的结果:# includevoid main () char cl=a, c2=b, c3=c, c4=101, c5=l 16;printf (x+a%3*(int)(x+y)%2/4设 x=2.5, a=7, y=4.7*a%c b%ct c%ct abcn, cl, c2, c3);printf (*tb%c %c, c4, c5);)解:程序运行的结果为:aa bb cc abcAN3. 7要将“ China”译成密码,密码规律是:用原来的字 母后面第4个字母代替原来的字母。例如,字母“A”后 面第4个字母是“ E”,用“ E”代替“ A”。因此,“ China” 应译为“Glmre”。请编程序,用赋初值的方法使 c1,c2,c3,c4,c5这5个变量的值分别为C, h, T, H,匕, 经过运算,使c1,c2,c3,c4,c5的值分别变 为G, T, m, T,并输出。解:main () char cl=C, c2= h c3=i, c4=n c5=a;cl+=4;c2+=4;c3+=4;c4+=4;c5+=4;primf(“密码是%c%c%c%c%cn, cl, c2, c3, c4, c5); 运行结果:密码是Glmre3. 8例2.6能否改成如下:main () int cl, c2;(原为 char cl, c2)cl =97;c2=98;printf (44%c %cn,cl,c2);printf (4t%d %dn”, cl, c2);)解:可以。因为在可输出的字符范围内,用整型和用字符 型作用相同。3. 9求下面算术表达式的值。(2) (float)(a+b)/2+(int)x%(int)y设 a=2 b=3, x=3.5, y=2.5解:(1) 2.5(2) 3.53.10写出程序运行的结果。main () int i, j, m, n;i=8;j=10;m=+i;n=j+;printf (d, %d, %d, %d“,i,j, m, n);解:运行结果为:9, 11, 9, 103. 11写出下面赋值的结果。格中写了数值的是要将它赋给其他类型的变量,将所有空格填上赋值后的数值。3.12出下面表达式运算后a的值,设原来a=12。设a 和n都已定义为整型变量。(1) a+=a(2)a-=2(3) a*=2+3(4)a/=a+a(5) a%=(n%=2),n的值等于5(6)a+=a-=a*=a解:(1) 24(2) 10(3) 60(4) 0(5) 0(6) 0第4章最简单的C程序设计顺序程序设计4.4 若 a=3, b=4 c=5, x=1.2, y=2.4, z=-3.6, u=51247,n=128765, c1=a, c2=b,想得到以下的输出格式和结int9942要求输出的结果如下:a=D3D nb=n4n d=5x= 1.200000,y= 2.400000,z= -3.600000x+y=D3.60n ny+z=-1.20n Llz+x=-2.40u= 51247 n= 128765cl二arE197(ASCn)char,dXunsigned int7665535float53.65long int68解:c2=,b,aorn98(ASCIl)int9910076536解:42-1char,d5PfnainXunsigned int99100765368int42 i,b,c;65535float99.000000100.00000076.00000053.6568.000On floj421006000 t x,y,z;65535.0000 00long int99100765368 chcrclM65535a=3;b=4;c=5;x=1.2;y=2.4;z= -3.6;u=51247;n= 128765;cl=a;c2=b;primfOprintf(a二2d Db=%2dD c=%2dn,a,b,c);果,请写出程序(包括定义变量类型和设计输出)。printf(ttx=%.6f,y=%.6f,z=%,6fn,x,y,z);printf(44x+y= %.2f y+z=%.2f z+x=%.2fn,x+y,y+z,z+x);printf(u=%61d n=%91dnu,n);printfCcl= %c or %d(ASCII)n,cl,cl);printf(4tc2=,%c, or %d(ASCH)n,c2,c2);4. 5请写出下面程序的输出结果:main () int a=5,b=7;float x=67.8564,y=-789.124;char c二A;long n= 1234567;unsigned u=65535;printf(d%dn”,a,b);printf(“3d%3dn”,a,b);printf(f,%fn”,x,y);printfC%-! Of,%-1 OfnM,x,y);printf(4t%8.2f, %8.2f,%4f, %4f, %3f, %3fn”,x,y,x,y,x,y);printf(e,% 10.2en,x,y);printfCt%c,%d,%o,%xn,c,c,c,c);printf(M%ld,%lo,%xn,n,n,n);printf(44%u,%o,%x,%dn,u,u,u,u);printf(s,%5.3sn,COMPUTER,COMPUTER);运行结果:57 5767.856400, -789.12402367.856400D,-789.124023 67.86,-789.12,67.8564,-789.1240,67.856400,-789.1240236.785640e+01, -7.9e+02A,65,101,411234567,4553207,d68765535,177777,ffff,-lCOMPUTER, DCOM可以发现,输出数据中若有负号、e和小数点,这些字符 也占位。4.6 用下面的scanf函数输入数据,使a=3, b=7, x=8.5,y=71.82, c1=A, c2=a。问在键盘上如何输入?#include void main()(int a, b;float x, y;char cl ,c2;scanf(44a=%d b=%d,&a, &b);scanf( %f%e,&x,&y);scanff* %c %c,&cl , &c2);解:a=3Db=7 8.5O71.82ADa4.7 下面的scanf函数输入数据,使a=10, b=20, c1=A, c2=宣,x=1.5, y=-3.75, z=67.8,请问在键盘上如何输 入数据?scanf(“5d%5d%c%c%f%f%*f,%f,&a,&b,&c 1 ,&c2,&x,& y,&z);解:main () (int a,b;float x,y,z;char cl,c2;scanf(“5d%5d%c%c%f%f%*f,%f,&a,&b,&c I,&c2,&x,& y,&z);printf(a=d, b=%d, cl=%c, c2=%c, x=%6.2f, y=6.2f, z=6.2fn),a,b,c l,c2,x,y,z);运行情况如下: 10D Q20Aal .5 -3.75U 1.5,67.8 (此行为 输入的数据,其中口为空格)a=10, b=20, c 1=A, c2=a, x=l .50, y=-3.75, z=67.80 (此行为输出)说明:按5d格式的要求输入a和b时,要先键入三个空 格,然后再键入10与20。%*f是用来禁止赋值的。在输入时,对应于*f的地方,随意打入了一个数1.5,该值 不会赋给任何变量。4.9输入一个华氏温度,要求输出摄氏温度,公式为C=(5/9)(F-32)4.8圆半径r=1.5,圆柱高h=3,求圆周长,圆面积,圆球表面枳,圆球体积,圆柱体枳。用scanf输入数据,输出计算结果,输出时要求有文字说明,取小数点后2位数字。请编程序。解:main ()float pi,h,r,l,s,sq,vq,vz; pi=3.14I5926;printf(“请输入圆半径r, scanfC4%f,%f&r,&h); 1=2*pi*r;s=r*r*pi;sq=4*pi*r*r;vq=3.0/4.0*pi*r*r*r; vz=pi*r*r*h;printf(圆周长为: printf(“圆面积为: printfC4圆球表面积为: printf(“圆球体积为: printf(“圆柱体积为:圆柱高h: n);l=%6.2fnM,l);s=%6.2fn,s);sq=%6.2fnM,sq);sv=%6.2fn,vq);sz=%6.2fn,vz);运行结果:请输入圆半径r,圆柱高h:1.5, 3/圆周长为:圆面积为:圆球表面积为: 圆球体积为: 圆柱体积为:1=9.42s=7.07 sq=28.27 sv=7.95 sz=21.21输出要有文字说明,取2位小数。解:main () float c,f;printf(“请输入一个华氏温度:n);scanf(M%f&f);c=(5.0/9.0)*(f-32);/*注意5和9要用实型表示,否则5/9的值为0/printf(“摄氏温度为:%5.2fn,c););运行结果:请输入一个华氏温度:78/摄氏温度为:25.56第5章选择结构程序设计5.2语言中如何表示“真”和“假”?系统如何判断个量的“真”和“假”?解:设有一个逻辑表达式,若其结果为真”,则以1表 示:若其结果为“假”,则以表示。但是判断个逻辑 量的值时,以。代表“真”,以非。代表“假”。例如3&5 的值为“真”,系统会给出3&5的值为1。5.3写出下面各逻辑表达式的值。设a=3, b=4, c=5。(1) a+bc&b=c(2) allb+c&b-c(3) !(ab)&!clll(4) !(x=a)&(y=b)&。(5) !(a+b)+c-l&b+c/2解:(DO方法三:ab?(ac?a:c):(bc?b:c)运行结果:(2) 1(3) 1(4) 0(5) 15.4 有3个整数a, b, c,由键盘输入,输出其中最大的数。解:方法一:程序如下:main () int a,b,c;printf(“请输入3个整数:);scanfC%d,%d,%dM,&a,&b,&c);if (ab)if (bc)printf(umax=%dn,c);elseprintfCtmax=%dn,b);else if (ab)? a:b;/ 将 a 和 b 中的大者存入temp中/max=(tempc)? temp:c;/* 将 a 和 b 中的大者与c比较,取最大者/printf(“3个整数中最大数是dn”,max);请输入3个整数:12,34,9/ 3个整数的最大数是34。5.5 有一函数:IXx 12x-l lx 10写程序,输入x值,输出y值。 解:程序如下main () int x,y;printf(“输入 x: ”);scanf(d”,&x);if (xl)/* xl */y=x;printf(4*x=%d3d, y=x=%dn”,x,y);)else if(x10)/* lx100 II score9999)place=5;else if (num999)place=4;else if (num99)place=3;else if (num9)place=2;else place= 1;printf(ttplace=%dn,place);printf(“每位数字为:;ten_thousand=num/l 0000;thousand=(int)(num-ten_thousand* 10000)/1000;hundred=(int)(num-ten_thousand* 1 OOOO-thousand* 1000)/1 00;ten=(int)(num-ten_thousand* 1 OOOO-thousand* 1000-hundre d*100)/10;indiv=(int)(num-ten_thousand* 1 OOOO-thousand* 1000-hund red*100-ten*10);switch(place)case5:printf(k4%d,%d,%d,%d,%d,ten_thousand,thousand,hundre d,ten,indiv);printf(n反序数字为:);printf(d%d%d%d%dn”,indiv,ten,hundred,thousa nd,ten_thousand);break;case4:printf(fct%d,%d,%d,%dM,thousand,hundred,ten,indiv);printf(n反序数字为:;printf(d%d%d%dn”,indiv,ten,hundred,thousand);break;case 3:printf(t4%d,%d,%d?,hundred,ten,indiv);printf(n反序数字为:;printf(%d%d%d n”,indiv,ten,hundred);break;case 2:printf(d,%d”, ten,indiv);printf(“n反序数字为:;printf(d%d n”,indiv,ten);break;case l:printf(tt%d, indiv);printf(n反序数字为:); printf(dn”,indiv);break;)运行结果:请输入个整数(99999): 98765/位数=5每位数字为:9, 8, 7, 6, 5反序数字为:567895.8 企业发放的奖金根据利润提成。利润I低于或等于10 万元时,奖金可提10%;利润高于10万元,低于20万 元(IOOOOOvIW20000)时,其中10万元按10%提成, 高于10万元的部分,可提成7.5%; 200000 1000000时,超过100万 的部分按1%提成。从键盘输入当月利润!,求应发放奖 金总数。要求:(1)用if语句编程序:(2)用switch语句编程序。 解:计算利润时,要特别注意不同利润的不同提成比例。 例如,利润为15万元,其中由10万元按10%的比例提 成,另外5万元则按7.5%提成。(1) 用if语句编程序,main () long i;float bonus,bon 1 ,bon2,bon4,bon6,bon 10;bon 1=100000*0.1;的奖金/bon2=bon 】+100000*0.075的奖金/bon4=bon2+100000*0.05/利润为10万元时/利润为20万元时/利润为40万元时的奖金/bon6=bon4+100000*0.03的奖金/bon 10=bon6+400000*0.015;时的奖金*/printf(“请输入利润i: ”);scanf(%ld”,&i);if (i=l 00000)bonus=i*0.1;内按0.1提成奖金/elseif(i=200000)bonus=bon l+(i-l 00000)*0.075 万元时的奖金/else if (i=400000)bonus=bon2+(i-200000)*0.05万元时的奖金/else if(i=600000)bonus=bon4+(i-400000)*0,0360万元时的奖金/else if (il & d2l & d3l & d4l)h=0; / 判断该点 是否在塔外/printf(“该点高度为d”,h);int t,a,b,c,d;printf(”请输入4个整数:n);scanf(H%d,%d,%d,%dH,&a,&b,&c,&d);printf(a=%d,b=%d,c=%d,d=%dn,a,b,c,d); if(ab)t=a;a=b;b=t;if(ac)t=a;a=c;c=t;if(ad)t=a;a=d;d=t;if(bc)t=b;b=c;c=t;1运行情况:请输入个点(x,y): 0.5,0.7/该点高度为请输入个点(x,y): 2.1,2.3/该点高度为10第6章循环控制if(bd)t=b;b=d;d=t;Jif(cd)t=c;c=d;d=t;printf(排序结果如下:n);printf(%d %d %d %dn,a,b,c,d);)6.1输入两个正整数m和n,求其最大公约数和最小公倍数。解:用辗转相除法求最大公约数main () int p,r,n,m,temp;printf(“请输入两个正整数n,m:);scanf(%d,%d,&n,&m);if (nm) temp=n;n=m;m=temp;/把大数放在n中,小数放在m中/)p=n*m;/先将m和n的乘积保存在P中,以便求最小公倍数时用*/while (m!=0)/求m和n的最大公约数到 r=n%m;n=m;m=r;printf(“它们的最大公约数为:%dn,n);printf(“它们的最小公倍数为:%dn?p/n);/*p是原来两个整数的乘积 )运行情况:请输入两个正整数:12,8/它们的最大公约数为:4 它们的最小公倍数为:246.2 输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数。解:#include main () char c;int letter=0,space=0,digit=0,other=0;printf(“请输入一行字符:n);while(c=getchar( )!=,n,) if (c=a & cv=z II A & cv=Z)letter+;else if (c=)space+;else if(c=0 & cv=9)digit+;else other+;)printf(字母数= %d,空格数= %d,数字数= %d,其它 字符数=%dnJetter,space,digit,other);)运行情况:请输入一行字符:My teachers address is “#123 Beijing Road,Shanghai.字母数:38,空格数:6,数字数:3,其它字符数:66.3求Sn=a+aa+aaa+aaa之值,其中a是个数字。例 如:2+22+222+2222 + 22222n个a(此时n=5), n由键盘输入。解:main () int a,n,i=l,sn=0,tn=0;printf(a,n=:);scanf(%d,%d,&a,&n);while (i=n) tn=tn+a;/*赋值后的tn为i个a组成数的值/sn=sn+tn;/*赋值后的sn为多项式前I项之和*/a=a*10;+i;)printf(a+aa+aaa+,*=%dn,sn);运行情况:a,n: 2,5/a+aa+aaa+ =246906.4 求En!(即求 1+2!+20!)。解:main ()float s=0,t=l;int n;for (n= 1 ;n=20;n+)t=t*n;/*求 n!*/s=s+t;/将各项累加/)printf( 1 !+2!+20!=%en”,s);)primf(“水仙花数”是:); for (n= 100;n 1000;n+) i=n/100;j=n/10-i*10;k=n%10;运行结果:1!+2!+20!=2.56133e+18if (n=i*i*i+j*j*j+k*k*k) printf(44%4d,n);1注意:s不能定义为int型,因为int型数据的范围是 -32768-32767i也不能定义为long型,因为long型数据 的范围为21亿21亿,无法容纳求得的结果。J printf(n”);)运行结果:“水仙花数”是:153 370 371 4076.5求1005010 1+办+zk=l2=1k= 长6.y 个数如果恰好等于它的因子之和,这个数就称为“完数“。例如,6的因子为1, 2, 3,而6=1+2+3,因此6解:#include stdio.h#inciude conio.h是“完数”。编程序找出1000以内的所有“完数”,并按面的格式输出其因子:6 Its factors are 1,2,3main() (解:方法一:#define M 1000/*int n 1 = 100,n2=50,n3= 1 0,k;float sl=0,s2=0,s3=0;for(k= 1 ;k=n 1 ;k+) sl+=k;定义寻找范围/main () int k 1 ,k2,k3,k4,k5,k6,k7,k8,k9,k 10;int i,a,n,s;for(k= 1 ;k=n2;k+)s2+=k*k;for(k= 1 ;k=n3;k+)s3+=1.0/k;printf(,sum=%8.2fn,s 1+s2+s3); getch();运行结果:47977.93for (a=2;a=M;a+)/*a 是 21000 之间的整数,检查它是否完数/n=0;/*n用来累计a的因子的个数s=a;/*s用来存放尚未求出的因子之和,开始时等于a*/for ( i=l;ia;i+ )/检查 i 是否 a 的因子/if (a%i=0)/如果i是a的因子6.6打印出所有的“水仙花数”。*/n+;/*n加1,表示新找所谓“水仙花数”是指个3位数,其各位数字的立方和 等于该数本身。例如,153是一个“水仙花数”,因为153 =13+534-3解:main () int i,j,k,n;到个因子/S=S-I;/*s减去已找到的因子,S的新值是尚未求出的因子之和/switch (n)/将找到的因子赋给 klklO*/ case 1:kl=i;break;/找出的第1个因子赋给!d*/case 2: )k2=i;break;/找出的第2个因子赋给k2*/case 3:运行结果:k3=i;break;祥找出的第3个因6 Its factors are 1,2,3子赋给k328 Its factors are 1,2,4,7,14case 4:496 Its factors are 1,2,4,8,16,31,62,124,248k4=i;break;/找出的第4个因子赋给k4*/方法二:case 5:main ()k5=i;break;/找出的第5个因int m,s,i;子赋给k5*/for (m=2;m 100;m+)case 6:s=0;k6=i;break;/找出的第6个因for (i=l;im;i+)子赋给k6*/if (m%i)=0) s=s+i;case 7:if(s=m)k7=i;break;/找出的第7个因printf(d是一个“完数”。它的因子是,m);子赋给k7*/for (i=l;im;i+)case 8:if( m%I=0) printf (d”,I);k8=i;break;/找出的第8个因printf(n”);子赋给k8*/case 9:)k9=i;break;/找出的第9个因)子赋给k9到方法三:此题用数组方法更简单。case 10:main ()k10=i;break;/找出的第10个 int klll;因子赋给klO*/int i,a,n,s;)for (a=2;a=1000;a+)n=0;if (s=0)*s=0表示s=a;全部因子都已找到*/for (i=l;il) printf(II%d,%d,kl,k2); /*n! 表示n+;a至少有2个因子/s=s-i;if (n2) printf(t%d,k3);/*n2表示kn=i;/*将找到的因子赋至少有3个因子,故应再输入个因子/给 k,k10。if (n3) printf(:%d”,k4);/以下类似)*/if (s=0)if(n4) printfC%d,k5);printf(%d是个“完数”,它的因子是:,a);if (n5) printf(一d”,k6);for (i=l;i6) printf(t%d,k7);printf(i7) printf(ti,%d,;k8);printf(8) printf(ut,%d,k9);)if(n9) printf(d,klO);)printf(n”);)运行结果:6是一个,完数”,它的因子是:1, 2, 328是个“完数”,它的因子是:1, 2, 4, 7, 14496是个“完数”,它的因子是:1, 2, 4, 8, 16, 31,62, 124, 2486.8 有一分数序列:2,3/2,5/3,8/5,13/8,21/13,求出这个数列的前20项之和。 解:main () int i,t,n=20;float a=2,b= 1 ,s=0;for (i=l;i=n;i+)s=s+a/b;t=a;a=a+b;*将前项分子与分母之和作为下项的分子/b=t;/*将前项分子作为下项的分母/)printfC4sum=%9.6fn,s);运行结果: sum=32.6602596.9 球从100米高度自由落下,每次落地后反跳回原高 度的一半,再落下。求它在第10次落地时,共经过多少 m?第10次反弹多高?#include stdio.h void main()(float sn=100,hn=sn/2;int n;for(n=2;n0)x 1=(x2+1)*2;/*第一天的桃子数是第二天桃子数加1后的2倍/x2=xl;day;)printf(total二dn”,xl); 运行结果: total=15346.11 用迭代法求丄 X= 厶。求平方根的迭代公式为Xn+l = 5(Xn)+Xn要求前后两次求出的X的差的绝对值小于10-5。解:用迭代法求平方根的算法如下:(1) 设定一个X的初值Xo;(2) 用上述公式求出x的下个值X1;(3) 再将XI代入上述公式,求出X的下个值X2;(4)如此继续下去,直到前后两次求出的x值(X”和Xn+i )满足以关系:lxn+1- xnl10-s为了便于程序处理,今只用变量X。和X1,先令X的 初值xo=a/2 (也可以是另外的值),求出xi;如果此时IXn+I xn IIO_5,则使Xf Xo,然后用这个新的Xo求出下个X1;如此反复,直到I Xn+| Xn 11。为止。 程序如下:# include main ()float a,xO,xl;printfCEnter a positive number: ”);scanfC%f;&a);/*输入 a 的值/x0=a/2;xl=(x0+a/x0)/2;doxO=x1;x 1=(x0+ a/x0)/2;while(fabs(xO-x 1)= 1 e-5);printf(The square root of %5.2f is %8.5fna,xl);)运行结果:Enter a positive number: 2/The square root of 2.00 is 1.414216.12 用牛顿迭代法求方程2x3-4x2+3x-6=0在1.5附近的根。解:牛顿迭代法又称牛顿切线法,它采用以下方法求根: 先任意设定一个与真实的根接近的值Xo作为第一个近似 根,由Xo求出f(X0),过(Xo,f(X0)点做f(X)的切线,交X轴 于X”把它作为第二次近似根,再由X|求出f(X1),再过 (X|,f(Xi)点做f(x)的切线,交X轴于X2,再求出f(x2),再 作切线如此继续下去,直到足够接近真正的X为止。 /(x0) = -Xj - x0因此,公一書4/(X。)#include math.hvoid main()(float xl,xO,f,fl;xl = 1.5;do(x0=xl;f=(2*x0-4)*x0+3)*x0-6;fl=(6*x0-8)*x0+3;x I =xO-f/f 1; while(fabs(x 1 -x0)= le-5);printf(THe root of equation is %5.2fn,xl);)6.13 用.分法求方程 2x3-4x2+3x-6=0 在(-10, 10)之间的根。解:二分法的思路如下:先指定一个区间X, X2,如果函 数f(X)在此区间是单调变化,可以根据f(XI)和f(X2)是否同 符号来确定方程f(X)=0在Xi,X2区间是否有一个实根。若 f(X1)和f(X2)不同符号,则f(X)=0在Xi,X2区间必有一个(且 只有一个)实根。若f(X|)和f(X2)同符号,说明在21区 间无实根,要重新改变X和X2的值。当确定X,X2有一个 实根,采用二分法将区,X2区间一分为二,再判断在哪个 小区间中有实根。如此不断进行下去,直到小区间足够小 为止。这就是牛顿迭代公式。本题中,f(x)= 2x3-4x2+3x-6=(2x-4)x+3)x-6 f(x)= 6x2-8x+3=(6x-8)+3#include stdio.h算法N-S图如:include Mstdio.hn#include math.h void main()(float xO,xl,x2,fxO,fxl,fx2;do(printf(nPlease enter xl,x2:H);scanf(n%f,%f&xl,&x2);fxl=xl*(2*x l-4)*x 1 +3)-6; fx2=x2*(2*x2-4)*x2+3)-6; while(fx 1 *fx20);dox0=(xl+x2)/2;/ 不能够把xOyO放在do之外? ? ? */fxO=xO*(2*xO-4)*xO+3)-6;if(fx0*fxl0) (x2=x0;fx2=fx0; elsexl=xO;fx
展开阅读全文