#include "funkcija.hpp" #include #include using namespace std; void IdFja::ispisi() const { cout << "x"; } void Konst::ispisi() const { cout << _v; } BinOp::~BinOp() { delete _leva; delete _desna; } UnOp::~UnOp() { delete _f; } void Zbir::ispisi() const { int lp = _leva->prioritet(); int p = prioritet(); int dp = _desna->prioritet(); if (lp < p) cout << "("; _leva->ispisi(); if (lp < p) cout << ")"; cout << " + "; if (dp < p) cout << "("; _desna->ispisi(); if (dp < p) cout << ")"; } void Razlika::ispisi() const { int lp = _leva->prioritet(); int p = prioritet(); int dp = _desna->prioritet(); if (lp < p) cout << "("; _leva->ispisi(); if (lp < p) cout << ")"; cout << " - "; if (dp < p) cout << "("; _desna->ispisi(); if (dp < p) cout << ")"; } void Proizvod::ispisi() const { int lp = _leva->prioritet(); int p = prioritet(); int dp = _desna->prioritet(); if (lp < p) cout << "("; _leva->ispisi(); if (lp < p) cout << ")"; cout << " * "; if (dp < p) cout << "("; _desna->ispisi(); if (dp < p) cout << ")"; } void Kolicnik::ispisi() const { int lp = _leva->prioritet(); int p = prioritet(); int dp = _desna->prioritet(); if (lp < p) cout << "("; _leva->ispisi(); if (lp < p) cout << ")"; cout << " / "; if (dp < p) cout << "("; _desna->ispisi(); if (dp < p) cout << ")"; } void Sin::ispisi() const { cout << "sin("; _f->ispisi(); cout << ")"; } void Cos::ispisi() const { cout << "cos("; _f->ispisi(); cout << ")"; } Funkcija* IdFja::izvod() const { return new Konst(1); } Funkcija* Konst::izvod() const { return new Konst(0); } Funkcija* Zbir::izvod() const { return new Zbir(_leva->izvod(), _desna->izvod()); } Funkcija* Razlika::izvod() const { return new Razlika(_leva->izvod(), _desna->izvod()); } Funkcija* Proizvod::izvod() const { return new Zbir( new Proizvod(_leva->izvod(), _desna->kopija()), new Proizvod(_leva->kopija(), _desna->izvod()) ); } Funkcija* Kolicnik::izvod() const { return new Kolicnik(new Razlika( new Proizvod(_leva->izvod(), _desna->kopija()), new Proizvod(_leva->kopija(), _desna->izvod()) ), new Proizvod(_desna->kopija(), _desna->kopija()) ); } Funkcija* Sin::izvod() const { return new Proizvod(new Cos(_f->kopija()), _f->izvod()); } Funkcija* Cos::izvod() const { return new Razlika(new Konst(0), new Proizvod(new Sin(_f->kopija()), _f->izvod())); } Funkcija* IdFja::kopija() const { return new IdFja(); } Funkcija* Konst::kopija() const { return new Konst(_v); } Funkcija* Zbir::kopija() const { return new Zbir(_leva->kopija(), _desna->kopija()); } Funkcija* Razlika::kopija() const { return new Razlika(_leva->kopija(), _desna->kopija()); } Funkcija* Proizvod::kopija() const { return new Proizvod(_leva->kopija(), _desna->kopija()); } Funkcija* Kolicnik::kopija() const { return new Kolicnik(_leva->kopija(), _desna->kopija()); } Funkcija* Sin::kopija() const { return new Sin(_f->kopija()); } Funkcija* Cos::kopija() const { return new Cos(_f->kopija()); } double IdFja::vrednost(double x) const { return x; } double Konst::vrednost(double x) const { return _v; } double Zbir::vrednost(double x) const { return _leva->vrednost(x) + _desna->vrednost(x); } double Razlika::vrednost(double x) const { return _leva->vrednost(x) - _desna->vrednost(x); } double Proizvod::vrednost(double x) const { return _leva->vrednost(x) * _desna->vrednost(x); } double Kolicnik::vrednost(double x) const { return _leva->vrednost(x) / _desna->vrednost(x); } double Sin::vrednost(double x) const { return sin(_f->vrednost(x)); } double Cos::vrednost(double x) const { return cos(_f->vrednost(x)); } int IdFja::prioritet() const { return 3; } int Konst::prioritet() const { return 3; } int Zbir::prioritet() const { return 1; } int Razlika::prioritet() const { return 1; } int Proizvod::prioritet() const { return 2; } int Kolicnik::prioritet() const { return 2; } int Sin::prioritet() const { return 3; } int Cos::prioritet() const { return 3; }