/*---------------------------------------
2011.8.28
实现一个用于表示复数的类,复数全部用
a+bi的形式表示,不存在a-bi(表示成
a+(-b)i的形式)这种形式
---------------------------------------*/
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
class Complex
{
public:
Complex(double x=0,double y=0)
:real_part(x),imaginary_part(y)
{
}
double get_rpart() const
{
return real_part;
}
double get_impart() const
{
return imaginary_part;
}
void set_num(double x,double y)
{
real_part=x;
imaginary_part=y;
}
Complex& operator+=(const Complex& );
Complex& operator-=(const Complex& );
Complex& operator*=(const Complex& );
Complex& operator/=(const Complex& );
~Complex()
{
}
private:
double real_part,imaginary_part;
};
//--------------------------------------------------------------------------------------------------------------
//重载操作符'+='
inline Complex& Complex::operator +=(const Complex& c)
{
real_part+=c.real_part;
imaginary_part+=c.imaginary_part;
return *this;
}
//--------------------------------------------------------------------------------------------------------------
//重载操作符'+'
inline Complex& operator+(const Complex& c1,Complex& c2)
{
Complex c(c1); //将左操作数赋给到我们要返回的局部对象
c+=c2;
return c;
}
//--------------------------------------------------------------------------------------------------------------
//重载操作符'-='
inline Complex& Complex:: operator-=(const Complex& c)
{
real_part-=c.real_part;
imaginary_part-=c.imaginary_part ;
return *this;
}
//--------------------------------------------------------------------------------------------------------------
//重载操作符'-'
inline Complex& operator-(const Complex& c1,const Complex& c2)
{
Complex c(c1);
c-=c2;
return c;
}
//--------------------------------------------------------------------------------------------------------------
//重载操作符'*='
inline Complex& Complex:: operator*=(const Complex& c)
{
double real_p=real_part;
double ima_p=imaginary_part;
real_part=real_p*c.real_part -ima_p*c.imaginary_part ;
imaginary_part=real_p*c.imaginary_part +ima_p*c.real_part;
return *this;
}
//--------------------------------------------------------------------------------------------------------------
//重载操作符'*'
inline Complex& operator*(const Complex& c1,const Complex& c2)
{
Complex c(c1);
c*=c2;
return c;
}
//--------------------------------------------------------------------------------------------------------------
//重载操作符'/='
Complex& Complex::operator /=(const Complex& c)
{
double real_p=real_part;
double ima_p=imaginary_part;
double deno=c.real_part*c.real_part +c.imaginary_part*c.imaginary_part;//分母
double real_num=real_p*c.real_part +ima_p*c.imaginary_part;//实部分子
double ima_num=ima_p*c.real_part-real_p*c.imaginary_part ;//虚部分子
real_part=real_num/deno;
imaginary_part=ima_num/deno;
return *this;
}
//--------------------------------------------------------------------------------------------------------------
//重载操作符'/'
inline Complex& operator/(const Complex& c1,const Complex& c2)
{
Complex c(c1);
c/=c2;
return c;
}
//--------------------------------------------------------------------------------------------------------------
//重载操作符'<<'
ostream& operator<<(ostream& os,const Complex& c)
{
if(c.get_impart()<0)
{
os<<c.get_rpart()<<'+'<<'('<<c.get_impart ()<<')'<<'i';
os<<endl;
}
else
{
os<<c.get_rpart()<<'+'<<c.get_impart ()<<'i';
os<<endl;
}
return os;
}
//--------------------------------------------------------------------------------------------------------------
//重载操作符'>>'
istream& operator>>(istream& is,Complex& c)
{
double x,y;
char c1,c2;
is>>x>>c1>>y>>c2; //输入时别忘了各个变量之间加空格
if(!is) return is;
if(c1!='+'||c2!='i')
{
is.clear (ios_base::failbit);
return is;
}
c.set_num (x,y);
return is;
}
//--------------------------------------------------------------------------------------------------------------
int main()
{
Complex c1(12,1);
Complex c2(1,3);
Complex c3=c1+c2;
Complex c4=c1-c2;
Complex c5=c1*c2;
Complex c6=c1/c2;
cout<<"c1+c2="<<c3<<'\n';
cout<<"c1-c2="<<c4<<'\n';
cout<<"c1*c2="<<c5<<'\n';
cout<<"c1/c2="<<c6<<'\n';
Complex c7;
cin>>c7;
cout<<"c7="<<c7<<endl;
}