Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Южный федеральный университет, ИКТИБ, кафедра МОП ЭВМ
- * Гатауллин Руслан Рустемович
- * Написано 05.09.2020
- */
- #include "solution.h"
- #include <iostream>
- #include <cmath>
- // Конструктор для абстрактного класса
- Solution::Solution(float a, float b, unsigned num_corners)
- : _a(a), _b(b), _num_corners(num_corners), _num_real_corners(0)
- {
- _corners = _num_corners > 0 ? new double[_num_corners] : nullptr;
- }
- // Виртуальный дестуктор абстрактного класса
- Solution::~Solution()
- {
- delete[]_corners;
- }
- // Виртуальный метод вывода решений уравнений
- void Solution::display_corners()
- {
- try
- {
- this->find_corners();
- std::cout << "Корни выражения: ";
- std::cout << "x1 = " << _corners[0];
- for (int i = 1; i < _num_real_corners; ++i)
- {
- std::cout << ", x" << i + 1 << " = " << _corners[i];
- }
- std::cout << std::endl;
- }
- catch (std::exception &ex)
- {
- std::cout << "Корней нет, причина: " << ex.what() << std::endl;
- }
- }
- // Конструктор линейного уравнения
- Linear::Linear(float a, float b) : Solution(a, b, 1)
- {}
- // Переписанный метод поиска
- void Linear::find_corners()
- {
- // При делении на ноль вызываем исключение
- if (_a == 0) throw std::runtime_error("a = 0, деление на ноль");
- _num_real_corners = 1;
- *_corners = -_b / _a;
- }
- // Конструкт квадратного уравнения
- Square::Square(float a, float b, float c) : Solution(a, b, 2), _c(c)
- {}
- // Процедура поиска решений квадратного уравнения
- void Square::find_corners()
- {
- if (_a == 0)
- {
- if (_b == 0) throw std::runtime_error("b = 0, деление на 0");
- _num_real_corners = 1;
- _corners[0] = -_c / _b;
- }
- else
- {
- double d = _b * _b - 4 * _a * _c;
- if (d >= 0)
- {
- d = sqrt(d);
- _num_real_corners = 2;
- _corners[0] = (-_b + d) / (2 * _a);
- _corners[1] = (-_b - d) / (2 * _a);
- }
- else
- throw std::runtime_error("действительных корней нет");
- }
- }
- // Конструктор серии уравнений
- Series::Series()
- {
- size_t size;
- std::cout << "Введите количество уравнений в серии: ";
- std::cin >> size;
- _size = size;
- if (_size > 0)
- {
- _ser = new Solution *[_size];
- for (int i = 0; i < _size; ++i)
- _ser[i] = nullptr;
- }
- else
- {
- exit(0);
- }
- }
- // Деструктор серий
- Series::~Series()
- {
- for (int i = 0; i < _size; ++i)
- {
- delete _ser[i];
- }
- delete[]_ser;
- }
- // Ввод уравнений в серию
- void Series::input_series()
- {
- std::cout << "Ввод серии из " << _size << " уравнений." << std::endl;
- std::cout << "Тип уравнения: линейное - 1, квадратное - 2" << std::endl;
- std::cout << "Линейное уравнение представляется в виде ax+b=0" << std::endl;
- std::cout << "Квадратное уравнение представляется в виде ax^2+bx+c=0" << std::endl;
- for (int i = 0; i < _size; ++i)
- {
- std::cout << std::endl;
- short type = 0;
- float a = 0, b = 0, c = 0;
- std::cout << "Уравнение #" << i + 1 << std::endl;
- std::cout << "Тип: ";
- std::cin >> type;
- switch (type)
- {
- case 1:
- std::cout << "Введите a и b для уравнения: " << std::endl;
- std::cout << "a = ";
- std::cin >> a;
- std::cout << "b = ";
- std::cin >> b;
- _ser[i] = new Linear(a, b);
- break;
- case 2:
- std::cout << "Введите a, b и c для уравнения: " << std::endl;
- std::cout << "a = ";
- std::cin >> a;
- std::cout << "b = ";
- std::cin >> b;
- std::cout << "c = ";
- std::cin >> c;
- _ser[i] = new Square(a, b, c);
- break;
- default:
- std::cout << "Неверный тип уравнения!" << std::endl;
- }
- }
- }
- // Показ решений серии
- void Series::display_solves()
- {
- for (int i = 0; i < _size; ++i)
- {
- if (_ser[i] != nullptr)
- {
- std::cout << std::endl << "Уравнение #" << i + 1 << std::endl;
- _ser[i]->display_corners();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement