/
haseew
/
Lab_5
Обзор
Документация
Войти
/
haseew
/
Lab_5
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
main.cpp
165 строк
6 KB
Egorchik
Lab_5
20 апр 2026, 16:34
20 апр 2026, 16:34
98016ce
Код
Авторство
О чём код?
/** * кто выполнил: Буров Егор * что делает программа: шаблонный класс многочлена polynomial, работающий с различными типами данных (int, complex, rational). * входные данные: коэффициенты * выходные данные: результаты операций над многочленами */ #include <iostream> #include <vector> #include <cmath> #include <numeric> #include "Polynomial.h" using namespace std; // ============== // класс complex из прошлой лабы // =============== class Complex { private: double re, im; public: Complex(double x = 0.0, double y = 0.0) : re(x), im(y) {} Complex(const Complex &z) : re(z.re), im(z.im) {} Complex& operator=(const Complex &z) { if (this != &z) { re = z.re; im = z.im; } return *this; } double abs() const { return std::sqrt(re * re + im * im); } Complex operator+(const Complex &z) const { return Complex(re + z.re, im + z.im); } Complex operator-(const Complex &z) const { return Complex(re - z.re, im - z.im); } Complex operator*(const Complex &z) const { return Complex(re * z.re - im * z.im, re * z.im + im * z.re); } bool operator==(const Complex &z) const { return re == z.re && im == z.im; } bool operator!=(const Complex &z) const { return !(*this == z); } friend std::ostream& operator<<(std::ostream &os, const Complex &z) { os << "(" << z.re << " + " << z.im << "i)"; return os; } }; // ========== // класс rational из прошлой лабы // ========== class Rational { private: int num, den; void reduce() { int g = std::gcd(num, den); num /= g; den /= g; if (den < 0) { num = -num; den = -den; } } public: Rational(int numerator = 0, int denominator = 1) : num(numerator), den(denominator) { if (den == 0) den = 1; reduce(); } Rational operator+(const Rational &r) const { return Rational(num * r.den + r.num * den, den * r.den); } Rational operator-(const Rational &r) const { return Rational(num * r.den - r.num * den, den * r.den); } Rational operator*(const Rational &r) const { return Rational(num * r.num, den * r.den); } bool operator==(const Rational &r) const { return num == r.num && den == r.den; } bool operator!=(const Rational &r) const { return !(*this == r); } friend std::ostream& operator<<(std::ostream &os, const Rational &r) { if (r.den == 1) os << r.num; else os << r.num << "/" << r.den; return os; } }; // =========== // главная функция для проверки шаблонов // =========== int main() { // ------------------------------- // задание 1 и 2: тестирование с типом int // -------------------------------- cout << "=== PROVERKA 1: Mnogochleny <int> ===" << endl; // создаем p1 = 3x^2 + 2x + 1 (в векторе от младшей степени к старшей 1, 2, 3) Polynomial<int> p1(std::vector<int>{1, 2, 3}); // создаем p2 = 5x + 4 (в векторе: 4, 5) Polynomial<int> p2(std::vector<int>{4, 5}); cout << "Mnogochlen p1 (ot starshej k mladshej): " << p1 << endl; cout << "Mnogochlen p2 (ot starshej k mladshej): " << p2 << endl; cout << "Stepen p1: " << p1.Degree() << endl; // арифметика с целыми числами Polynomial<int> p_sum = p1 + p2; Polynomial<int> p_diff = p1 - p2; Polynomial<int> p_mult = p1 * p2; cout << "Slozhenie (p1 + p2): " << p_sum << endl; cout << "Vychitanie (p1 - p2): " << p_diff << endl; cout << "Umnozhenie (p1 * p2): " << p_mult << endl; // операции со скалярами (int) Polynomial<int> p_skalar = p1 + 10; cout << "Mnogochlen p1 + 10 (skalar): " << p_skalar << endl; // проверка доступа по индексу [] cout << "Koefficient pered x^2 v p1: " << p1[2] << endl; cout << "Koefficient pered x^5 v p1 (netu): " << p1[5] << endl; // вычисление в точке x = 2 по схеме горнера cout << "Znachenie p1 v tochke x=2: " << p1(2) << endl; // проверка равенства cout << "p1 == p2: " << (p1 == p2 ? "Da" : "Net") << endl; cout << "p1 != p2: " << (p1 != p2 ? "Da" : "Net") << endl; // ------------------------- // задание 3: тестирование с типом complex // ------------------------- cout << "\n=== PROVERKA 2: Mnogochleny <Complex> ===" << endl; Complex c1(1.0, 1.0); Complex c2(2.0, 0.0); Complex c3(0.0, 3.0); // многочлен cp1 = c3*x^2 + c2*x + c1 Polynomial<Complex> cp1(std::vector<Complex>{c1, c2, c3}); Polynomial<Complex> cp2(std::vector<Complex>{Complex(1.0, 0.0), Complex(2.0, 2.0)}); cout << "Mnogochlen cp1: " << cp1 << endl; cout << "Mnogochlen cp2: " << cp2 << endl; cout << "Slozhenie (cp1 + cp2): " << (cp1 + cp2) << endl; cout << "Umnozhenie (cp1 * cp2): " << (cp1 * cp2) << endl; // вычисление в точке (в качестве аргумента принимает complex) Complex c_point(2.0, 0.0); cout << "Znachenie cp1 v tochke (2 + 0i): " << cp1(c_point) << endl; // ------------------------------------- // задание 4: тестирование с типом rational // ------------------------------------- cout << "\n=== PROVERKA 3: Mnogochleny <Rational> ===" << endl; Rational r1(1, 2); // дробь 1/2 Rational r2(3, 4); // дробь 3/4 Rational r3(5, 1); // число 5 Polynomial<Rational> rp1(std::vector<Rational>{r1, r2}); // многочлен 3/4*x + 1/2 Polynomial<Rational> rp2(std::vector<Rational>{r3, r1}); // многочлен 1/2*x + 5 cout << "Mnogochlen rp1: " << rp1 << endl; cout << "Mnogochlen rp2: " << rp2 << endl; cout << "Slozhenie (rp1 + rp2): " << (rp1 + rp2) << endl; cout << "Umnozhenie (rp1 * rp2): " << (rp1 * rp2) << endl; // вычисление в точке Rational r_point(2, 1); // точка x = 2 cout << "Znachenie rp1 v tochke x=2: " << rp1(r_point) << endl; return 0; }