Advertisement
naskedvi

T11 - zad.3.

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