#ifndef __Complex_H__ #define __Complex_H__ #include #include using namespace std; class Complex { private: double Real, Imag; public: Complex (double Real=0, double Imag=0) { this->Real = Real; this->Imag = Imag; }; Complex & operator= (const Complex & s) { Real = s.Real; Imag = s.Imag; return *this; }; Complex operator- () const { return Complex(-Real,-Imag); }; Complex & operator= (double co) { Real = co; Imag = 0; return *this; }; Complex operator+ (const Complex& co) const { Complex n; n.Real = this->Real + co.Real; n.Imag = this->Imag + co.Imag; return n; }; Complex & operator-= (Complex co) { Real -= co.Real; Imag -= co.Imag; return *this; }; friend Complex operator- (Complex, Complex); friend ostream & operator << (ostream & s, const Complex & c) { s << "(" << c.Real << "," << c.Imag << ")"; return s; }; Complex operator/ (const Complex co) { return Complex((this->Real*co.Real + this->Imag*co.Imag)/(co.Real*co.Real+co.Imag*co.Imag), (this->Imag*co.Real - this->Real*co.Imag)/(co.Real*co.Real + co.Imag*co.Imag)); }; Complex& operator/=(const Complex co){ Complex n; n.Real = (Real*co.Real + Imag*co.Imag)/(co.Real*co.Real+co.Imag*co.Imag); n.Imag = (Imag*co.Real - Real*co.Imag)/(co.Real*co.Real + co.Imag*co.Imag); Real = n.Real; Imag = n.Imag; return *this; }; double abs(){ return sqrt(this->Real*this->Real+this->Imag*this->Imag); }; double phase(){ if(this->Real > 0){ return atan(1/(this->Imag/this->Real)); } if ( this->Real < 0 ){ return atan(1/(this->Imag/this->Real))+M_PI; } if( this->Imag > 0 ){ return M_PI/2; } return -M_PI/2; }; Complex conj(){ Complex n; n.Real = this->Real; n.Imag = -this->Imag; return n; }; }; inline Complex operator - (Complex s1, Complex s2) { Complex n (s1); return n -= s2; } #endif /* __Complex_H__ */