Добавил:
Рад, если кому-то помог Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
01.11.2025
Размер:
6.84 Кб
Скачать
#include <iostream>
#include <vector>
#include <cmath>
#include <windows.h>
using namespace std;

class Polynomial {
private:
    vector<double> coefficients; // coefficients[i] - коэффициент при x^i
    
    void normalize() {
        while (!coefficients.empty() && coefficients.back() == 0) {
            coefficients.pop_back();
        }
        if (coefficients.empty()) coefficients.push_back(0);
    }
    
public:
    Polynomial(const vector<double>& coeffs = {0}) : coefficients(coeffs) {
        normalize();
    }
    
    // Сложение полиномов
    Polynomial operator+(const Polynomial& other) const {
        int maxSize = max(coefficients.size(), other.coefficients.size());
        vector<double> result(maxSize, 0);
        
        for (int i = 0; i < coefficients.size(); i++) result[i] += coefficients[i];
        for (int i = 0; i < other.coefficients.size(); i++) result[i] += other.coefficients[i];
        
        return Polynomial(result);
    }
    
    // Вычитание полиномов
    Polynomial operator-(const Polynomial& other) const {
        int maxSize = max(coefficients.size(), other.coefficients.size());
        vector<double> result(maxSize, 0);
        
        for (int i = 0; i < coefficients.size(); i++) result[i] += coefficients[i];
        for (int i = 0; i < other.coefficients.size(); i++) result[i] -= other.coefficients[i];
        
        return Polynomial(result);
    }
    
    // Умножение полиномов
    Polynomial operator*(const Polynomial& other) const {
        vector<double> result(coefficients.size() + other.coefficients.size() - 1, 0);
        
        for (int i = 0; i < coefficients.size(); i++) {
            for (int j = 0; j < other.coefficients.size(); j++) {
                result[i + j] += coefficients[i] * other.coefficients[j];
            }
        }
        
        return Polynomial(result);
    }
    
    // Деление полиномов (простое деление на полином-константу)
    Polynomial operator/(const Polynomial& other) const {
        if (other.coefficients.size() != 1 || other.coefficients[0] == 0) {
            throw invalid_argument("Деление только на ненулевую константу");
        }
        
        vector<double> result = coefficients;
        double divisor = other.coefficients[0];
        
        for (int i = 0; i < result.size(); i++) {
            result[i] /= divisor;
        }
        
        return Polynomial(result);
    }
    
    // Умножение на число (&)
    Polynomial operator&(double scalar) const {
        vector<double> result = coefficients;
        for (int i = 0; i < result.size(); i++) {
            result[i] *= scalar;
        }
        return Polynomial(result);
    }
    
    friend Polynomial operator&(double scalar, const Polynomial& p);
    
    // Вычисление значения в точке X (())
    double operator()(double x) const {
        double result = 0;
        double power = 1;
        
        for (int i = 0; i < coefficients.size(); i++) {
            result += coefficients[i] * power;
            power *= x;
        }
        
        return result;
    }
    
    // Дифференцирование (~)
    Polynomial operator~() const {
        if (coefficients.size() <= 1) return Polynomial({0});
        
        vector<double> result(coefficients.size() - 1);
        for (int i = 1; i < coefficients.size(); i++) {
            result[i - 1] = coefficients[i] * i;
        }
        
        return Polynomial(result);
    }
    
    // Интегрирование (!)
    Polynomial operator!() const {
        vector<double> result(coefficients.size() + 1);
        result[0] = 0; // константа интегрирования
        
        for (int i = 0; i < coefficients.size(); i++) {
            result[i + 1] = coefficients[i] / (i + 1);
        }
        
        return Polynomial(result);
    }
    
    void print() const {
        bool first = true;
        for (int i = coefficients.size() - 1; i >= 0; i--) {
            if (coefficients[i] != 0) {
                if (!first && coefficients[i] > 0) cout << " + ";
                if (coefficients[i] < 0) cout << " - ";
                
                if (i == 0 || abs(coefficients[i]) != 1) {
                    if (!first) cout << abs(coefficients[i]);
                    else cout << coefficients[i];
                }
                
                if (i > 0) {
                    if (abs(coefficients[i]) != 1 || first) cout << abs(coefficients[i]);
                    cout << "x";
                    if (i > 1) cout << "^" << i;
                }
                first = false;
            }
        }
        if (first) cout << "0";
        cout << endl;
    }
    
    friend ostream& operator<<(ostream& os, const Polynomial& p);
};

Polynomial operator&(double scalar, const Polynomial& p) {
    return p & scalar;
}

ostream& operator<<(ostream& os, const Polynomial& p) {
    bool first = true;
    for (int i = p.coefficients.size() - 1; i >= 0; i--) {
        if (p.coefficients[i] != 0) {
            if (!first && p.coefficients[i] > 0) os << " + ";
            if (p.coefficients[i] < 0) os << " - ";
            
            if (i == 0 || abs(p.coefficients[i]) != 1) {
                if (!first) os << abs(p.coefficients[i]);
                else os << p.coefficients[i];
            }
            
            if (i > 0) {
                if (abs(p.coefficients[i]) != 1 || first) os << abs(p.coefficients[i]);
                os << "x";
                if (i > 1) os << "^" << i;
            }
            first = false;
        }
    }
    if (first) os << "0";
    return os;
}

int main() {
    SetConsoleOutputCP(65001);
    
    cout << "=== Задача 3.8 - Полином ===" << endl;
    
    Polynomial p1({1, 2, 3});  // 3x^2 + 2x + 1
    Polynomial p2({0, 1, 1});  // x^2 + x
    
    cout << "p1 = " << p1 << endl;
    cout << "p2 = " << p2 << endl;
    
    Polynomial sum = p1 + p2;
    cout << "p1 + p2 = " << sum << endl;
    
    Polynomial product = p1 * p2;
    cout << "p1 * p2 = " << product << endl;
    
    Polynomial scaled = p1 & 2.5;
    cout << "p1 & 2.5 = " << scaled << endl;
    
    double value = p1(2);
    cout << "p1(2) = " << value << endl;
    
    Polynomial derivative = ~p1;
    cout << "~p1 (производная) = " << derivative << endl;
    
    Polynomial integral = !p1;
    cout << "!p1 (интеграл) = " << integral << endl;
    
    return 0;
}
Соседние файлы в папке Лаба3