Добавил:
vvrstcnho
Рад, если кому-то помог
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторные работы С++ (для ИВТ) / Готовые лабы С++ / Лаба3 / Laba 3 (8)
.cpp#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
