Я работаю над классом многочленов, который в основном делает +, -, *, / и оценивает многочлены. Я продолжаю сталкиваться с ошибками (в частности, вывод неправильный), и я думаю, что это из-за одного из моих методов работы (может быть, добавление ??).
РЕДАКТИРОВАТЬ: Сузить задачу до оператора + (). Он не может добавлять полиномы и двойные.
Любая помощь будет оценена, пожалуйста!
Полиномиальный класс 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)
}
Вам, вероятно, нужно установить 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;
}
Все еще неэффективно, но по крайней мере это должно дать правильный результат.
Есть логическая проблема с добавлением двойника. В этом случае вы хотите добавить только coefs[0]
не всем им.
Почему вы определяете оператор присваивания? Разве по умолчанию не подходит для этого класса?
Помимо проблемы, на которую указал Хенринк, присвоение 0,01 для coef не имеет смысла. Как только int принимается здесь.
void Polynomial::set(int coef, int pwr){
coefs[pwr] = coef;
pwrs = degree();
}