正文

钱能的《C++程序设计教程》序列五:chapter5第一部分2005-08-03 02:59:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xiangyu/3410.html

分享到:

声明:为了大家的共同学习,特推出一些经典书籍的课后练习的答案,答案内容属原创,转载请注明出处, 欢迎大家批评指正。 这一序列说明: 1.采用国内的教材:《C++程序设计教程》钱能主编 清华大学出版社 1999 2.在每一章练习解答前会有一个“疑难知识点”概述,这里只代表我自己的观点,也就是我自己现在还不能 达到非常熟练,或者我初学时感觉比较模糊的知识。 3. 有一些答案来自网络,里面答案的选题编辑:张朝阳,责任编辑:徐培忠、林庆嘉。在这里表示感谢。以 后这里的答案简称“网络版” 4.更多的学习和改进将在《The C++ programming language》答案序列中体现。 序列五:chapter5 一、疑难知识点: 1.函数概述: (1)区分函数定义和函数声明(其实就是函数原型) (2)函数定义不允许嵌套 (3)若函数定义和函数声明不一致,也就是参数类型不一致,则可以正常编译但会出现错误链接。若是返回 类型或者参数个数不一样,则会误认为是重载,这时返回类型不一样的是错的,另一个重载若都提供了各自 的函数定义则是正确的。当然,没有被调用的函数可以只有声明没有定义。 (4)函数没有返回类型在新的标准下是错的,不过我载VC++6.0上面竟然可以通过^_^ (5)无返回的函数也可以使用return,但不能返回值 (6)内联函数用inline声明,定义时可以省略inline。反之也可以只在定义时放inline,而声明时没有,但 是这时其实已经变成普通的函数了而不是inline函数。 2.注意分清代码、各类变量、常量等在内存中的存储区域 3.局部变量的类型修饰是auto,习惯上省略 4.全局变量定义前的所以函数定义不知道该变量。由此,全局变量的定义位置也是比较重要的。 5.在p94有这么一句话:C++允许int到long,int到double的转换。当实参是整数而重载函数一为long型参数 ,一为double参数时应该给以一个显式转化。我原来觉得在这种情况下应该时调用long参数的函数,因为说 到底long也是int。我在vc++6.0上试验结果就是这样. 例子: int aa(long); int bb(double); void main() {     int b=6;     int a=aa(b);     cout<<a<<endl; } int aa(long a) {     return 3; } int bb(double) {     return 4; } 6.不能以返回类型来区别是否重载,若两个函数只是返回类型不一样将被当成同一个函数而出错(这个很重 要) 7.默认参数在函数声明中提供,当又有声明又有定义时,定义中不允许默认参数。默认参数从右到左逐渐定 义。 二、课后习题 前面三题没什么意思,引用网络版答案如下: 5.1 #include <iostream.h> #include <iomanip.h> #include <math.h> bool isprime(long n); void main() {   //input   long a,b,l=0;   cout <<"please input two numbers:\n";   cin >>a >>b;   cout <<"primes from " <<a <<" to " <<b <<" is \n";   //process   if(a%2==0) a++;   for(long m=a; m<=b; m+=2)     if(isprime(m)){       //output       if(l++%10==0)         cout <<endl;       cout <<setw(5) <<m;     } } bool isprime(long n) {   int sqrtm=sqrt(n);   for(int i=2; i<=sqrtm; i++)  //判明素数     if(n%i==0)       return false;   return true; } 5.2 #include <iostream.h> #include <iomanip.h> #include <math.h> double f(double x); double integral(double a, double b); const double eps = 1e-8; void main() {   double a=0, b=1;   cout <<"the integral of f(x) from "        <<a <<" to " <<b <<" is \n"        <<setiosflags(ios::fixed)        <<setprecision(8)        <<setw(8) <<integral(a,b) <<endl; } double f(double x) {   return exp(x)/(1+x*x); } double integral(double a, double b) {   int n=1;   double h,tn,t2n,i2n,in=0;   h = b-a;   t2n = i2n = h*(f(a)+f(b))/2;   while(fabs(i2n-in)>=eps){     tn = t2n;     in = i2n;     double sigma = 0.0;     for(int k=0; k<n; k++){       double x = a+(k+0.5)*h;       sigma += f(x);     }     t2n = (tn+h*sigma)/2.0;   //变步长梯形     i2n = (4*t2n-tn)/3.0;     //辛普生公式     n *= 2;     h /= 2;   }   return i2n; } 5.3由于字数限制删去

阅读(4054) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册