声明:为了大家的共同学习,特推出一些经典书籍的课后练习的答案,答案内容属原创,转载请注明出处,
欢迎大家批评指正。
这一序列说明:
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由于字数限制删去
正文
钱能的《C++程序设计教程》序列五:chapter5第一部分2005-08-03 02:59:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/xiangyu/3410.html
阅读(3853) | 评论(0)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论