Advertisement
Guest User

Virtuelni tut zad 3

a guest
Jul 21st, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.90 KB | None | 0 0
  1. //Isam Tut 14 zad 3
  2. #include <iostream>
  3. #include <cstring>
  4. #include <iomanip>
  5. #include <algorithm>
  6. #include <stdexcept>
  7. #include <fstream>
  8. #include <string>
  9.  
  10. using std::cout;
  11. using std::setw;
  12. using std::endl;
  13.  
  14. class Tim
  15. {
  16. char ime_tima[20];
  17. int broj_odigranih, broj_pobjeda, broj_nerijesenih, broj_poraza, broj_datih, broj_primljenih, broj_poena;
  18. public:
  19. Tim (const char ime[])
  20. {
  21. if(std::strlen(ime) > 20) throw std::range_error("Predugacko ime tima");
  22. std::strcpy(ime_tima, ime);
  23. broj_odigranih = 0;
  24. broj_pobjeda = 0;
  25. broj_nerijesenih = 0;
  26. broj_poraza = 0;
  27. broj_datih = 0;
  28. broj_primljenih = 0;
  29. broj_poena = 0;
  30. }
  31. void ObradiUtakmicu(int broj_datih, int broj_primljenih);
  32. const char *DajImeTima() const {return ime_tima;}
  33. int DajBrojPoena() const {return broj_poena;}
  34. int DajGolRazliku() const {return (broj_datih - broj_primljenih);}
  35. void IspisiPodatke() const {cout << std::left <<setw(20) << ime_tima << setw(4)<< std::right << broj_odigranih << setw(4) << broj_pobjeda << setw(4) << broj_nerijesenih
  36. << setw(4) << broj_poraza << setw(4) << broj_datih << setw(4) << broj_primljenih << setw(4) << broj_poena << std::endl;}
  37. };
  38.  
  39. class Liga
  40. {
  41. int broj_timova;
  42. const int max_br_timova;
  43. Tim **timovi;
  44. public:
  45.  
  46. explicit Liga (int velicina_lige): broj_timova(0), max_br_timova(velicina_lige), timovi(new Tim* [max_br_timova]{}) {}
  47.  
  48. explicit Liga (std::initializer_list<Tim> lista_timova): broj_timova(lista_timova.size()), max_br_timova(lista_timova.size()), timovi(new Tim *[lista_timova.size()]{})
  49. {
  50. auto it = lista_timova.begin();
  51. for(int i = 0; i < max_br_timova; i++) {
  52. timovi[i] = new Tim(*it++);
  53. }
  54. }
  55. ~Liga()
  56. {
  57. for(int i = 0; i < max_br_timova; i++) delete timovi[i];
  58. delete[] timovi;
  59. }
  60.  
  61. Liga(const Liga &l) : max_br_timova(l.max_br_timova), timovi(new Tim* [max_br_timova]{})
  62. {
  63. broj_timova = l.broj_timova;
  64. for(int i = 0; i < max_br_timova; i++) timovi[i] = new Tim(l.timovi[i]->DajImeTima());
  65. for(int i = 0; i < max_br_timova; i++) *timovi[i] = *l.timovi[i];
  66. }
  67.  
  68. Liga(Liga &&l): max_br_timova(l.max_br_timova), timovi(l.timovi)
  69. {
  70. l.timovi = nullptr;
  71. }
  72.  
  73. Liga &operator =(const Liga &l)
  74. {
  75. if(l.max_br_timova != max_br_timova) throw std::logic_error("Nesaglasni kapaciteti liga");
  76.  
  77. if(l.broj_timova > broj_timova)
  78. {
  79. auto novi = new Tim*[l.max_br_timova];
  80. delete[] timovi;
  81. timovi = novi;
  82. novi = nullptr;
  83. }
  84.  
  85. broj_timova = l.broj_timova;
  86. for(int i = 0; i < broj_timova; i++) *timovi[i] = *(l.timovi[i]);
  87. return *this;
  88. }
  89.  
  90. Liga &operator = (Liga &&l)
  91. {
  92. if(l.max_br_timova != max_br_timova) throw std::logic_error("Nesaglasni kapaciteti liga");
  93. std::swap(timovi, l.timovi);
  94. return *this;
  95. }
  96.  
  97. void DodajNoviTim(const char ime_tima[]);
  98. void RegistrirajUtakmicu (const char tim1[], const char tim2[], int rezultat1, int rezultat2);
  99. void IspisiTabelu();
  100. void ObrisiSve() {
  101. for(int i = 0; i < max_br_timova; i++) delete timovi[i];
  102. delete[] timovi;
  103. int broj_timova = 0;
  104. Tim timovi = nullptr;
  105.  
  106. }
  107. void SacuvajStanje(std::string ime_datoteke)
  108. {
  109. std::ofstream izl_tok(ime_datoteke, std::ios::binary);
  110. if(!izl_tok) throw std::logic_error("Problemi pri upisu u datoteku");
  111. izl_tok.write(reinterpret_cast<char*>(this), sizeof *this);
  112.  
  113. for(int i = 0; i < broj_timova; i++)
  114. izl_tok.write(reinterpret_cast<char*>(timovi[i]), broj_timova * sizeof (Tim));
  115.  
  116. if(!izl_tok) throw std::logic_error("Problemi pri upisu u datoteku");
  117. }
  118.  
  119. void AzurirajIzDatoteke(std::string ime_datoteke)
  120. {
  121. std::ifstream tok(ime_datoteke);
  122. if(!tok) throw std::logic_error("Datoteka ne postoji");
  123. int br1, br2;
  124. std::string tim1, tim2;
  125. std::string pom;
  126. char znak;
  127. int broj_timova = 0;
  128. while(tok)
  129. {
  130. std::getline(tok, tim1);
  131. std::getline(tok, tim2);
  132. tok >> br1 >> znak >> br2;
  133. std::getline(tok, pom);
  134.  
  135. for(int i = 0; i < broj_timova; i++)
  136. if(std::strcmp(timovi[i]->DajImeTima(), tim1.c_str()) != 0) {
  137. DodajNoviTim(tim1.c_str());
  138. broj_timova++;
  139. }
  140. for(int i = 0; i < broj_timova; i++)
  141. if(std::strcmp(timovi[i]->DajImeTima(), tim1.c_str()) != 0) {
  142. DodajNoviTim(tim2.c_str());
  143. broj_timova++;
  144. }
  145. RegistrirajUtakmicu(tim1.c_str(), tim2.c_str(), br1, br2);
  146. }
  147. if(!tok.eof()) throw std::logic_error("Problemi pri citanju datoteke");
  148. }
  149.  
  150. Liga(std::string ime_datoteke): max_br_timova(8)
  151. {
  152. std::ifstream izl_tok(ime_datoteke, std::ios::binary);
  153. if(!izl_tok) throw std::logic_error("Datoteka ne postoji");
  154. izl_tok.read(reinterpret_cast<char*>(this), sizeof *this);
  155.  
  156. for(int i = 0; i < 4; i++)
  157. izl_tok.read(reinterpret_cast<char*>(timovi[i]), broj_timova * sizeof (Tim));
  158.  
  159. if(!izl_tok) throw std::logic_error("Datoteka sadrzi fatalne greske");
  160. }
  161.  
  162.  
  163. };
  164.  
  165. int main ()
  166. {
  167. Liga l (7);
  168. l.DodajNoviTim("A"); l.DodajNoviTim("B"); l.DodajNoviTim("C");
  169. l.DodajNoviTim("D"); l.DodajNoviTim("E");
  170. l.RegistrirajUtakmicu("A", "B", 1, 2);
  171. l.RegistrirajUtakmicu("A", "B", 2, 1);
  172. l.RegistrirajUtakmicu("C", "B", 1, 3);
  173. l.RegistrirajUtakmicu("E", "B", 4, 3);
  174. l.RegistrirajUtakmicu("B", "D", 2, 2);
  175. l.RegistrirajUtakmicu("D", "A", 1, 2);
  176. l.IspisiTabelu(); //za vas, radi orijentacije
  177. std::remove ("premier.bin"); //pobrisimo datoteku...
  178. l.SacuvajStanje ("premier.bin");
  179. l.DodajNoviTim("NoviTim 1");
  180. l.DodajNoviTim("NoviTim 2");
  181. std::cout << std::string (48, '-') << std::endl;
  182. Liga nova ("premier.bin"); //kreiramo novu iz datoteke
  183. nova.IspisiTabelu();
  184.  
  185. return 0;
  186. }
  187.  
  188. void Tim::ObradiUtakmicu(int broj_datih, int broj_primljenih)
  189. {
  190. if(broj_datih < 0 || broj_primljenih < 0) throw std::range_error("Neispravan broj golova");
  191. broj_odigranih++;
  192. Tim::broj_datih += broj_datih;
  193. Tim::broj_primljenih += broj_primljenih;
  194.  
  195. if(broj_datih > broj_primljenih)
  196. {
  197. broj_pobjeda++;
  198. broj_poena += 3;
  199. }
  200. else if(broj_datih < broj_primljenih) broj_poraza++;
  201. else
  202. {
  203. broj_nerijesenih++;
  204. broj_poena++;
  205. }
  206. }
  207.  
  208. void Liga::DodajNoviTim(const char ime_tima[])
  209. {
  210. if(broj_timova >= max_br_timova) throw std::range_error("Liga popunjena");
  211. for(int i = 0; i < broj_timova; i++)
  212. if(std::strcmp(timovi[i]->DajImeTima(), ime_tima) == 0) throw std::logic_error("Tim vec postoji");
  213.  
  214. timovi[broj_timova] = new Tim(ime_tima);
  215. broj_timova++;
  216. }
  217.  
  218. void Liga::RegistrirajUtakmicu(const char tim1[], const char tim2[], int rezultat1, int rezultat2)
  219. {
  220. if(rezultat1 < 0 || rezultat2 < 0) throw std::range_error("Neispravan broj golova");
  221. bool prvi = false, drugi = false;
  222. for(int i = 0; i < broj_timova; i++)
  223. {
  224. if(std::strcmp(timovi[i]->DajImeTima(), tim1) == 0) prvi = true;
  225. if(std::strcmp(timovi[i]->DajImeTima(), tim2) == 0) drugi = true;
  226. }
  227. if(prvi == false || drugi == false) throw std::logic_error("Tim nije nadjen");
  228.  
  229. for(int i = 0; i < broj_timova; i++)
  230. {
  231. if(std::strcmp(timovi[i]->DajImeTima(), tim1) == 0) timovi[i]->ObradiUtakmicu(rezultat1, rezultat2);
  232. if(std::strcmp(timovi[i]->DajImeTima(), tim2) == 0) timovi[i]->ObradiUtakmicu(rezultat2, rezultat1);
  233. }
  234. }
  235.  
  236. bool Kriterij (const Tim *tim1, const Tim *tim2)
  237. {
  238. if(tim1 == nullptr) return false;
  239. if(tim1->DajBrojPoena() == tim2->DajBrojPoena())
  240. {
  241. if(tim1->DajGolRazliku() == tim2->DajGolRazliku())
  242. {
  243. if(std::strcmp(tim1->DajImeTima(), tim2->DajImeTima()) > 0) return 0;
  244. return 1;
  245. }
  246. return tim1->DajGolRazliku() > tim2->DajGolRazliku();
  247. }
  248. return tim1->DajBrojPoena() > tim2->DajBrojPoena();
  249. }
  250.  
  251. void Liga::IspisiTabelu()
  252. {
  253. std::sort(timovi, timovi + broj_timova, Kriterij);
  254.  
  255. for(int i = 0; i < broj_timova; i++) timovi[i]->IspisiPodatke();
  256. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement