#include <valarray>
#include <ios>
#include <iostream>
using namespace std;
class complex
{
public:
// Конструктор
complex(double re=0, double im=0);
// Оператор ()
complex& operator()(double re=0, double im=0);
complex& operator()(const complex& val);
// Оператор "равно"
bool operator==(const complex& val) const;
// Оператор "не равно"
bool operator!=(const complex& val) const;
// Возвращает действительную часть
double re(void) const;
static double re(const complex& val);
// Возвращает мнимую часть
double im(void) const;
static double im(const complex& val);
// Выделение модуля
double abs(void) const;
static double abs(const complex& val);
// Аргумент
double arg(void) const;
static double arg(const complex& val);
// Оператор сложения
friend complex operator+(const complex& val1,const complex& val2);
complex& operator+=(const complex& val);
// Оператор вычитания
friend complex operator-(const complex& val1,const complex& val2);
complex& operator-=(const complex& val);
// Оператор умножения
friend complex operator*(const complex& val1,const complex& val2);
complex& operator*=(const complex& val);
// Опрератор деления
friend complex operator/(const complex& val1,const complex& val2);
complex& operator/=(const complex& val);
// Возведение в степень
friend complex pow(const complex& val,double deg);
// Извлечение квадратного корня
friend complex sqrt(const complex& val);
// Операторы ввода/вывода
friend ostream& operator<<(ostream& stream,const complex& val);
friend istream& operator>>(istream& stream,complex& val);
private:
double _re;
double _im;
};
int main()
{
complex A(10,-5),B(-5,10),C;
cout<<"A="<<A<<endl;
cout<<"B="<<B<<endl;
cout<<"C(A)="<<C(A)<<endl;
cout<<"(A==C)="<<boolalpha<<(A==C)<<endl;
cout<<"(A!=C)="<<boolalpha<<(A!=C)<<endl;
cout<<"C(3,-3)="<<C(3,-3)<<endl;
cout<<"re(A)="<<A.re()<<endl;
cout<<"im(A)="<<A.im()<<endl;
cout<<"(A==B)="<<boolalpha<<(A==B)<<endl;
cout<<"(A!=B)="<<boolalpha<<(A!=B)<<endl;
cout<<"A+B="<<A+B<<endl;
cout<<"10+A="<<10+A<<endl;
cout<<"A-B="<<A-B<<endl;
cout<<"10-A="<<10-A<<endl;
cout<<"A*B="<<A*B<<endl;
cout<<"10*A="<<10*A<<endl;
cout<<"A/B="<<A/B<<endl;
cout<<"10/A="<<10/A<<endl;
cout<<"abs(A)="<<A.abs()<<endl;
cout<<"arg(A)="<<A.arg()<<endl;
cout<<"A^2="<<pow(A,2)<<endl;
cout<<"C=sqrt(B)="<<(C=sqrt(B))<<endl;
cout<<"C*C="<<C*C<<endl;
cout<<"pow(C,2)="<<pow(C,2)<<endl;
system("PAUSE");
return 0;
}
// Конструктор
complex::complex(double re, double im)
: _re(re)
, _im(im)
{
}
complex& complex::operator()(double re, double im)
{
_re=re;
_im=im;
return *this;
}
complex& complex::operator ()(const complex& val)
{
_re=val._re;
_im=val._im;
return *this;
}
ostream& operator<<(ostream& stream,const complex& val)
{
if(val._re||!val._im)stream<<val._re;
if(val._im)
{
ios_base::fmtflags flags=stream.flags();
if(val._re)stream.setf(ios::showpos);
stream<<val._im<<'i';
stream.flags(flags);
}
return stream;
};
istream& operator>>(istream& stream,complex& val)
{
double re,im;
stream>>re>>im;
if(stream.good())
{
val._re=re;
val._im=im;
}
return stream;
};
inline bool complex::operator==(const complex& val) const
{
return (_re==val._re)&&(_im==val._im);
}
inline bool complex::operator!=(const complex& val) const
{
return (_re!=val._re)||(_im!=val._im);
}
// Возвращает действительную часть
inline double complex::re(void) const
{
return _re;
}
inline double complex::re(const complex& val)
{
return val._re;
}
// Возвращает мнимую часть
inline double complex::im(void) const
{
return _im;
}
inline double complex::im(const complex& val)
{
return val._im;
}
// Оператор сложения
inline complex operator+(const complex& val1,const complex& val2)
{
return complex(val1._re+val2._re,val1._im+val2._im);
}
inline complex& complex::operator+=(const complex& val)
{
_re+=val._re;
_im+=val._im;
return *this;
}
// Оператор вычитания
inline complex operator-(const complex& val1,const complex& val2)
{
return complex(val1._re-val2._re,val1._im-val2._im);
}
complex& complex::operator-=(const complex& val)
{
_re-=val._re;
_im-=val._im;
return *this;
}
// Оператор умножения
complex operator*(const complex& val1,const complex& val2)
{
return complex(val1._re*val2._re-val1._im*val2._im,val1._re*val2._im+val1._im*val2._re);
}
complex& complex::operator*=(const complex& val)
{
_re=_re*val._re-_im*val._im;
_im=_re*val._im+_im*val._re;
return *this;
}
// Опрератор деления
complex operator/(const complex& val1,const complex& val2)
{
double div=val2._re*val2._re+val2._im*val2._im;
return complex((val1._re*val2._re+val1._im*val2._im)/div,(val1._im*val2._re-val1._re*val2._im)/div);
}
complex& complex::operator/=(const complex& val)
{
double div=val._re*val._re+val._im*val._im;
_re=(_re*val._re+_im*val._im)/div;
_im=(_im*val._re-_re*val._im)/div;
return *this;
}
// Выделение модуля
inline double complex::abs(void) const
{
return std::sqrt(_re*_re+_im*_im);
}
inline double complex::abs(const complex& val)
{
return std::sqrt(val._re*val._re+val._im*val._im);
}
// Аргумент
inline double complex::arg(void) const
{
return acos(_re/abs());
}
inline double complex::arg(const complex& val)
{
return acos(val._re/val.abs());
}
complex pow(const complex& val,double deg)
{
double r=std::pow(val.abs(),deg),a=val.arg()*deg;
return complex(r*cos(a),r*sin(a));
}
complex sqrt(const complex& val)
{
double r=std::sqrt(val.abs()),a=val.arg()/2;
return complex(r*cos(a),r*sin(a));
}
A=10-5i
B=-5+10i
C(A)=10-5i
(A==C)=true
(A!=C)=false
C(3,-3)=3-3i
re(A)=10
im(A)=-5
(A==B)=false
(A!=B)=true
A+B=5+5i
10+A=20-5i
A-B=15-15i
10-A=5i
A*B=125i
10*A=100-50i
A/B=-0.8-0.6i
10/A=0.8+0.4i
abs(A)=11.1803
arg(A)=0.463648
A^2=75+100i
C=sqrt(B)=1.75789+2.84432i
C*C=-5+10i
pow(C,2)=-5+10i
1>------ Rebuild All started: Project: 159929, Configuration: Debug Win32 ------
1>Deleting intermediate and output files for project '159929', configuration 'Debug|Win32'
1>Compiling...
1>159929.cpp
1>Compiling manifest to resources...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
1>Copyright (C) Microsoft Corporation. All rights reserved.
1>Linking...
1>LINK : E:\Visual Studio 2008\Projects\RusFAQ\Debug\159929.exe not found or not built by the last incremental link; performing full link
1>Embedding manifest...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
1>Copyright (C) Microsoft Corporation. All rights reserved.
1>Build log was saved at "file://e:\Visual Studio 2008\Projects\RusFAQ\159929\Debug\BuildLog.htm"
1>159929 - 0 error(s), 0 warning(s)
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.