YorKnEz

Untitled

May 31st, 2021
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.06 KB | None | 0 0
  1. #include "Polinom.h"
  2.  
  3. Polinom::Polinom()
  4. {
  5. _poli.push_back(new Monom());
  6. }
  7. Polinom::Polinom(const Polinom& dreapta) {
  8. for (int i = 0; i < dreapta._poli.size(); ++i)
  9. _poli.push_back(new Monom(*dreapta._poli[i]));
  10. }
  11. Polinom::~Polinom() {
  12. for (int i = 0; i < _poli.size(); ++i)
  13. delete(Monom*) _poli[i];
  14. }
  15.  
  16. int Polinom::gradPolinom() {
  17. return _poli[0]->grad;
  18. }
  19.  
  20. float Polinom::evaluare(float x) {
  21. float sum = 0;
  22. for (int i = 0; i < _poli.size(); ++i)
  23. sum += _poli[i]->coeficient * pow(x, _poli[i]->grad);
  24.  
  25. return sum;
  26. }
  27.  
  28. void Polinom::stergeZero() {
  29. if (_poli.size() == 1)
  30. return;
  31. vector<Monom*>::iterator start = _poli.begin(), sfarsit = _poli.end() - 1;
  32. do {
  33. --sfarsit;
  34. if (Monom::esteZero(*sfarsit)) {
  35. if (start == sfarsit) {
  36. _poli.erase(sfarsit);
  37. return;
  38. }
  39. auto aux = sfarsit;
  40. --sfarsit;
  41. _poli.erase(aux);
  42. ++sfarsit;
  43. }
  44. } while (sfarsit != start);
  45. }
  46.  
  47. void Polinom::add(float c, int g)
  48. {
  49. Monom* deAdaugat = new Monom(c, g);
  50. vector<Monom*>::iterator loc = upper_bound(_poli.begin(), _poli.end(), deAdaugat, Monom::comparatie);
  51. if ((*loc)->grad == g) {
  52. (*loc)->coeficient += c;
  53. return;
  54. }
  55.  
  56. _poli.insert(loc, deAdaugat);
  57. }
  58.  
  59. Polinom Polinom::operator*(float scalar) {
  60. if (abs(scalar) < FLT_EPSILON)
  61. return Polinom();
  62. Polinom out = *this;
  63. for (int i = 0; i < _poli.size(); ++i)
  64. out._poli[i]->coeficient *= scalar;
  65. return out;
  66. }
  67.  
  68. Polinom Polinom::operator+(const Polinom& dreapta) {
  69. Polinom out;
  70. int i = 0, j = 0;
  71.  
  72. while (i < _poli.size() && j < dreapta._poli.size()) {
  73.  
  74. if (_poli[i]->grad == dreapta._poli[j]->grad) {
  75. out.add(_poli[i]->coeficient + dreapta._poli[j]->coeficient, _poli[i]->grad);
  76. ++i;
  77. ++j;
  78. continue;
  79. }
  80. if (_poli[i]->grad < dreapta._poli[j]->grad) {
  81. out.add(_poli[i]->coeficient, _poli[i]->grad);
  82. ++i;
  83. continue;
  84. }
  85. out.add(dreapta._poli[j]->coeficient, dreapta._poli[j]->grad);
  86. ++j;
  87. }
  88. while (i < _poli.size()) {
  89. out.add(_poli[i]->coeficient, _poli[i]->grad);
  90. ++i;
  91. }
  92.  
  93. while (j < dreapta._poli.size()) {
  94. out.add(dreapta._poli[j]->coeficient, dreapta._poli[j]->grad);
  95. ++j;
  96. }
  97.  
  98. out.stergeZero();
  99. return out;
  100. }
  101.  
  102. istream& operator>>(istream& is, Polinom& p) {
  103. int g;
  104. float c;
  105. int monoame;
  106.  
  107. cout << "Numar monoame: "; is >> monoame;
  108.  
  109. for (int i = 0; i < monoame; ++i) {
  110. is >> c >> g;
  111. p.add(c, g);
  112. }
  113. is.get();
  114.  
  115. return is;
  116. }
  117.  
  118. ostream& operator<<(ostream& os, Polinom& p) {
  119. int sfarsit = (p._poli.size() == 1) ? 1 : p._poli.size()-1;
  120. for (int i = 0; i < sfarsit; ++i)
  121. os << "(" << p._poli[i]->coeficient << " " << p._poli[i]->grad << ") ";
  122. os << endl;
  123.  
  124. return os;
  125. }
  126.  
Advertisement
Add Comment
Please, Sign In to add comment