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

下载本文档

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

文档简介

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

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

3、4.5f) - 012 + 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) 2 341 257+ 2)106524*133)23 5827 96 3 67 . / . 4) n 2 +1 7) In ln(10 1) 2n +5) log5 2n -1 6) e n +i 7) arctan(log ( ) 3 e + n13- (2.24- 0

4、.242 )2 9)1 23 4 5 + + / 1 0) ln(2n 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,

5、 金球的重量为 : %fn,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;7. 写程序计算 5x2+ 2x + 6 的两个根,考虑用合适的方式输出。 (提示:对这个具体问题,可以先人工计算出判别式b2 - 4ac的值,以此作为已知信息,就可以写出程序了。)#include #include void f(double a,double b,double c)double temp=b*b-4*a*c;if(temp0)printf( 方

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

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

8、 ? b + a : c + a;答:1) u=22) u=43. 假设整型变量 a 的值是 1,b 的值是 2,c 的值是 0,写出 下面各个表达式的值。1) a & !(b | c) & !a)2) !(a & b) | c ? a | b : a & b & c3) !(a + b c) & b = c * a -b1) 12) 03) 04. 下面程序在执行时,哪些地方将发生类型转换?程序打 印的值是什么?int f (int n, float m) return (m + m / 4;int main () float y = 3;printf(%dn, f(y, y + 1);re

9、turn 0;答:5. 在计算机上试验本章正文中的一些程序。对它们做一些 修改,观察程序加工和运行的情 况,并对程序的行为做出解释。答案:略求圆柱体的体积、6. 定义求圆球的体积、 求圆球的表面积、 求圆柱体的表面积的函数。 答:#include double 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.1415926*h;r

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

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

12、le,) 它返回 三个参数中最大的 一个。写一个主函数试验各种参数情况。答:#includedouble tmax(double x,double y,double z)if(xy)return xz?x:z;elsereturn yz?y:z;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/(R1+R2)10. 如果四

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

14、需要时输出适当的信息,使之成为一个更完整的函数。写一个主函数,用各 种特殊情况和一般情况测试所完成的函数。 答:#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)printf( 方程有两个相同的根为: %f,-b/2/a);elseprintf( 方程无解! );f(5,

15、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度输出一行数 据,打印一个表。每行中包括

16、 5 个 项目:角度数,以及它所对应的正弦、余弦、正切、余切 函数值。答:#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=艺1的函数。两种循环结构给出函数定义,再利用等差级数求 和公式给出

17、函数定义。答:#include double 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()printf(%fn,f1(10,2.5);printf(%fn,f2(10,2.5);printf(%fn,f3(10,2.5); sys

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

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

20、如果出现错误,弄清楚是什么原因。这个程 序能对k = 30得到正确结果吗?(另外,你能只用一重循 环完成函数的定义吗?)5. 写函数计算: * ;八;,公式中有n层嵌 套。利用这L#in elude #in elude double f(i nt 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)printf(%fn,f(10,(double)x);system(pause);return 0;个函数打印x = 1.0 、

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

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

23、=1.0, n=2.0;double tt=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(pause);return 0;11. 修改书中计算sin值的函数,使之能输出计算中循环执 行的次数。用不同的数值(一个比一个大)试验这一函数, 观察出现的情况。你看到出现溢出的情况了吗?(为试验 方便,你应该写一个适用的驱动程序)12. 已知-?=- ?+?-

24、?+1123132451352467357xxxxxLr 1xsinh (x 0, n0):tnin = ngcd(.wm n利用这个定义,用递归和循环方式各写出一个求最大公约 数的函数。答: /- 辗转相减求最大公约数#include int gcd(int m,int n)return m=n?m:(mALIOP4SV pnoutt坦 =XT 一 -u 一04 po 口坦心/宀 ouna)F(Dsned=E2SAS(+O66HV 一OOLH)。u 一 OUCUE -u 一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

25、+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,是盈数时返回正值。利用这个函数求出 1000以内的所 有完全数(实际上只有 1、6、28、496)。为这个程序计时: 从100开始每隔 100做一次计算,写一个循环

26、,输出各次计 算花的时间。再从 1000开始,每隔 1000做一次计算直到 10000为止,输出对程序执行计时的值。利用所定义的函数对一段区间的整数做一个分类,输出其中各个数所属的类18. 写程序由标准输入得到一系列三个一组的数,把每组 数作为三角形的三边长,计算三角形的面积。注意在程序 里检查输入数据,对不能构成三角形的情况给出错误信息 仔细分析自己的程序,能否检查出所有不合理数据。用不同数 据运行试验。19. 写一个程序,它读入一系列整数,最后输出其中最大 的两个数。/ 读入一系列数,最后输出其中最大的两个#includeint main()long x,max1=-1000000,max

27、2=-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 等于0, 1, 2,的对应值(数据的数目事先并未确定), 请求出这一折线与 x 轴之间区域的面积。答:求折线与x轴之间区域的面积。可以看成是几个梯形面积 和#includeint 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*X1else s+=y; /s 开始累加输入的值,此处包括最后一个 数,即 Xn;+count;s=s-y/2.; / 由于刚才多加了最后输入的数的 1/2 ,也就是1/2的Xn,所以要减去。pri ntf(s=%fmA2n,s);

温馨提示

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

评论

0/150

提交评论