声明:为了大家的共同学习,特推出一些经典书籍的课后练习的答案,答案内容属原创,转载请注明出处, 欢迎大家批评指正。 这一序列说明: 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由于字数限制删去

评论