I have the following Polynomial class I'm working on:
#include <iostream>
using namespace std;
class Polynomial
{
private:
int coef[100];
int deg;
public:
Polynomial::Polynomial()
{
for ( int i = 0; i < 100; i++ )
{
coef[i] = 0;
}
}
void set ( int a , int b )
{
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 << " ";
}
}
}
int evaluate ( int x )
{
int p = 0;
for ( int i = deg; i >= 0; i-- )
p = coef[i] + ( x * p );
return p;
}
Polynomial differentiate()
{
if ( deg == 0 ) {
Polynomial t;
t.set ( 0, 0 );
return t;
}
Polynomial deriv;
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;
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;
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;
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;
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;
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;
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 );
a.set ( 1, 2 );
b.set ( 6, 3 );
b.set ( -3, 2 );
c = a - b;
a -= b;
c.print();
cout << "\n";
a.print();
cout << "\n";
c = a * b;
c.print();
cout << "\n";
d = c.differentiate().differentiate();
d.print();
cout << "\n";
cout << c.evaluate ( 2 );
cin.get();
}
Now the "-" operator is overloaded and it works fine:
Polynomial Polynomial::operator - ( Polynomial b )
{
Polynomial a = *this;
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;
}
However, I am having difficulty with my "= =" operator:
Polynomial Polynomial::operator -= ( Polynomial b )
{
Polynomial a = *this;
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;
}
I just changed my "-" operator method a bit to overwrite the value in "a" and return "a", and just use the polynomial "c" as a temporary parameter.
I have included some debugging print statement, and I confirm that both are:
c = a - b;
and
a - = b;
are calculated with the same value.
However, when I go to print them, their results are different:
Polynomial a, b; 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 < "\ ";
a.print(); cout < "\ ";
:
7x ^ 4 -6x ^ 3 4x ^ 2
7x ^ 4 1x ^ 2
c = a - b a -= b ?