Advertisement
Little_hobbit

solution.cpp

Sep 5th, 2020 (edited)
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.01 KB | None | 0 0
  1. /*
  2.  * Южный федеральный университет, ИКТИБ, кафедра МОП ЭВМ
  3.  * Гатауллин Руслан Рустемович
  4.  * Написано 05.09.2020
  5.  */
  6.  
  7. #include "solution.h"
  8. #include <iostream>
  9. #include <cmath>
  10.  
  11. // Конструктор для абстрактного класса
  12. Solution::Solution(float a, float b, unsigned num_corners)
  13.         : _a(a), _b(b), _num_corners(num_corners), _num_real_corners(0)
  14. {
  15.     _corners = _num_corners > 0 ? new double[_num_corners] : nullptr;
  16. }
  17.  
  18. // Виртуальный дестуктор  абстрактного класса
  19. Solution::~Solution()
  20. {
  21.     delete[]_corners;
  22. }
  23.  
  24. // Виртуальный метод вывода решений уравнений
  25. void Solution::display_corners()
  26. {
  27.     try
  28.     {
  29.         this->find_corners();
  30.  
  31.         std::cout << "Корни выражения: ";
  32.         std::cout << "x1 = " << _corners[0];
  33.         for (int i = 1; i < _num_real_corners; ++i)
  34.         {
  35.             std::cout << ", x" << i + 1 << " = " << _corners[i];
  36.         }
  37.         std::cout << std::endl;
  38.     }
  39.     catch (std::exception &ex)
  40.     {
  41.         std::cout << "Корней нет, причина: " << ex.what() << std::endl;
  42.     }
  43. }
  44.  
  45. // Конструктор линейного уравнения
  46. Linear::Linear(float a, float b) : Solution(a, b, 1)
  47. {}
  48.  
  49. // Переписанный метод поиска
  50. void Linear::find_corners()
  51. {
  52.     // При делении на ноль вызываем исключение
  53.     if (_a == 0) throw std::runtime_error("a = 0, деление на ноль");
  54.  
  55.     _num_real_corners = 1;
  56.     *_corners = -_b / _a;
  57. }
  58.  
  59. // Конструкт квадратного уравнения
  60. Square::Square(float a, float b, float c) : Solution(a, b, 2), _c(c)
  61. {}
  62.  
  63. // Процедура поиска решений квадратного уравнения
  64. void Square::find_corners()
  65. {
  66.     if (_a == 0)
  67.     {
  68.         if (_b == 0) throw std::runtime_error("b = 0, деление на 0");
  69.  
  70.         _num_real_corners = 1;
  71.         _corners[0] = -_c / _b;
  72.     }
  73.     else
  74.     {
  75.         double d = _b * _b - 4 * _a * _c;
  76.         if (d >= 0)
  77.         {
  78.             d = sqrt(d);
  79.             _num_real_corners = 2;
  80.             _corners[0] = (-_b + d) / (2 * _a);
  81.             _corners[1] = (-_b - d) / (2 * _a);
  82.         }
  83.         else
  84.             throw std::runtime_error("действительных корней нет");
  85.     }
  86. }
  87.  
  88. // Конструктор серии уравнений
  89. Series::Series()
  90. {
  91.     size_t size;
  92.     std::cout << "Введите количество уравнений в серии: ";
  93.     std::cin >> size;
  94.  
  95.     _size = size;
  96.     if (_size > 0)
  97.     {
  98.         _ser = new Solution *[_size];
  99.         for (int i = 0; i < _size; ++i)
  100.             _ser[i] = nullptr;
  101.     }
  102.     else
  103.     {
  104.         exit(0);
  105.     }
  106. }
  107.  
  108. // Деструктор серий
  109. Series::~Series()
  110. {
  111.     for (int i = 0; i < _size; ++i)
  112.     {
  113.         delete _ser[i];
  114.     }
  115.     delete[]_ser;
  116. }
  117.  
  118. // Ввод уравнений в серию
  119. void Series::input_series()
  120. {
  121.     std::cout << "Ввод серии из " << _size << " уравнений." << std::endl;
  122.     std::cout << "Тип уравнения: линейное - 1, квадратное - 2" << std::endl;
  123.     std::cout << "Линейное уравнение представляется в виде ax+b=0" << std::endl;
  124.     std::cout << "Квадратное уравнение представляется в виде ax^2+bx+c=0" << std::endl;
  125.     for (int i = 0; i < _size; ++i)
  126.     {
  127.         std::cout << std::endl;
  128.         short type = 0;
  129.         float a = 0, b = 0, c = 0;
  130.         std::cout << "Уравнение #" << i + 1 << std::endl;
  131.         std::cout << "Тип: ";
  132.         std::cin >> type;
  133.  
  134.         switch (type)
  135.         {
  136.             case 1:
  137.                 std::cout << "Введите a и b для уравнения: " << std::endl;
  138.                 std::cout << "a = ";
  139.                 std::cin >> a;
  140.                 std::cout << "b = ";
  141.                 std::cin >> b;
  142.                 _ser[i] = new Linear(a, b);
  143.                 break;
  144.             case 2:
  145.                 std::cout << "Введите a, b и c для уравнения: " << std::endl;
  146.                 std::cout << "a = ";
  147.                 std::cin >> a;
  148.                 std::cout << "b = ";
  149.                 std::cin >> b;
  150.                 std::cout << "c = ";
  151.                 std::cin >> c;
  152.                 _ser[i] = new Square(a, b, c);
  153.                 break;
  154.             default:
  155.                 std::cout << "Неверный тип уравнения!" << std::endl;
  156.         }
  157.     }
  158. }
  159.  
  160. // Показ решений серии
  161. void Series::display_solves()
  162. {
  163.     for (int i = 0; i < _size; ++i)
  164.     {
  165.         if (_ser[i] != nullptr)
  166.         {
  167.             std::cout << std::endl << "Уравнение #" << i + 1 << std::endl;
  168.             _ser[i]->display_corners();
  169.         }
  170.     }
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement