Advertisement
Guest User

Untitled

a guest
Mar 28th, 2017
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.79 KB | None | 0 0
  1. #include <iostream>
  2. #include <string.h>
  3. #include <fstream>
  4.  
  5. using namespace std;
  6.  
  7. // ////////////////////////////////////////////////
  8. // Polynomial class
  9. // ///////////////////////////////////////////////
  10.  
  11. class Polynomial {
  12. private:
  13. unsigned int degree;
  14. double * coefficients;
  15. public:
  16. void setCoefficient(unsigned int i, double value)
  17. {
  18. coefficients[i]=value;
  19. }
  20. double getCoefficient(unsigned int i)
  21. {
  22. return coefficients[i];
  23. }
  24. double value(double x)
  25. {
  26. double v=0.0;
  27. for(unsigned int i=degree; i>0; i--) v=x*v+coefficients[i];
  28. v=x*v+coefficients[0];
  29. return v;
  30. }
  31.  
  32. Polynomial(unsigned int n)
  33. {
  34. degree=n;
  35. coefficients=new double[n+1];
  36. for(unsigned int i=0; i<n; i++)
  37. {
  38. coefficients[i]=0.0;
  39. }
  40. coefficients[n]=1.0;
  41. }
  42. ~Polynomial()
  43. {
  44. delete coefficients;
  45. }
  46.  
  47. friend ostream & operator<<(ostream & out, Polynomial & p)
  48. {
  49. bool first=false;
  50. for(unsigned int i=p.degree; i>1; i--)
  51. {
  52. if(first && p.coefficients[i]!=0) out << "+";
  53. if(p.coefficients[i]!=0) { out << p.coefficients[i] << "*x^" << i; first=true; }
  54. }
  55. if(first && p.coefficients[1]!=0) out << "+";
  56. if(p.coefficients[1]!=0) { out << p.coefficients[1] << "*x"; first=true; }
  57. if(first && p.coefficients[0]!=0) out << "+";
  58. if(p.coefficients[0]!=0) out << p.coefficients[0];
  59. return out;
  60. }
  61. };
  62.  
  63. // //////////////////////////////////////////////////
  64. // other program-specific variables and functions
  65. // ///////////////////////////////////////////////////
  66.  
  67. /* prosi o podanie liczby int lub lancucha
  68. * wyswietlajac komunikat txt
  69. * ustawia odpowiednio:
  70. * n i zwraca READ_INT
  71. * ALBO
  72. * s i zwraca READ_STRING
  73. */
  74.  
  75. typedef enum { READ_ERROR, READ_INT, READ_STRING } readValue_t;
  76.  
  77. readValue_t getIntOrString(string txt, unsigned int &n, string &s)
  78. {
  79. char decyzja;
  80.  
  81. cout << txt;
  82. decyzja = cin.peek();
  83.  
  84. if(isdigit(decyzja))
  85. {
  86. cin >> n;
  87. return READ_INT;
  88. }
  89. else
  90. {
  91. getline(cin, s);
  92. return READ_STRING;
  93. }
  94. return READ_ERROR;
  95. }
  96.  
  97. // czyta z zadanego strumienia wartosc float
  98. // mozna etykietowac jako inline - krotki kawalek, czesto wykonywany
  99. // aby nie generowac narzutu w postaci kazdorazowego wywolywania funkcji
  100. // kompilator wstawi cialo tej funkcji bezposrednio w kazdym miejscu,
  101. // gdzie jest wywolywana
  102. inline double readDoubleFromStream(istream &str)
  103. {
  104. double f;
  105. str >> f;
  106. return f;
  107. }
  108.  
  109.  
  110.  
  111.  
  112.  
  113. int main(int argc, char* argv[])
  114. {
  115. string nazwaPliku;
  116. char decyzja;
  117. unsigned int stopien;
  118. ifstream infs;
  119. double val;
  120. // wskaznik na obiekt typu istream
  121. istream *czytanie = NULL;
  122.  
  123. do {
  124. // pobierz nazwe lub liczbe
  125. readValue_t
  126. wynik = getIntOrString("Podaj nazwę pliku lub stopień wielomianiu, lub 0 by zakończyć: ",
  127. stopien,
  128. nazwaPliku);
  129.  
  130. switch(wynik)
  131. {
  132. // wpisano liczbe
  133. case READ_INT:
  134. if(stopien == 0) // opcja na wyjscie -- stopien != 0
  135. return 0;
  136. cout << endl << "Ok, stopień to " << stopien << endl;
  137. // ustaw wskaznik tak, by wskazywal na cin
  138. // bo bedziemy czytac z klawiatury
  139. czytanie = &cin;
  140. break;
  141.  
  142. case READ_STRING:
  143. cout << endl << "Ok, plik to " << nazwaPliku << endl;
  144. // proba otwarcia
  145. infs.open(nazwaPliku.c_str());
  146. if(infs.fail()) { // nie powiodlo sie
  147. cout << "Nie mogę otworzyć pliku: " << nazwaPliku << endl;
  148. break;
  149. }
  150. // tutaj kawalek zaznaczony na diagramie wykrzyknikiem
  151. // trzeba jeszcze przeczytac stopien wielomianu
  152. // zanim zabierzemy sie za czytanie wspolczynnikow
  153. infs >> stopien;
  154. cout << "Stopien z pliku to: " << stopien << endl;
  155. // ustaw wskaznik tak, by wskazywal na plik
  156. // bo czytanie bedzie z pliku
  157. czytanie = &infs;
  158. break;
  159.  
  160. default:
  161. cout << "BĹ‚Ä…d czytania" << endl;
  162. }
  163. } while(czytanie == NULL);
  164.  
  165. // instancja klasy, bo znamy juz stopien
  166. Polynomial p(stopien);
  167.  
  168. for(int i=0; i<=stopien; i++)
  169. {
  170. // wskaznik czytanie pokazuje na wybrany wczesniej
  171. // strumien wejsciowy - cin (klasy istream) albo infs (klasy ifstream)
  172. // poniewaz ifstream jest potomkiem istream -- wszystko sie zgadza
  173. val = readDoubleFromStream(*czytanie);
  174. p.setCoefficient(i, val);
  175. }
  176.  
  177. cout << "Wielomian: " << p << endl;
  178. cout << "Dla jakiej wartości wyliczyć? : ";
  179. cin >> val;
  180. cout << "Wartość wielomianu dla " << val << " = " << p.value(val) << endl;
  181.  
  182. return 0;
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement