Advertisement
Guest User

Untitled

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