Advertisement
Guest User

Untitled

a guest
Mar 28th, 2017
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.53 KB | None | 0 0
  1. //main
  2.  
  3. #include <iostream>
  4. #include <string>
  5. #include "wielomian.h"
  6.  
  7. using namespace std;
  8.  
  9. void testy_konstruktorow();
  10. void testy_sytuacji_wyjatkowych();
  11. void testy_operacji_arytmetycznych();
  12. void program();
  13.  
  14. int main()
  15. {
  16. cout<<"TESTY:"<<endl<<endl;
  17. cout<<"Konstruktory:"<<endl;
  18. cout<<"Bezargumentowy:"<<endl;
  19. wielomian w1;
  20. cout << w1 << "\nwielomian(int,double):"<<endl;
  21. wielomian w2(6, 2.351);
  22. cout << w2 << "\nwielomian(int, const double[]):"<<endl;
  23. double tab[] = { 4.1,4.2,4.3,4.4,4.5,4.6,4.7,4.8 };
  24. wielomian w3(5, tab);
  25. cout << w3 << "\nwielomian(initializer_list<double>):"<<endl;
  26. initializer_list<double> pl{ 123, 323.5, 234.2, 444444.44, 3.1412 };
  27. wielomian w4(pl);
  28. cout << w4 <<endl<<endl;
  29.  
  30.  
  31. cout << "Operacje matematycznie"<<endl;
  32. double pom1[] = { 4.2,4,4.4,3,23 };
  33. wielomian w5(4, pom1);
  34. initializer_list<double> pl2{ 555.4,55.3,13.3,42.4,6.4,1.2 };
  35. wielomian w6(pl2);
  36. cout<<w5<<endl<<w6;
  37. cout << "w1+w2: " << w5 + w6 << endl;
  38. cout << "w1-w2: " << w5 - w6 << endl;
  39. double pom2[] = { 1,2,3.2 };
  40. double pom3[] = { 1,2.3 };
  41. wielomian w7(2, pom2);
  42. wielomian w8(1, pom3);
  43. cout << "w3*w4: " << w7*w8 << endl;
  44. cout << "w3*2.5: " << w7*2.5 << endl;
  45. w7 += w8;
  46. cout << "w3+=w4: " << w7 << endl;
  47. w7 -= w8 += w7;
  48. cout << "w3-=w4+=w3: " << w7 << endl;
  49. w7 *= w8;
  50. cout << "w3*=w4: " << w7 << endl;
  51. w7 *= 2.5;
  52. cout << "w3*=2.5: " << w7 << endl;
  53. cout << "wartosc w3 w punkcie 1.5: " << w7(1.5) << endl;
  54. cout << "wspolczynnik w3 przy x^2: " << w7[2] << endl;
  55. }
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62. //funkcje
  63. #include <iostream>
  64. #include <string>
  65. #include "wielomian.h"
  66.  
  67. using namespace std;
  68.  
  69. //zamiast std::cerr wolalbym wyjatki, no ale specyfikacja
  70.  
  71. wielomian::wielomian(int st, double wsp) : stopien(st)// konstruktor tworzący jednomian
  72. {
  73. if(wsp==0)
  74. {
  75. cerr<<"Wspolczynnik przy najwiekszej potedze jest rowny zero zatem stopien jest bledny!"<<endl;
  76. return;
  77. }
  78. wspolczynniki = new double[st+1];
  79. for(int i=0; i<=st; i++)
  80. wspolczynniki[i]=wsp;
  81. }
  82.  
  83. wielomian::wielomian(int st, const double wsp[]) : stopien(st)// konstruktor tworzący wielomian
  84. {
  85.  
  86. if(wsp[st]==0)
  87. {
  88. cerr<<"Wspolczynnik przy najwiekszej potedze jest rowny zero zatem stopien jest bledny!"<<endl;
  89. return;
  90. }
  91. wspolczynniki = new double[st+1];
  92. for(int i=0; i<=st; i++)
  93. wspolczynniki[i]=wsp[i];
  94. }
  95.  
  96. wielomian::wielomian (initializer_list<double> wsp) // lista współczynników
  97. {
  98. if(*(wsp.end()-1) == 0)
  99. {
  100. cerr<<"Wspolczynnik przy najwiekszej potedze jest rowny zero zatem stopien jest bledny!"<<endl;
  101. return;
  102. }
  103. stopien = wsp.size() - 1;
  104. wspolczynniki = new double[stopien + 1];
  105. int i=0;
  106. for(auto iterator = wsp.begin(); iterator != wsp.end(); i++, iterator++)
  107. wspolczynniki[i] = *iterator;
  108. }
  109.  
  110. wielomian::wielomian(const wielomian &pierwotny) // konstruktor kopijący
  111. {
  112. stopien = pierwotny.stopien;
  113. wspolczynniki = new double[stopien + 1];
  114. for(int i=0 ; i<stopien; i++)
  115. wspolczynniki[i] = pierwotny.wspolczynniki[i];
  116. }
  117.  
  118.  
  119. wielomian::wielomian(wielomian &&pierwotny) // konstruktor przenoszący
  120. {
  121. stopien = pierwotny.stopien;
  122. wspolczynniki = pierwotny.wspolczynniki;
  123. pierwotny.wspolczynniki = nullptr;
  124. }
  125.  
  126. wielomian& wielomian::operator = (const wielomian &pierwotny) // przypisanie kopijące
  127. {
  128. this->~wielomian();
  129.  
  130. stopien = pierwotny.stopien;
  131. wspolczynniki = new double[stopien + 1];
  132. for(int i=0 ; i<stopien; i++)
  133. wspolczynniki[i] = pierwotny.wspolczynniki[i];
  134. return *this;
  135. }
  136.  
  137. wielomian& wielomian::operator = (wielomian &&pierwotny)// przypisanie przenoszące
  138. {
  139. this->~wielomian();
  140.  
  141. stopien = pierwotny.stopien;
  142. wspolczynniki = pierwotny.wspolczynniki;
  143. pierwotny.wspolczynniki = nullptr;
  144.  
  145. return *this;
  146. }
  147.  
  148. wielomian::~wielomian() // destruktor
  149. {
  150. delete[] wspolczynniki;
  151. }
  152.  
  153.  
  154. istream& operator >> (istream &we, wielomian &w)
  155. {
  156. cout<<"Podaj stopien wielomianu (w postaci liczby naturnalnej)"<<endl;
  157. we >> w.stopien;
  158. w.~wielomian();
  159. w.wspolczynniki = new double[w.stopien + 1];
  160. cout<<"Podawaj kolejne wspolczynniki"<<endl;
  161. for (int i=0; i<w.stopien; i++)
  162. {
  163. we >> w.wspolczynniki[i];
  164. }
  165. cout<<"Podaj wspolczynnik przy x o najwiekszej potedze (musi byc rozny od 0)"<<endl;
  166. return we;
  167. }
  168.  
  169. ostream& operator << (ostream &wy, const wielomian &wzor)
  170. {
  171. for (int i=wzor.stopien; i>=1; i--)
  172. {
  173. wy << wzor.wspolczynniki[i] << "*x^" << i << " + ";
  174. }
  175. wy << wzor.wspolczynniki[0] << endl;
  176. return wy;
  177. }
  178.  
  179.  
  180. wielomian operator+(const wielomian &u, const wielomian &v)
  181. {
  182. int st = stopien_plus(u, v);
  183. double *wsp = policz_wspolczynniki_suma(u, v, st);
  184. wielomian w(st, wsp);
  185. delete[] wsp;
  186. return w;
  187. }
  188.  
  189. wielomian operator-(const wielomian &u, const wielomian &v)
  190. {
  191. int st = stopien_minus(u, v);
  192. double *wsp = policz_wspolczynniki_roznica(u, v, st);
  193. wielomian w(st, wsp);
  194. delete[] wsp;
  195. return w;
  196. }
  197.  
  198. wielomian operator*(const wielomian &u, const wielomian &v)
  199. {
  200. int st = u.stopien + v.stopien;
  201. double *wsp = policz_wspolczynniki_iloczyn(u, v, st);
  202. wielomian w(st, wsp);
  203. delete[] wsp;
  204. return w;
  205. }
  206.  
  207. wielomian operator*(const wielomian &u, double m)
  208. {
  209. wielomian w = u;
  210. for (int i = 0; i <= w.stopien; i++)
  211. w.wspolczynniki[i] *= m;
  212. return w;
  213. }
  214.  
  215. wielomian& wielomian::operator+=(const wielomian &v)
  216. {
  217. int st = stopien_plus(*this, v);
  218. double *wsp = policz_wspolczynniki_suma(*this, v, st);
  219. wielomian *w = new wielomian(st, wsp);
  220. *this = *w; //tu korzystamy z przypisania kop
  221. delete[] wsp;
  222. delete w;
  223. return *this;
  224. }
  225.  
  226. wielomian& wielomian::operator-=(const wielomian &v)
  227. {
  228. int st = stopien_minus(*this, v);
  229. double *wsp = policz_wspolczynniki_roznica(*this, v, st);
  230. wielomian *w = new wielomian(st, wsp);
  231. *this = *w;
  232. delete[] wsp;
  233. delete w;
  234. return *this;
  235. }
  236.  
  237. wielomian& wielomian::operator*=(const wielomian &v)
  238. {
  239. int st = stopien + v.stopien;
  240. double *wsp = policz_wspolczynniki_iloczyn(*this, v, st);
  241. wielomian *w = new wielomian(st, wsp);
  242. *this = *w;
  243. delete[] wsp;
  244. delete w;
  245. return *this;
  246. }
  247.  
  248. wielomian& wielomian::operator*=(double c)
  249. {
  250. for (int i = 0; i <= stopien; i++)
  251. wspolczynniki[i] *= c;
  252. return *this;
  253. }
  254.  
  255. double wielomian::operator()(double x) const
  256. {
  257. if (stopien == 0)
  258. return wspolczynniki[0];
  259. double wynik = x*wspolczynniki[stopien] + wspolczynniki[stopien - 1];
  260. for (int i = stopien-2; i >= 0; i--)
  261. wynik = wynik*x + wspolczynniki[i];
  262. return wynik;
  263. }
  264.  
  265. double wielomian::operator[](int i) const
  266. {
  267. if (i > stopien || i < 0)
  268. {
  269. std::cerr << "Zle podany indeks wspolczynnika!\n";
  270. return 0;
  271. }
  272.  
  273. return wspolczynniki[i];
  274. }
  275.  
  276. int stopien_plus(const wielomian &u, const wielomian &v)
  277. {
  278. int st = max(u.stopien, v.stopien);
  279. while (u.stopien == v.stopien && st > 0 && (u.wspolczynniki[st] + v.wspolczynniki[st] == 0))
  280. st--;
  281. return st;
  282. }
  283.  
  284. int stopien_minus(const wielomian &u, const wielomian &v)
  285. {
  286. int st = max(u.stopien, v.stopien);
  287. while (u.stopien == v.stopien && st > 0 && (u.wspolczynniki[st] - v.wspolczynniki[st] == 0))
  288. st--;
  289. return st;
  290. }
  291.  
  292. double* policz_wspolczynniki_suma(const wielomian &u, const wielomian &v, int st)
  293. {
  294. double *wsp = new double[st + 1];
  295. int i;
  296. for (i = 0; i <= u.stopien && i <= v.stopien && i <= st; i++)
  297. wsp[i] = u.wspolczynniki[i] + v.wspolczynniki[i];
  298. if (u.stopien > v.stopien)
  299. for (;i <= u.stopien && i <= st;i++)
  300. wsp[i] = u.wspolczynniki[i];
  301.  
  302. else if (v.stopien > u.stopien)
  303. for (;i <= v.stopien && i <= st;i++)
  304. wsp[i] = v.wspolczynniki[i];
  305. return wsp;
  306. }
  307.  
  308. double* policz_wspolczynniki_roznica(const wielomian &u, const wielomian &v, int st)
  309. {
  310. double *wsp = new double[st + 1];
  311. int i;
  312. for (i = 0; i <= u.stopien && i <= v.stopien && i <= st; i++)
  313. wsp[i] = u.wspolczynniki[i] - v.wspolczynniki[i];
  314. if (u.stopien > v.stopien)
  315. for (;i <= u.stopien && i <= st; i++)
  316. wsp[i] = u.wspolczynniki[i];
  317.  
  318. else if (v.stopien > u.stopien)
  319. for (;i <= v.stopien && i <= st; i++)
  320. wsp[i] = v.wspolczynniki[i] * (-1);
  321. return wsp;
  322. }
  323.  
  324. double* policz_wspolczynniki_iloczyn(const wielomian &u, const wielomian &v, int st)
  325. {
  326. double *wsp = new double[st + 1];
  327. for (int i = 0; i <= st; i++)
  328. wsp[i] = 0;
  329.  
  330. for (int i = 0; i <= u.stopien; i++)
  331. for (int j = 0; j <= v.stopien; j++)
  332. wsp[i + j] += u.wspolczynniki[i] * v.wspolczynniki[j];
  333. return wsp;
  334. }
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342. //deklaracje
  343. #include <iostream>
  344.  
  345.  
  346. class wielomian
  347. {
  348. private:
  349. int stopien;
  350. double *wspolczynniki;
  351.  
  352. public:
  353. wielomian(int st = 0, double wsp = 1.0);
  354. wielomian(int st, const double wsp[]);
  355. wielomian(std::initializer_list<double> wsp);
  356. wielomian(const wielomian &w);
  357. wielomian(wielomian &&w);
  358. wielomian& operator=(const wielomian &w);
  359. wielomian& operator=(wielomian &&w);
  360. ~wielomian();
  361.  
  362. wielomian& operator+=(const wielomian &v);
  363. wielomian& operator-=(const wielomian &v);
  364. wielomian& operator*=(const wielomian &v);
  365. wielomian& operator*=(double c);
  366. double operator()(double x) const; // obliczenie wartości wielomianu w x-sie
  367. double operator[](int i) const; // odczytanie i-tego współczynnika
  368.  
  369. int get_stopien();
  370.  
  371. friend std::istream& operator>>(std::istream &we, wielomian &w);
  372. friend std::ostream& operator<<(std::ostream &wy, const wielomian &w);
  373. friend wielomian operator+(const wielomian &u, const wielomian &v);
  374. friend wielomian operator-(const wielomian &u, const wielomian &v);
  375. friend wielomian operator*(const wielomian &u, const wielomian &v);
  376. friend wielomian operator*(const wielomian &u, double c);
  377. friend int stopien_plus(const wielomian &u, const wielomian &v);
  378. friend int stopien_minus(const wielomian &u, const wielomian &v);
  379. friend double* policz_wspolczynniki_suma(const wielomian &u, const wielomian &v, int st);
  380. friend double* policz_wspolczynniki_roznica(const wielomian &u, const wielomian &v, int st);
  381. friend double* policz_wspolczynniki_iloczyn(const wielomian &u, const wielomian &v, int st);
  382. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement