Posted By

jajojejeje on 11/14/18


Tagged

z kod korepetucji lab4B1


Versions (?)

kod z korepetucji lab4B1


 / Published in: C++
 

kod z korepetucji lab4B1

  1. /* ========================================
  2. ZPO: laboratorium 4
  3. WMP.SNS UKSW, Warszawa
  4. ========================================
  5. */
  6. #include "pch.h"
  7. #include<iostream>
  8. #include<fstream>
  9. #include<string>
  10. #include<limits>
  11. #include<exception>
  12. #include<math.h> //abs
  13. #include<iomanip>//setprecision()
  14.  
  15. using namespace std;
  16.  
  17. class Bazowe_Cechy {
  18. public:
  19. static const bool _jest_liczba = false;
  20. static const bool _nalezy_do_przedzialu = false;
  21. static const bool _jest_liczba_calkowita = false;
  22. static const int _dolna_granica_przedzialu = 0;
  23. static const int _gorna_granica_przedzialu = 0;
  24. static const int _liczba_cyfr_po_przecinku = 0;//dodane
  25. static const bool _czy_jest_pierwsza = false;//dodane
  26. };
  27.  
  28. template<typename T>
  29. class Cechy : public Bazowe_Cechy {
  30. public:
  31. static const double dolna_granica_przedzialu() { return 0; };
  32. static const double gorna_granica_przedzialu() { return 0; };
  33. static const double wielokrotnosc() { return 1; };//dodane
  34. };
  35.  
  36. class temperatura_wody {
  37. double t;
  38. public:
  39. temperatura_wody(double temp = 50) : t(temp) {};
  40. double operator()() { return t; };
  41. temperatura_wody& operator=(double temp) { t = temp; return *this; };
  42. };
  43.  
  44. template<>
  45. class Cechy<temperatura_wody> : public Bazowe_Cechy {
  46. public:
  47. static const bool _jest_liczba = true;
  48. static const bool _nalezy_do_przedzialu = true;
  49. static const double dolna_granica_przedzialu() { return 0; };
  50. static const double gorna_granica_przedzialu() { return 100; };
  51. static const double wielokrotnosc() { return 0.01; };
  52. static const int _liczba_cyfr_po_przecinku = 1;
  53. };
  54.  
  55. class kostka_do_gry {
  56. int n;
  57. public:
  58. kostka_do_gry(int num = 1) : n(num) {};
  59. int operator()() { return n; };
  60. kostka_do_gry& operator=(int num) { n = num; return *this; };
  61. };
  62.  
  63. template<>
  64. class Cechy<kostka_do_gry> : public Bazowe_Cechy {
  65. public:
  66. static const bool _jest_liczba = true;
  67. static const bool _nalezy_do_przedzialu = true;
  68. static const bool _jest_liczba_calkowita = true;
  69. static const int _dolna_granica_przedzialu = 1;
  70. static const int _gorna_granica_przedzialu = 6;
  71. static const double dolna_granica_przedzialu() { return 0; };
  72. static const double gorna_granica_przedzialu() { return 0; };
  73. static const double wielokrotnosc() { return 1; };//dodane
  74.  
  75. };
  76.  
  77. class minuta_dnia {
  78. int n;
  79. public:
  80. minuta_dnia(int num = 1) : n(num) {};
  81. int operator()() { return n; };
  82. minuta_dnia& operator=(int num) { n = num; return *this; };
  83. };
  84.  
  85. template<>
  86. class Cechy<minuta_dnia> : public Bazowe_Cechy {
  87. public:
  88. static const bool _jest_liczba = true;
  89. static const bool _nalezy_do_przedzialu = true;
  90. static const bool _jest_liczba_calkowita = true;
  91. static const int _dolna_granica_przedzialu = 1;
  92. static const int _gorna_granica_przedzialu = 60 * 24;
  93. static const double dolna_granica_przedzialu() { return 0; };
  94. static const double gorna_granica_przedzialu() { return 0; };
  95. static const double wielokrotnosc() { return 1; };//dodane
  96. };
  97.  
  98. class bicie_zegara {
  99. double c;
  100. public:
  101. bicie_zegara(double num = 0.8) : c(num) {};
  102. double operator()() { return c; };
  103. bicie_zegara& operator=(double num) { c = num; return *this; };
  104. };
  105.  
  106. template<>
  107. class Cechy<bicie_zegara> : public Bazowe_Cechy {
  108. public:
  109. static const bool _jest_liczba = true;
  110. static const bool _nalezy_do_przedzialu = true;
  111. static const bool _jest_liczba_calkowita = false;
  112. static const double dolna_granica_przedzialu() { return 0.8; };
  113. static const double gorna_granica_przedzialu() { return 12 * 2 - 1.2; };
  114. static const double wielokrotnosc() { return 2.0; };
  115. static const int _liczba_cyfr_po_przecinku = 1;
  116. };
  117.  
  118. class ilosc_piwa {
  119. double l;
  120. public:
  121. ilosc_piwa(double num = 0.568) : l(num) {};
  122. double operator()() { return l; };
  123. ilosc_piwa& operator=(double num) { l = num; return *this; };
  124. };
  125.  
  126. template<>
  127. class Cechy<ilosc_piwa> : public Bazowe_Cechy {
  128. public:
  129. static const bool _jest_liczba = true;
  130. static const bool _nalezy_do_przedzialu = false;
  131. static const bool _jest_liczba_calkowita = true;
  132. static const double wielokrotnosc() { return 0.568; }; //zakladajac ze mozna zamowic 1 pinte piwa
  133. static const int _liczba_cyfr_po_przecinku = 3;
  134. static const double dolna_granica_przedzialu() { return 0; };
  135. static const double gorna_granica_przedzialu() { return 0; };
  136. };
  137.  
  138. class liczba_pierwsza {
  139. int p;
  140. public:
  141. liczba_pierwsza(int num = 2) : p(num) {};
  142. int operator()() { return p; };
  143. liczba_pierwsza& operator=(int num) { p = num; return *this; };
  144. /*static bool pierwsza(int liczba){
  145. for (int i = 2; i < liczba; i++) {
  146. if (liczba%i == 0) return false;
  147. }
  148. return true;
  149. }*/
  150. };
  151.  
  152. template<>
  153. class Cechy<liczba_pierwsza> : public Bazowe_Cechy {
  154. public:
  155. static const bool _jest_liczba = true;
  156. static const bool _nalezy_do_przedzialu = false;
  157. static const bool _jest_liczba_calkowita = true;
  158. static const bool _czy_jest_pierwsza = true;
  159. static const double dolna_granica_przedzialu() { return 0; };
  160. static const double gorna_granica_przedzialu() { return 0; };
  161. static const double wielokrotnosc() { return 1; };//dodane
  162. };
  163.  
  164. template<typename T>
  165. ostream& operator<<(ostream& os, T& get) {
  166. //if (typeid(get)==typeid(""))
  167. int liczbaMiejscPoPrzecinku = Cechy<T>::_liczba_cyfr_po_przecinku;
  168. os
  169. << fixed
  170. << setprecision(liczbaMiejscPoPrzecinku)
  171. << get();
  172. return os;
  173. };
  174.  
  175.  
  176. class Przepelnienie : public exception {
  177. char opis[100];
  178. public:
  179. Przepelnienie(const char* o) { strcpy_s(opis, o); }
  180. const char* what() const throw() { return opis; };
  181. };
  182. class BrakDanych : public exception {
  183. char opis[100];
  184. public:
  185. BrakDanych(const char* o) { strcpy_s(opis, o); }
  186. const char* what() const throw() { return opis; };
  187. };
  188.  
  189.  
  190. template<typename T, int rozmiar, class _Cechy = Cechy<T>>
  191. class SzablonStosu {
  192. T stos[rozmiar];
  193. int top;
  194. public:
  195.  
  196.  
  197.  
  198. int zajetosc() { return top; };
  199. SzablonStosu() : top(0) {}
  200. void push(const T& i) {
  201. if (top == rozmiar)
  202. throw Przepelnienie(typeid(i).name());
  203. stos[top++] = i;
  204. }
  205.  
  206. void push(int i) {
  207. if (top == rozmiar)
  208. throw Przepelnienie(typeid(i).name());
  209.  
  210. if (Cechy<T>::_jest_liczba && Cechy<T>::_jest_liczba_calkowita) {
  211. if (Cechy<T>::_nalezy_do_przedzialu) {
  212. if ((Cechy<T>::_dolna_granica_przedzialu <= i) && (i <= Cechy<T>::_gorna_granica_przedzialu))
  213. stos[top++] = i;
  214. }
  215. else {
  216. if (Cechy<liczba_pierwsza>::_czy_jest_pierwsza) {
  217. for (int licznik = 2; licznik < i; licznik++) {
  218. if (i%licznik == 0) return;
  219. }
  220. stos[top++] = i;
  221. /*if (liczba_pierwsza::pierwsza(i)) {
  222. stos[top++] = i;
  223. }*/
  224.  
  225. }
  226. else
  227. stos[top++] = i;
  228.  
  229. }
  230. }
  231. }
  232. void push(double i) {
  233. if (top == rozmiar)
  234. throw Przepelnienie(typeid(i).name());
  235.  
  236. if (Cechy<T>::_jest_liczba && !Cechy<T>::_jest_liczba_calkowita) {
  237. //TO JEST TYLKO ZABAWA
  238. //nigdzie w poleceniu nie ma, ze musimy tworzyc akurat taka ceche
  239. double tmp = i / Cechy<T>::wielokrotnosc();
  240. if (!(abs(tmp-(int)tmp) < 0.0001)) return;
  241. if (Cechy<T>::_nalezy_do_przedzialu) {
  242. if ((Cechy<T>::dolna_granica_przedzialu() <= i) && (i <= Cechy<T>::gorna_granica_przedzialu()))
  243. stos[top++] = i;
  244. }
  245. else
  246. stos[top++] = i;
  247. }
  248. }
  249. T pop() {
  250. if (top == 0)
  251. throw BrakDanych(typeid(stos[0]).name());
  252.  
  253. return stos[--top];
  254. }
  255. };
  256.  
  257.  
  258. template<typename T>
  259. ostream& operator<<(ostream& os, typename SzablonStosu<T, 5>& get) {
  260. int liczbaMiejscPoPrzecinku = Cechy<T>::_liczba_cyfr_po_przecinku;
  261. while (get.zajetosc() > 0) {
  262. os
  263. << fixed
  264. << setprecision(liczbaMiejscPoPrzecinku)
  265. << get.pop()() << endl;
  266. }
  267. return os;
  268. };
  269.  
  270. int main() {
  271. SzablonStosu<temperatura_wody, 5> temp;
  272. temp.push(12);//temperatura to double wiec 12 nie zostanie dodane na stos
  273. temp.push(12.0);//PRAWIDLOWA WARTOSC
  274. temp.push(44.5);//PRAWIDLOWA WARTOSC
  275. temp.push(101.0);//wartosc spoza zakresu nie zostanie dodana na stos
  276. //cout << "stos temperatur" << endl;//tu nie mozemy wypisac string bo kompiletor nie wie czy uzyc standardowego operatora strumienia czy naszego
  277. //https://stackoverflow.com/questions/3319837/ambiguous-operator
  278. cout << temp << endl;
  279.  
  280.  
  281.  
  282. system("pause");
  283. return 0;
  284. }

Report this snippet  

You need to login to post a comment.