Develop class Polynomial using C++ programming – Operator Overloading
Develop class Polynomial. The internal representation of a Polynomial
is an array of terms. Each term contains a coefficient and an exponent, e.g., the term
2x^4
has the coefficient 2 and the exponent 4. Develop a complete class containing proper constructor
and destructor functions as well as set and get functions. The class should also provide the following
overloaded operator capabilities:
a) Overload the addition operator (+) to add two Polynomials.
b) Overload the subtraction operator (-) to subtract two Polynomials.
c) Overload the assignment operator to assign one Polynomial to another.
d) Overload the multiplication operator (*) to multiply two Polynomials.
e) Overload the addition assignment operator (+=), subtraction assignment operator (-=),
and multiplication assignment operator (*=).
Answer:
Test program
#include <iostream>
#include "Polynomial.h"
using namespace std;
int main()
{
Polynomial a, b, c, t;
a.enterTerms();
b.enterTerms();
t = a; // save the value of a
cout << "First polynomial is:\n";
a.printPolynomial();
cout << "Second polynomial is:\n";
b.printPolynomial();
cout << "\nAdding the polynomials yields:\n";
c = a + b;
c.printPolynomial();
cout << "\n+= the polynomials yields:\n";
a += b;
a.printPolynomial();
cout << "\nSubtracting the polynomials yields:\n";
a = t; // reset a to original value
c = a - b;
c.printPolynomial();
cout << "\n-= the polynomials yields:\n";
a -= b;
a.printPolynomial();
cout << "\nMultiplying the polynomials yields:\n";
a = t; // reset a to original value
c = a * b;
c.printPolynomial();
cout << "\n*= the polynomials yields:\n";
a *= b;
a.printPolynomial();
cout << endl;
}
Polynomial member-function definitions
#include <iostream>
#include <iomanip>
#include "Polynomial.h"
using namespace std;
Polynomial::Polynomial()
{
for ( int t = 0; t < maxTerms; ++t )
{
coefficients[ t ] = 0;
exponents[ t ] = 0;
} // end for
numberOfTerms = 0;
} // end Polynomial constructor
void Polynomial::printPolynomial() const
{
int start;
bool zero = false;
if ( coefficients[ 0 ] ) // output constants
{
cout << coefficients[ 0 ];
start = 1;
zero = true; // at least one term exists
}
else
{
if ( coefficients[ 1 ] )
{
cout << coefficients[ 1 ] << 'x'; // constant does not exist
// so output first term
// without a sign
if ( ( exponents[ 1 ] != 0 ) && ( exponents[ 1 ] != 1 ) )
cout << '^' << exponents[ 1 ];
zero = true; // at least one term exists
}
start = 2;
}
// output remaining polynomial terms
for ( int x = start; x < maxTerms; ++x )
{
if ( coefficients[ x ] != 0 )
{
cout << showpos << coefficients[ x ] << noshowpos << 'x';
if ( ( exponents[ x ] != 0 ) && ( exponents[ x ] != 1 ) )
cout << '^' << exponents[ x ];
zero = true; // at least one term exists
} // end if
} // end for
if ( !zero ) // no terms exist in the polynomial
cout << '0';
cout << endl;
} // end function printPolynomial
Polynomial &Polynomial::operator=( const Polynomial &r )
{
exponents[ 0 ] = r.exponents[ 0 ];
coefficients[ 0 ] = r.coefficients[ 0 ];
for ( int s = 1; s < maxTerms; ++s )
{
if ( r.exponents[ s ] != 0 )
{
exponents[ s ] = r.exponents[ s ];
coefficients[ s ] = r.coefficients[ s ];
}
else
{
if ( exponents[ s ] == 0 )
break;
exponents[ s ] = 0;
coefficients[ s ] = 0;
}
}
return *this;
}
Polynomial Polynomial::operator+( const Polynomial &r ) const
{
Polynomial temp;
bool exponentExists;
int s;
// process element with a zero exponent
temp.coefficients[ 0 ] = coefficients[ 0 ] + r.coefficients[ 0 ];
// copy right arrays into temp object; s will be used to keep
// track of first open coefficient element
for ( s = 1; ( s < maxTerms ) && ( r.exponents[ s ] != 0 ); ++s )
{
temp.coefficients[ s ] = r.coefficients[ s ];
temp.exponents[ s ] = r.exponents[ s ];
}
for ( int x = 1; x < maxTerms; ++x )
{
exponentExists = false; // assume exponent will not be found
for ( int t = 1; ( t < maxTerms ) && ( !exponentExists ); ++t )
if ( exponents[ x ] == temp.exponents[ t ] )
{
temp.coefficients[ t ] += coefficients[ x ];
exponentExists = true; // exponent found
} // end if
// exponent was not found, insert into temp
if ( !exponentExists )
{
temp.exponents[ s ] = exponents[ x ];
temp.coefficients[ s ] += coefficients[ x ];
++s;
} // end if
} // end for
return temp;
} // end function operator+
Polynomial &Polynomial::operator+=( const Polynomial &r )
{
*this = *this + r;
return *this;
}
Polynomial Polynomial::operator-( const Polynomial &r ) const
{
Polynomial temp;
bool exponentExists;
int s;
// process element with a zero exponent
temp.coefficients[ 0 ] = coefficients[ 0 ] - r.coefficients[ 0 ];
// copy left arrays into temp object; s will be used to keep
// track of first open coefficient element
for ( s = 1; ( s < maxTerms ) && ( exponents[ s ] != 0 ); ++s )
{
temp.coefficients[ s ] = coefficients[ s ];
temp.exponents[ s ] = exponents[ s ];
}
for ( int x = 1; x < maxTerms; ++x )
{
exponentExists = false; // assume exponent will not be found
for ( int t = 1; ( t < maxTerms ) && ( !exponentExists ); ++t )
if ( r.exponents[ x ] == temp.exponents[ t ] )
{
temp.coefficients[ t ] -= r.coefficients[ x ];
exponentExists = true; // exponent found
}
// exponent was not found, insert into temp
if ( !exponentExists )
{
temp.exponents[ s ] = r.exponents[ x ];
temp.coefficients[ s ] -= r.coefficients[ x ];
++s;
}
}
return temp;
}
Polynomial &Polynomial::operator-=( const Polynomial &r )
{
*this = *this - r;
return *this;
}
Polynomial Polynomial::operator*( const Polynomial &r ) const
{
Polynomial temp;
int s = 1; // subscript location for temp coefficient and exponent
for ( int x = 0; ( x < maxTerms ) &&
( x == 0 || coefficients[ x ] != 0 ); ++x )
for ( int y = 0; ( y < maxTerms ) &&
( y == 0 || r.coefficients[ y ] != 0 ); ++y )
if ( coefficients[ x ] * r.coefficients[ y ] )
if ( ( exponents[ x ] == 0 ) && ( r.exponents[ y ] == 0 ) )
temp.coefficients[ 0 ] +=
coefficients[ x ] * r.coefficients[ y ];
else
{
temp.coefficients[ s ] =
coefficients[ x ] * r.coefficients[ y ];
temp.exponents[ s ] = exponents[ x ] + r.exponents[ y ];
++s;
}
polynomialCombine( temp ); // combine common terms
return temp;
} // end function operator*
void Polynomial::polynomialCombine( Polynomial &w )
{
Polynomial temp = w;
// zero out elements of w
for ( int x = 0; x < maxTerms; ++x )
{
w.coefficients[ x ] = 0;
w.exponents[ x ] = 0;
}
for ( int x = 1; x < maxTerms; ++x )
{
for ( int y = x + 1; y < maxTerms; ++y )
if ( temp.exponents[ x ] == temp.exponents[ y ] )
{
temp.coefficients[ x ] += temp.coefficients[ y ];
temp.exponents[ y ] = 0;
temp.coefficients[ y ] = 0;
} // end if
} // end outer for
w = temp;
}
Polynomial &Polynomial::operator*=( const Polynomial &r )
{
*this = *this * r;
return *this;
}
void Polynomial::enterTerms()
{
bool found = false;
int c, e, term;
cout << "\nEnter number of polynomial terms: "; cin >> numberOfTerms;
for ( int n = 0; n < maxTerms && n < numberOfTerms; ++n )
{
cout << "\nEnter coefficient: "; cin >> c;
cout << "Enter exponent: "; cin >> e;
if ( c != 0 )
{
// exponents of zero are forced into first element
if ( e == 0 )
{
coefficients[ 0 ] += c;
continue;
}
for ( term = 1; ( term < maxTerms ) &&
( coefficients[ term ] != 0 ); ++term )
if ( e == exponents[ term ] )
{
coefficients[ term ] += c;
exponents[ term ] = e;
found = true; // existing exponent updated
}
if ( !found ) // add term
{
coefficients[ term ] += c;
exponents[ term ] = e;
}
}
}
}
int Polynomial::getNumberOfTerms() const
{
return numberOfTerms;
}
int Polynomial::getTermExponent( int term ) const
{
return exponents[ term ];
}
int Polynomial::getTermCoefficient( int term ) const
{
return coefficients[ term ];
}
void Polynomial::setCoefficient( int term, int coefficient )
{
if ( coefficients[ term ] == 0 ) // no term at this location
cout << "No term at this location, cannot set term." << endl;
else // otherwise, set term
coefficients[ term ] = coefficient;
}
// destructor
Polynomial::~Polynomial()
{
// empty destructor
}
Polynomial class definition
#ifndef POLYNOMIAL_H
#define POLYNOMIAL_H
class Polynomial
{
public:
static const int maxTerms = 100; // maximum number of terms
Polynomial();
Polynomial operator+( const Polynomial & ) const; // addition
Polynomial operator-( const Polynomial & ) const; // subtraction
Polynomial operator*( const Polynomial & ) const; // multiplication
Polynomial &operator=( const Polynomial & ); // assignment
Polynomial &operator+=( const Polynomial & );
Polynomial &operator-=( const Polynomial & );
Polynomial &operator*=( const Polynomial & );
void enterTerms();
void printPolynomial() const;
int getNumberOfTerms() const; // user can only retrieve value
int getTermExponent( int ) const;
int getTermCoefficient( int ) const;
void setCoefficient( int, int ); // set coefficient of a specific term
~Polynomial(); // destructor
private:
int numberOfTerms;
int exponents[ maxTerms ]; // exponent array
int coefficients[ maxTerms ]; // coefficients array
static void polynomialCombine( Polynomial & ); // combine common terms
};
#endif
Leave a reply