Добавил:
okley
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:3 семестр / sr25
.cpp#include <iostream>
#include <math.h>
#include <tgmath.h>
// возвести компл. число в натуральную степень,взять корень, найти все корни, возвести экспоненту в компл. степень
using namespace std;
class Complex {
double Re, Im, Mod, Arg;
public:
Complex(double ReVal, double ImVal){ // конструктор для создания объектов
Re=ReVal;
Im=ImVal;
Mod=sqrt(ReVal*ReVal+ImVal*ImVal);
Arg=atan2(ImVal, ReVal);
}
Complex(){ // конструктор по умолчанию
Re=0.0;
Im=0.0;
Mod=0.0;
Arg=0.0;
}
double cRe() { return(Re); }
double cIm() { return(Im); }
double cMod() { return(Mod); }
double cArg() { return(Arg); }
Complex operator+(Complex c){ // сложение комплексных чисел
Complex a(Re+c.cRe(), Im+c.cIm());
return(a);
}
Complex operator-(Complex c){ // разность
Complex a(Re-c.cRe(), Im-c.cIm());
return(a);
}
Complex operator*(Complex c){ // произведение
Complex a(Re*c.cRe()-Im*c.cIm(), Im*c.cRe() + Re*c.cIm());
return(a);
}
Complex operator/(Complex c){ // деление
if((c.cRe()==0)&&(c.cIm()==0)){ // проверка на деление на ноль
cout << "\Error!\n";
Complex a(0.0, 0.0);
return a;
}
Complex a((Re*c.cRe() + Im*c.cIm())/(c.cMod()*c.cMod()), (Im*c.cRe() - c.cIm()*Re)/(c.cMod()*c.cMod()));
return(a);
}
Complex Sopr(Complex c){ // сопряженное
Complex a(c.cRe(), -c.cIm());
return a;
}
Complex Obr(Complex c){ // обратить знаки
Complex a(-c.cRe(), -c.cIm());
return a;
}
Complex cPower(int n){ // возвести в целую степень
double newArg=Arg*n;
double newMod=pow(Mod, n);
Complex a(newMod*cos(newArg), newMod*sin(newArg));
return(a);
}
Complex cExp(){ // возвести экспоненту в компл. степень
double newArg=Im;
double newMod=pow(2.71828, Re);
Complex a(newMod*cos(newArg), newMod*sin(newArg));
return(a);
}
Complex cRoot(int n, Complex *p){ // взять корень от компл. числа
if(n==0){
cout << "\Error!\n";
Complex a(0.0, 0.0);
return a;
}
double newArg=Arg/n;
double newMod=pow(Mod, 1/double(n));
for(int i=0; i<n; i++){
p[i]=Complex(newMod*cos(newArg+2*3.14159*i/n), newMod*sin(newArg+2*3.14159*i/n));
}
}
void cOutput(){ // вывод
cout << Re;
if (Im<0) cout << Im << "i";
else cout << "+" << Im << "i";
cout << "\t Module = " << Mod << " Angle = " << Arg << "\n";
}
void cInput1(){ // ввод декартовый
cout << "Input real part:\n";
cin >> Re;
cout << "Input imaginary part:\n";
cin >> Im;
Mod=sqrt(Re*Re+Im*Im);
Arg=atan2(Im, Re);
}
void cInput2(){ // ввод полярный
cout << "Input module:\n";
cin >> Mod;
cout << "Input angle:\n";
cin >> Arg;
Re = Mod*cos(Arg);
Im = Mod*sin(Arg);
}
};
int main() {
Complex c(1.2, 1.5), d(25.3, -12.1);
int N=0;
cout.precision(3);
c.cInput1();
d.cInput1();
c.cOutput();
d.cOutput();
cout << "c + d = ";
(c+d).cOutput();
cout << "c - d = ";
(c-d).cOutput();
cout << "c * d = ";
(c*d).cOutput();
cout << "c / d = ";
(c/d).cOutput();
cin >> N;
Complex *roots=new Complex[N];
cout << "c ^ n = ";
c.cPower(N).cOutput();
cout << "e ^ c = ";
c.cExp().cOutput();
c.cRoot(N, roots);
cout << "Korni: \n";
for(int i=0; i<N; i++){
cout << "i-root(c) = ";
roots[i].cOutput();
}
}
