Advertisement
naskedvi

T11 - zad.2.

May 25th, 2014
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.80 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <new>
  6. #include <stdexcept>
  7.  
  8. class Tim
  9. {
  10.     char ime[20];
  11.     int broj_odigranih, broj_pobjeda,
  12.         broj_nerijesenih, broj_poraza,
  13.         broj_datih, broj_primljenih, broj_poena;
  14. public:
  15.     Tim(const char ime[]);
  16.     void ObradiUtakmicu(int broj_datih, int broj_primljenih);
  17.     const char *DajImeTima() const { return ime; }
  18.     int DajBrojPoena() const { return broj_poena; }
  19.     int DajGolRazliku() const { return broj_primljenih-broj_datih; }
  20.     void IspisiPodatke() const;
  21. };
  22.  
  23.  
  24. class Liga
  25. {
  26.     const int max_br_timova;
  27.     int broj_timova;
  28.     Tim **timovi;
  29.     static bool Kriterij(Tim* tim1, Tim* tim2){
  30.             return tim1->DajBrojPoena()>tim2->DajBrojPoena();}
  31. public:
  32.     explicit Liga(int velicina_lige);
  33.     explicit Liga(std::initializer_list<Tim> lista_timova);
  34.     Liga(const Liga &l);
  35.     Liga(Liga &&l);
  36.     Liga &operator =(const Liga &l);
  37.     Liga &operator =(Liga &&l);
  38.     void DodajNoviTim(const char ime_tima[]);
  39.     void RegistrirajUtakmicu(const char tim1[], const char tim2[],
  40.                              int rezultat_1, int rezultat_2);
  41.     void IspisiTabelu();
  42. };
  43.  
  44. int main()
  45. {
  46.     try {
  47.     Liga l{5};
  48.     l.DodajNoviTim("Sarajevo");
  49.     l.DodajNoviTim("Zeljeznicar");
  50.     l.DodajNoviTim("Velez");
  51.     l.RegistrirajUtakmicu("Sarajevo","Zeljeznicar",5,0);
  52.     l.RegistrirajUtakmicu("Sarajevo","Velez",5,1);
  53.     l.RegistrirajUtakmicu("Sarajevo","Zeljeznicar",7,0);
  54.     l.RegistrirajUtakmicu("Velez","Zeljeznicar",1,1);
  55.     l.RegistrirajUtakmicu("Sarajevo","Velez",5,0);
  56.     l.RegistrirajUtakmicu("Velez","Zeljeznicar",2,0);
  57.     Liga l2(5);
  58.     l2=std::move(l);
  59.     }
  60.     catch(const char poruka[]) {
  61.         std::cout<<std::endl << poruka << std::endl;
  62. }
  63.     return 0;
  64. }
  65.  
  66.  
  67. //IMPLEMENTACIJE ZA KLASU LIGA//
  68.  
  69. Liga::Liga(int velicina_lige): max_br_timova(velicina_lige),
  70.         broj_timova(0),timovi(new Tim*[velicina_lige]){}
  71.  
  72. Liga::Liga(std::initializer_list<Tim> lista_timova):
  73.         max_br_timova(lista_timova.size()), broj_timova(lista_timova.size()),
  74.         timovi(new Tim*[lista_timova.size()]){}
  75.  
  76. //KOPIRAJUCI KONSTRUKTORI:
  77. Liga::Liga(const Liga &l): max_br_timova(l.max_br_timova), broj_timova(l.broj_timova),
  78.             timovi(new Tim*[l.max_br_timova])
  79.      {
  80.         for(int i=0; i<broj_timova; i++) timovi[i]=new Tim(*l.timovi[i]);
  81.         //za svaki pokazivac u nizu dinamicki alociramo klasu tim
  82.         //u koju kopiramo sadrzaj klase tim iz onog cime smo inicijalizirali
  83.      }
  84.  
  85. Liga::Liga(Liga &&l): max_br_timova(l.max_br_timova), broj_timova(l.broj_timova),
  86.             timovi(l.timovi)
  87.     {
  88.         l.timovi=nullptr; //prijasnji vise ne pokazuje ninasta
  89.         //dok novi pokazuje na niz pokazivaca od ovog prijasnjeg
  90.         l.broj_timova=0;
  91.     }
  92.  
  93. //OPERATORI DODJELE:
  94. Liga &Liga::operator =(const Liga &l){
  95.     if (l.max_br_timova!=max_br_timova)
  96.         throw std::logic_error("Nejednak maksimalni broj timova");
  97.             //ako imamo A=B, izbrisacemo sadrzaj od A i kopirati u njega sadrzaj od B
  98.                 //pod odredjenim uslovima
  99.         if (broj_timova>l.broj_timova){
  100.             for(int i=0; i<l.broj_timova; i++) timovi[i]=l.timovi[i]; //kopirali
  101.                 for(int i=l.broj_timova; i<broj_timova; i++)
  102.                     delete timovi[i];} //brisemo ostatak
  103.  
  104.         if (broj_timova<l.broj_timova){
  105.                 for(int i=0; i<broj_timova; i++) timovi[i]=l.timovi[i]; //kopirali
  106.                     for(int i=broj_timova; i<l.broj_timova; i++)
  107.                         timovi[i]=new Tim(*l.timovi[i]);} //alociramo onoliko koliko fali
  108.         broj_timova=l.broj_timova; return *this;
  109.     }
  110.  
  111. Liga &Liga::operator =(Liga &&l){
  112.         //ako imamo A=std::move(B), izbrisacemo sadrzaj od A,
  113.             //pa cemo sadrzaj od B kopirati u A,
  114.                 //zatim sve iz B izbrisati tako da ostane prazan
  115.             if (broj_timova>l.broj_timova){
  116.                 for(int i=0; i<l.broj_timova; i++) timovi[i]=l.timovi[i]; //kopirali
  117.                     for(int i=l.broj_timova; i<broj_timova; i++)
  118.                         delete timovi[i];} //brisemo ostatak
  119.             if (broj_timova<l.broj_timova){
  120.                 for(int i=0; i<broj_timova; i++) timovi[i]=l.timovi[i]; //kopirali
  121.                     for(int i=broj_timova; i<l.broj_timova; i++)
  122.                         timovi[i]=new Tim(*l.timovi[i]);} //alociramo onoliko koliko fali
  123.     broj_timova=l.broj_timova;
  124.     l.timovi=nullptr; l.broj_timova=0; return *this;
  125.     }
  126.  
  127. //OSTALE FUNKCIJE
  128. void Liga::DodajNoviTim(const char ime_tima[]){
  129.     if (broj_timova>=max_br_timova) throw "Previse timova!";
  130.     for(int i = 0; i < broj_timova; i++)
  131.     {
  132.         if (std::strcmp(ime_tima, timovi[i]->DajImeTima()) == 0)
  133.           throw "Imena timova se ne smiju ponavljati!";
  134.     }
  135.         timovi[broj_timova++]=new Tim(ime_tima);}
  136.  
  137. void Liga::RegistrirajUtakmicu(const char tim1[], const char tim2[],
  138.                             int rezultat_1, int rezultat_2){
  139.     Tim* ptim1(nullptr);
  140.         Tim* ptim2(nullptr);
  141.             for(int i = 0; i < broj_timova; i++){
  142.                 if (std::strcmp(tim1, timovi[i]->DajImeTima()) == 0) ptim1 = timovi[i];
  143.                 if (std::strcmp(tim2, timovi[i]->DajImeTima()) == 0) ptim2 = timovi[i];
  144.                 }
  145.             if (ptim1 == 0) throw "Ne postoji tim1!";
  146.             if (ptim2 == 0) throw "Ne postoji tim2!";
  147.         if(ptim1 == ptim2) throw "Imena timova ne smiju biti jednaka!";
  148.     ptim1->ObradiUtakmicu(rezultat_1, rezultat_2);
  149.     ptim2->ObradiUtakmicu(rezultat_2, rezultat_1);
  150. }
  151.  
  152. void Liga::IspisiTabelu()
  153. {
  154.     std::sort(timovi, timovi+broj_timova, Liga::Kriterij);
  155.     std::cout << std::endl << "Rezultati lige: " << std::endl;
  156.     for(int i = 0; i < broj_timova; i++)
  157.         {timovi[i]->IspisiPodatke();
  158.     std::cout << std::endl;}
  159. }
  160.  
  161. //IMPLEMENTACIJE ZA KLASU TIM //
  162.  
  163. Tim::Tim(const char ime[]) : broj_odigranih(0),
  164.       broj_pobjeda(0), broj_nerijesenih(0), broj_poraza(0),
  165.       broj_datih(0), broj_primljenih(0), broj_poena(0)
  166.       { std::strcpy(Tim::ime,ime);}
  167.  
  168. void Tim::ObradiUtakmicu(int broj_datih, int broj_primljenih)
  169. {
  170.     broj_odigranih++;
  171.     if(broj_datih==broj_primljenih)
  172.         { broj_nerijesenih++; broj_poena+=1; }
  173.     if(broj_datih>broj_primljenih)
  174.         { broj_pobjeda++; broj_poena+=3; }
  175.     if(broj_datih<broj_primljenih)
  176.           broj_poraza++;
  177.     Tim::broj_datih += broj_datih;
  178.     Tim::broj_primljenih += broj_primljenih;
  179. }
  180. void Tim::IspisiPodatke() const
  181. {
  182.     std::cout<<std::left<<std::setw(20)<<ime<<std::right<<
  183.     std::setw(4)<<broj_odigranih<< std::setw(4)<<broj_pobjeda<<
  184.     std::setw(4)<<broj_nerijesenih<< std::setw(4)<<broj_poraza<<
  185.     std::setw(4)<<broj_datih<< std::setw(4)<< broj_primljenih<<
  186.     std::setw(4)<<broj_poena;
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement