正文

钱能的《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由于字数限制删去

阅读(3853) | 评论(0)


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

评论

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