Advertisement
Guest User

Untitled

a guest
Dec 17th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.20 KB | None | 0 0
  1. #pragma once
  2. #include <iostream>
  3. #include <cmath>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. template <typename T>
  8. class Polinom {
  9. private:
  10. int n;
  11. T *koef;
  12. template <typename T> friend ostream& operator << (ostream &, const Polinom<T> &); // перегрузка вывода
  13. public:
  14. Polinom() {};
  15. Polinom(T c); // конструктор с 1 коэф
  16. Polinom(T *a, int size); // конструктор с массивом коэф
  17. Polinom(Polinom<T> &p); // конструктор копирования
  18. ~Polinom(); // деструктор
  19. Polinom operator + (Polinom<T> &p);
  20. Polinom operator - (Polinom<T> &p);
  21. Polinom operator * (Polinom<T> &p);
  22.  
  23. Polinom operator *=(Polinom<T> &p);
  24. Polinom operator -=(Polinom<T> &p);
  25. Polinom operator +=(Polinom<T> &p);
  26. bool operator ==(Polinom<T> &p);
  27. bool operator !=(Polinom<T> &p);
  28. T operator () (T x);
  29. };
  30.  
  31. template <typename T>
  32. Polinom<T>::Polinom(T c)
  33. {
  34. n = 1;
  35. koef = new T[n];
  36. koef[0] = c;
  37. }
  38.  
  39. template <typename T>
  40. Polinom<T>::Polinom(T *a, int sz)
  41. {
  42. n = sz;
  43. koef = new T[n];
  44. for (int i = 0; i<n; i++)
  45. koef[i] = a[i];
  46. }
  47.  
  48. template <typename T>
  49. Polinom<T>::Polinom(Polinom<T> &p)
  50. {
  51. n = p.n;
  52. koef = new T[n];
  53. for (int i = 0; i<n; i++)
  54. koef[i] = p.koef[i];
  55. }
  56.  
  57. template <typename T>
  58. Polinom<T>::~Polinom()
  59. {
  60. delete[]koef;
  61. }
  62.  
  63.  
  64. template <typename T>
  65. ostream& operator <<(ostream &out, const Polinom<T> &p)
  66. {
  67. bool has = false;
  68. for (int i = p.n - 1; i >= 0; i--)
  69. {
  70. T kf = p.koef[i];
  71. if (kf < 0)
  72. {
  73. if (kf != -1 || i == 0)
  74. {
  75.  
  76. out << kf;
  77. if (i > 0)
  78. {
  79. out << "*x";
  80. if (i>1)
  81. out << "^(" << i << ")";
  82. }
  83. has = true;
  84.  
  85. }
  86. else
  87. {
  88. out << '-';
  89. if (i > 0)
  90. {
  91. out << "x";
  92. if (i>1)
  93. out << "^(" << i << ")";
  94. }
  95. has = true;
  96.  
  97. }
  98. }
  99. else
  100. if (kf > 0)
  101. {
  102. if (has)
  103. {
  104. out << "+";
  105. has = true;
  106. }
  107. if (kf > 1 || i == 0)
  108. {
  109. out << kf;
  110. if (i > 0)
  111. {
  112. out << "*x";
  113. if (i>1)
  114. out << "^(" << i << ")";
  115. }
  116. has = true;
  117. }
  118. else
  119. {
  120. if (i > 0)
  121. {
  122. out << "x";
  123. if (i>1)
  124. out << "^(" << i << ")";
  125. }
  126. has = true;
  127. }
  128.  
  129. }
  130. }
  131. if (!has)
  132. out << 0;
  133. out << endl;
  134. return out;
  135. }
  136.  
  137. template <typename T>
  138. Polinom<T> Polinom<T>::operator +(Polinom<T> &p)
  139. {
  140. int newn = max(n, p.n);
  141. Polinom<T> res = Polinom<T>();
  142. res.n = newn;
  143. res.koef = new T[n];
  144. for (int i = 0; i < newn; i++)
  145. {
  146. T x = 0;
  147. if (i < n)
  148. x = koef[i];
  149. T y = 0;
  150. if (i < p.n)
  151. y = p.koef[i];
  152. res.koef[i] = x + y;
  153. }
  154. return res;
  155. }
  156.  
  157. template <typename T>
  158. Polinom<T>Polinom<T>::operator -(Polinom<T> &p)
  159. {
  160. int newn = max(n, p.n);
  161. Polinom res = Polinom();
  162. res.n = newn;
  163. res.koef = new T[n];
  164. for (int i = 0; i < newn; i++)
  165. {
  166. T x = 0;
  167. if (i < n)
  168. x = koef[i];
  169. T y = 0;
  170. if (i < p.n)
  171. y = p.koef[i];
  172. res.koef[i] = x - y;
  173. }
  174. return res;
  175. }
  176.  
  177. template <typename T>
  178. Polinom<T>Polinom<T>::operator *(Polinom<T> &p)
  179. {
  180. int newn = n + p.n-1;
  181. Polinom res = Polinom();
  182. res.n = newn;
  183. res.koef = new T[newn];
  184. for (int i = 0; i < newn; i++)
  185. res.koef[i] = 0;
  186.  
  187. for (int i = 0; i < n; i++)
  188. {
  189. for (int j = 0; j<p.n; j++)
  190. res.koef[i+j] += koef[i]*p.koef[j];
  191. }
  192. return res;
  193. }
  194.  
  195. template <typename T>
  196. Polinom<T> Polinom<T>::operator *=(Polinom<T> &p)
  197. {
  198. int newn = n + p.n - 1;
  199. Polinom res = Polinom();
  200. res.n = newn;
  201. res.koef = new T[newn];
  202. for (int i = 0; i < newn; i++)
  203. res.koef[i] = 0;
  204.  
  205. for (int i = 0; i < n; i++)
  206. {
  207. for (int j = 0; j<p.n; j++)
  208. res.koef[i + j] += koef[i] * p.koef[j];
  209. }
  210. delete[]this->koef;
  211. n = newn;
  212. koef = new T[n];
  213. for (int i = 0; i < n; i++)
  214. koef[i] = res.koef[i];
  215. return *this;
  216. }
  217.  
  218. template <typename T>
  219. Polinom<T> Polinom<T>::operator -=(Polinom<T> &p)
  220. {
  221. int newn = max(n, p.n);
  222. Polinom res = Polinom();
  223. res.n = newn;
  224. res.koef = new T[newn];
  225. for (int i = 0; i < newn; i++)
  226. {
  227. T x = 0;
  228. if (i < n)
  229. x = koef[i];
  230. T y = 0;
  231. if (i < p.n)
  232. y = p.koef[i];
  233. res.koef[i] = x - y;
  234. }
  235. delete [] this->koef;
  236. n = newn;
  237. koef = new T[n];
  238. for (int i = 0; i < n; i++)
  239. koef[i] = res.koef[i];
  240. return *this;
  241. }
  242.  
  243. template <typename T>
  244. Polinom<T> Polinom<T>::operator +=(Polinom<T> &p)
  245. {
  246. int newn = max(n, p.n);
  247. Polinom res = Polinom();
  248. res.n = newn;
  249. res.koef = new T[newn];
  250. for (int i = 0; i < newn; i++)
  251. {
  252. T x = 0;
  253. if (i < n)
  254. x = koef[i];
  255. T y = 0;
  256. if (i < p.n)
  257. y = p.koef[i];
  258. res.koef[i] = x + y;
  259. }
  260. delete []this->koef;
  261. n = newn;
  262. koef = new T[n];
  263. for (int i = 0; i < n; i++)
  264. koef[i] = res.koef[i];
  265. return this;
  266. }
  267.  
  268. template <typename T>
  269. bool Polinom<T>::operator ==(Polinom<T> &p)
  270. {
  271. for (int i = 0; i < max(n, p.n); i++)
  272. {
  273. T x = 0;
  274. if (i < n)
  275. x = koef[i];
  276. T y = 0;
  277. if (i < p.n)
  278. y = p.koef[i];
  279. if (x != y)
  280. return false;
  281. }
  282. return true;
  283. }
  284.  
  285. template <typename T>
  286. bool Polinom<T>::operator !=(Polinom<T> &p)
  287. {
  288. return !(this == p);
  289. }
  290.  
  291. template <typename T>
  292. T Polinom<T>::operator () (T x)
  293. {
  294. T ans = 0;
  295. T pow = 1;
  296. for (int i = 0; i < n; i++,pow*=x)
  297. {
  298. ans += pow*koef[i];
  299. }
  300. return ans;
  301. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement