从问题到程序-习题答案_第1页
从问题到程序-习题答案_第2页
从问题到程序-习题答案_第3页
从问题到程序-习题答案_第4页
从问题到程序-习题答案_第5页
已阅读5页,还剩10页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、从问题到程序高级语言程序设计第二章练习1. 指出下面的哪些字符序列不是合法的标识符:_abc x+- 3x1Xf_1_4Eoofx_x_2 I am答:不合法的标示符有:a$#24非法符号 #x+-非法符号 #3x1不是以英文字母开头I am非法符号“空格”bg-1非法符号 -2.手工计算下列表达式的值:125 + 0125 2)0XAF - 0XFA24 * 3 / 5 + 6 4 )36 + - (5 - 23) / 435 * 012 + 27 / 4 / 7 * (12 - 4)2)-75 3)20 4) 40 5)3501)3)5) 答: 1)2103. 在下面表达式的计算过程中,在

2、什么地方将发生类型转换,各个转换是从什么类型转换 到什么类型,表达式计算的结果是什么?1)2)3) 答:3 * (2L + 4.5f) - 012 + 443 * (int)sqrt(34) - sin(6) * 5 + 0x2AF cos(2.5f + 4) - 6 *27L + 1526 - 2.4L1)53.5 2) 703.397077 在此题中十六进制数会在计算中(编译时)自动转成十进制数 3)1362.593574. 写程序计算第 3 题中各个表达式的值。 答:#include#includeint main()printf(%fn,3 * (2L + 4.5f) - 012 +

3、44);printf(%fn,3 * (int)sqrt(34) - sin(6) * 5 + 0x2AF); printf(%fn,cos(2.5f + 4) - 6 *27L + 1526 - 2.4); system(pause);return 0;5.写程序计算下面各个表达式的值:1)1 2572 34+ 2) 106524*133) 23 5827 96 3 67./ . 4)n 2 +1 7) In In(10 1) 2n +5) Iog5 2 n -1 6) e n +1 7) arctan(log ( ) 3 e + n 8) 3.6813-(2.24-0.242 )2 9)

4、1 2 3 4 5 + + / 10)ln(2 n 13+ e )6. 已知铁的比重是 7.86,金的比重是 19.3。写几个简单程序,分别计算出直径100 毫米和150 毫米的铁球与金球的重量。答:#include double f1(double r) double v,w;v=4.0/3.0*r*r*r*3.1415926;w=7.86*v;return w;double f2(double r) double v,w;v=4.0/3.0*r*r*r*3.1415926;w=19.3*v;return w;int main()printf(铁球的重量为 : %f, 金球的重量为 : %f

5、n,f1(0.1/2),f2(0.1/2.0);printf(铁球的重量为 : %f, 金球的重量为 : %fn,f1(0.15/2),f2(0.15/2.0);system(pause);return 0;27. 写程序计算 5x2+ 2x + 6 的两个根,考虑用合适的方式输出。(提示:对这个具体问题,可以先人工计算 2出判别式 b2 - 4ac 的值,以此作为已知信息,就可以写出程序了。)答:#include #include void f(double a,double b,double c) double temp=b*b-4*a*c;if(tem p0)printf( 方程的根为:

6、f,%f,(-b+sqrt(te mp )/2/a,(-b-sqrt(tem p)/2/a); else if(te mp=0)方程有两个相同的根为:f,-b/2/a);printf(else方程无解!);prin tf( /int mai n()可以测试不同的数据f(5,2,6);system( pause);return 0;8. 在计算机上试验本章正文中的一些程序。对它们做一些修改,观察程序加工和运行的情 况,并对程序的行为做出解释。9. 在一个能正确工作工作的输出整数结果的程序里,将printf的相应转换描述改为 %f或者%ld,看看会出现什么问题。在一个能正确工作工作的输出双精度结果

7、的程序里,1、将printf的相应转换描述改为d或者ld,看看会出现什么问题。第三章练习1.下面的字符序列中哪些不是合法的变量名:-abc_aafor pp. 288IBM/PC tihsWhile答:-abcr24_s25 _a_babc_345for pp .288 to be IBM/PCms-c#micro m%ust While abc2.假设整型变量a的值是1, b的值是2, 面各个语句,写出执行对应语句后整型变量1)2)答:1)u = a ? b : c;u = (a = 2) ? b + a : c + a;u=22) u=4的值是3, u的值。在这种情况下分别执行下3.1)2

8、)3)答:假设整型变量a的值是1,b的值是2,a & !(b II c) & !a)!(a & b) II c ? a II b : a & b & c!(a + b c) & b = c * a-b的值是0,写出下面各个表达式的值。4. 下面程序在执行时,哪些地方将发生类型转换?程序打印的值是什么?int f (int n, float m) return (m + n) / 4;int mai n () float y = 3;prin tf(%dn, f(y, y + 1); return 0;答:#in elude 2:参数1传递:形式 参数为int,实际参数 为float,float

9、转换为 int4:除操作:参与/的对 象有int型的4和 float 型有(m+n),int 转换为floatint f(i nt n float m)int mai n () float y=3;3:加操作: 对象有 float:m,i nt 换为floatprin tf(%dn,f (y,y+1);return (m+n) /4;参与+的in t:n 和型的n转return 0;system(” pause);5:函数结果传递:(m+n)/4 结果的类型为float型,而 函数要求返回的值类型为 int,因而发生float型转换 为int型1:表达式y+1求值: 参与+的对象有int:1

10、和float:y,int转换为 float5. 在计算机上试验本章正文中的一些程序。对它们做一些修改,观察程序加工和运行的情 况,并对程序的行为做出解释。答案:略6. 定义求圆球的体积、求圆球的表面积、求圆柱体的体积、求圆柱体的表面积的函数。 答:#in cludedouble f1(double r)double v;v=4.0/3.0*r*r*r*3.1415926;return v;double f2(double r)double s;s=4*r*r*3.1415926;return s;double f3(double r,double h)double v;v=r*r*3.1415

11、926*h;return v;double f4(double r,double h)double s;s=2*3.1415926*r*h+2*3.1415926*r*r;return s;圆球的体积为 %fn,f1(0.15);圆球的面积为 %fn,f2(0.15); 圆柱体的体积为 %lfn,f3(0.15,0.5); 圆柱体的面积为 %lfn,f4(0.15,0.5);int main()printf(printf(printf(printf(system(pause);return 0;100 毫米和 150 毫米的金、银、铜、7. 1)不用函数,直接写一个主程序计算并输出直径为 铁、

12、锡球的重量(以 kg 为单位输出)。2)重新完成上面程序,先定义一个带有两个参数的函数,它能求出直径为 x 的比重为 y 的圆球的重量,而后在主程序里调用这个函数完成所需工作。将这样得到的解与不用 函数的解比较,比较它们的长度、容易出错的程度。假设现在要求修改所用圆周率的精 度,考虑用两种方式写程序的修改难度。3)请写程序,求出边长为 100 毫米和 150 毫米的金、银、铜、铁、锡立方体的重量。 你可以利用前面的程序吗?是否很容易修改前面程序,完成这一计算?比较不用函数的 解法和使用函数的解法在易修改和重复使用方面的效用。8. 定义函数: double tmax(double, double

13、, double) ,它返回三个参数中最大的 一个。写一个主函数试验各种参数情况。答:#includedouble tmax(double x,double y,double z)if(xy)return xz?x:z;elsereturn yz?y:z;int main()printf(最大的一个为:%f,tmax(8,3,2);printf(最大的一个为:%f,tmax(8,13,2);printf(最大的一个为:%f,tmax(8,3,22);system(pause);return 0;9. 写函数,它以两个电阻的值作为参数,求出并联的电阻值。 答:并联电阻值的计算公式为: R1*R2

14、/(R1+R2)10. 如果四边形四个边的长度分别为a、b、e d , 对对角之和为2a ,则其面积为:S = (s - a)(s - b)(s - c)(s - d ) - abed cos2a其中 s =(a + b + c + d)/2。 定义一个函数计算任意四边形的面积。设有一个四边形,其 四条边边长分别为 3、 4、 5、5,一对对角之和为 145o ,写程序计算它的面积。11. 修改已知四边长求四边形面积的函数,增加对各种参数错误情况的检查和处理(如返回 值0),用各种实例数据检查你的函数否检查出所有可能的错误情况。12. 分析本章正文中给出的求二次方程根的函数,看它缺乏对哪些特殊

15、情况的处理。补充这 些处理,在需要时输出适当的信息,使之成为一个更完整的函数。写一个主函数,用各 种特殊情况和一般情况测试所完成的函数。答:#include #include void f(double a,double b,double c)double temp=b*b-4*a*c;if(a=0)printf( 方程的根为: %f,-c/b);if(temp0)printf( 方程的根为: %f,%f,(-b+sqrt(temp)/2/a,(-b-sqrt(temp)/2/a); else if(temp=0)方程有两个相同的根为: %f,-b/2/a);printf(else方程无解!

16、);printf( int main()可以测试不同的数据/f(5,2,6); system(pause); return 0;13. 写一个简单程序,它输出从1 到10 的整数。14. 写一个简单程序,它输出从10 到10 的整数。15. 写一个两个整型参数的简单函数,它输出从第一个整数到第二个整数为止的整数序列。16. 用定义函数 double power(double x, int n) ,它求出 x 的 n 次幂。用主函数试验很大的n值(例如令X值为1),看看会出现什么情况;用大的 x和n值,看看发生 浮点数计算溢出时会出现什么情况。17. 写一个程序,它在090度之间每隔5度输出一行

17、数据,打印一个表。每行中包括 项目:角度数,以及它所对应的正弦、余弦、正切、余切函数值。答:#include #include int main()double s=0*3.1415926/180;int i;for(i=0;i=90/5;i+)printf(%f ,%f ,%f ,%f ,%fn,s,sin(s),cos(s),tan(s),1/tan(s); s+=5*3.1415926/180;system(pause);return 0; 18. 查看有关公式,写求解并输出一元三次方程的根的函数。19. 写出求等差级数的和 ka kn的函数。两种循环结构给出函数定义,再利用等差级数求和

18、公式给出函数定义。 答:#includedouble f1(int n,double a)int i;double sum=0;for(i=1;i=n;+i)sum+=i*a;return sum;double f2(int n,double a)int i=1;double sum=0;while(i=n)sum+=i*a;+i;return sum;double f3(int n,double a)return n*(a+n*a)/2;int main()prin tf(%fn,f1(10,2.5);prin tf(%fn,f2(10,2.5); prin tf(%fn,f3(10,2.5

19、); system( pause);return 0;20. 请到查出银行一年定期存款的利率和5年定期存款的利率。假定现在要存入100元钱,存款到期后立即将利息与本金一起再次存入。请写出程序,计算按每次存一年和按照每次存5年,总共存50年后两种存款方式的得款总额。对两种情况都每隔5年输出一次当时的总金额。21. 写一个程序打印出2的顺序各次幕。让它打印出2的前30个幕,看看会出现什么情况。用一个条件为真的循环打印2的各次幕,看看会出现什么情况。第四章练习1. 1 )写出通过递推方式求 200之内的完全平方数的程序;2)写出只使用加法的求完全平方数的程序;3)写出求1000之内的完全立方数的程序

20、,请参考书中实例的写法和上面的两种写法,分别写出相应的求立方数的版本。2. 试验正文中乌龟旅行的实例,看看在你所用的C系统上得到什么样的结果。从数学教科书中找出有关调和级数确定一个范围,观察输出的结果,能够得到 了解有关的理论结果。k值计算出的结果。你写出的函数对 1到10计算 k = 30得到正确结果吗?(另外,你能只用一的理论结论,并将它与我们的试验做一个比较。3. 写一个程序,计算并输出 Fibonacci序列中一系列的相邻项之比。什么结论(这个比的序列可能有极限吗?极限是什么)。查阅有关资料,4. 写函数计算1! + 2! + . + k!。用主函数试验函数对一系列结果都正确吗?如果出

21、现错误,弄清楚是什么原因。这个程序能对重循环完成函数的定义吗?),公式中有n层嵌套。利用这 L5 写函数计算./(.V)= 1+1/(1 + 1 / (+1/(I + 1/.y)答:#in clude #in clude double f(int n, double x)int m=0;double sum;for(sum=1+1/x;m =n ;+m) sum=1+1/sum;return sum; int mai n()int X;for(x=1;x=20;+x)prin tf(%frr,f(10,(double)x);system( p ause);return 0;个函数打印x = 1

22、.0、2.0、,、20.0 , n = 10时的函数值表。6. 实现书中讨论的验证哥德巴赫猜想的程序,用不同的n对6n的范围试验该程序。去掉程序中的打印输出语句,增加计时功能,对不同的n运行程序,考察程序的运行时间,画出一条曲线,说明运行时间与n的关系。7. 设法(从文献中)找到其他更有效的素数判断方法并实现对应函数。在一个数值比较大的整数区间试验书上给出的函数和你写的其他函数,利用它们打印出这一区间中的所有素数。你所试验的几种方法在工作效率上有明显差异吗?(为程序计时)8.1 ) 定义函数:void prt_faetors(i nt),它对正整数实参输出其所有的因子。2 )定义函数:void

23、 prt_pfaetors(int),它对正整数实际参数,输出其所有的素因子(多重因子重复输出);对于负参数,首先输出-1,然后输出所有因子。9.已知厶卩&,利用该公式编程序求n的近似值,看用这个和式的前多少项求出的近似值与3.14159165的误差小于1e-5,令程序输出三项数据:计算得到的和,由这个和求出的的近似值,求得该和所用得 项数。把1e-61e-7 并重新试验,用计时方式总结出误差减小与执行时间之间的关系。答:#in clude #in elude #in elude int mai n()double a=3.14159265*3.14159265/6.0;double x=1.

24、0, n=2.0;double t;t=clock();while(fabs(a-x)1e-8)x=x+1/n/n;+n;double pi=sqrt(6.0*x);prin tf( n=%f,%f,%.32fn, n,x, pi);prin tf(%fsn,(clock()-t)/CLOCKS_ PER_SEC);system( p ause);return 0;11. 修改书中计算sin值的函数,使之能输出计算中循环执行的次数。用不同的数值(一个比一个大)试验这一 函数,观察出现的情况。你看到出现溢出的情况了吗?(为试验方便,你应该写一个适用的驱动程序)12. 已知-?=-?+?-?+11

25、23132451352467357xxxxxL - 1xsinh ( x 0, n0 ):利用这个定义,用递归和循环方式各写出一个求最大公约数的函数。答: /- 辗转相减求最大公约数#include int gcd(int m,int n)return m=n?m:(mn?gcd(n-m,m):gcd(m-n,n);int main() printf(%dn,gcd(96,56);system(pause);return 0;64个金盘需要多长时间。如果僧侣据此评价僧15. 对一些n值试验河内塔程序,给它们计时。据此估计你所用的计算机搬完 们1秒钟搬金盘 1次,搬完 64个金盘需要多少时间?将

26、这一时间与科学家对宇宙的估计寿命做个比较, 侣们的说法。水仙花16. 一个三位的十进制整数,如果它的三个数位数字的立方和等于这个数的数值,那么它就被称为一个 数”。定义函数判断一个整数是水仙花数,并利用这个函数打印出所有的水仙花数。答:/ 求水仙花数/ 方法一#include void f(int n) int i,j,k;i=n/100; j=(n-i*100)/10; k=n-i*100-j*10;if(i*i*i+j*j*j+k*k*k=n)prin tf(%d=%dA3+%dA3+%dA3n, n,i,j,k); else ;int main()int i;for(i=100;i=99

27、9;+i)f(i);system(pause);return 0;/ 方法二void f()int i,j,k,x;for(i=1;i=9;+i) for(j=0;j=9;+j) for(k=0;k=9;+k) x=i*i*i+j*j*j+k*k*k;if(x=i*100+j*10+k)prin tf(%d=%dA3+%dA3+%dA3n,x,i,j,k);int main()f();system(pause);return 0;17. 对一个整数,如果其所有因子(包括因子 1 在内) 小于自身的数称为 “亏数”;因子之和大于自身的数称为全数时返回 0,是盈数时返回正值。利用这个函数求出之和正

28、好等于这个数,那么就称它为 “完全数 ”。因子之和“盈数”。写一个函数,当其参数是亏数时返回负值,是完1000以内的所有完全数(实际上只有 1、6、28、496)。为1000开始,每隔 1000这个程序计时:从 1 00开始每隔 100做一次计算,写一个循环,输出各次计算花的时间。再从做一次计算直到 10000为止,输出对程序执行计时的值。利用所定义的函数对一段区间的整数做一个分类,输出 其中各个数所属的类。18. 写程序由标准输入得到一系列三个一组的数, 把每组数作为三角形的三边长, 计算三角形的面积。 注意在程 序里检查输入数据,对不能构成三角形的情况给出错误信息。仔细分析自己的程序,能否

29、检查出所有不合理数据。用不同数据运行试验。19. 写一个程序,它读入一系列整数,最后输出其中最大的两个数。/ 读入一系列数,最后输出其中最大的两个#includeint main()long x,max1=-1000000,max2=-100000;while(scanf(%d,&x)=1)if(x!=max1&xmax2)if(xmax1)max2=max1;max1=x;elsemax2=x;printf(max1=%d max2=%dn,max1,max2); system(pause);return 0;20. 写一个程序, 它输出所读入的一系列整数的平均值。 项数。21. 假设程序由输入得到的一系列正实数是一条折线在请求出这一折线与X轴之间区域的面积。答:求折线与X轴之间区域的面积。可以看成是几个梯形面积和 #include假定给它的第一个数并不是数据, 而是用于说明数据的X等于0,1, 2,的对应值 (数据的数目事先并未确定)int main()int y,count=0; double s=0.0;while(scanf(%d,&y)=1) if(count=0)s+=y/2.; /s 加第一个输入值的 1/2 ,即 s=1/2*X1 else s+=y; /s 开始累加输入的值,此处

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论