Posted By

jajojejeje on 11/10/18


Tagged


Versions (?)

PiasecznoLab4_1


 / Published in: C++
 

PiasecznoLab4_1

  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<cmath>
  13. #include<string>
  14. #include <sstream>
  15. #include<iomanip>//setprecision()
  16.  
  17. using namespace std;
  18. template <typename T>
  19. class Cechy;
  20.  
  21. template<typename T>
  22. std::ostream& operator<<(std::ostream& stream,
  23. T& sr) {
  24. return stream <<fixed<< std::setprecision(Cechy<T>::_liczba_miejsc_po_przecinku) << sr() << endl;
  25. }
  26. //template<typename T>
  27. //class Wypisywalne {
  28. // template<typename T>
  29. // friend std::ostream& operator<<(std::ostream& stream, T& sr);
  30. //};
  31.  
  32. class Bazowe_Cechy {
  33. public:
  34. static const bool _jest_liczba = false;
  35. static const bool _nalezy_do_przedzialu = false;
  36. static const bool _jest_liczba_calkowita = false;
  37. static const bool _jest_potega_liczby_dwa = false;
  38. static const int _dolna_granica_przedzialu = 0;
  39. static const int _gorna_granica_przedzialu = 0;
  40. static const int _liczba_miejsc_po_przecinku = 0;
  41. };
  42.  
  43. template<typename T>
  44. class Cechy : public Bazowe_Cechy {
  45. public:
  46. static const double dolna_granica_przedzialu() { return 0; };
  47. static const double gorna_granica_przedzialu() { return 0; };
  48. };
  49.  
  50. //srednica_opony--
  51. class srednica_opony {
  52. int srednica;
  53. public:
  54. srednica_opony(int srednica = 0) : srednica(srednica) {}
  55. int operator()() { return srednica; }
  56. srednica_opony& operator=(int srednica) { this->srednica = srednica; return *this; }
  57.  
  58. };
  59.  
  60.  
  61.  
  62. template<>
  63. class Cechy<srednica_opony> : public Bazowe_Cechy {
  64. public:
  65. static const bool _jest_liczba = true;
  66. static const bool _nalezy_do_przedzialu = true;
  67. static const bool _jest_liczba_calkowita = true;
  68. static const int _dolna_granica_przedzialu = 0;//(?)
  69. static const int _gorna_granica_przedzialu = 0;//(?)
  70. static const int _liczba_miejsc_po_przecinku = 0;
  71.  
  72. static const double dolna_granica_przedzialu() { return 10; };
  73. static const double gorna_granica_przedzialu() { return 24; };
  74. };
  75. //--srednica_opony
  76. //czestotliwosc--
  77. class czestotliwosc {
  78. double herce;
  79. public:
  80. czestotliwosc(double herce = 0) : herce(herce){}
  81. double operator()() { return herce; }
  82. czestotliwosc& operator=(double herce) { this->herce = herce; return *this; }
  83. };
  84. template<>
  85. class Cechy<czestotliwosc> : public Bazowe_Cechy {
  86. public:
  87. static const bool _jest_liczba = true;
  88. static const bool _nalezy_do_przedzialu = true;
  89. static const bool _jest_liczba_calkowita = false;
  90. static const int _dolna_granica_przedzialu = 0;//(?)
  91. static const int _gorna_granica_przedzialu = 0;//(?)
  92. static const int _liczba_miejsc_po_przecinku = 2;
  93.  
  94. static const double dolna_granica_przedzialu() { return 87.5; };
  95. static const double gorna_granica_przedzialu() { return 108; };
  96. };
  97. //--czestotliwosc
  98. //pojemnosc_microSD--
  99. class pojemnosc_microSD {
  100. int n;
  101. public:
  102. pojemnosc_microSD(int n=1) : n(n) {}
  103. int operator()() { return (int) pow(2,n); }
  104. pojemnosc_microSD& operator=(int GB) { n = (int) pow(GB,1.0/n); return *this; }
  105.  
  106. };
  107. template<>
  108. class Cechy<pojemnosc_microSD> : public Bazowe_Cechy {
  109. public:
  110. static const bool _jest_liczba = true;
  111. static const bool _nalezy_do_przedzialu = true;
  112. static const bool _jest_liczba_calkowita = true;
  113. static const bool _jest_potega_liczby_dwa = true;
  114. static const int _dolna_granica_przedzialu = 1;//(?)
  115. static const int _gorna_granica_przedzialu = 128;//(?)
  116. static const int _liczba_miejsc_po_przecinku = 0;
  117.  
  118. static const double dolna_granica_przedzialu() { return 1; };
  119. static const double gorna_granica_przedzialu() { return 128; };
  120. };
  121.  
  122. //--pojemnosc_microSD
  123. //temperatura_wody--
  124. class temperatura_wody {
  125. double t;
  126. public:
  127. temperatura_wody(double temp = 50) : t(temp) {};
  128. double operator()() { return t; };
  129. temperatura_wody& operator=(double temp) { t = temp; return *this; };
  130. };
  131.  
  132. template<>
  133. class Cechy<temperatura_wody> : public Bazowe_Cechy {
  134. public:
  135. static const bool _jest_liczba = true;
  136. static const bool _nalezy_do_przedzialu = true;
  137. static const double dolna_granica_przedzialu() { return 0; };
  138. static const double gorna_granica_przedzialu() { return 100; };
  139. static const int _liczba_miejsc_po_przecinku = 2;
  140. };
  141. //--temperatura_wody
  142.  
  143. class kostka_do_gry {
  144. int n;
  145. public:
  146. kostka_do_gry(int num = 1) : n(num) {};
  147. int operator()() { return n; };
  148. kostka_do_gry& operator=(int num) { n = num; return *this; };
  149. };
  150.  
  151. template<>
  152. class Cechy<kostka_do_gry> : public Bazowe_Cechy {
  153. public:
  154. static const bool _jest_liczba = true;
  155. static const bool _nalezy_do_przedzialu = true;
  156. static const bool _jest_liczba_calkowita = true;
  157. static const int _dolna_granica_przedzialu = 1;
  158. static const int _gorna_granica_przedzialu = 6;
  159. static const int _liczba_miejsc_po_przecinku = 0;
  160. };
  161.  
  162. class Przepelnienie : public exception {
  163. char opis[100];
  164. public:
  165. Przepelnienie(const char* o) { strcpy_s(opis, o); }
  166. const char* what() const throw() { return opis; };
  167. };
  168. class BrakDanych : public exception {
  169. char opis[100];
  170. public:
  171. BrakDanych(const char* o) { strcpy_s(opis, o); }
  172. const char* what() const throw() { return opis; };
  173. };
  174.  
  175.  
  176. template<typename T, int rozmiar/*, class _Cechy = Cechy<T>*/>
  177. class SzablonStosu {
  178. T stos[rozmiar];
  179. int top;
  180. public:
  181. int zajetosc() { return top; };
  182. SzablonStosu() : top(0) {}
  183. void push(const T& i) {
  184. if (top == rozmiar)
  185. throw Przepelnienie(typeid(i).name());
  186. stos[top++] = i;
  187. }
  188. void push(int i) {
  189. if (top == rozmiar)
  190. throw Przepelnienie(typeid(i).name());
  191.  
  192. // walidacja warto?ci przekazanej do zapisu
  193. if (Cechy<T>::_jest_liczba && Cechy<T>::_jest_liczba_calkowita) {
  194. if (Cechy<T>::_nalezy_do_przedzialu) {
  195. if (Cechy<T>::_jest_potega_liczby_dwa) {
  196.  
  197. int tmp = i;
  198. while (tmp != 1) {
  199. if (tmp % 2 != 0) return;
  200. tmp /= 2;
  201. }
  202. }
  203. if ((Cechy<T>::_dolna_granica_przedzialu <= i) && (i <= Cechy<T>::_gorna_granica_przedzialu))
  204. stos[top++] = i;
  205. }
  206. else
  207. stos[top++] = i;
  208. }
  209. }
  210. void push(double i) {
  211. if (top == rozmiar)
  212. throw Przepelnienie(typeid(i).name());
  213.  
  214. // walidacja warto?ci przekazanej do zapisu
  215. if (Cechy<T>::_jest_liczba && !Cechy<T>::_jest_liczba_calkowita) {
  216. if (Cechy<T>::_nalezy_do_przedzialu) {
  217. if ((Cechy<T>::dolna_granica_przedzialu() <= i) && (i <= Cechy<T>::gorna_granica_przedzialu()))
  218. stos[top++] = i;
  219. }
  220. else
  221. stos[top++] = i;
  222. }
  223. }
  224. T pop() {
  225. if (top == 0)
  226. throw BrakDanych(typeid(stos[0]).name());
  227.  
  228. return stos[--top];
  229. }
  230.  
  231. //string operator()() {
  232. // std::stringstream ss;
  233. // for (int i = 0; i < top; i++) {
  234. // double d = stos[i]();
  235. // ss <<d<<", ";
  236. // }
  237. // std::string s = ss.str();
  238. // return s; };
  239. };
  240.  
  241.  
  242.  
  243.  
  244. int main() {
  245.  
  246. srednica_opony sr(10);
  247. kostka_do_gry k(1);
  248. //czestotliwosc c(2);
  249. pojemnosc_microSD p(63);
  250. SzablonStosu<pojemnosc_microSD,5> s;
  251. s.push(10);
  252. int a=5;
  253. //s.push(p);
  254. //cout << s.pop() << endl;
  255.  
  256.  
  257. /*
  258. SzablonStosu<string, 5> K1;
  259. SzablonStosu<temperatura_wody, 10> K2;
  260. SzablonStosu<kostka_do_gry, 10> K3;
  261.  
  262. // zape?nianie stosu
  263. ifstream fi("qv-lab4.txt");
  264. string s;
  265. try {
  266. K1.push("Henryk");
  267. K1.push("Sienkiewicz");
  268. while (fi) {
  269. fi >> s;
  270. K1.push(s);
  271. fi.seekg(ios::beg);
  272. fi.clear();
  273. cout << '*';
  274. };
  275. }
  276. catch (Przepelnienie& e) {
  277. cout << "K1 gotowy: " << e.what() << endl;
  278. };
  279. cout << "Danych na stosie K1: " << K1.zajetosc() << endl;
  280.  
  281. K2.push(temperatura_wody());
  282. K2.push(temperatura_wody(36.6));
  283. K2.push(40);
  284. K2.push(71.2);
  285. cout << "Danych na stosie K2: " << K2.zajetosc() << endl;
  286.  
  287. K3.push(kostka_do_gry(3));
  288. K3.push(kostka_do_gry());
  289. K3.push(4);
  290. K3.push(6);
  291. K3.push(10);
  292. cout << "Danych na stosie K3: " << K3.zajetosc() << endl;
  293.  
  294. // opró?nianie stosu
  295. try {
  296. while (true)
  297. K1.pop();
  298. }
  299. catch (BrakDanych& e) {
  300. cout << "K1 pusty: " << e.what() << endl;
  301. }
  302. try {
  303. while (true)
  304. K2.pop();
  305. }
  306. catch (BrakDanych& e) {
  307. cout << "K2 pusty: " << e.what() << endl;
  308. }
  309. try {
  310. while (true)
  311. K3.pop();
  312. }
  313. catch (BrakDanych& e) {
  314. cout << "K3 pusty: " << e.what() << endl;
  315. }
  316. */
  317. system("pause");
  318. return 0;
  319. }

Report this snippet  

You need to login to post a comment.