Проблемы с полиномиальным классом С++

Я работаю над полиномиальным классом, который в основном выполняет +, -, *, / и оценивает полиномы. Я продолжаю сталкиваться с ошибками (в частности, неверный вывод), и я думаю, что это из-за одного из моих методов работы (может быть, дополнение??).

EDIT: задача сужена до оператора +(). Он не может складывать многочлены и двойной.

Любая помощь будет оценена, пожалуйста!

Полиномиальный класс CPP:

#include <iostream>
#include "polynomial.h"

using namespace std;

/*
   =======================
       Constructors
   =======================
*/

Polynomial::Polynomial() //default constructor
   {
      for ( int i = 0; i < 20; i++ )
      {
         coefs[i] = 0;
      }
   }


Polynomial::~Polynomial() {}
void Polynomial::set(int coef, int pwr){
    coefs[pwr] = coef;
    pwrs = degree();
}

int Polynomial::degree()
   {
      int d = 0;
      for ( int i = 0; i < 20; i++ )
         if ( coefs[i] != 0 ) d = i;
      return d;
   }

/* 
   =======================
        operator=
   =======================
*/

Polynomial& Polynomial::operator= ( const Polynomial& poly )
{
      if ( this == &poly ) return ( *this ) ;
      else{
          for (int i = 0; i < 20; i++)
              coefs[i] = poly.coefs[i];
      }
      return ( *this );
}

/* 
   =======================
        operator+
   =======================
*/

Polynomial operator+(const Polynomial& a, const Polynomial& b )
{
    Polynomial c;
    for ( int i = 0; i <= a.pwrs; i++ ) c.coefs[i] += a.coefs[i];
    for ( int i = 0; i <= b.pwrs; i++ ) c.coefs[i] += b.coefs[i];
    c.pwrs = c.degree();
    return c;
}

Polynomial operator+(const Polynomial& a, const double& d)
{
    Polynomial c;
    for ( int i = 0; i <= a.pwrs; i++ ){
        if(i == a.pwrs) {
            i=i+1;
            c.coefs[i] = d;
        }
        c.coefs[i] += a.coefs[i];
    }
    c.pwrs = c.degree();
    return c;
}

/*
   =======================
       Operator-
   =======================
*/

Polynomial operator- (const Polynomial& a,const Polynomial& b )
{
    //Polynomial a = *this; //a is the poly on the L.H.S
    Polynomial c;
    for ( int i = 0; i <= a.pwrs; i++ ) c.coefs[i] += a.coefs[i];
    for ( int i = 0; i <= b.pwrs; i++ ) c.coefs[i] -= b.coefs[i];
    c.pwrs = c.degree();
    return c;
}

/*
   =======================
       Operator*
   =======================
*/

Polynomial operator* (const Polynomial& a, const Polynomial& b)
{
    //Polynomial a = *this; //a is the poly on the L.H.S
    Polynomial c;
    for ( int i = 0; i <= a.pwrs; i++ )
        for ( int j = 0; j <= b.pwrs; j++ )
            c.coefs[i+j] += ( a.coefs[i] * b.coefs[j] );
    c.pwrs = c.degree();
    return c;
   }

Polynomial operator*(const Polynomial& poly1, const double& d)
{
    Polynomial poly;
    for(int i = 0; i < 20; i++)
        poly.coefs[i] = poly1.coefs[i] * d;
    poly.pwrs = poly1.pwrs;
    return poly;
}

Polynomial operator*(const double& d, const Polynomial& poly1)
{
    Polynomial poly;
    for(int i = 0; i < 20; i++)
        poly.coefs[i] = d * poly1.coefs[i];
    poly.pwrs = poly1.pwrs;
    return poly;
}

/*
   =======================
       Operator/
   =======================
*/

Polynomial operator/ (const Polynomial& a, const Polynomial& b)
{
    Polynomial c;
    for ( int i = 0; i <= a.pwrs; i++ )
        for ( int j = 0; j <= b.pwrs; j++ )
            c.coefs[i+j] += ( a.coefs[i] / b.coefs[j] );
    c.pwrs = c.degree();
    return c;
   }


ostream& operator<<(ostream& out, const Polynomial& p) {
    for ( int i = 19; i >= 0; i-- ) {
        if(p.pwrs > 1){
            if ( p.coefs[i] != 0 ) {
                cout << p.coefs[i] << "x^" << i << " ";
                if(p.coefs[i-1] > 0)
                    cout << "+";
                else if(p.coefs[i-1] < 0)
                    cout << "";
            }
        }
        else if (p.pwrs == 1)
            cout << p.coefs[i] << "x ";
        else if(p.pwrs == 0)
            cout << p.coefs[i];
    }
    cout << endl;
}

Главный:

#include <iostream>
#include "polynomial.h"
#include "monomial.h"

using namespace std;

int main(){
Polynomial a, b, c, d, e,result;
    a.set(1,3); //x^3
    b.set(1,2); //x^2
    c.set(6,1); //6x
    d.set(0.01,10); //(1/100)x^10
    e.set(2,5); //2x^5 
    result = 4*(a+b)*(c+1)*(d-e); // 4 * (x^3+x^2) * (6x+1) * ((1/100)x^10 - 2x^5)
}

person Timonse    schedule 11.11.2013    source источник
comment
если вы хотите, чтобы ваш код был отлажен, вы должны сообщить, что это за ошибка.   -  person Paul Draper    schedule 11.11.2013
comment
Программа компилируется нормально, но вывод неверный. Я пытался отладить его, но я не могу найти решение проблемы. Я думаю, что это связано с операторами, однако я не знаю, как их исправить.   -  person Timonse    schedule 11.11.2013
comment
поделитесь примерами ввода и неправильного вывода.   -  person Paul Draper    schedule 11.11.2013
comment
Вход находится в main. Но вот пример: (x^3+x^2)*(0,01x^10 - 2x^5). Вывод дает -2x^8-2x^7, что явно неверно.   -  person Timonse    schedule 11.11.2013
comment
При отладке обычно полезно выполнять ее поэтапно. Вы знаете какой-то неверный ввод. Уменьшайте сложность шаг за шагом, пока не придете ни к чему (что означает, что у вас большие проблемы), либо к правильному шагу. Тогда у вас есть правильный базовый уровень для работы.   -  person dutt    schedule 11.11.2013


Ответы (3)


Вероятно, вам нужно установить pwrs = degree(); в operator =.

Кроме того, как указал @ 6502, ваш operator + неверен. Вы можете изменить это следующим образом:

Polynomial operator+(const Polynomial& a, const double& d)
{
    Polynomial c;
    c.coefs[0] = d;
    for ( int i = 0; i <= a.pwrs; i++ ){
        c.coefs[i] += a.coefs[i];
    }
    c.pwrs = c.degree();
    return c;
}

Все еще неэффективно, но, по крайней мере, это должно дать правильный результат.

person Henrik    schedule 11.11.2013
comment
Спасибо. Это сделало мой результат намного лучше. Единственная проблема сейчас в моем операторе +(). Он может складывать многочлены вместе. Но не полиномы, а дубль. Любые идеи о том, как это исправить? - person Timonse; 11.11.2013

Возникает логическая проблема с добавлением двойника. В этом случае вы хотите добавить только к coefs[0], а не ко всем из них.

Почему вы определяете оператор присваивания? Разве значение по умолчанию не подходит для этого класса?

person 6502    schedule 11.11.2013
comment
Я пытался использовать двойные числа вместо целых чисел, чтобы решить проблему, в которой я уверен. Однако при попытке сделать это я получаю сообщение об ошибке недопустимых типов «двойной [20] [двойной]» для индекса массива. Исправление, которое может решить проблему. - person Timonse; 11.11.2013

Помимо проблемы, на которую указал Хенринк, присваивать коэффициенту 0,01 бессмысленно. Поскольку здесь принимается только int.

void Polynomial::set(int coef, int pwr){
    coefs[pwr] = coef;
    pwrs = degree();
}
person TerrenceSun    schedule 11.11.2013