C++面向程序设计(第二版)课后习题答案解析

最近没什么心情整理零散的知识点,就整理一下第四章的课后习题答案。

1.定义一个复数类Complex,重载运算符“+”,使之能用于复数的加法运算。将运算符函数重载为非成员函数,非友元的普通函数。编程序,求两个复数之和。

源代码:

 1 #include <iostream>
 2 #include<stdlib.h>
 3 using namespace std;
 4 class Complex
 5 {public:
 6     Complex(){real=0;imag=0;}
 7     Complex(double r,double i){real=r;imag=i;}
 8     double get_real();//获取实部函数
 9     double get_imag();//获取虚部函数
10     void display();//显示函数
11 private:
12     double real;
13     double imag;
14 };
15 
16 //实现具体的函数
17 double Complex::get_real()
18 {
19     return real;
20 }
21 double Complex::get_imag()
22 {
23     return imag;
24 }
25 void Complex::display()
26 {
27     cout<<"("<<real<<","<<imag<<"i)"<<endl;
28 }
29 //重载运算符“+”
30 Complex operator + (Complex &c1,Complex &c2)
31 {
32     return Complex(c1.get_real()+c2.get_real(),c1.get_imag()+c2.get_imag());
33 }
34 
35 
36 int main()
37 {
38     Complex c1(3,4),c2(5,-10),c3;
39     c3=c1+c2;
40     cout<<"c3=";
41     c3.display();
42     system("pause");
43     return 0;
44 }

2.定义一个复数类Complex,重载运算符“+”,“-”,“*”,“/”,使之能用于复数的加,减,乘,除。运算符重载函数作为Complex类的成员函数。编程序,分别求两个复数之和、差、积和商。

源程序:

 1 #include<iostream>
 2 #include<stdlib.h>
 3 using namespace std;
 4 class Complex
 5 {
 6 public:
 7     Complex(){real=0;imag=0;}
 8     Complex(double r,double i){real=r;imag=i;}
 9     //重载函数:加、减、乘、除
10     Complex operator+(Complex &c2);
11     Complex operator-(Complex &c2);
12     Complex operator*(Complex &c2);
13     Complex operator/(Complex &c2);
14     void display();
15 private:
16     double real;
17     double imag;
18 };
19 Complex Complex::operator+(Complex &c2)
20 {
21     Complex c; 
22     c.real=real+c2.real;
23     c.imag=imag+c2.imag;
24     return c;
25 }
26 Complex Complex::operator-(Complex &c2)
27 {
28     Complex c;
29     c.real=real-c2.real;
30     c.imag=imag-c2.imag;
31     return c;
32 }
33 Complex Complex::operator* (Complex &c2)
34 {
35     Complex c;
36     c.real=real*c2.real-imag* c2.imag;
37     c.imag=imag* c2.real+real*c2.imag;
38     return c;
39 }
40 Complex Complex::operator/(Complex &c2)
41 {
42     Complex c; 
43     c.real=(real*c2.real+imag* c2.imag)/(c2.real*c2.real+c2.imag* c2.imag);
44     c.imag=(imag* c2.real-real*c2.imag)/(c2.real*c2.real+c2.imag* c2.imag);
45     return c;
46 }
47 void Complex::display()
48 {
49     cout<<"("<<real<<","<<imag<<"i)"<<endl;
50 }
51 
52  int main()
53 {
54     Complex c1(3,4),c2(5,-10),c3;
55     c3=c1+c2;
56     cout<<"c1+c2=";
57     c3.display();
58     c3=c1-c2;
59     cout<<"c1-c2=";
60     c3.display();
61     c3=c1*c2;
62     cout<<"c1*c2=";
63     c3.display();
64     c3=c1/c2;
65     cout<<"c1/c2=";
66     c3.display();
67     system("pause");
68     return 0;
69  }

3.定义一个复数类函数Complex,重载运算符“+”,使之能用于复数的加法运算。参加运算的两个运算量都可以是类对象,也可以其中有一个是整数,顺序任意。如c1+c2,i+c1,c1+i均合法(设i为整数,c1,c2为复数)。编程序,分别求两个复数之和、整数和复数之和。

源代码:

 1 #include <iostream>
 2 #include<stdlib.h>
 3 using namespace std;
 4 class Complex
 5 {
 6 public:
 7     Complex(){real=0;imag=0;}
 8     Complex(double r,double i){real=r;imag=i;}
 9     //定义重载复数加法
10     Complex operator+(Complex &c2);
11     //定义重载整数加法
12     Complex operator+(int &i);
13     //定义友元类重载复数、整数加法函数
14     friend Complex operator+(int&,Complex &);
15     void display();
16 private:
17     double real;
18     double imag;
19 };
20 
21  Complex Complex::operator+(Complex &c)
22 {
23     return Complex(real+c.real,imag+c.imag);
24  }
25 Complex Complex::operator+(int &i)
26 {
27     return Complex(real+i,imag);
28 }
29 void Complex::display()
30 {
31     cout<<"("<<real<<","<<imag<<"i)"<<endl;
32 }
33 Complex operator+(int &i,Complex &c)
34 {
35     return Complex(i+c.real,c.imag);
36 }
37 
38  int main()
39 {
40     Complex c1(3,4),c2(5,-10),c3;
41     int i=5;
42     c3=c1+c2;
43     cout<<"c1+c2=";
44     c3.display();
45     c3=i+c1;
46     cout<<"i+c1=";
47     c3.display();
48     c3=c1+i;
49     cout<<"c1+i=";
50     c3.display();
51     system("pause");
52     return 0;
53 }

4.有两个矩阵a和b,均为2行3列。求两个矩阵之和,重载运算符“+”,使之能用于矩阵相加。如c=a+b。

源代码:

 1 #include <iostream>
 2 #include<stdlib.h>
 3 using namespace std;
 4 class Matrix
 5 {
 6 public:
 7     Matrix();
 8     //定义友元类加法重载函数
 9     friend Matrix operator+(Matrix &,Matrix &);
10     //定义矩阵输入函数
11     void input();
12     //定义矩阵输出函数
13     void display();
14 private:
15 //定义两行三列的矩阵
16     int mat[2][3];
17 };
18 Matrix::Matrix()
19 {
20     for(int i=0;i<2;i++)
21     {
22         for(int j=0;j<3;j++)
23         {
24             mat[i][j]=0;
25         }
26     
27     }
28     
29 }
30 //矩阵加法运算函数
31 Matrix operator+(Matrix &a,Matrix &b)
32 {
33     Matrix c;
34     for(int i=0;i<2;i++)
35     {
36         for(int j=0;j<3;j++)
37         {
38         c.mat[i][j]=a.mat[i][j]+b.mat[i][j];
39         }
40     }
41     
42     return c;
43 }
44 //矩阵控制台输入具体数据函数
45 void Matrix::input()
46 {
47     cout<<"input value of matrix:"<<endl;
48     for(int i=0;i<2;i++)
49     {
50         for(int j=0;j<3;j++)
51         {
52             cin>>mat[i][j];
53         }
54     
55     }
56     
57 }
58 //显示矩阵数据函数
59  void Matrix::display()
60 {
61     for (int i=0;i<2;i++)
62     {
63         for(int j=0;j<3;j++)
64         {
65             cout<<mat[i][j]<<" ";
66         }
67         cout<<endl;
68     }
69 }
70 int main()
71 {    
72     Matrix a,b,c;
73     a.input();
74     b.input();
75     cout<<endl<<"Matrix a:"<<endl;
76     a.display();
77     cout<<endl<<"Matrix b:"<<endl;
78     b.display();
79     c=a+b; 
80     cout<<endl<<"Matrix c = Matrix a + Matrix b :"<<endl;
81     c.display();
82     system("pause");
83     return 0;
84 }

5.在第四题的基础上,重载流插入运算符“<<”和流提取运算符“>>”,使之能用于矩阵的输入和输出。

源程序:

 1 #include <iostream>
 2 #include<stdlib.h>
 3 using namespace std;
 4 class Matrix
 5 {
 6 public:
 7     Matrix();
 8     //定义重载运算符“+”函数
 9     friend Matrix operator+(Matrix &,Matrix &);
10     //定义重载流插入运算符“<<”函数
11     friend ostream& operator<<(ostream&,Matrix&);
12     //定义重载流提取运算符“>>”函数
13     friend istream& operator>>(istream&,Matrix&);
14 private:
15 //定义2行3列矩阵
16     int mat[2][3];
17 };
18 //初始化矩阵
19 Matrix::Matrix()
20 {
21     for(int i=0;i<2;i++)
22     {
23         for(int j=0;j<3;j++)
24         {
25             mat[i][j]=0;
26         }
27         
28     }
29 }
30 //重载运算符“+”函数
31 Matrix operator+(Matrix &a,Matrix &b)
32 {
33     Matrix c;
34     for(int i=0;i<2;i++)
35     {
36         for(int j=0;j<3;j++)
37         {
38             c.mat[i][j]=a.mat[i][j]+b.mat[i][j];
39     
40         }
41     }
42     
43     return c; 
44 }
45 
46 //重载流提取运算符“>>”函数,输入矩阵数据
47 istream& operator>>(istream &in,Matrix &m)
48 {
49     cout<<"input value of matrix:"<<endl;
50     for(int i=0;i<2;i++)
51     {
52         for(int j=0;j<3;j++)
53         {
54              in>>m.mat[i][j];
55         }
56        
57     }
58     
59     return in;
60 }
61 //重载流插入运算符“<<”函数,输出矩阵数据
62 ostream& operator<<(ostream &out,Matrix &m)
63 {
64     for (int i=0;i<2;i++)
65     {for(int j=0;j<3;j++)
66     {
67         out<<m.mat[i][j]<<" ";
68     }
69     out<<endl;
70     }
71     return out;
72 }
73 int main()
74 {
75     Matrix a,b,c;
76     cin>>a;
77     cin>>b;
78     cout<<endl<<"Matrix a:"<<endl<<a<<endl;
79     cout<<endl<<"Matrix b:"<<endl<<b<<endl;
80     c=a+b; 
81     cout<<endl<<"Matrix C = Matrix a + Matrix b :"<<endl<<c<<endl;
82     system("pause");
83     return 0;
84 }

6.请编写程序,处理一个复数与一个double数相加的运算,结果存放在一个double型的变量dl中,输出dl的值,再以复数的形式输出此值。定义Complex(复数)类,在成员函数中包含重载类型转换运算符:

operator double() {return real;}

源代码:

 1 #include <iostream>
 2 #include<stdlib.h>
 3 using namespace std;
 4 class Complex
 5 {
 6 public:
 7     Complex(){real=0;imag=0;}
 8     Complex(double r){real=r;imag=0;}
 9     Complex(double r,double i){real=r;imag=i;}
10     //重载类型转换运算符函数
11     operator double(){return real;}
12     void display();
13 private:
14     double real;
15     double imag;
16 };
17 void Complex::display()
18 {
19     cout<<"("<<real<<", "<<imag<<")"<<endl;
20 }
21 int main()
22 {
23     Complex c1(3,4),c2;
24     double d1;
25     d1=2.5+c1;
26     cout<<"d1="<<d1<<endl;
27     c2=Complex(d1);
28     cout<<"c2=";
29     c2.display();
30     system("pause");
31     return 0;
32 }

7.扩展:有两个3行3列的矩阵,求两个矩阵的和、差、积,重载运算符“+”,“-”,“*”。

源代码:

  1 #include <iostream>
  2 #include<stdlib.h>
  3 using namespace std;
  4 class Matrix
  5 {
  6 public:
  7     Matrix();
  8     //定义重载加法运算函数
  9     friend Matrix operator+(Matrix &,Matrix &);
 10     //定义重载减法运算函数
 11     friend Matrix operator-(Matrix &,Matrix &);
 12     //定义重载乘法运算函数
 13     friend Matrix operator*(Matrix &,Matrix &);
 14     void input();
 15     void display();
 16 private:
 17     //定义3行3列矩阵
 18     int mat[3][3];
 19 };
 20 //初始化矩阵
 21 Matrix::Matrix()
 22 {
 23     for(int i=0;i<3;i++)
 24     {
 25         for(int j=0;j<3;j++)
 26         {
 27             mat[i][j]=0;
 28         }
 29     
 30     }
 31     
 32 }
 33 //重载加法运算函数,
 34 Matrix operator+(Matrix &a,Matrix &b)
 35 {
 36     Matrix c;
 37     for(int i=0;i<3;i++)
 38     {
 39         for(int j=0;j<3;j++)
 40         {
 41             //矩阵加法为行列号相同的元素相加为该位置的数据
 42             c.mat[i][j]=a.mat[i][j]+b.mat[i][j];
 43         }
 44     }
 45     
 46     return c;
 47 }
 48 //重载减法运算函数,矩阵减法为行列号相同的元素相减为该位置的数据
 49 Matrix operator-(Matrix &a,Matrix &b)
 50 {
 51     Matrix c;
 52     for(int i=0;i<3;i++)
 53     {
 54         for(int j=0;j<3;j++)
 55         {
 56         c.mat[i][j]=a.mat[i][j]-b.mat[i][j];
 57         }
 58     }
 59     
 60     return c;
 61 }
 62 //重载乘法运算函数,第一个矩阵的第i行的第一个元素,逐一与第二个矩阵的i行的j列上的所有元素之积的和,为该i行j列的数据
 63 Matrix operator*(Matrix &a,Matrix &b)
 64 {
 65     //int mat;
 66     Matrix c;
 67     for(int i=0;i<3;i++)
 68     {
 69         for(int j=0;j<3;j++)
 70         {
 71             //矩阵乘法运算的核心步骤,k为控制列乘的数据
 72             for(int k=0;k<3;k++)
 73             c.mat[i][j]=c.mat[i][j]+a.mat[i][k]*b.mat[k][j];
 74         }
 75     }
 76     
 77     return c;
 78 }
 79 //矩阵输入函数
 80 void Matrix::input()
 81 {
 82     cout<<"input value of matrix:"<<endl;
 83     for(int i=0;i<3;i++)
 84     {
 85         for(int j=0;j<3;j++)
 86         {
 87             cin>>mat[i][j];
 88         }
 89     
 90     }
 91     
 92 }
 93 //矩阵输出函数
 94  void Matrix::display()
 95 {
 96     for (int i=0;i<3;i++)
 97     {
 98         for(int j=0;j<3;j++)
 99         {
100             cout<<mat[i][j]<<" ";
101         }
102         cout<<endl;
103     }
104 }
105 int main()
106 {    
107     Matrix a,b,c;
108     a.input();
109     b.input();
110     cout<<endl<<"Matrix a:"<<endl;
111     a.display();
112     cout<<endl<<"Matrix b:"<<endl;
113     b.display();
114     c=a+b; 
115     cout<<endl<<"Matrix c = Matrix a + Matrix b :"<<endl;
116     c.display();
117     c=a-b; 
118     cout<<endl<<"Matrix c = Matrix a - Matrix b :"<<endl;
119     c.display();
120     c=a*b; 
121     cout<<endl<<"Matrix c = Matrix a * Matrix b :"<<endl;
122     c.display();
123     system("pause");
124     return 0;
125 }

小结:

熟练掌握复数运算,重载运算符(+,-,*,/,<<,>>)函数的使用方法,矩阵的输入及输出函数封装,矩阵的加、减和乘法的运算。

猜你喜欢

转载自www.cnblogs.com/chenting123456789/p/11980495.html