Advertisement
DoromaAnim

Untitled

Apr 4th, 2019
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.11 KB | None | 0 0
  1. #include "wielomian.hpp"
  2.  
  3. // WCZYTYWANIE 0
  4.  
  5. wielomian::wielomian(int st, double wsp)
  6. :n{st}
  7. {
  8. a = new double[st + 1];
  9. a[0] = wsp;
  10. }
  11.  
  12. wielomian::wielomian(int st, const double wsp[])
  13. :n{st}
  14. {
  15. a = new double[st + 1];
  16. for(int i = 0; i <= n; ++i)
  17. {
  18. a[i] = wsp[i];
  19. }
  20.  
  21. if(n != 0 && a[n] == 0)
  22. {
  23. throw invalid_argument("Zero wiodące w wielomianie");
  24. }
  25. }
  26.  
  27. wielomian::wielomian(initializer_list <double> wsp)
  28. :n{(int)wsp.size()}
  29. {
  30. a = new double[n];
  31. int temp = 0;
  32. for(auto& p : wsp)
  33. {
  34. a[temp++] = p;
  35. }
  36.  
  37. if(n != 0 && a[n] == 0)
  38. {
  39. throw invalid_argument("Zero wiodące w wielomianie");
  40. }
  41. }
  42.  
  43. wielomian::wielomian(const wielomian &w)
  44. {
  45. n = w.stopien();
  46. a = new double[n + 1];
  47. for(int i = 0; i <= n; ++i)
  48. {
  49. a[i] = w[i];
  50. }
  51. }
  52.  
  53. wielomian::wielomian(wielomian &&w)
  54. {
  55. n = w.stopien();
  56. a = w.a;
  57. w.a = nullptr;
  58.  
  59. }
  60.  
  61. wielomian::~wielomian()
  62. {
  63. if(a != nullptr)delete[] a;
  64. }
  65.  
  66. int wielomian::stopien() const
  67. {
  68. return n;
  69. }
  70.  
  71. double& wielomian::operator[](int index)
  72. {
  73. if(index > n)
  74. {
  75. throw logic_error("Wielomian ma mniejszy stopień");
  76. }
  77. return a[index];
  78. }
  79.  
  80. double wielomian::operator[](int index) const
  81. {
  82. if(index > n)
  83. {
  84. throw logic_error("Wielomian ma mniejszy stopień");
  85. }
  86. return a[index];
  87. }
  88.  
  89. void wielomian::norm()
  90. {
  91. if(n > 0 && !a[n])
  92. {
  93. int cnt = 0;
  94. for(int i = n; i > 0; --i)
  95. {
  96. if(a[i])break;
  97. cnt++;
  98. }
  99. int newn = n - cnt;
  100. double* ntab = new double[n - cnt + 1];
  101. for(int i = 0; i <= newn; ++i)
  102. {
  103. ntab[i] = a[i];
  104. }
  105. this->~wielomian();
  106. a = ntab;
  107. n = newn;
  108. }
  109. }
  110.  
  111. wielomian& wielomian::operator= (const wielomian &w)
  112. {
  113. n = w.stopien();
  114. if(this == &w)return *this;
  115. this->~wielomian();
  116. a = new double[n + 1];
  117. for(int i = 0; i <= n; ++i)
  118. {
  119. a[i] = w[i];
  120. }
  121. }
  122.  
  123. wielomian& wielomian::operator= (wielomian &&w)
  124. {
  125. if(this == &w)return *this;
  126. this->~wielomian();
  127. n = w.stopien();
  128. a = w.a;
  129. w.a = nullptr;
  130. }
  131.  
  132. istream& operator>> (istream &we, wielomian &w) // WCZYTAWANIE UJEMNEGO STOPNIA
  133. {
  134. w.~wielomian();
  135.  
  136. we >> w.n;
  137.  
  138. w.a = new double[w.n + 1];
  139.  
  140. for(int i = 0; i <= w.n; ++i)
  141. {
  142. we >> w.a[i];
  143. }
  144.  
  145. if(w.n != 0 && w.a[w.n] == 0)
  146. {
  147. throw invalid_argument("Zero wiodące w wielomianie");
  148. }
  149.  
  150. return we;
  151. }
  152.  
  153. ostream& operator<< (ostream &wy, const wielomian &w)
  154. {
  155. wy << w.n << "\n";
  156.  
  157. for(int i = 0; i <= w.n; ++i)
  158. {
  159. wy << w.a[i] << " ";
  160. }
  161.  
  162. return wy;
  163. }
  164.  
  165. wielomian operator+ (const wielomian& u, const wielomian& v)
  166. {
  167. wielomian res;
  168. res.~wielomian();
  169. res.n = max(u.stopien(), v.stopien());
  170. res.a = new double [res.n + 1];
  171. for(int i = 0; i <= res.n; ++i)
  172. {
  173. double tu = (u.stopien() >= i) ? u[i] : 0;
  174. double tv = (v.stopien() >= i) ? v[i] : 0;
  175. res.a[i] = tv + tu;
  176. }
  177.  
  178. res.norm();
  179.  
  180. return res;
  181. }
  182.  
  183. wielomian operator- (const wielomian& u, const wielomian& v) // ZMINIEJSZANIE STOPNIA
  184. {
  185. //cout << __PRETTY_FUNCTION__ << "\n";
  186. wielomian res;
  187. res.~wielomian();
  188. res.n = max(u.stopien(), v.stopien());
  189. res.a = new double [res.n + 1];
  190. for(int i = 0; i <= res.n; ++i)
  191. {
  192. double tu = (u.stopien() >= i) ? u[i] : 0;
  193. double tv = (v.stopien() >= i) ? v[i] : 0;
  194. res.a[i] = tu - tv;
  195. }
  196.  
  197. res.norm();
  198.  
  199. return res;
  200. }
  201.  
  202. wielomian operator* (const wielomian& u, const wielomian& v) // MNOZENIE i ZMINIEJSZANIE STOPNIA
  203. {
  204. wielomian res;
  205. res.~wielomian();
  206. res.n = u.stopien() + v.stopien();
  207. res.a = new double [res.n + 1]();
  208. for(int i = 0; i <= u.stopien(); ++i)
  209. {
  210. for(int j = 0; j <= v.stopien(); ++j)
  211. {
  212. res.a[i + j] += u[i] * v[j];
  213. }
  214. }
  215.  
  216. res.norm();
  217.  
  218. return res;
  219. }
  220.  
  221. wielomian operator* (const wielomian& u, double c) // BRAK ARGUMENTU?
  222. {
  223. wielomian temp(u);
  224.  
  225. for(int i = 0; i <= temp.n; ++i)
  226. {
  227. temp.a[i] *= c;
  228. }
  229.  
  230. temp.norm();
  231.  
  232. return temp;
  233. }
  234.  
  235. wielomian& wielomian::operator+= (const wielomian &v)
  236. {
  237. int prevn = n;
  238. double* tempa = a;
  239. n = max(n, v.stopien());
  240. a = new double[n + 1];
  241.  
  242. for(int i = 0; i <= n; ++i)
  243. {
  244. double tu = (prevn >= i) ? tempa[i] : 0;
  245. double tv = (v.stopien() >= i) ? v[i] : 0;
  246. a[i] = tu + tv;
  247. }
  248.  
  249. delete[] tempa;
  250.  
  251. this->norm();
  252.  
  253. return *this;
  254. }
  255.  
  256. wielomian& wielomian::operator-= (const wielomian &v)
  257. {
  258. cout << __PRETTY_FUNCTION__ << "\n";
  259. int prevn = n;
  260. double* tempa = a;
  261. n = max(n, v.stopien());
  262. a = new double[n + 1];
  263.  
  264. for(int i = 0; i <= n; ++i)
  265. {
  266. double tu = (prevn >= i) ? tempa[i] : 0;
  267. double tv = (v.stopien() >= i) ? v[i] : 0;
  268. a[i] = tu - tv;
  269. }
  270.  
  271. delete[] tempa;
  272.  
  273. this->norm();
  274.  
  275. return *this;
  276. }
  277.  
  278. wielomian& wielomian::operator*= (const wielomian &v)
  279. {
  280. int prevn = n;
  281. double* tempa = a;
  282. n = n + v.stopien();
  283. a = new double[n + 1]();
  284. for(int i = 0; i <= prevn; ++i)
  285. {
  286. for(int j = 0; j <= v.stopien(); ++j)
  287. {
  288. a[i + j] += tempa[i] * v[j];
  289. }
  290. }
  291.  
  292. delete[] tempa;
  293.  
  294. this->norm();
  295.  
  296. return *this;
  297. }
  298.  
  299. wielomian& wielomian::operator*= (double c)
  300. {
  301. for(int i = 0; i <= this->n; ++i)
  302. {
  303. this->a[i] *= c;
  304. }
  305.  
  306. this->norm();
  307.  
  308. return *this;
  309. }
  310.  
  311. double wielomian::operator() (double x) const
  312. {
  313. double tx = 1;
  314. double sum = 0;
  315.  
  316. for(int i = 0; i <= n; ++i)
  317. {
  318. sum += tx * a[i];
  319. tx *= x;
  320. }
  321.  
  322. return sum;
  323. }
  324.  
  325.  
  326.  
  327. #pragma once
  328.  
  329. #include <iostream>
  330.  
  331. using namespace std;
  332.  
  333. class wielomian
  334. {
  335. private:
  336. int n;
  337. double* a;
  338. public:
  339. wielomian(int st = 0, double wsp = 1.0);
  340. wielomian(int st, const double wsp[]);
  341. wielomian(initializer_list <double> wsp);
  342. wielomian(const wielomian &w);
  343. wielomian(wielomian &&w);
  344. ~wielomian();
  345.  
  346. int stopien() const;
  347.  
  348. double& operator[](int index); // wczyt
  349. double operator[](int index) const; // odczyt
  350. wielomian& operator= (const wielomian &w);
  351. wielomian& operator= (wielomian &&w);
  352. friend istream& operator>> (istream &we, wielomian &w);
  353. friend ostream& operator<< (ostream &wy, const wielomian &w);
  354. friend wielomian operator+ (const wielomian& u, const wielomian& v);
  355. friend wielomian operator- (const wielomian& u, const wielomian& v);
  356. friend wielomian operator* (const wielomian& u, const wielomian& v);
  357. friend wielomian operator* (const wielomian& u, double c);
  358. wielomian& operator+= (const wielomian &v);
  359. wielomian& operator-= (const wielomian &v);
  360. wielomian& operator*= (const wielomian &v);
  361. wielomian& operator*= (double c);
  362. double operator() (double x) const;
  363. void norm();
  364.  
  365. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement