Source files (for downloading):
#ifndef POLYNOMIAL_H #define POLYNOMIAL_H #includeusing namespace std; class Polynomial { friend bool operator==(const Polynomial & lhs, const Polynomial & rhs); public: // constructors Polynomial(); Polynomial(double coefficients[], int number); Polynomial(const Polynomial & rhs); explicit Polynomial(double const_term); // destructor ~Polynomial(); // named member functions int degree() const { return size - 1; } void print(ostream & out = cout) const; // assignment operators Polynomial & operator= (const Polynomial & rhs); Polynomial & operator+= (const Polynomial & rhs); Polynomial & operator*= (double rhs); private: int size; // size of the coefs array ( = degree + 1) double * coefs; // coefs will be an array }; Polynomial operator+(const Polynomial & lhs, const Polynomial & rhs); Polynomial operator*(const Polynomial & lhs, double rhs); Polynomial operator*(double lhs, const Polynomial & rhs); ostream & operator<<(ostream & out, const Polynomial & p); #endif
// Constructor
// Creates a default polynomial p of the form p(x) = 0.0
Polynomial::Polynomial() : size(1), coefs(new double[1]) {
coefs[0] = 0.0;
}
// Constructor
// Given an array of coefficients C (and it's size N) creates a polynomial
// p(x) = C[N-1]x^(N-1) + ... + C[2]x^2 + C[1]x + C[0]
Polynomial::Polynomial(double coefficients[], int number) :
size(number), coefs(new double[number]) {
for (int i = 0; i < size; i++) {
coefs[i] = coefficients[i];
}
}
// Constructor
// Given a constant term A, creates the polynomial p(x) = A
Polynomial::Polynomial(double const_term) : size(1), coefs(new double[1]) {
coefs[0] = const_term;
}
// Copy constructor
// Creates a polynomial from the given polynomial
Polynomial::Polynomial(const Polynomial & rhs) :
size(rhs.size), coefs(new double[rhs.size]) {
for (int i = 0; i < size; i++) {
coefs[i] = rhs.coefs[i];
}
}
// Destructor
Polynomial::~Polynomial() {
delete [] coefs;
}
// Overload assignment =
Polynomial & Polynomial::operator=(const Polynomial & rhs) {
if (this == &rhs) {
return *this;
}
else {
delete [] coefs;
coefs = new double[rhs.size];
size = rhs.size;
for (int i = 0; i < size; i++) {
coefs[i] = rhs.coefs[i];
}
}
return *this;
}
// Overload assignment +=
Polynomial & Polynomial::operator+=(const Polynomial & rhs) {
int newSize = (rhs.size > size) ? rhs.size : size;
double *newCoef = new double [newSize];
for (int i = 0; i < newSize; i++) {
newCoef[i] = 0;
}
for (int i = 0; i < rhs.size; i++) {
newCoef[i] += rhs.coefs[i];
}
for (int i = 0; i < size; i++) {
newCoef[i] += coefs[i];
}
delete [] coefs;
coefs = newCoef;
size = newSize;
return *this;
}
// Overload assignment *= so it supports scalar multiplication
Polynomial & Polynomial::operator*=(double rhs) {
for (int i = 0; i < size; i++) {
coefs[i] *= rhs;
}
return *this;
}
// Overload +
Polynomial operator+(const Polynomial & lhs, const Polynomial & rhs) {
Polynomial answer(lhs);
answer += rhs;
return answer;
}
// Overload * so it supports scalar multiplication. Note that
// we overload it twice so we can do either:
// polynomial * scalar
// or
// scalar * polynomial
Polynomial operator*(const Polynomial & lhs, double rhs) {
Polynomial answer(lhs);
answer *= rhs;
return answer;
}
Polynomial operator*(double lhs, const Polynomial & rhs) {
Polynomial answer(rhs);
answer *= lhs;
return answer;
}
// Prints the polynomial to the given ostream. If no ostream is given,
// the polynomial is printed to cout
void Polynomial::print(ostream & out) const {
if (size == 0) {
return;
}
for (int i = size - 1; i > 0; i--)
out << coefs[i] << "x^" << i << " + ";
out << coefs[0];
}
// Overload << for output
ostream & operator<<(ostream & out, const Polynomial & p) {
p.print(out);
return out;
}
// Overload ==
bool operator==(const Polynomial & lhs, const Polynomial & rhs) {
if (lhs.size != rhs.size) {
return false;
}
for (int i = 0; i < lhs.size; i++) {
if (lhs.coefs[i] != rhs.coefs[i]) {
return false;
}
}
return true;
}