Я следующий полиномиальный класс Я работаю на:Почему моя операционная система не работает правильно?
#include <iostream>
using namespace std;
class Polynomial
{
//define private member functions
private:
int coef[100]; // array of coefficients
// coef[0] would hold all coefficients of x^0
// coef[1] would hold all x^1
// coef[n] = x^n ...
int deg; // degree of polynomial (0 for the zero polynomial)
//define public member functions
public:
Polynomial::Polynomial() //default constructor
{
for (int i = 0; i < 100; i++)
{
coef[i] = 0;
}
}
void set (int a , int b) //setter function
{
//coef = new Polynomial[b+1];
coef[b] = a;
deg = degree();
}
int degree()
{
int d = 0;
for (int i = 0; i < 100; i++)
if (coef[i] != 0) d = i;
return d;
}
void print()
{
for (int i = 99; i >= 0; i--) {
if (coef[i] != 0) {
cout << coef[i] << "x^" << i << " ";
}
}
}
// use Horner's method to compute and return the polynomial evaluated at x
int evaluate (int x)
{
int p = 0;
for (int i = deg; i >= 0; i--)
p = coef[i] + (x * p);
return p;
}
// differentiate this polynomial and return it
Polynomial differentiate()
{
if (deg == 0) {
Polynomial t;
t.set (0, 0);
return t;
}
Polynomial deriv;// = new Polynomial (0, deg - 1);
deriv.deg = deg - 1;
for (int i = 0; i < deg; i++)
deriv.coef[i] = (i + 1) * coef[i + 1];
return deriv;
}
Polynomial Polynomial::operator + (Polynomial b)
{
Polynomial a = *this; //a is the poly on the L.H.S
Polynomial c;
for (int i = 0; i <= a.deg; i++) c.coef[i] += a.coef[i];
for (int i = 0; i <= b.deg; i++) c.coef[i] += b.coef[i];
c.deg = c.degree();
return c;
}
Polynomial Polynomial::operator += (Polynomial b)
{
Polynomial a = *this; //a is the poly on the L.H.S
Polynomial c;
for (int i = 0; i <= a.deg; i++) c.coef[i] += a.coef[i];
for (int i = 0; i <= b.deg; i++) c.coef[i] += b.coef[i];
c.deg = c.degree();
for (int i = 0; i < 100; i++) a.coef[i] = c.coef[i];
a.deg = a.degree();
return a;
}
Polynomial Polynomial::operator -= (Polynomial b)
{
Polynomial a = *this; //a is the poly on the L.H.S
Polynomial c;
for (int i = 0; i <= a.deg; i++) c.coef[i] += a.coef[i];
for (int i = 0; i <= b.deg; i++) c.coef[i] -= b.coef[i];
c.deg = c.degree();
for (int i = 0; i < 100; i++) a.coef[i] = c.coef[i];
a.deg = a.degree();
return a;
}
Polynomial Polynomial::operator *= (Polynomial b)
{
Polynomial a = *this; //a is the poly on the L.H.S
Polynomial c;
for (int i = 0; i <= a.deg; i++)
for (int j = 0; j <= b.deg; j++)
c.coef[i+j] += (a.coef[i] * b.coef[j]);
c.deg = c.degree();
for (int i = 0; i < 100; i++) a.coef[i] = c.coef[i];
a.deg = a.degree();
return a;
}
Polynomial Polynomial::operator - (Polynomial b)
{
Polynomial a = *this; //a is the poly on the L.H.S
Polynomial c;
for (int i = 0; i <= a.deg; i++) c.coef[i] += a.coef[i];
for (int i = 0; i <= b.deg; i++) c.coef[i] -= b.coef[i];
c.deg = c.degree();
return c;
}
Polynomial Polynomial::operator * (Polynomial b)
{
Polynomial a = *this; //a is the poly on the L.H.S
Polynomial c;
for (int i = 0; i <= a.deg; i++)
for (int j = 0; j <= b.deg; j++)
c.coef[i+j] += (a.coef[i] * b.coef[j]);
c.deg = c.degree();
return c;
}
};
int main()
{
Polynomial a, b, c, d;
a.set (7, 4); //7x^4
a.set (1, 2); //x^2
b.set (6, 3); //6x^3
b.set (-3, 2); //-3x^2
c = a - b; // (7x^4 + x^2) - (6x^3 - 3x^2)
a -= b;
c.print();
cout << "\n";
a.print();
cout << "\n";
c = a * b; // (7x^4 + x^2) * (6x^3 - 3x^2)
c.print();
cout << "\n";
d = c.differentiate().differentiate();
d.print();
cout << "\n";
cout << c.evaluate (2); //substitue x with 2
cin.get();
}
Теперь у меня есть «-» перегружен и она отлично работает:
Polynomial Polynomial::operator - (Polynomial b)
{
Polynomial a = *this; //a is the poly on the L.H.S
Polynomial c;
for (int i = 0; i <= a.deg; i++) c.coef[i] += a.coef[i];
for (int i = 0; i <= b.deg; i++) c.coef[i] -= b.coef[i];
c.deg = c.degree();
return c;
}
Однако, я с трудом с моим «- =» оператор:
Polynomial Polynomial::operator -= (Polynomial b)
{
Polynomial a = *this; //a is the poly on the L.H.S
Polynomial c;
for (int i = 0; i <= a.deg; i++) c.coef[i] += a.coef[i];
for (int i = 0; i <= b.deg; i++) c.coef[i] -= b.coef[i];
c.deg = c.degree();
// overwrite value of 'a' with the newly computed 'c' before returning 'a'
for (int i = 0; i < 100; i++) a.coef[i] = c.coef[i];
a.deg = a.degree();
return a;
}
Я просто слегка видоизмененный мой «-» метод оператора перезаписать значение в «а» и возврата «а», а просто использовать «C» многочлен как темп ,
Я поместил в некоторой отладке оператора печати, и я подтверждаю, что во время вычислений, как:
с = а - Ь;
и
а - = Ь;
рассчитывается с одинаковым значением.
Однако, когда я иду, чтобы напечатать их, их результаты разные:
полиномиальной а, б; a.set (7, 4); // 7x^4 a.set (1, 2); // x^2
b.set (6, 3); // 6x^3 b.set ( -3, 2); // - 3x^2
c = a - b; // (7x^4 + x^2) - (6x^3 - 3x^2) a - = b;
c.print(); cout < < "\ n";
a.print(); cout < < "\ n";
Результат:
7x^4 -6x^3 4x^2
7x^4 1x^2
Почему мой c = a - b
и a -= b
дает мне разные результаты когда я иду печатать их?
Вы должны объявить свои бинарные математические операторы (включая оператор присваивания, как '- =') взять константный вход задания. Кроме того, вы должны объявить, что ваши операторы присваивания возвращают ссылку, и используйте 'return * this;'. Поэтому ваш оператор вычитания и назначения должен выглядеть так: 'Polynomial & Polynomial :: operator - = (const Polynomial & b)'. –
Другая ошибка: ваш конструктор не устанавливает 'deg'. Возможно, вам стоит рассмотреть возможность использования 'vector' для ваших коэффициентов, если только вы не использовали его раньше, и в этом случае это может быть немного. –