谭浩强C++ 第十章
第十章课后习题
1、复数类,运算符重载
//要求运算符重载非成员,非友元函数
//解决1,数据成员公有,显然不是一个优解,但是可以运行得到答案
//解决2,用一个公有成员函数得到私有成员
#include<iostream>
using namespace std;
class Complex{public:Complex(){real=0; imag=0;}Complex(double r,double i):real(r),imag(i){ }void display(){if(imag>0) cout<<real<<"+"<<imag<<"i"<<endl;else if(imag==0) cout<<real<<endl;else cout<<real<<imag<<"i"<<endl;}public:double real;double imag;
};
Complex operator +(Complex &c1,Complex &c2){Complex x;x.real=c1.real+c2.real;x.imag=c1.imag+c2.imag;return x;
}
int main(){Complex c1(3,5);Complex c2(4,-1);Complex c;c=c1+c2;c.display();return 0;
}
#include<iostream>
using namespace std;
class Complex{public:Complex(){real=0; imag=0;}Complex(double r,double i):real(r),imag(i){ }double get_r(){return real;}double get_i(){return imag;}void display(){if(imag>0) cout<<real<<"+"<<imag<<"i"<<endl;else if(imag==0) cout<<real<<endl;else cout<<real<<imag<<"i"<<endl;}private:double real;double imag;
};
Complex operator +(Complex &c1,Complex &c2){return Complex(c1.get_r()+c2.get_r(),c1.get_i()+c2.get_i());
}
int main(){Complex c1(3,5);Complex c2(4,-1);Complex c;c=c1+c2;c.display();return 0;
}
2、复数加减乘除重载作为Complex类的成员函数
#include<iostream>
using namespace std;
class Complex{public:Complex(){real=0; imag=0;}Complex(double r,double i):real(r),imag(i){ }void display(){if(imag>0) cout<<real<<"+"<<imag<<"i"<<endl;else if(imag==0) cout<<real<<endl;else cout<<real<<imag<<"i"<<endl;}Complex operator+(Complex &);Complex operator-(Complex &);Complex operator*(Complex &);Complex operator/(Complex &);private:double real;double imag;
};
Complex Complex::operator +(Complex &c2){return Complex(real+c2.real,imag+c2.imag);
}
Complex Complex::operator -(Complex &c2){return Complex(real-c2.real,imag-c2.imag);
}
Complex Complex::operator *(Complex &c2){return Complex(real*c2.real-imag*c2.imag,real*c2.imag+imag*c2.real);
}
Complex Complex::operator /(Complex &c2){return Complex((real*c2.real+imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag),(imag*c2.real-real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag));
}
int main(){Complex c1(3,5);Complex c2(4,-1);Complex c;c=c1+c2;c.display();c=c1-c2;c.display();c=c1*c2;c.display();c=c1/c2;c.display();return 0;
}
3、重载,复数和复数相加,复数和整数相加,且可交换
//参考,P324~326
#include<iostream>
using namespace std;
class Complex{public:Complex(){real=0; imag=0;}Complex(double r,double i):real(r),imag(i){ }Complex(double r){//转换构造函数 real=r;imag=0;}void display(){if(imag>0) cout<<real<<"+"<<imag<<"i"<<endl;else if(imag==0) cout<<real<<endl;else cout<<real<<imag<<"i"<<endl;}friend Complex operator+(Complex ,Complex );//友元不限制第一个参数是本类的对象,可以使用交换律 private:double real;double imag;
};
Complex operator +(Complex c1,Complex c2){return Complex(c1.real+c2.real,c1.imag+c2.imag);
}
int main(){Complex c1(3,5);Complex c2(4,-1);double i=8; Complex c;c=c1+c2;c.display();c=c2+c1;c.display();c=c1+i;c.display();c=i+c1;c.display();return 0;
}
4、两行三列矩阵相加,重载
//参考,P324~326
#include<iostream>
using namespace std;
class Matrix{public: Matrix(){a0=0; a1=0; a2=0;b0=0; b1=0; b2=0;}Matrix(double a00,double a01,double a02,double b00,double b01,double b02){a0=a00; a1=a01; a2=a02;b0=b00; b1=b01; b2=b02;}void display(){cout<<"Matrix:"<<endl;cout<<a0<<'\t'<<a1<<'\t'<<a2<<endl;cout<<b0<<'\t'<<b1<<'\t'<<b2<<endl;}friend Matrix operator+(Matrix ,Matrix);private:double a0,a1,a2;double b0,b1,b2;
};
Matrix operator +(Matrix m1,Matrix m2){return Matrix(m1.a0+m2.a0,m1.a1+m2.a1,m1.a2+m2.a2,m1.b0+m2.b0,m1.b1+m2.b1,m1.b2+m2.b2);
}
int main(){Matrix m1(1,2,3,4,5,6);Matrix m2(0,1,2,7,8,9);Matrix m;m=m1+m2;m.display();return 0;
}
5、对上题重载,使矩阵可输入输出
#include<iostream>
using namespace std;
class Matrix{public: Matrix(){a0=0; a1=0; a2=0;b0=0; b1=0; b2=0;}Matrix(double a00,double a01,double a02,double b00,double b01,double b02){a0=a00; a1=a01; a2=a02;b0=b00; b1=b01; b2=b02;}friend Matrix operator+(Matrix ,Matrix);friend istream& operator>>(istream& ,Matrix &);//流插入运算符重载friend ostream& operator<<(ostream& ,Matrix &);//流提取运算符重载private:double a0,a1,a2;double b0,b1,b2;
};
Matrix operator +(Matrix m1,Matrix m2){return Matrix(m1.a0+m2.a0,m1.a1+m2.a1,m1.a2+m2.a2,m1.b0+m2.b0,m1.b1+m2.b1,m1.b2+m2.b2);
}
istream& operator>>(istream& in,Matrix &m){cout<<"input matrix(2*3):"<<endl;in>>m.a0>>m.a1>>m.a2>>m.b0>>m.b1>>m.b2;
}
ostream& operator<<(ostream& out,Matrix &m){cout<<endl<<"the matrix:"<<endl;out<<m.a0<<'\t'<<m.a1<<'\t'<<m.a2<<endl;out<<m.b0<<'\t'<<m.b1<<'\t'<<m.b2<<endl;
}
int main(){Matrix m1;Matrix m2;Matrix m;cin>>m1;cin>>m2;m=m1+m2;cout<<m;return 0;
}
6、复数和double类型相加,结果存放在double型变量中,然后以复数形式输出
#include<iostream>
using namespace std;
class Complex{public:Complex(){real=0; imag=0;}Complex(double r,double i):real(r),imag(i){ }Complex(double r){//转换构造函数 real=r;imag=0;}void display(){if(imag>=0) cout<<real<<"+"<<imag<<"i"<<endl;else cout<<real<<imag<<"i"<<endl;}operator double(){//类型转换函数 return real;}//参考P327转换构造和类型转换若有运算符+重载时不能同时使用会造成歧义,但是没有时可以同时使用 private:double real;double imag;
};
int main(){Complex c1(3,5),c2;double i; i=2.4+c1;//隐式调用类型转换函数 cout<<i<<endl;c2=Complex(i);//变成复数形式 c2.display(); return 0;
}
7、学生类转换成老师类
//参考P321转换构造函数
#include<iostream>
using namespace std;
class Student{public:Student(int nm,string na,char s,double sc):num(nm),name(na),sex(s),score(sc){}void display(){cout<<"Student:"<<endl;cout<<"num: "<<num<<endl;cout<<"name: "<<name<<endl;cout<<"sex: "<<sex<<endl; cout<<"score: "<<score<<endl;}public://Student 中数据成员必须设为公有 ,或者应该也可像第一题一样用公有成员函数得到私有成员,然后才可在类外调用int num;string name;char sex;double score;
};
class Teacher{public:Teacher(){num=0;name="\0";sex='0';salary=0.0;}Teacher(int nm,string na,char s,double sa):num(nm),name(na),sex(s),salary(sa){}Teacher(Student& s){//转换构造函数 num=s.num;//在类外使用student成员name=s.name;sex=s.sex;salary=0.0; }void display(){cout<<"Teacher:"<<endl;cout<<"num: "<<num<<endl;cout<<"name: "<<name<<endl;cout<<"sex: "<<sex<<endl; cout<<"salary: "<<salary<<endl;}private:int num;string name;char sex;double salary;
};
int main(){Student s1(1001,"lily",'f',89.1);s1.display();cout<<endl; Teacher t;t=Teacher(s1);t.display();return 0;
}
谭浩强C++ 第十章
第十章课后习题
1、复数类,运算符重载
//要求运算符重载非成员,非友元函数
//解决1,数据成员公有,显然不是一个优解,但是可以运行得到答案
//解决2,用一个公有成员函数得到私有成员
#include<iostream>
using namespace std;
class Complex{public:Complex(){real=0; imag=0;}Complex(double r,double i):real(r),imag(i){ }void display(){if(imag>0) cout<<real<<"+"<<imag<<"i"<<endl;else if(imag==0) cout<<real<<endl;else cout<<real<<imag<<"i"<<endl;}public:double real;double imag;
};
Complex operator +(Complex &c1,Complex &c2){Complex x;x.real=c1.real+c2.real;x.imag=c1.imag+c2.imag;return x;
}
int main(){Complex c1(3,5);Complex c2(4,-1);Complex c;c=c1+c2;c.display();return 0;
}
#include<iostream>
using namespace std;
class Complex{public:Complex(){real=0; imag=0;}Complex(double r,double i):real(r),imag(i){ }double get_r(){return real;}double get_i(){return imag;}void display(){if(imag>0) cout<<real<<"+"<<imag<<"i"<<endl;else if(imag==0) cout<<real<<endl;else cout<<real<<imag<<"i"<<endl;}private:double real;double imag;
};
Complex operator +(Complex &c1,Complex &c2){return Complex(c1.get_r()+c2.get_r(),c1.get_i()+c2.get_i());
}
int main(){Complex c1(3,5);Complex c2(4,-1);Complex c;c=c1+c2;c.display();return 0;
}
2、复数加减乘除重载作为Complex类的成员函数
#include<iostream>
using namespace std;
class Complex{public:Complex(){real=0; imag=0;}Complex(double r,double i):real(r),imag(i){ }void display(){if(imag>0) cout<<real<<"+"<<imag<<"i"<<endl;else if(imag==0) cout<<real<<endl;else cout<<real<<imag<<"i"<<endl;}Complex operator+(Complex &);Complex operator-(Complex &);Complex operator*(Complex &);Complex operator/(Complex &);private:double real;double imag;
};
Complex Complex::operator +(Complex &c2){return Complex(real+c2.real,imag+c2.imag);
}
Complex Complex::operator -(Complex &c2){return Complex(real-c2.real,imag-c2.imag);
}
Complex Complex::operator *(Complex &c2){return Complex(real*c2.real-imag*c2.imag,real*c2.imag+imag*c2.real);
}
Complex Complex::operator /(Complex &c2){return Complex((real*c2.real+imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag),(imag*c2.real-real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag));
}
int main(){Complex c1(3,5);Complex c2(4,-1);Complex c;c=c1+c2;c.display();c=c1-c2;c.display();c=c1*c2;c.display();c=c1/c2;c.display();return 0;
}
3、重载,复数和复数相加,复数和整数相加,且可交换
//参考,P324~326
#include<iostream>
using namespace std;
class Complex{public:Complex(){real=0; imag=0;}Complex(double r,double i):real(r),imag(i){ }Complex(double r){//转换构造函数 real=r;imag=0;}void display(){if(imag>0) cout<<real<<"+"<<imag<<"i"<<endl;else if(imag==0) cout<<real<<endl;else cout<<real<<imag<<"i"<<endl;}friend Complex operator+(Complex ,Complex );//友元不限制第一个参数是本类的对象,可以使用交换律 private:double real;double imag;
};
Complex operator +(Complex c1,Complex c2){return Complex(c1.real+c2.real,c1.imag+c2.imag);
}
int main(){Complex c1(3,5);Complex c2(4,-1);double i=8; Complex c;c=c1+c2;c.display();c=c2+c1;c.display();c=c1+i;c.display();c=i+c1;c.display();return 0;
}
4、两行三列矩阵相加,重载
//参考,P324~326
#include<iostream>
using namespace std;
class Matrix{public: Matrix(){a0=0; a1=0; a2=0;b0=0; b1=0; b2=0;}Matrix(double a00,double a01,double a02,double b00,double b01,double b02){a0=a00; a1=a01; a2=a02;b0=b00; b1=b01; b2=b02;}void display(){cout<<"Matrix:"<<endl;cout<<a0<<'\t'<<a1<<'\t'<<a2<<endl;cout<<b0<<'\t'<<b1<<'\t'<<b2<<endl;}friend Matrix operator+(Matrix ,Matrix);private:double a0,a1,a2;double b0,b1,b2;
};
Matrix operator +(Matrix m1,Matrix m2){return Matrix(m1.a0+m2.a0,m1.a1+m2.a1,m1.a2+m2.a2,m1.b0+m2.b0,m1.b1+m2.b1,m1.b2+m2.b2);
}
int main(){Matrix m1(1,2,3,4,5,6);Matrix m2(0,1,2,7,8,9);Matrix m;m=m1+m2;m.display();return 0;
}
5、对上题重载,使矩阵可输入输出
#include<iostream>
using namespace std;
class Matrix{public: Matrix(){a0=0; a1=0; a2=0;b0=0; b1=0; b2=0;}Matrix(double a00,double a01,double a02,double b00,double b01,double b02){a0=a00; a1=a01; a2=a02;b0=b00; b1=b01; b2=b02;}friend Matrix operator+(Matrix ,Matrix);friend istream& operator>>(istream& ,Matrix &);//流插入运算符重载friend ostream& operator<<(ostream& ,Matrix &);//流提取运算符重载private:double a0,a1,a2;double b0,b1,b2;
};
Matrix operator +(Matrix m1,Matrix m2){return Matrix(m1.a0+m2.a0,m1.a1+m2.a1,m1.a2+m2.a2,m1.b0+m2.b0,m1.b1+m2.b1,m1.b2+m2.b2);
}
istream& operator>>(istream& in,Matrix &m){cout<<"input matrix(2*3):"<<endl;in>>m.a0>>m.a1>>m.a2>>m.b0>>m.b1>>m.b2;
}
ostream& operator<<(ostream& out,Matrix &m){cout<<endl<<"the matrix:"<<endl;out<<m.a0<<'\t'<<m.a1<<'\t'<<m.a2<<endl;out<<m.b0<<'\t'<<m.b1<<'\t'<<m.b2<<endl;
}
int main(){Matrix m1;Matrix m2;Matrix m;cin>>m1;cin>>m2;m=m1+m2;cout<<m;return 0;
}
6、复数和double类型相加,结果存放在double型变量中,然后以复数形式输出
#include<iostream>
using namespace std;
class Complex{public:Complex(){real=0; imag=0;}Complex(double r,double i):real(r),imag(i){ }Complex(double r){//转换构造函数 real=r;imag=0;}void display(){if(imag>=0) cout<<real<<"+"<<imag<<"i"<<endl;else cout<<real<<imag<<"i"<<endl;}operator double(){//类型转换函数 return real;}//参考P327转换构造和类型转换若有运算符+重载时不能同时使用会造成歧义,但是没有时可以同时使用 private:double real;double imag;
};
int main(){Complex c1(3,5),c2;double i; i=2.4+c1;//隐式调用类型转换函数 cout<<i<<endl;c2=Complex(i);//变成复数形式 c2.display(); return 0;
}
7、学生类转换成老师类
//参考P321转换构造函数
#include<iostream>
using namespace std;
class Student{public:Student(int nm,string na,char s,double sc):num(nm),name(na),sex(s),score(sc){}void display(){cout<<"Student:"<<endl;cout<<"num: "<<num<<endl;cout<<"name: "<<name<<endl;cout<<"sex: "<<sex<<endl; cout<<"score: "<<score<<endl;}public://Student 中数据成员必须设为公有 ,或者应该也可像第一题一样用公有成员函数得到私有成员,然后才可在类外调用int num;string name;char sex;double score;
};
class Teacher{public:Teacher(){num=0;name="\0";sex='0';salary=0.0;}Teacher(int nm,string na,char s,double sa):num(nm),name(na),sex(s),salary(sa){}Teacher(Student& s){//转换构造函数 num=s.num;//在类外使用student成员name=s.name;sex=s.sex;salary=0.0; }void display(){cout<<"Teacher:"<<endl;cout<<"num: "<<num<<endl;cout<<"name: "<<name<<endl;cout<<"sex: "<<sex<<endl; cout<<"salary: "<<salary<<endl;}private:int num;string name;char sex;double salary;
};
int main(){Student s1(1001,"lily",'f',89.1);s1.display();cout<<endl; Teacher t;t=Teacher(s1);t.display();return 0;
}