This program compiles correctly but When i need to input data, it crashes saying "string subscript out of range", I dont know what it means.
I would really appreciate if someone can run the program and see if anything is missing.
I wrote this program with my class mate who knows more about this than I do. unfortunately I cant get in touch with him.
program is separated in 3 files. I really need to run some test with this thing. thank you.
Class
Code:
#ifndef POLYNOMIAL_H
#define POLYNOMIAL_H
#include <iostream>
#include <string>
#include <cmath>
#include <iomanip>
using namespace std;
class Polynomial
{
friend ostream &operator << ( ostream &, const Polynomial & );
friend istream &operator >> ( istream &, Polynomial & );
public:
Polynomial(); // default constructor
Polynomial( int );
Polynomial( string );
Polynomial( const char * );
Polynomial( const int *, int=0 ); // regular constructor
Polynomial( const Polynomial & ); // copy constructor
~Polynomial(); // destructor
void setPolynomial( int );
void setPolynomial( string );
void setDegree( int = 0, int = 0 );
void setDegree( const char *, int = 0 );
int getDegree( int = 0 );
long long int eval( int = 0 );
Polynomial operator+( const Polynomial & ) const;
Polynomial operator+( const char * ) const;
Polynomial operator+( int ) const;
Polynomial operator-( const Polynomial & ) const;
Polynomial operator-( const char * ) const;
Polynomial operator-( int ) const;
Polynomial operator*( const Polynomial & ) const;
Polynomial operator*( const char * ) const;
Polynomial operator*( int ) const;
private:
int *ptr;
int size;
};
#endif
Definition
Code:
#include "Poly.h"
#include <iomanip>
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
Polynomial::Polynomial()
{
setPolynomial(0);
}
Polynomial::Polynomial( int input )
{
setPolynomial( input );
}
Polynomial::Polynomial( string temp )
{
setPolynomial( temp );
}
Polynomial::Polynomial( const char * temp )
{
string tempstring = temp;
setPolynomial( tempstring );
}
Polynomial::Polynomial( const int * coeff, int max )
{
size = max;
ptr = new int[size];
for ( int i = 0; i < size; i++)
setDegree(i, coeff[i]);
}
Polynomial::Polynomial( const Polynomial &polyToCopy )
{
size = polyToCopy.size;
ptr = new int[size];
for ( int i = 0; i < size; i++)
setDegree( i, polyToCopy.ptr[i] );
}
Polynomial::~Polynomial()
{
delete [] ptr;
}
void Polynomial::setPolynomial(int input)
{
size = 1;
ptr = new int[size];
ptr[0] = input;
}
void Polynomial::setPolynomial( string temp )
{
string polyonly;
char poly[100];
int pos = 0, j = 0;
for ( unsigned int i = 0; i <= temp.length(); i++)
{
if ( ( isdigit( temp[i] ) ) || ( temp[i] == '+' )
|| ( temp[i] == '-' ) || ( temp[i] == 'x' )
|| ( temp[i] == 'X' ) || ( temp[i] == '^' )
|| ( i == temp.length() ) )
{
polyonly[j] = temp[i];
j++;
}
}
for ( int i = 0; i <= j; i++ )
{
if ( (i == 0) || ( polyonly[i] == '+' ) || ( polyonly[i] == '-') )
pos = 0;
if ( ( isdigit(polyonly[i] ) ) || ( polyonly[i] == '-' )
|| ( polyonly[i] == 'x' ) || ( polyonly[i] == 'X' )
|| ( polyonly[i] == '^') )
{
poly[pos] = polyonly[i];
pos++;
}
if ((i == j) || ((i<j) && ((polyonly[i+1] == '-') || (polyonly[i+1] == '+'))))
{
poly[pos] = '\0';
setDegree(poly,pos);
}
}
}
void Polynomial::setDegree( int degree, int coeff )
{
if (degree >= size)
{
int oldsize = size;
Polynomial temp(*this);
size = degree+1;
delete [] ptr;
ptr = new int[size];
for ( int i = 0; i < size; i++ )
{
if ( i < oldsize )
ptr[i] = temp.ptr[i];
else if ( i >= oldsize )
ptr[i] = 0;
}
}
if ( degree >= 0 )
ptr[degree] = coeff;
}
void Polynomial::setDegree( const char *input, int max )
{
int isNegative = 0;
int foundX = 0;
int coeff = 0;
int degree = 0;
int i;
if ( input[0] == '-' )
isNegative = 1;
for ( i = 0; i < max; i++ )
{
if ( ( input[i] != '+' ) && ( input[i] != '-' ) )
{
if ( ( input[i] == 'x' ) || ( input[i] == 'X' ) )
{
foundX = 1;
if ( coeff == 0 )
coeff = 1;
if ( i == max - 1 )
degree = 1;
}
if ( isdigit( input[i] ) )
{
if ( foundX == 0 )
{
coeff *= 10;
coeff += input[i] - '0';
}
else
{
degree *= 10;
degree += input[i] - '0';
}
}
}
}
if ( isNegative == 1 )
coeff *= -1;
setDegree( degree,coeff );
}
int Polynomial::getDegree( int degree )
{
if ( size > degree )
return ptr[degree];
else
return 0;
}
long long int Polynomial::eval( int value )
{
long long int total = 0;
for ( int i = 0; i < size; i++ )
total += ( long long int )ptr[i]*( ( long long int ) pow( ( float ) value,( float ) i ) );
return total;
}
Polynomial Polynomial::operator+( const Polynomial &right ) const
{
Polynomial temp;
int max_size, value;
max_size = ( size > right.size ) ? size : right.size;
for ( int i = 0; i < max_size; i++ )
{
value = 0;
if ( i < size )
value += ptr[i];
if ( i < right.size)
value += right.ptr[i];
temp.setDegree(i,value);
}
return temp;
}
Polynomial Polynomial::operator+(const char *input) const
{
string stringinput = input;
Polynomial temp;
temp.setPolynomial( stringinput );
return *this + temp;
}
Polynomial Polynomial::operator+( int input ) const
{
return *this + Polynomial( input );
}
Polynomial Polynomial::operator-( const Polynomial &right ) const
{
Polynomial temp( right );
for ( int i = 0; i < temp.size; i++ )
temp.ptr[i] *= -1;
return *this + temp;
}
Polynomial Polynomial::operator-( const char *input ) const
{
string stringinput = input;
Polynomial temp;
temp.setPolynomial( stringinput );
return *this - temp;
}
Polynomial Polynomial::operator-( int input ) const
{
return *this - Polynomial( input );
}
Polynomial Polynomial::operator*( const Polynomial &right ) const
{
Polynomial temp;
int i, j;
for ( i = 0; i < size; i++ )
for ( j = 0; j < right.size; j++ )
temp.setDegree(i+j,temp.getDegree(i+j)+ptr[i]*right.ptr[j]);
return temp;
}
Polynomial Polynomial::operator*( const char *input ) const
{
string stringinput = input;
Polynomial temp;
temp.setPolynomial( stringinput );
return *this * temp;
}
Polynomial Polynomial::operator*( int input ) const
{
return *this * Polynomial(input);
}
ostream &operator<<( ostream &output, const Polynomial &right )
{
int didOut = 0;
for ( int i = right.size - 1; i >= 0; i-- )
{
if ( right.ptr[i] != 0 )
{
if ( right.ptr[i] > 0 )
{
if ( i != right.size - 1 )
output << " + ";
else
{
if ( i != right.size - 1)
output << " - ";
else
output << "-";
}
if ( ( fabs ((double)right.ptr[i])!= 1.0 ) || ( i == 0 ) )
{
output << fabs((double)right.ptr[i] );
didOut = 1;
}
}
if ( i > 1 )
output << "x^" << i;
else if ( i == 1 )
output << "x";
}
}
if ( didOut == 0)
output << 0;
return output;
}
istream &operator>>(istream &input, Polynomial &right )
{
string temp;
getline( input, temp );
right.setPolynomial( temp );
return input;
}
test program
Code:
#include "Poly.h"
#include <iostream>
#include <iomanip>
#include <string>
#include <cmath>
using namespace std;
int main()
{
const int f_size = 4;
int f_arr[f_size] = { 1, 1, 1, 1 };
Polynomial f( f_arr,f_size );
Polynomial g;
cout << "Enter a polynomial (like:x^15+x^3-x-1) for 'g' (expecting x-1): ";
cin >> g;
Polynomial F;
F.setDegree( 0, 1 );
F.setDegree( 10, 1 );
Polynomial G( F );
G.setDegree( 10, -1 );
G.setDegree( 15, 1 );
cout << "Values of variables:" << endl;
cout << "f = " << f << endl;
cout << "g = " << g << endl;
cout << "F = " << F << endl;
cout << "G = " << G << endl;
cout << endl;
cout << "Evaluating f & F:" << endl;
cout << " f( 0 ) = " << f.eval( 0 ) << endl;
cout << " f( 1 ) = " << f.eval( 1 ) << endl;
cout << "f( -2 ) = " << f.eval( -2 ) << endl;
cout << " F( 0 ) = " << F.eval( 0 ) << endl;
cout << " F( 1 ) = " << F.eval( 1 ) << endl;
cout << "F( -2 ) = " << F.eval( -2 ) << endl;
cout << endl;
cout << "Testing overloaded operations:" << endl;
cout << " f + g: (" << f << ") + (" << g << ")" << endl;
cout << " = " << f + g << endl << endl;
cout << " f + 288: (" << f << ") + ( 288 ) " << endl;
cout << " = " << f + 288 << endl << endl;
cout << " f + ( 3x+1 ): ( " << f << " ) + ( 3x + 1 )" << endl;
cout << " = " << f + "3x + 1" << endl << endl;
cout << " f - g: (" << f << ") - (" << g << ")" << endl;
cout << " = " << f - g << endl << endl;
cout << " f * g: (" << f << ") * (" << g << ")" << endl;
cout << " = " << f * g << endl << endl;
cout << " F + G: (" << F << ") + (" << G << ")" << endl;
cout << " = " << F + G << endl << endl;
cout << " F - G: (" << F << ") - (" << G << ")" << endl;
cout << " = " << F - G << endl << endl;
cout << " F * G: (" << F << ") * (" << G << ")" << endl;
cout << " = " << F * G << endl << endl;
cout << endl;
cout << endl;
system( "PAUSE" );
return 0;
}