перегрузка операторов — проблемы с полиномиальным классом переполнения стека

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

РЕДАКТИРОВАТЬ: Сузить задачу до оператора + (). Он не может добавлять полиномы и двойные.

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

Полиномиальный класс 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)
}

2

Решение

Вам, вероятно, нужно установить 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;
}

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

1

Другие решения

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

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

0

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

void Polynomial::set(int coef, int pwr){
coefs[pwr] = coef;
pwrs = degree();
}
0
По вопросам рекламы [email protected]