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
DefinitionCode:#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
test programCode:#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; }
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; }



LinkBack URL
About LinkBacks




