Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Isam Tut 14 zad 3
- #include <iostream>
- #include <cstring>
- #include <iomanip>
- #include <algorithm>
- #include <stdexcept>
- #include <fstream>
- #include <string>
- using std::cout;
- using std::setw;
- using std::endl;
- class Tim
- {
- char ime_tima[20];
- int broj_odigranih, broj_pobjeda, broj_nerijesenih, broj_poraza, broj_datih, broj_primljenih, broj_poena;
- public:
- Tim (const char ime[])
- {
- if(std::strlen(ime) > 20) throw std::range_error("Predugacko ime tima");
- std::strcpy(ime_tima, ime);
- broj_odigranih = 0;
- broj_pobjeda = 0;
- broj_nerijesenih = 0;
- broj_poraza = 0;
- broj_datih = 0;
- broj_primljenih = 0;
- broj_poena = 0;
- }
- void ObradiUtakmicu(int broj_datih, int broj_primljenih);
- const char *DajImeTima() const {return ime_tima;}
- int DajBrojPoena() const {return broj_poena;}
- int DajGolRazliku() const {return (broj_datih - broj_primljenih);}
- void IspisiPodatke() const {cout << std::left <<setw(20) << ime_tima << setw(4)<< std::right << broj_odigranih << setw(4) << broj_pobjeda << setw(4) << broj_nerijesenih
- << setw(4) << broj_poraza << setw(4) << broj_datih << setw(4) << broj_primljenih << setw(4) << broj_poena << std::endl;}
- };
- class Liga
- {
- int broj_timova;
- const int max_br_timova;
- Tim **timovi;
- public:
- explicit Liga (int velicina_lige): broj_timova(0), max_br_timova(velicina_lige), timovi(new Tim* [max_br_timova]{}) {}
- 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()]{})
- {
- auto it = lista_timova.begin();
- for(int i = 0; i < max_br_timova; i++) {
- timovi[i] = new Tim(*it++);
- }
- }
- ~Liga()
- {
- for(int i = 0; i < max_br_timova; i++) delete timovi[i];
- delete[] timovi;
- }
- Liga(const Liga &l) : max_br_timova(l.max_br_timova), timovi(new Tim* [max_br_timova]{})
- {
- broj_timova = l.broj_timova;
- for(int i = 0; i < max_br_timova; i++) timovi[i] = new Tim(l.timovi[i]->DajImeTima());
- for(int i = 0; i < max_br_timova; i++) *timovi[i] = *l.timovi[i];
- }
- Liga(Liga &&l): max_br_timova(l.max_br_timova), timovi(l.timovi)
- {
- l.timovi = nullptr;
- }
- Liga &operator =(const Liga &l)
- {
- if(l.max_br_timova != max_br_timova) throw std::logic_error("Nesaglasni kapaciteti liga");
- if(l.broj_timova > broj_timova)
- {
- auto novi = new Tim*[l.max_br_timova];
- delete[] timovi;
- timovi = novi;
- novi = nullptr;
- }
- broj_timova = l.broj_timova;
- for(int i = 0; i < broj_timova; i++) *timovi[i] = *(l.timovi[i]);
- return *this;
- }
- Liga &operator = (Liga &&l)
- {
- if(l.max_br_timova != max_br_timova) throw std::logic_error("Nesaglasni kapaciteti liga");
- std::swap(timovi, l.timovi);
- return *this;
- }
- void DodajNoviTim(const char ime_tima[]);
- void RegistrirajUtakmicu (const char tim1[], const char tim2[], int rezultat1, int rezultat2);
- void IspisiTabelu();
- void ObrisiSve() {
- for(int i = 0; i < max_br_timova; i++) delete timovi[i];
- delete[] timovi;
- int broj_timova = 0;
- Tim timovi = nullptr;
- }
- void SacuvajStanje(std::string ime_datoteke)
- {
- std::ofstream izl_tok(ime_datoteke, std::ios::binary);
- if(!izl_tok) throw std::logic_error("Problemi pri upisu u datoteku");
- izl_tok.write(reinterpret_cast<char*>(this), sizeof *this);
- for(int i = 0; i < broj_timova; i++)
- izl_tok.write(reinterpret_cast<char*>(timovi[i]), broj_timova * sizeof (Tim));
- if(!izl_tok) throw std::logic_error("Problemi pri upisu u datoteku");
- }
- void AzurirajIzDatoteke(std::string ime_datoteke)
- {
- std::ifstream tok(ime_datoteke);
- if(!tok) throw std::logic_error("Datoteka ne postoji");
- int br1, br2;
- std::string tim1, tim2;
- std::string pom;
- char znak;
- int broj_timova = 0;
- while(tok)
- {
- std::getline(tok, tim1);
- std::getline(tok, tim2);
- tok >> br1 >> znak >> br2;
- std::getline(tok, pom);
- for(int i = 0; i < broj_timova; i++)
- if(std::strcmp(timovi[i]->DajImeTima(), tim1.c_str()) != 0) {
- DodajNoviTim(tim1.c_str());
- broj_timova++;
- }
- for(int i = 0; i < broj_timova; i++)
- if(std::strcmp(timovi[i]->DajImeTima(), tim1.c_str()) != 0) {
- DodajNoviTim(tim2.c_str());
- broj_timova++;
- }
- RegistrirajUtakmicu(tim1.c_str(), tim2.c_str(), br1, br2);
- }
- if(!tok.eof()) throw std::logic_error("Problemi pri citanju datoteke");
- }
- Liga(std::string ime_datoteke): max_br_timova(8)
- {
- std::ifstream izl_tok(ime_datoteke, std::ios::binary);
- if(!izl_tok) throw std::logic_error("Datoteka ne postoji");
- izl_tok.read(reinterpret_cast<char*>(this), sizeof *this);
- for(int i = 0; i < 4; i++)
- izl_tok.read(reinterpret_cast<char*>(timovi[i]), broj_timova * sizeof (Tim));
- if(!izl_tok) throw std::logic_error("Datoteka sadrzi fatalne greske");
- }
- };
- int main ()
- {
- Liga l (7);
- l.DodajNoviTim("A"); l.DodajNoviTim("B"); l.DodajNoviTim("C");
- l.DodajNoviTim("D"); l.DodajNoviTim("E");
- l.RegistrirajUtakmicu("A", "B", 1, 2);
- l.RegistrirajUtakmicu("A", "B", 2, 1);
- l.RegistrirajUtakmicu("C", "B", 1, 3);
- l.RegistrirajUtakmicu("E", "B", 4, 3);
- l.RegistrirajUtakmicu("B", "D", 2, 2);
- l.RegistrirajUtakmicu("D", "A", 1, 2);
- l.IspisiTabelu(); //za vas, radi orijentacije
- std::remove ("premier.bin"); //pobrisimo datoteku...
- l.SacuvajStanje ("premier.bin");
- l.DodajNoviTim("NoviTim 1");
- l.DodajNoviTim("NoviTim 2");
- std::cout << std::string (48, '-') << std::endl;
- Liga nova ("premier.bin"); //kreiramo novu iz datoteke
- nova.IspisiTabelu();
- return 0;
- }
- void Tim::ObradiUtakmicu(int broj_datih, int broj_primljenih)
- {
- if(broj_datih < 0 || broj_primljenih < 0) throw std::range_error("Neispravan broj golova");
- broj_odigranih++;
- Tim::broj_datih += broj_datih;
- Tim::broj_primljenih += broj_primljenih;
- if(broj_datih > broj_primljenih)
- {
- broj_pobjeda++;
- broj_poena += 3;
- }
- else if(broj_datih < broj_primljenih) broj_poraza++;
- else
- {
- broj_nerijesenih++;
- broj_poena++;
- }
- }
- void Liga::DodajNoviTim(const char ime_tima[])
- {
- if(broj_timova >= max_br_timova) throw std::range_error("Liga popunjena");
- for(int i = 0; i < broj_timova; i++)
- if(std::strcmp(timovi[i]->DajImeTima(), ime_tima) == 0) throw std::logic_error("Tim vec postoji");
- timovi[broj_timova] = new Tim(ime_tima);
- broj_timova++;
- }
- void Liga::RegistrirajUtakmicu(const char tim1[], const char tim2[], int rezultat1, int rezultat2)
- {
- if(rezultat1 < 0 || rezultat2 < 0) throw std::range_error("Neispravan broj golova");
- bool prvi = false, drugi = false;
- for(int i = 0; i < broj_timova; i++)
- {
- if(std::strcmp(timovi[i]->DajImeTima(), tim1) == 0) prvi = true;
- if(std::strcmp(timovi[i]->DajImeTima(), tim2) == 0) drugi = true;
- }
- if(prvi == false || drugi == false) throw std::logic_error("Tim nije nadjen");
- for(int i = 0; i < broj_timova; i++)
- {
- if(std::strcmp(timovi[i]->DajImeTima(), tim1) == 0) timovi[i]->ObradiUtakmicu(rezultat1, rezultat2);
- if(std::strcmp(timovi[i]->DajImeTima(), tim2) == 0) timovi[i]->ObradiUtakmicu(rezultat2, rezultat1);
- }
- }
- bool Kriterij (const Tim *tim1, const Tim *tim2)
- {
- if(tim1 == nullptr) return false;
- if(tim1->DajBrojPoena() == tim2->DajBrojPoena())
- {
- if(tim1->DajGolRazliku() == tim2->DajGolRazliku())
- {
- if(std::strcmp(tim1->DajImeTima(), tim2->DajImeTima()) > 0) return 0;
- return 1;
- }
- return tim1->DajGolRazliku() > tim2->DajGolRazliku();
- }
- return tim1->DajBrojPoena() > tim2->DajBrojPoena();
- }
- void Liga::IspisiTabelu()
- {
- std::sort(timovi, timovi + broj_timova, Kriterij);
- for(int i = 0; i < broj_timova; i++) timovi[i]->IspisiPodatke();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement