Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Polinom.h"
- Polinom::Polinom()
- {
- _poli.push_back(new Monom());
- }
- Polinom::Polinom(const Polinom& dreapta) {
- for (int i = 0; i < dreapta._poli.size(); ++i)
- _poli.push_back(new Monom(*dreapta._poli[i]));
- }
- Polinom::~Polinom() {
- for (int i = 0; i < _poli.size(); ++i)
- delete(Monom*) _poli[i];
- }
- int Polinom::gradPolinom() {
- return _poli[0]->grad;
- }
- float Polinom::evaluare(float x) {
- float sum = 0;
- for (int i = 0; i < _poli.size(); ++i)
- sum += _poli[i]->coeficient * pow(x, _poli[i]->grad);
- return sum;
- }
- void Polinom::stergeZero() {
- if (_poli.size() == 1)
- return;
- vector<Monom*>::iterator start = _poli.begin(), sfarsit = _poli.end() - 1;
- do {
- --sfarsit;
- if (Monom::esteZero(*sfarsit)) {
- if (start == sfarsit) {
- _poli.erase(sfarsit);
- return;
- }
- auto aux = sfarsit;
- --sfarsit;
- _poli.erase(aux);
- ++sfarsit;
- }
- } while (sfarsit != start);
- }
- void Polinom::add(float c, int g)
- {
- Monom* deAdaugat = new Monom(c, g);
- vector<Monom*>::iterator loc = upper_bound(_poli.begin(), _poli.end(), deAdaugat, Monom::comparatie);
- if ((*loc)->grad == g) {
- (*loc)->coeficient += c;
- return;
- }
- _poli.insert(loc, deAdaugat);
- }
- Polinom Polinom::operator*(float scalar) {
- if (abs(scalar) < FLT_EPSILON)
- return Polinom();
- Polinom out = *this;
- for (int i = 0; i < _poli.size(); ++i)
- out._poli[i]->coeficient *= scalar;
- return out;
- }
- Polinom Polinom::operator+(const Polinom& dreapta) {
- Polinom out;
- int i = 0, j = 0;
- while (i < _poli.size() && j < dreapta._poli.size()) {
- if (_poli[i]->grad == dreapta._poli[j]->grad) {
- out.add(_poli[i]->coeficient + dreapta._poli[j]->coeficient, _poli[i]->grad);
- ++i;
- ++j;
- continue;
- }
- if (_poli[i]->grad < dreapta._poli[j]->grad) {
- out.add(_poli[i]->coeficient, _poli[i]->grad);
- ++i;
- continue;
- }
- out.add(dreapta._poli[j]->coeficient, dreapta._poli[j]->grad);
- ++j;
- }
- while (i < _poli.size()) {
- out.add(_poli[i]->coeficient, _poli[i]->grad);
- ++i;
- }
- while (j < dreapta._poli.size()) {
- out.add(dreapta._poli[j]->coeficient, dreapta._poli[j]->grad);
- ++j;
- }
- out.stergeZero();
- return out;
- }
- istream& operator>>(istream& is, Polinom& p) {
- int g;
- float c;
- int monoame;
- cout << "Numar monoame: "; is >> monoame;
- for (int i = 0; i < monoame; ++i) {
- is >> c >> g;
- p.add(c, g);
- }
- is.get();
- return is;
- }
- ostream& operator<<(ostream& os, Polinom& p) {
- int sfarsit = (p._poli.size() == 1) ? 1 : p._poli.size()-1;
- for (int i = 0; i < sfarsit; ++i)
- os << "(" << p._poli[i]->coeficient << " " << p._poli[i]->grad << ") ";
- os << endl;
- return os;
- }
Advertisement
Add Comment
Please, Sign In to add comment