Advertisement
includelow

LABA2\\4VAR.

Mar 8th, 2017
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.52 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <ccomplex>
  4.  
  5. using namespace std;
  6.  
  7. const double PI = 3.1415926;
  8.  
  9. class Complex
  10. {
  11. public:
  12.     // Конструктор по умолчанию
  13.     Complex(){ module = 0; argument = 0; }
  14.     // Конструктор инициализации
  15.     Complex(double _m, double _a){ module = _m; argument = _a; }
  16.     // Конструктор преобразования из стандатртного типа double
  17.     Complex(double x)
  18.     {
  19.         module = sqrt(x*x);
  20.         if (x > 0)
  21.             argument = 0;
  22.         else
  23.             argument = PI;
  24.     }
  25.     // Конструктор преобразования из стандатртного типа complex<double>
  26.     Complex(complex<double> x)
  27.     {
  28.         module = sqrt(real(x) * real(x) + imag(x) * imag(x));
  29.         if (real(x) > 0)
  30.             argument = atan(imag(x) / real(x));
  31.         if ((real(x) < 0) && (imag(x) >= 0))
  32.             argument = PI + atan(imag(x) / real(x));
  33.         if ((real(x) < 0) && (imag(x) < 0))
  34.             argument = -PI + atan(imag(x) / real(x));
  35.         if ((real(x) == 0) && (imag(x) > 0))
  36.             argument = PI / 2;
  37.         if ((real(x) == 0) && (imag(x) < 0))
  38.             argument = -PI / 2;
  39.     }
  40.     // Сеттер аргумента комплексного числа
  41.     void setAgr(double a)
  42.     {
  43.         argument = a;
  44.     }
  45.     // Функция возвращает действительную часть комплексного числа
  46.     double getRE(){
  47.         return module*cos(argument);
  48.     }
  49.     // Функция возвращает мнимую часть комплексного числа
  50.     double getIM(){
  51.         return module*sin(argument);
  52.     }
  53.     // Объявление дружественных функций перегружающих математические операторы
  54.     friend Complex operator +(Complex, Complex);
  55.     friend Complex operator *(Complex, Complex);
  56.     friend Complex sh(Complex);
  57.     // Объявление дружественной функции перегружающей потоковый оператор вывода
  58.     friend ostream& operator<<(ostream&, const Complex&);
  59.     // Объявление дружественной функции перегружающей потоковый оператор ввода
  60.     friend istream& operator>>(istream&, Complex&);
  61.  
  62. private:
  63.     // Модуль комплексного числа
  64.     double module;
  65.     // Аргумент комплексного числа
  66.     double argument;
  67. };
  68. // Перегрузка оператора сложения комплексных чисел
  69. Complex operator +(Complex obj1, Complex obj2)
  70. {
  71.     double re = obj1.getRE() + obj2.getRE();
  72.     double im = obj1.getIM() + obj2.getIM();
  73.     complex<double> c(re, im);
  74.     Complex temp(c);
  75.     return temp;
  76. }
  77. // Перегрузка оператора умножения комплексных чисел
  78. Complex operator *(Complex obj1, Complex obj2)
  79. {
  80.     double re = obj1.getRE() * obj2.getRE() - obj1.getIM() * obj2.getIM();
  81.     double im = obj1.getRE() * obj2.getIM() + obj1.getIM() * obj2.getRE();
  82.     complex<double> c(re, im);
  83.     Complex temp(c);
  84.     return temp;
  85. }
  86. // Перегрузка оператора гиперболического синуса комплексных чисел
  87. Complex sh(Complex obj)
  88. {
  89.     double re = sinh(obj.getRE()) * cos(obj.getIM());
  90.     double im = cosh(obj.getRE()) * sin(obj.getIM());
  91.     complex<double> c(re, im);
  92.     Complex temp(c);
  93.     return temp;
  94. }
  95. // Перегрузка потокового оператора вывода <<
  96. // Комплексное число будет выводиться в виде "(модуль;аргумент)"
  97. ostream& operator<<(ostream& os, const Complex& obj)
  98. {
  99.     os << "(" << obj.module << ";" << obj.argument << ")";
  100.     return os;
  101. }
  102.  
  103. // Перегрузка потокового оператора ввода >>
  104. // Ввод осщуествялется как поочередный ввод модуля комплексного числа, затем его аргумента
  105. istream& operator>>(istream& is, Complex& obj)
  106. {
  107.     is >> obj.module >> obj.argument;
  108.     return is;
  109. }
  110. // y(z) = i + z*sh(1+z)
  111. Complex func(Complex obj)
  112. {
  113.     Complex i(1, PI/2);
  114.     return i + obj * sh(1 + obj);
  115. }
  116. // y(z) = i + z*sh(1+z)
  117. complex<double> func(complex<double> obj)
  118. {
  119.     complex<double> i(0,1);
  120.     return i + obj * sinh((1.0 + obj));
  121. }
  122. // Функция вывода таблицы значений функции при изменении аргумента от 0 до 2PI
  123. void table()
  124. {
  125.     Complex z1(1, 0);
  126.     Complex ans;
  127.     complex<double> ans_c;
  128.     cout << "\n|    Complex       |    complex(standart)   |";
  129.     for (int i = 0; i < 9; i++)
  130.     {
  131.         z1.setAgr(i*PI / 4);
  132.         complex<double> z(z1.getRE(), z1.getIM());
  133.         ans = func(z1);
  134.         ans_c = func(z);
  135.         cout << "\n " << ans << " | (" << abs(ans_c) << "," << arg(ans_c) << ")";
  136.     }
  137. }
  138. // Функция сравнения результатов вычмсления значения функции от Complex числа и complex<>double
  139. void compare()
  140. {
  141.     Complex z;
  142.     cout << "\n Введите модуль и аргумент комплесного числа: ";
  143.     cin >> z;
  144.     Complex ans = func(z);
  145.     complex<double> z1(z.getRE(), z.getIM());
  146.     complex<double> ans_c = func(z1);
  147.     if ((real(ans_c) - ans.getRE() < 0.0001) && (imag(ans_c) - ans.getIM() < 0.0001))
  148.         cout << "\n Результаты совпадают!";
  149.     else
  150.         cout << "\n Результаты не совпадают!";
  151.     cout << "\nf(z) = " << ans << " f(z1) = (" << abs(ans_c) << "," << arg(ans_c) << ")";
  152. }
  153.  
  154. void main()
  155. {
  156.     setlocale(LC_ALL, "Russian");
  157.     table();
  158.     compare();
  159.     cout << endl;
  160.     system("pause");
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement