c++运算符重载习题.docx
《c++运算符重载习题.docx》由会员分享,可在线阅读,更多相关《c++运算符重载习题.docx(14页珍藏版)》请在冰点文库上搜索。
![c++运算符重载习题.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/0777a5be-3255-4eaf-b06c-7c8df3610d33/0777a5be-3255-4eaf-b06c-7c8df3610d331.gif)
Task8-1
/*
1. 定义一个复数类Complex,重载运算符“+”,使之能用于复数的加法运算。
将运算符函数重载为非成员、非友元的普通函数。
编写程序,求两个复数之和
*/
#include
usingnamespacestd;
classComplex
{
public:
Complex(){real=0;imag=0;}
Complex(doubler,doublei){real=r;imag=i;}
voiddisplay();
doublereal;
doubleimag;
};
voidComplex:
:
display()
{
cout<<"("<}
Complexoperator+(Complex&c1,Complex&c2)
{
Complexp;
p.real=c1.real+c2.real;
p.imag=c1.imag+c2.imag;
returnp;
}
intmain()
{
Complexc1(3,5),c2(2,5),c3;
c1.display();
cout<<"+";
c2.display();
cout<<"=";
c3=c1+c2;
c3.display();
}
Task8-2
/*2. 定义一个复数类Complex,重载运算符“+”、”-“、”*”、”/”,
使之能用于复数的加、减、乘、除。
运算符重载函数作为Complex类的成员函数,
编程,分别求两个复数之和差积商。
*/
#include
usingnamespacestd;
classComplex
{public:
Complex(){real=0;imag=0;}
Complex(doubler,doublei){real=r;imag=i;}
Complexoperator+(Complex&c2);
Complexoperator-(Complex&c2);
Complexoperator*(Complex&c2);
Complexoperator/(Complex&c2);
voiddisplay();
private:
doublereal;
doubleimag;
};
ComplexComplex:
:
operator+(Complex&c2)
{Complexc;
c.real=real+c2.real;
c.imag=imag+c2.imag;
returnc;
}
ComplexComplex:
:
operator-(Complex&c2)
{Complexc;
c.real=real-c2.real;
c.imag=imag-c2.imag;
returnc;
}
ComplexComplex:
:
operator*(Complex&c2)
{Complexc;
c.real=real*c2.real;
c.imag=imag*c2.imag;
returnc;
}
ComplexComplex:
:
operator/(Complex&c2)
{Complexc;
c.real=(real*c2.real+imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);
c.imag=(imag*c2.real-real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);
returnc;
}
voidComplex:
:
display()
{cout<<"("<}
intmain()
{Complexc1(3,4),c2(5,-10),c3;
c3=c1+c2;
cout<<"c1+c2=";
c3.display();
c3=c1-c2;
cout<<"c1-c2=";
c3.display();
c3=c1*c2;
cout<<"c1*c2=";
c3.display();
c3=c1/c2;
cout<<"c1/c2=";
c3.display();
return0;
}
Task8-3
/*
3. 有两个矩阵a和b,均为n行m列(m、n的值自己给出),
求两个矩阵之和、差、积、商,重载运算符“+”、”-“、”*”、”/”,
使之能用于矩阵向加减乘除,如c=a+b、c=a*b。
*/
#include
#definen2
#definem3
usingnamespacestd;
classMatrix//定义Matrix类
{public:
Matrix();//默认构造函数
friendMatrixoperator+(Matrix&,Matrix&);//重载运算符“+”
friendMatrixoperator-(Matrix&,Matrix&);
friendMatrixoperator*(Matrix&,Matrix&);
friendMatrixoperator/(Matrix&,Matrix&);
voidinput();//输入数据函数
voiddisplay();//输出数据函数
private:
intmat[n][m];
};
Matrix:
:
Matrix()//定义构造函数
{for(inti=0;ifor(intj=0;jmat[i][j]=0;
}
Matrixoperator+(Matrix&a,Matrix&b)//定义重载运算符“+”函数
{Matrixc;
for(inti=0;ifor(intj=0;j{c.mat[i][j]=a.mat[i][j]+b.mat[i][j];}
returnc;
}
Matrixoperator-(Matrix&a,Matrix&b)//定义重载运算符“+”函数
{Matrixc;
for(inti=0;ifor(intj=0;j{c.mat[i][j]=a.mat[i][j]-b.mat[i][j];}
returnc;
}
Matrixoperator*(Matrix&a,Matrix&b)//定义重载运算符“+”函数
{Matrixc;
for(inti=0;ifor(intj=0;j{c.mat[i][j]=a.mat[i][j]*b.mat[i][j];}
returnc;
}
Matrixoperator/(Matrix&a,Matrix&b)//定义重载运算符“+”函数
{Matrixc;
for(inti=0;ifor(intj=0;j{c.mat[i][j]=a.mat[i][j]/b.mat[i][j];}
returnc;
}
voidMatrix:
:
input()//定义输入数据函数
{cout<<"inputvalueofmatrix:
"<inti,j;
for(i=0;i{
for(j=0;j{
cin>>mat[i][j];
}
}
}
voidMatrix:
:
display()//定义输出数据函数
{for(inti=0;i{for(intj=0;j{cout<cout<}
intmain()
{
Matrixa,b,c;
a.input();
b.input();
cout<"<a.display();
cout<"<b.display();
c=a+b;//用重载运算符“+”实现两个矩阵相加
cout<"<c.display();
c=a-b;//用重载运算符“+”实现两个矩阵相加
cout<"<c.display();
c=a*b;//用重载运算符“+”实现两个矩阵相加
cout<"<c.display();
c=a/b;//用重载运算符“+”实现两个矩阵相加
cout<"<c.display();
return0;
}
Task8-4
/*
4. 在第三题的基础上,重载运算符>>和<<,使之能用于该矩阵的输入和输出。
*/
#include
#definen2
#definem3
usingnamespacestd;
classMatrix//定义Matrix类
{public:
Matrix();//默认构造函数
friendMatrixoperator+(Matrix&,Matrix&);//重载运算符“+”
friendMatrixoperator-(Matrix&,Matrix&);
friendMatrixoperator*(Matrix&,Matrix&);
friendMatrixoperator/(Matrix&,Matrix&);
friendostream&operator<<(ostream&,Matrix&);
friendistream&operator>>(istream&,Matrix&);
voidinput();//输入数据函数
voiddisplay();//输出数据函数
private:
intmat[n][m];
};
Matrix:
:
Matrix()//定义构造函数
{for(inti=0;ifor(intj=0;jmat[i][j]=0;
}
Matrixoperator+(Matrix&a,Matrix&b)//定义重载运算符“+”函数
{Matrixc;
for(inti=0;ifor(intj=0;j{c.mat[i][j]=a.mat[i][j]+b.mat[i][j];}
returnc;
}
Matrixoperator-(Matrix&a,Matrix&b)//定义重载运算符“+”函数
{Matrixc;
for(inti=0;ifor(intj=0;j{c.mat[i][j]=a.mat[i][j]-b.mat[i][j];}
returnc;
}
Matrixoperator*(Matrix&a,Matrix&b)//定义重载运算符“+”函数
{Matrixc;
for(inti=0;ifor(intj=0;j{c.mat[i][j]=a.mat[i][j]*b.mat[i][j];}
returnc;
}
Matrixoperator/(Matrix&a,Matrix&b)//定义重载运算符“+”函数
{Matrixc;
for(inti=0;ifor(intj=0;j{c.mat[i][j]=a.mat[i][j]/b.mat[i][j];}
returnc;
}
ostream&operator<<(ostream&out,Matrix&c)
{
for(inti=0;i {
for(intj=0;j cout< cout< }
returnout;
}
istream&operator>>(istream&in,Matrix&c)
{
for(inti=0;i {
for(intj=0;j cin>>c.mat[i][j];
cout< }
returnin;
}
voidMatrix:
:
input()//定义输入数据函数
{cout<<"inputvalueofmatrix:
"<inti,j;
for(i=0;i{
for(j=0;j{
cin>>mat[i][j];
}
}
}
voidMatrix:
:
display()//定义输出数据函数
{for(inti=0;i{for(intj=0;j{cout<cout<}
intmain()
{
Matrixa,b,c;
cout<<"请输入第一个n*m矩阵"<cin>>a;
cout<<"请输入第二个n*m矩阵"<cin>>b;
cout<"<cout<cout<"<cout<
c=a+b;//用重载运算符“+”实现两个矩阵相加
cout<"<c=a-b;//用重载运算符“+”实现两个矩阵相加
cout<"<cout<c=a*b;//用重载运算符“+”实现两个矩阵相加
cout<"<cout<c=a/b;//用重载运算符“+”实现两个矩阵相加
cout<"<cout<return0;
}
Task8-5
/*
5. 实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除
(运算后再化简)、求反、比较(6种关系)的运算。
*/
#include
#include
usingnamespacestd;
intgcd(intm,intn);
classFraction
{
private:
intnume;//分子
intdeno;//分母
public:
Fraction(intnu=0,intde=1);//构造函数,初始化用
voidSet(intnu=0,intde=1);//置值,改变值时用
Fractionoperator+(Fraction&c2);
Fractionoperator-(Fraction&c2);
Fractionoperator*(Fraction&c2);
Fractionoperator/(Fraction&c2);
booloperator>=(Fraction&c2);
Fractionoperator-();
voiddisplay();
voidSimplify();//化简(使分子分母没有公因子)
};
Fraction:
:
Fraction(intnu,intde)
{
if(de!
=0)
{
nume=nu;
deno=de;
}
else
{
cout<<"格式错误,程序退出\n";
exit(0);
}
}
voidFraction:
:
Set(intnu,intde)
{
if(de!
=0)
{
nume=nu;
deno=de;
}
}
voidFraction:
:
display()
{
cout<}
//求分子,分母最大公约数
intgcd(intm,intn)
{
intr;
if(m{
r=m;
m=n;
n=r;
}
while(r=m%n)
{
if(r==0)
break;
m=n;
n=r;
}
returnn;
}
//将分数化简
voidFraction:
:
Simplify()
{
intn=gcd(nume,deno);
nume=nume/n;
deno=deno/n;
cout<}
FractionFraction:
:
operator+(Fraction&c2)
{
Fractionc;
c.deno=deno*c2.deno;
c.nume=nume*c2.deno+c2.nume*deno;
returnc;
}
FractionFraction:
:
operator-(Fraction&c2)
{
Fractionc;
c.deno=deno*c2.deno;
c.nume=nume*c2.deno-c2.nume*deno;
returnc;
}
FractionFraction:
:
operator*(Fraction&c2)
{
Fractionc;
c.deno=deno*c2.deno;
c.nume=nume*c2.nume;
returnc;
}
FractionFraction:
:
operator/(Fraction&c2)
{
Fractionc;
c.deno=deno*c2.nume;
c.nume=nume*c2.deno;
returnc;
}
boolFraction:
:
operator>=(Fraction&c2)
{
nume=nume*c2.nume;
c2.nume=c2.nume*deno;
if(nume>=c2.nume)
returntrue;
else
returnfalse;
}
FractionFraction:
:
operator-()
{
Fractionc;
c.nume=-nume;
c.deno=deno;
returnc;
}
intmain()
{
Fractionc1(1,2),c2(5,8),c;
cout<<"c1=";
c1.display();
cout<<"c2=";
c2.display();
c=c1+c2;
cout<<"