Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <ccomplex>
- using namespace std;
- const double PI = 3.1415926;
- class Complex
- {
- public:
- // Конструктор по умолчанию
- Complex(){ module = 0; argument = 0; }
- // Конструктор инициализации
- Complex(double _m, double _a){ module = _m; argument = _a; }
- // Конструктор преобразования из стандатртного типа double
- Complex(double x)
- {
- module = sqrt(x*x);
- if (x > 0)
- argument = 0;
- else
- argument = PI;
- }
- // Конструктор преобразования из стандатртного типа complex<double>
- Complex(complex<double> x)
- {
- module = sqrt(real(x) * real(x) + imag(x) * imag(x));
- if (real(x) > 0)
- argument = atan(imag(x) / real(x));
- if ((real(x) < 0) && (imag(x) >= 0))
- argument = PI + atan(imag(x) / real(x));
- if ((real(x) < 0) && (imag(x) < 0))
- argument = -PI + atan(imag(x) / real(x));
- if ((real(x) == 0) && (imag(x) > 0))
- argument = PI / 2;
- if ((real(x) == 0) && (imag(x) < 0))
- argument = -PI / 2;
- }
- // Сеттер аргумента комплексного числа
- void setAgr(double a)
- {
- argument = a;
- }
- // Функция возвращает действительную часть комплексного числа
- double getRE(){
- return module*cos(argument);
- }
- // Функция возвращает мнимую часть комплексного числа
- double getIM(){
- return module*sin(argument);
- }
- // Объявление дружественных функций перегружающих математические операторы
- friend Complex operator +(Complex, Complex);
- friend Complex operator *(Complex, Complex);
- friend Complex sh(Complex);
- // Объявление дружественной функции перегружающей потоковый оператор вывода
- friend ostream& operator<<(ostream&, const Complex&);
- // Объявление дружественной функции перегружающей потоковый оператор ввода
- friend istream& operator>>(istream&, Complex&);
- private:
- // Модуль комплексного числа
- double module;
- // Аргумент комплексного числа
- double argument;
- };
- // Перегрузка оператора сложения комплексных чисел
- Complex operator +(Complex obj1, Complex obj2)
- {
- double re = obj1.getRE() + obj2.getRE();
- double im = obj1.getIM() + obj2.getIM();
- complex<double> c(re, im);
- Complex temp(c);
- return temp;
- }
- // Перегрузка оператора умножения комплексных чисел
- Complex operator *(Complex obj1, Complex obj2)
- {
- double re = obj1.getRE() * obj2.getRE() - obj1.getIM() * obj2.getIM();
- double im = obj1.getRE() * obj2.getIM() + obj1.getIM() * obj2.getRE();
- complex<double> c(re, im);
- Complex temp(c);
- return temp;
- }
- // Перегрузка оператора гиперболического синуса комплексных чисел
- Complex sh(Complex obj)
- {
- double re = sinh(obj.getRE()) * cos(obj.getIM());
- double im = cosh(obj.getRE()) * sin(obj.getIM());
- complex<double> c(re, im);
- Complex temp(c);
- return temp;
- }
- // Перегрузка потокового оператора вывода <<
- // Комплексное число будет выводиться в виде "(модуль;аргумент)"
- ostream& operator<<(ostream& os, const Complex& obj)
- {
- os << "(" << obj.module << ";" << obj.argument << ")";
- return os;
- }
- // Перегрузка потокового оператора ввода >>
- // Ввод осщуествялется как поочередный ввод модуля комплексного числа, затем его аргумента
- istream& operator>>(istream& is, Complex& obj)
- {
- is >> obj.module >> obj.argument;
- return is;
- }
- // y(z) = i + z*sh(1+z)
- Complex func(Complex obj)
- {
- Complex i(1, PI/2);
- return i + obj * sh(1 + obj);
- }
- // y(z) = i + z*sh(1+z)
- complex<double> func(complex<double> obj)
- {
- complex<double> i(0,1);
- return i + obj * sinh((1.0 + obj));
- }
- // Функция вывода таблицы значений функции при изменении аргумента от 0 до 2PI
- void table()
- {
- Complex z1(1, 0);
- Complex ans;
- complex<double> ans_c;
- cout << "\n| Complex | complex(standart) |";
- for (int i = 0; i < 9; i++)
- {
- z1.setAgr(i*PI / 4);
- complex<double> z(z1.getRE(), z1.getIM());
- ans = func(z1);
- ans_c = func(z);
- cout << "\n " << ans << " | (" << abs(ans_c) << "," << arg(ans_c) << ")";
- }
- }
- // Функция сравнения результатов вычмсления значения функции от Complex числа и complex<>double
- void compare()
- {
- Complex z;
- cout << "\n Введите модуль и аргумент комплесного числа: ";
- cin >> z;
- Complex ans = func(z);
- complex<double> z1(z.getRE(), z.getIM());
- complex<double> ans_c = func(z1);
- if ((real(ans_c) - ans.getRE() < 0.0001) && (imag(ans_c) - ans.getIM() < 0.0001))
- cout << "\n Результаты совпадают!";
- else
- cout << "\n Результаты не совпадают!";
- cout << "\nf(z) = " << ans << " f(z1) = (" << abs(ans_c) << "," << arg(ans_c) << ")";
- }
- void main()
- {
- setlocale(LC_ALL, "Russian");
- table();
- compare();
- cout << endl;
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement