Udało się! :D
Kod cały:
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <functional>
#include <typeinfo>
using namespace std;
class Poly
{
public:
struct Mono
{
char sign = 1;
double power;
double multiplier;
void operator=(double multiplier)
{
this->multiplier = multiplier;
}
bool operator<(const Mono &other)
{
if (this->power == other.power)
{
if (this->multiplier == other.multiplier)
{
return this->sign > other.sign;
}
else
{
return this->multiplier > other.multiplier;
}
}
else
{
return this->power > other.power;
}
}
double calculate(double x);
};
public:
Poly();
~Poly();
Poly(double multiplier);
friend ostream& operator<<(ostream& out, const Poly& d );
friend Poly operator+(const Poly &p1, const Poly &p2);
void addPolyComponent(double multiplier , double power, char sign = 1)
{
Mono mono;
mono.multiplier = (sign < 0 ? -multiplier : multiplier); //- (-Ax^Y)
mono.power = power;
mono.sign = sign;
polyComponents.push_back(mono);
}
void sortPoly()
{
sort(polyComponents.begin(), polyComponents.end());
}
void reducePoly()
{
if (polyComponents.size() <= 1)
{
return;
}
sortPoly();
auto anchor = polyComponents.begin();
auto search = anchor + 1;
while (search != polyComponents.end())
{
if (search->power == anchor->power)
{
anchor->multiplier += search->multiplier;
polyComponents.erase(search);
}
else
{
if (anchor->multiplier == 0)
{
polyComponents.erase(anchor);//to przestawia anchor i search o 1 w przód
continue;
}
anchor = search;
search++;
}
}
}
Mono& operator[](double v) //Do wyrazu wolnego, bo Poly P2 = 5 //Poly P2(5);
{
Mono mono;
mono.power = v;
mono.sign = 1;
polyComponents.push_back(mono);
return polyComponents.back();
}
private:
vector<Mono> polyComponents;
};
Poly::Poly() // konstruktor domyślny
{
}
Poly::~Poly() // destruktor
{
}
Poly::Poly(double multiplier) //konstruktor wywołujący addPolyComponent
{
addPolyComponent(multiplier , 0, 0);
}
double Poly::Mono::calculate(double x)
{
double monoresult = 0;
monoresult = pow(x,power);
monoresult *= multiplier;
cout <<"Wynik jednomianu: " << monoresult << endl;
return monoresult;
}
ostream& operator<<(ostream &out,const Poly &poly)
{
bool isFirst = true;
for (const Poly::Mono &mono : poly.polyComponents)
{
if (!isFirst)//dla pierwszego elementu nie chcemy wyświetlać łącznika, jeśli jest ujemny to będzie pokazane przy multiplierze
{
out << (mono.sign >= 0 ? "+" : "") << mono.multiplier << "x^" << mono.power << " ";
}
else
{
isFirst = false;
out << mono.multiplier << "x^" << mono.power << " ";
}
}
return out;
}
Poly operator+(const Poly &p1, const Poly &p2)
{
Poly p3;
p3.polyComponents = p1.polyComponents;
for (const Poly::Mono &mono : p2.polyComponents)
{
p3.polyComponents.push_back(mono);
}
p3.reducePoly();
return p3;
}
int main()
{
Poly P1; //Declare object representing polynomial P1
P1[3] = 2; P1[1] = 3.6; P1[0] = 7; //Specify coefficients of P1 = 2x^3 + 3.6x + 7
Poly P2 = 5; //Declare object representing polynomial P2 = 5
P2[1] = 3; P2[2] = 6; P2[4] = 1; //Specify additional coefficients of P2 = x^4 + 6x^2 + 3x + 5
cout << "Polynomial P1: " << P1 << endl; //Print P1
cout << "Polynomial P2: " << P2 << endl; //Print P2
Poly P3 = P1 + P2; //Add P1 and P2
cout << "Sum of polynomials P1 and P2: " << P3 << endl; //Print sum of P1 and P2
return 0;
}