Advertisement
EnsarMeskovic

[PR III] FITCodingChallange/Prijave/Ucesnici

Jan 30th, 2017
505
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 34.00 KB | None | 0 0
  1. #include<iostream>
  2. #include<string>
  3. #include<regex>
  4. #include<vector>
  5. #include<algorithm>
  6. #include<exception>
  7. using namespace std;
  8.  
  9. char crt[] = "----------------------------------------------------\n";
  10. string praviloDatumMatch = "([1-9]|0[1-9]|1[0-9]|2[0-9]|3[0-1]){1}([./]{1})([1-9]|0[1-9]|1[0-2]){1}([./]{1})(200[0-9]|201[0-9]|202[0-9]|203[0-9]|204[0-9])"; // dd.mm.gggg || dd/mm/gggg (dd [1-31] / mm [1-12] / gggg [2000-2049])
  11. string praviloLozinkaSearch = "(?=.{5,})(?=.+\\d)(?=.*[A-Z])";
  12. string praviloMail = "([a-z0-9._-]+)@([a-z0-9.-]+)\\.([a-z]{2,63})";
  13. bool _provjeriIspravnost(string tekst, string pravilo, bool match) {
  14.     if (match) return regex_match(tekst, regex(pravilo)); else return regex_search(tekst, regex(pravilo));
  15. }
  16. //Koristiti klasu NedozvoljenaOperacija za bacanje izuzetaka u cijelom programu
  17. class NedozvoljenaOperacija: public exception {
  18.     int _linijaKoda;
  19. public:
  20.     NedozvoljenaOperacija(char* poruka, int linijaKoda): exception(poruka) {
  21.         _linijaKoda = linijaKoda;
  22.     }
  23.     NedozvoljenaOperacija(const NedozvoljenaOperacija & obj): exception(obj.what()) {
  24.         _linijaKoda = obj._linijaKoda;
  25.     }
  26.     NedozvoljenaOperacija & operator = (const NedozvoljenaOperacija & obj) {
  27.         if (this != &obj) {
  28.             exception(obj.what());
  29.             _linijaKoda = obj._linijaKoda;
  30.         } return *this;
  31.     }
  32.     void Info() {
  33.         cout << "Greska u liniji koda " << _linijaKoda << ": " << exception::what() << endl;
  34.     }
  35. };
  36. template<class T1, class T2>
  37. class FITKolekcija {
  38.     T1* _elementi1;
  39.     T2* _elementi2;
  40.     int _trenutno;
  41. public:
  42.     //Konstruktor, destruktor i ostale funkcije potrebne za rad sa klasom
  43.     FITKolekcija() {
  44.         _elementi1 = nullptr;
  45.         _elementi2 = nullptr;
  46.         _trenutno = 0;
  47.     }
  48.     ~FITKolekcija() {
  49.         if (_elementi1 != nullptr) {
  50.             delete[] _elementi1; _elementi1 = nullptr;
  51.         } if (_elementi2 != nullptr) {
  52.             delete[] _elementi2; _elementi2 = nullptr;
  53.         }
  54.     }
  55.     FITKolekcija(const FITKolekcija & obj) {
  56.         if (obj._trenutno == 0) {
  57.             _elementi1 = nullptr;
  58.             _elementi2 = nullptr;
  59.             _trenutno = 0;
  60.         } else {
  61.             _elementi1 = new T1[obj._trenutno];
  62.             _elementi2 = new T2[obj._trenutno];
  63.             _trenutno = obj._trenutno;
  64.             for (int i = 0; i < _trenutno; i++) {
  65.                 _elementi1[i] = obj._elementi1[i];
  66.                 _elementi2[i] = obj._elementi2[i];
  67.             }
  68.         }
  69.     }
  70.     FITKolekcija & operator = (const FITKolekcija & obj) {
  71.         if (this != &obj) {
  72.             delete[] _elementi1;
  73.             delete[] _elementi2;
  74.             _trenutno = obj._trenutno;
  75.             _elementi1 = new T1[obj._trenutno];
  76.             _elementi2 = new T2[obj._trenutno];
  77.             for (int i = 0; i < obj._trenutno; i++) {
  78.                 _elementi1[i] = obj._elementi1[i];
  79.                 _elementi2[i] = obj._elementi2[i];
  80.             }
  81.         } return *this;
  82.     }
  83.     void AddElement(T1 & element1, T2 & element2) {
  84.         for (int i = 0; i < _trenutno; i++)
  85.             if (_elementi1[i] == element1 && _elementi2[i] == element2)
  86.                 throw NedozvoljenaOperacija("Nije dozvoljeno dodavati vise istih elemenata u Kolekciju!", __LINE__);
  87.         T1 *_temp1 = new T1[_trenutno+1];
  88.         T2 *_temp2 = new T2[_trenutno+1];
  89.         for (int i = 0; i < _trenutno; i++) {
  90.             _temp1[i] = _elementi1[i];
  91.             _temp2[i] = _elementi2[i];
  92.         }
  93.         _temp1[_trenutno] = element1;
  94.         _temp2[_trenutno] = element2;
  95.         delete[]_elementi1;
  96.         delete[]_elementi2;
  97.         _elementi1 = _temp1;
  98.         _elementi2 = _temp2;
  99.         _trenutno++;
  100.     }
  101.     void sortirajKolekcijuPoBodovima() {
  102.         int brSwap;
  103.         for (int i = _trenutno; i > 0; i--) {
  104.             brSwap = 0;
  105.             for (int j = 1; j < i; j++) {
  106.                 if (_elementi1[j] > _elementi1[j-1]) {
  107.                     swap(_elementi1[j], _elementi1[j-1]);
  108.                     swap(_elementi2[j], _elementi2[j-1]);
  109.                     brSwap++;
  110.                 }
  111.             }
  112.             if (!brSwap) return;
  113.         }
  114.     }
  115.     void sortirajKolekcijuPoKategorijamaClanovaKomisije() {
  116.         int brSwap;
  117.         for (int i = _trenutno; i > 0; i--) {
  118.             brSwap = 0;
  119.             for (int j = 1; j < i; j++) {
  120.                 if (_elementi2[j] > _elementi2[j-1]) {
  121.                     swap(_elementi1[j], _elementi1[j-1]);
  122.                     swap(_elementi2[j], _elementi2[j-1]);
  123.                     brSwap++;
  124.                 }
  125.             }
  126.             if (!brSwap) return;
  127.         }
  128.     }
  129.     T1 & _getElement1(int lokacija) const {
  130.         if (lokacija < 0 || lokacija >= _trenutno)
  131.             throw NedozvoljenaOperacija("Pristup memorijskoj lokaciji nije dozvoljen!", __LINE__);
  132.         return _elementi1[lokacija];
  133.     }
  134.     T2 & _getElement2(int lokacija) const {
  135.         if (lokacija < 0 || lokacija >= _trenutno)
  136.             throw NedozvoljenaOperacija("Pristup memorijskoj lokaciji nije dozvoljen!", __LINE__);
  137.         return _elementi2[lokacija];
  138.     }
  139.     void _setElement1(int lokacija, T1 vrijednost) {
  140.         if (lokacija < 0 || lokacija >= _trenutno)
  141.             throw NedozvoljenaOperacija("Pristup memorijskoj lokaciji nije dozvoljen!", __LINE__);
  142.         _elementi1[lokacija] = vrijednost;
  143.     }
  144.     void _setElement2(int lokacija, T2 vrijednost) {
  145.         if (lokacija < 0 || lokacija >= _trenutno)
  146.             throw NedozvoljenaOperacija("Pristup memorijskoj lokaciji nije dozvoljen!", __LINE__);
  147.         _elementi2[lokacija] = vrijednost;
  148.     }
  149.     int _getTrenutno() const { return _trenutno; }
  150. };
  151. template <class T1, class T2>
  152. bool operator == (const FITKolekcija<T1, T2> & prvi, const FITKolekcija <T1, T2> & drugi) {
  153.     if (prvi._getTrenutno() != drugi._getTrenutno()) return false;
  154.     for (int i = 0; i < prvi._getTrenutno(); i++) {
  155.         if (prvi._getElement1(i) != drugi._getElement1(i))
  156.             return false;
  157.         if (prvi._getElement2(i) != drugi._getElement2(i))
  158.             return false;
  159.     }
  160.     return true;
  161. }
  162. enum Kategorija { GameChallenge, InnovationChallenge, MobileChallenge, SQLChallenge, CodingChallenge };
  163. char *_ispisKategorije[]{ "GameChallenge", "InnovationChallenge", "MobileChallenge", "SQLChallenge", "CodingChallenge" };
  164. //Klasu proglasiti apstraktnom
  165. class Osoba {
  166.     char* _ime;
  167.     char* _prezime;
  168.     int _godiste;
  169. public:
  170.     Osoba(char* ime = "---", char* prezime = "---", int godiste = 0) {
  171.         int vel = strlen(ime) + 1;
  172.         _ime = new char[vel];
  173.         strcpy_s(_ime, vel, ime);
  174.         vel = strlen(prezime) + 1;
  175.         _prezime = new char[vel];
  176.         strcpy_s(_prezime, vel, prezime);
  177.         _godiste = godiste;
  178.     }
  179.     Osoba(const Osoba & obj) {
  180.         int vel = strlen(obj._ime) + 1;
  181.         _ime = new char[vel];
  182.         strcpy_s(_ime, vel, obj._ime);
  183.         vel = strlen(obj._prezime) + 1;
  184.         _prezime = new char[vel];
  185.         strcpy_s(_prezime, vel, obj._prezime);
  186.         _godiste = obj._godiste;
  187.     }
  188.     /*The destructor is the only method that even if it is pure virtual has to have an implementation
  189.     in order to instantiate derived classes (yes pure virtual functions can have implementations).*/
  190.     virtual ~Osoba() = 0 {
  191.         delete[] _ime; _ime = nullptr;
  192.         delete[] _prezime; _prezime = nullptr;
  193.     }
  194.     Osoba & operator = (const Osoba & obj) {
  195.         if (this != &obj) {
  196.             delete[]_ime;
  197.             delete[]_prezime;
  198.             int vel = strlen(obj._ime) + 1;
  199.             _ime = new char[vel];
  200.             strcpy_s(_ime, vel, obj._ime);
  201.             vel = strlen(obj._prezime) + 1;
  202.             _prezime = new char[vel];
  203.             strcpy_s(_prezime, vel, obj._prezime);
  204.             _godiste = obj._godiste;
  205.         } return *this;
  206.     }
  207.     string _getImePrezime() const { return (string)_ime + " " + (string)_prezime; }
  208.     int _getGodiste() const { return _godiste; }
  209. };
  210. //Prepoznati nasljedjivanje izmedju odgovarajući klasa
  211. //I ucesnici i clanovi komisije trebaju imati podatke za pristup sistemu (email i password)
  212. class Ucesnik: public Osoba {
  213.     char* _email;
  214.     string password; //Najmanje 5 karaktera, kombinacija brojeva i velikih slova
  215.     string _obrazovnaInstitucija;
  216. public:
  217.     Ucesnik(char* ime = "---", char* prezime = "---", int godiste = 0, char* email = "---", string pw = "PassW0RD", string obInstitucija = "---"): Osoba(ime, prezime, godiste) {
  218.         int vel = strlen(email)+1;
  219.         _email = new char[vel];
  220.         strcpy_s(_email, vel, email);
  221.         if (_provjeriIspravnost(pw, praviloLozinkaSearch, 0)) {
  222.             password = pw;
  223.         } else pw = "Passw0RD";
  224.         _obrazovnaInstitucija = obInstitucija;
  225.     }
  226.     virtual ~Ucesnik() {
  227.         if (_email != nullptr) { delete[]_email; _email = nullptr; };
  228.     }
  229.     Ucesnik(const Ucesnik & obj): Osoba(obj) {
  230.         int vel = strlen(obj._email)+1;
  231.         _email = new char[vel];
  232.         strcpy_s(_email, vel, obj._email);
  233.         password = obj.password;
  234.         _obrazovnaInstitucija = obj._obrazovnaInstitucija;
  235.     }
  236.     Ucesnik & operator = (const Ucesnik & obj) {
  237.         if (this != &obj) {
  238.             if (_email)
  239.                 delete[]_email;
  240.             Osoba::operator=(obj);
  241.             int vel = strlen(obj._email)+1;
  242.             _email = new char[vel];
  243.             strcpy_s(_email, vel, obj._email);
  244.             password = obj.password;
  245.             _obrazovnaInstitucija = obj._obrazovnaInstitucija;
  246.         } return *this;
  247.     }
  248.     friend bool operator == (const Ucesnik prvi, const Ucesnik drugi);
  249.     friend ostream & operator << (ostream &C, const Ucesnik &obj);
  250.     friend bool operator != (const Ucesnik prvi, const Ucesnik drugi);
  251. };
  252. bool operator != (const Ucesnik prvi, const Ucesnik drugi) {
  253.     return !(prvi == drugi);
  254. }
  255. ostream & operator << (ostream &C, const Ucesnik &obj) {
  256.     C << "Ime i prezime: " << obj._getImePrezime() << endl;
  257.     C << "Godiste: " << obj._getGodiste() << endl;
  258.     C << "Obrazovna institucija: " << obj._obrazovnaInstitucija << endl;
  259.     C << "E-mail: " << obj._email << endl;
  260.     return C;
  261. }
  262. bool operator == (const Ucesnik prvi, const Ucesnik drugi) {
  263.     return strcmp(prvi._email, drugi._email) == 0 && prvi._getImePrezime() == drugi._getImePrezime() && prvi._getGodiste() == drugi._getGodiste();
  264. }
  265. class ClanKomisije: public Ucesnik {
  266.     char* _pozicija; //Radno mjesto u firmi
  267.     string _firma;
  268. public:
  269.     ClanKomisije(char* ime = "---", char* prezime = "---", int godiste = 0, char* email = "---", string pw = "PassW0RD", string obInstitucija = "---", char* pozicija = "---", string firma = "---"): Ucesnik(ime, prezime, godiste, email, pw, obInstitucija) {
  270.         int vel = strlen(pozicija) +1;
  271.         _pozicija = new char[vel];
  272.         strcpy_s(_pozicija, vel, pozicija);
  273.         _firma = firma;
  274.     }
  275.     virtual ~ClanKomisije() { delete[]_pozicija; _pozicija = nullptr; }
  276.     ClanKomisije(const ClanKomisije & obj): Ucesnik(obj) {
  277.         int vel = strlen(obj._pozicija) +1;
  278.         _pozicija = new char[vel];
  279.         strcpy_s(_pozicija, vel, obj._pozicija);
  280.         _firma = obj._firma;
  281.     }
  282.     ClanKomisije & operator = (const ClanKomisije & obj) {
  283.         if (this != &obj) {
  284.             Ucesnik::operator=(obj);
  285.             delete[]_pozicija;
  286.             int vel = strlen(obj._pozicija) +1;
  287.             _pozicija = new char[vel];
  288.             strcpy_s(_pozicija, vel, obj._pozicija);
  289.             _firma = obj._firma;
  290.         } return *this;
  291.     }
  292.     friend ostream & operator << (ostream &C, const ClanKomisije &obj);
  293. };
  294. ostream & operator << (ostream &C, const ClanKomisije &obj) {
  295.     C << (Ucesnik)obj;
  296.     C << "Firma: " << obj._firma << endl;
  297.     C << "Pozicija: " << obj._pozicija << endl;
  298.     return C;
  299. }
  300. int sumaDana(int _dan, int _mjesec, int _godina) {
  301.     int suma = 0, brDana[]{ 31,28,31,30,31,30,31,31,30,31,30,31 };
  302.     for (int i = 1900; i < _godina; i++) {
  303.         if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
  304.             suma += 366;
  305.         else suma += 365;
  306.     }
  307.     for (int i = 1; i < _mjesec; i++) {
  308.         if (((_godina % 4 == 0 && _godina % 100 != 0) || _godina % 400 == 0) && i == 2)
  309.             suma += 29;
  310.         else suma += brDana[i-1];
  311.     } return suma += _dan;
  312. }
  313. bool _porediDatume(string _datumPrijave, string _datumDO) {
  314.     string dan1 = _datumPrijave.substr(0, 2), mjesec1 = _datumPrijave.substr(3, 2), godina1 = _datumPrijave.substr(6, 4);
  315.     string dan2 = _datumDO.substr(0, 2), mjesec2 = _datumDO.substr(3, 2), godina2 = _datumDO.substr(6, 4);
  316.     int _dan1, _mjesec1, _godina1, _dan2, _mjesec2, _godina2;
  317.     _dan1 = stoi(dan1, nullptr, 10); _dan2 = stoi(dan2, nullptr, 10);
  318.     _mjesec1 = stoi(mjesec1, nullptr, 10); _mjesec2 = stoi(mjesec2, nullptr, 10);
  319.     _godina1 = stoi(godina1, nullptr, 10); _godina2 = stoi(godina1, nullptr, 10);
  320.     return sumaDana(_dan1, _mjesec1, _godina1) <= sumaDana(_dan2, _mjesec2, _godina2);
  321. }
  322. //Prijave koje ne ukljucuju izradu i predaju projekata (kategorije: SQLChallenge i CodingChallenge)
  323. class Prijava {
  324. protected:
  325.     string _datum; //Podrzani format: dd.MM.yyyy
  326.     Kategorija _kategorija;
  327.     FITKolekcija<Ucesnik, bool> _tim; //Tim se sastoji od jednog ili vise ucesnika, drugi paramtetar oznacava predstavnika tima
  328. public:
  329.     //Konstruktor
  330.     Prijava(string datum, Kategorija kategorija) {
  331.         if (_provjeriIspravnost(datum, praviloDatumMatch,1))
  332.             _datum = datum;
  333.         else NedozvoljenaOperacija("Datum nije unesen u pravilnom formatu!", __LINE__);
  334.         _kategorija = kategorija;
  335.     }
  336.     virtual ~Prijava() {};
  337.     Prijava(const Prijava & obj) {
  338.         _datum = obj._datum;
  339.         _kategorija = obj._kategorija;
  340.         _tim = obj._tim;
  341.     }
  342.     Prijava & operator = (const Prijava & obj) {
  343.         if (this != &obj) {
  344.             _datum = obj._datum;
  345.             _kategorija = obj._kategorija;
  346.             _tim = obj._tim;
  347.         } return *this;
  348.     }
  349.     //Funkciju za dodavanje clanova tima uz postivanje ogranicenja maksimalno dozvoljenog broja clanova u timu.
  350.     //SQLChallenge i CodingChallenge: 2
  351.     //GameChallenge i MobileChallenge: 3
  352.     //InnovationChallenge: 4
  353.     //Onemoguciti dodavanje istog ucesnika vise puta. Tim moze imati najvise jednog predstavnika.
  354.     void AddClanaTima(Ucesnik & ucesnik, bool predstavnik = false) {
  355.         switch (_kategorija) {
  356.         case CodingChallenge:
  357.         case SQLChallenge: if (_tim._getTrenutno() == 2) throw NedozvoljenaOperacija("Dostigli ste maksimalni broj clanova tima! Dodavanje novih nije omoguceno!", __LINE__);
  358.             for (int i = 0; i < _tim._getTrenutno(); i++) {
  359.                 if (_tim._getElement2(i) && predstavnik) throw NedozvoljenaOperacija("U jednom timu moze biti samo jedan Predstavnik tima!", __LINE__);
  360.                 if (_tim._getElement1(i) == ucesnik) throw NedozvoljenaOperacija("Nije moguce dodati isto lice dva puta u tim!", __LINE__);
  361.             } _tim.AddElement(ucesnik, predstavnik); break;
  362.         case GameChallenge:
  363.         case MobileChallenge: if (_tim._getTrenutno() == 3) throw NedozvoljenaOperacija("Dostigli ste maksimalni broj clanova tima! Dodavanje novih nije omoguceno!", __LINE__);
  364.             for (int i = 0; i < _tim._getTrenutno(); i++) {
  365.                 if (_tim._getElement2(i) && predstavnik) throw NedozvoljenaOperacija("U jednom timu moze biti samo jedan Predstavnik tima!", __LINE__);
  366.                 if (_tim._getElement1(i) == ucesnik) throw NedozvoljenaOperacija("Nije moguce dodati isto lice dva puta u tim!", __LINE__);
  367.             } _tim.AddElement(ucesnik, predstavnik); break;
  368.         case InnovationChallenge: if (_tim._getTrenutno() == 4) throw NedozvoljenaOperacija("Dostigli ste maksimalni broj clanova tima! Dodavanje novih nije omoguceno!", __LINE__);
  369.             for (int i = 0; i < _tim._getTrenutno(); i++) {
  370.                 if (_tim._getElement2(i) && predstavnik) throw NedozvoljenaOperacija("U jednom timu moze biti samo jedan Predstavnik tima!", __LINE__);
  371.                 if (_tim._getElement1(i) == ucesnik) throw NedozvoljenaOperacija("Nije moguce dodati isto lice dva puta u tim!", __LINE__);
  372.             } _tim.AddElement(ucesnik, predstavnik); break;
  373.         }
  374.     }
  375.     //Funkciju za promjenu predstavnika tima.
  376.     void PromjeniPredstavnikaTima(Ucesnik ucesnik) {
  377.         bool izvrsenaPromjena = false;
  378.         for (int i = 0; i < _tim._getTrenutno(); i++) {
  379.             if (_tim._getElement2(i))
  380.                 _tim._setElement2(i, false);
  381.             if (ucesnik == _tim._getElement1(i)) {
  382.                 _tim._setElement2(i, true);
  383.                 izvrsenaPromjena = true;
  384.             }
  385.         }
  386.         if (!izvrsenaPromjena)
  387.             throw NedozvoljenaOperacija("Navedeni ucesnik nije registrovan u timu!", __LINE__);
  388.     }
  389.     FITKolekcija<Ucesnik, bool> _getTim() const { return _tim; }
  390.     Kategorija & _getKategorija() { return _kategorija; }
  391.     string  _getDatum() const { return _datum; }
  392.     friend ostream& operator << (ostream &C, const Prijava &obj);
  393.     friend bool operator == (const Prijava &prva, const Prijava &druga);
  394. };
  395. bool operator == (const Prijava &prva, const Prijava &druga) {
  396.     if (prva._tim._getTrenutno() != druga._tim._getTrenutno())
  397.         return false;
  398.     for (int i = 0; i < prva._tim._getTrenutno(); i++) {
  399.         if (prva._tim._getElement1(i) != druga._tim._getElement1(i))
  400.             return false;
  401.     }
  402.     if (prva._kategorija == druga._kategorija)
  403.         return true;
  404.     return false;
  405. }
  406. ostream& operator << (ostream &C, const Prijava &obj) {
  407.     C << "Datum prijave: " << obj._datum << endl;
  408.     C << "Kategorija: " << _ispisKategorije[obj._kategorija] << endl;
  409.     C << "Tim:\n";
  410.     if (obj._tim._getTrenutno() == 0)
  411.         C << "Podaci o clanovima tima nisu evidentirani!" << endl;
  412.     else {
  413.         for (int i = 0; i < obj._tim._getTrenutno(); i++)
  414.             C << obj._tim._getElement1(i) << endl;
  415.     } return C;
  416. }
  417. //Prijave koje ukljucuju izradu projekata (kategorije: GameChallenge, InnovationChallenge i MobileChallenge)
  418. class PrijavaProjekta: public Prijava {
  419.     char* _nazivProjekta;
  420.     string _opisProjekta;
  421.     bool _finalizirano; //Atribut oznacava da li je projekat zavrsen i predan u predvidjenom roku
  422.     bool _prezentacija; //Projekti koji se prezentuju i ocjenjuju
  423. public:
  424.     //Konstruktor i destruktor
  425.     PrijavaProjekta(char* naziv, string opis, string datum, Kategorija kategorija):Prijava(datum, kategorija) {
  426.         int vel = strlen(naziv) +1;
  427.         _nazivProjekta = new char[vel];
  428.         strcpy_s(_nazivProjekta, vel, naziv);
  429.         _opisProjekta = opis;
  430.         _finalizirano = _prezentacija = false;
  431.     }
  432.     virtual ~PrijavaProjekta() { cout << "PrijavaProjekta::destruktor! "; if (_nazivProjekta) { delete[]_nazivProjekta; _nazivProjekta = nullptr; } }
  433.     PrijavaProjekta(const PrijavaProjekta & obj): Prijava(obj) {
  434.         int vel = strlen(obj._nazivProjekta) +1;
  435.         _nazivProjekta = new char[vel];
  436.         strcpy_s(_nazivProjekta, vel, obj._nazivProjekta);
  437.         _opisProjekta = obj._opisProjekta;
  438.         _finalizirano = obj._finalizirano;
  439.         _prezentacija = obj._prezentacija;
  440.     }
  441.     PrijavaProjekta & operator = (const PrijavaProjekta & obj) {
  442.         if (this != &obj) {
  443.             delete[]_nazivProjekta;
  444.             int vel = strlen(obj._nazivProjekta) +1;
  445.             _nazivProjekta = new char[vel];
  446.             strcpy_s(_nazivProjekta, vel, obj._nazivProjekta);
  447.             _opisProjekta = obj._opisProjekta;
  448.             _finalizirano = obj._finalizirano;
  449.             _prezentacija = obj._prezentacija;
  450.         } return *this;
  451.     }
  452.     void _setOpisProjekta(string noviOpis) { _opisProjekta = noviOpis; }
  453.     void _setFinalizirano(bool vrijednost) { _finalizirano = vrijednost; }
  454.     void _setPrezentacija(bool vrijednost) { _prezentacija = vrijednost; }
  455.     bool _getFinalizirano() const { return _finalizirano; }
  456.     bool _getPrezentacija() const { return _prezentacija; }
  457.     friend ostream & operator << (ostream &C, const PrijavaProjekta &obj);
  458.     friend bool operator == (const PrijavaProjekta &prvi, const PrijavaProjekta &drugi);
  459. };
  460. ostream & operator << (ostream &C, const PrijavaProjekta &obj) {
  461.     C << "Naziv projekta: " << obj._nazivProjekta << endl;
  462.     C << "Opis projekta: " << obj._opisProjekta << endl;
  463.     C << "Datum prijave: " << obj._datum << endl;
  464.     C << "Kategorija: " << _ispisKategorije[obj._kategorija] << endl;
  465.     if (obj._tim._getTrenutno() == 0)
  466.         C << "Podaci o clanovima tima nisu evidentirani!" << endl;
  467.     else {
  468.         for (int i = 0; i < obj._tim._getTrenutno(); i++)
  469.             C << obj._tim._getElement1(i) << endl;
  470.     } return C;
  471. }
  472. bool operator == (const PrijavaProjekta &prvi, const PrijavaProjekta &drugi) {
  473.     return strcmp(prvi._nazivProjekta, drugi._nazivProjekta) == 0;
  474. }
  475. class FITCodingChallenge {
  476.     int _godina;
  477.     string _prijaveDo; //Podrzani format unosa: dd.MM.yyyy (koristiti regex)
  478.     vector<Prijava*> _prijave;
  479.     FITKolekcija<ClanKomisije, Kategorija> _komisija;
  480.     FITKolekcija<Prijava*, FITKolekcija<ClanKomisije*, double>> _ocjene;
  481. public:
  482.     //Konstruktor
  483.     FITCodingChallenge(int godina, string prijaveDo) {
  484.         _godina = godina;
  485.         if (_provjeriIspravnost(prijaveDo, praviloDatumMatch, 1))
  486.             _prijaveDo = prijaveDo;
  487.         else _prijaveDo = "01.01.2000";
  488.     }
  489.     ~FITCodingChallenge() { cout << "FITCodingChallange::destruktor! "; }
  490.     FITCodingChallenge(const FITCodingChallenge & obj) {
  491.         _godina = obj._godina;
  492.         _prijaveDo = obj._prijaveDo;
  493.         _prijave = obj._prijave;
  494.         _komisija = obj._komisija;
  495.         _ocjene = obj._ocjene;
  496.     }
  497.     FITCodingChallenge & operator = (const FITCodingChallenge & obj) {
  498.         if (this != &obj) {
  499.             _godina = obj._godina;
  500.             _prijaveDo = obj._prijaveDo;
  501.             _prijave = obj._prijave;
  502.             _komisija = obj._komisija;
  503.             _ocjene = obj._ocjene;
  504.         } return *this;
  505.     }
  506.     //Operator += za dodavanje novih prijava. Isti ucesnik ne moze imati vise prijava u sklopu iste kategorije.
  507.     //Postovati ogranicenje roka za prijave (_prijaveDo).
  508.     //Voditi racuna o alokaciji memorije za prijave (ne zadrzavati adresu proslijedjenog objekta)
  509.     FITCodingChallenge & operator += (Prijava & prijava) {
  510.         if (!_porediDatume(prijava._getDatum(), _prijaveDo))
  511.             throw NedozvoljenaOperacija("Rok za prijave je istekao!", __LINE__);
  512.         for (unsigned int i = 0; i < _prijave.size(); i++) {
  513.             if (_prijave[i]->_getKategorija() == prijava._getKategorija()) {
  514.                 for (int j = 0; j < _prijave[i]->_getTim()._getTrenutno(); j++) {
  515.                     for (int e = 0; e < prijava._getTim()._getTrenutno(); e++)
  516.                         if (_prijave[i]->_getTim()._getElement1(j) == prijava._getTim()._getElement1(e))
  517.                             throw NedozvoljenaOperacija("Ucesnik iz prijave vec postoji u prijavljen na istoj Kategoriji!", __LINE__);
  518.                 }
  519.             }
  520.         }
  521.         PrijavaProjekta * pok = dynamic_cast<PrijavaProjekta *>(&prijava);
  522.         if (pok)
  523.             _prijave.push_back(pok);
  524.         else
  525.             _prijave.push_back(&prijava);
  526.         return *this;
  527.     }
  528.     //Funkciju koja odredjenu prijavu oznacava kao finaliziranu i odabranu za prezentaciju ili ne.
  529.     void _finalizirajPrijavu(PrijavaProjekta & prijava) {
  530.         PrijavaProjekta *pok = nullptr; bool pronadjen = false;
  531.         for (unsigned int i = 0; i < _prijave.size(); i++) {
  532.             pok = dynamic_cast<PrijavaProjekta *>(_prijave[i]);
  533.             if (pok != nullptr && prijava == *pok) {
  534.                 dynamic_cast<PrijavaProjekta *>(_prijave[i])->_setFinalizirano(1);
  535.                 dynamic_cast<PrijavaProjekta *>(_prijave[i])->_setPrezentacija(1);
  536.                 return;
  537.             }
  538.         }
  539.         if (!pronadjen)
  540.             throw NedozvoljenaOperacija("Navedena prijava nije pronadjena!", __LINE__);
  541.     }
  542.     //Operator () za dodavanje clanova komisije po kategorijama. Sprijeciti dodavanje istih clanova u sklopu jedne kategorije.
  543.     void operator () (ClanKomisije &obj, Kategorija kat) {
  544.         try {
  545.             _komisija.AddElement(obj, kat);
  546.         } catch (NedozvoljenaOperacija &greska) {
  547.             greska.Info();
  548.         }
  549.     }
  550.     //Funkciju za ispis svih prijava po kategorijama. Funkcija neobavezno prima parametar kategoriju.
  551.     //Ispis treba da ukljuci i podatke o ucesnicima, odnosno clanovima tima.
  552.     //Ukoliko kategorija nije proslijedjena, podaci treba da budu grupisani po kategorijama.
  553.     void _ispisPrijavaPoKategorijama(Kategorija kat = (Kategorija)101) {
  554.         sort(_prijave.begin(), _prijave.end());
  555.         if (kat == (Kategorija)101) {
  556.             for (Prijava* i : _prijave)
  557.                 cout << crt << *i;
  558.         } else {
  559.             bool pronadjena = false;
  560.             for (int i = 0; i < _prijave.size(); i++)
  561.                 if (_prijave[i]->_getKategorija() == kat) {
  562.                     cout << crt << *_prijave[i]; pronadjena = true;
  563.                 }
  564.             if (!pronadjena) throw NedozvoljenaOperacija("Navedena Kategorija ne postoji u Prijavama!", __LINE__);
  565.         }
  566.     }
  567.     //Funkciju za ocjenu projekata (radova) od strane clanova komisije (kolekcija _ocjene).
  568.     //Kolekcija sadrzi samo pokazivace (bez alokacije nove memorije) na postojece prijave i vec definisane clanove komisije.
  569.     //Voditi racuna da se ne mogu ocijeniti projekti koji nisu finalizirani i nisu odabrani za prezentaciju, niti da ocjenu mogu dati clanovi komisije koji
  570.     //nisu pridruzeni odgovarajucoj kategoriji prijave. Svaki clan komisije daje ocjenu za svaki projekat, odnosno rad, u
  571.     //kategoriji gdje je dodijeljen. Ocjene se krecu u rasponu od 1 do 10 za projekte, a za radove u kategoriji SQL ili CodingChallenge
  572.     //u rasponu osvojenih bodova od 0 do 100. Pretpostaviti da su svi ucesnici prijavljeni u kategorijama SQL i CodingChallenge predali radove.
  573.     void _ocjeniPrijavu(Prijava & prijava, ClanKomisije * clan, double ocjena) {
  574.         PrijavaProjekta * pok = nullptr;
  575.         if (dynamic_cast<PrijavaProjekta*>(&prijava)) {
  576.             if (ocjena < 1 || ocjena > 10)
  577.                 throw NedozvoljenaOperacija("Unesena ocjena ne postoji u skali za projekte!", __LINE__);
  578.         } else {
  579.             if (ocjena < 0 || ocjena > 100)
  580.                 throw NedozvoljenaOperacija("Uneseni broj bodova nije moguce dodijeliti prijavi!", __LINE__);
  581.         }
  582.         for (int i = 0; i < _komisija._getTrenutno(); i++) {
  583.             if (*clan == _komisija._getElement1(i) && prijava._getKategorija() == _komisija._getElement2(i)) {
  584.                 FITKolekcija<ClanKomisije *, double> _temp;
  585.                 for (int j = 0; j < _prijave.size(); j++) {
  586.                     pok = dynamic_cast<PrijavaProjekta*>(_prijave[j]);
  587.                     if (*_prijave[j] == prijava) { //ne postoji bolji nacin provjere da li je to odgovarajuca prijava // poor class
  588.                         if (pok) {
  589.                             if (pok->_getFinalizirano() && pok->_getPrezentacija()) {
  590.                                 _temp.AddElement(clan, ocjena);
  591.                                 _ocjene.AddElement(_prijave[j], _temp);
  592.                             } else throw NedozvoljenaOperacija("Projekat prijave nije finaliziran ili nije odredjen za prezentaciju!", __LINE__);
  593.                         } else {
  594.                             _temp.AddElement(clan, ocjena);
  595.                             _ocjene.AddElement(_prijave[j], _temp);
  596.                         } return;
  597.                     }
  598.                 }
  599.             }
  600.         } throw NedozvoljenaOperacija("Navedena prijava ne postoji!", __LINE__);
  601.     }
  602.     //Funkcija koja na osnovu imena i prezimena clana komisije ispisuje podatke o njegovim ocjenama uključujući
  603.     //prijave na koje se one odnose.
  604.     void _pretragaClanovaKomisije(char *imePrezime) {
  605.         string _imePrezime = (string)imePrezime; int brIspisa = 0;
  606.         for (int i = 0; i < _ocjene._getTrenutno(); i++) {
  607.             for (int j = 0; j < _ocjene._getElement2(i)._getTrenutno(); j++)
  608.                 if (_imePrezime == _ocjene._getElement2(i)._getElement1(j)->_getImePrezime()) {
  609.                     if (brIspisa == 0) {
  610.                         cout << crt << "..:: CLAN KOMISIJE ::..\n" << crt << *_ocjene._getElement2(i)._getElement1(j); brIspisa++;
  611.                     }
  612.                     cout << crt << "..:: UCESNIK ::..\n" << crt << *_ocjene._getElement1(i);
  613.                     cout << crt << _ocjene._getElement2(i)._getElement1(j)->_getImePrezime() << " ocjenio sa: " << _ocjene._getElement2(i)._getElement2(j) << endl << crt;
  614.                 }
  615.         }
  616.     }
  617.     //Funkcija koja na osnovu imena i prezimena ucesnika ispisuje podatke o njegovim prijavama na takmicenju, zajedno sa
  618.     //ocjenama, ukoliko su one definisane za prijavu/e datog ucenika.
  619.     void _pretragaUcesnika(char *imePrezime) {
  620.         string _imePrezime = (string)imePrezime; int brIspisa = 0; bool pronadjen = false;
  621.         for (int i = 0; i < _prijave.size(); i++) {
  622.             for (int j = 0; j < _prijave[i]->_getTim()._getTrenutno(); j++) {
  623.                 if (_prijave[i]->_getTim()._getElement1(j)._getImePrezime() == _imePrezime) {
  624.                     pronadjen = true;
  625.                     if (brIspisa == 0) {
  626.                         cout << crt << _prijave[i]->_getTim()._getElement1(j) << crt; brIspisa++;
  627.                     }
  628.                     cout << crt << _prijave[i];
  629.                     for (int e = 0; e < _ocjene._getTrenutno(); e++) {
  630.                         for (int a = 0; a < _ocjene._getElement2(e)._getTrenutno(); a++) {
  631.                             if (_ocjene._getElement1(e) == _prijave[i])
  632.                                 cout << _ocjene._getElement2(e)._getElement1(a)->_getImePrezime() << " ocijenio sa: " << _ocjene._getElement2(e)._getElement2(a) << endl << crt;
  633.                         }
  634.                     }
  635.                 }
  636.             }
  637.         }
  638.         if (!pronadjen) throw NedozvoljenaOperacija("Navedeni Ucesnik nije pronadjen!", __LINE__);
  639.     }
  640.     //Funkciju za rangiranje kandidata na osnovu kategorije proslijedjene kao parametar.
  641.     //Funkcija treba da na osnovu ocjena clanova komisije ispise rang liste timova zajedno sa prosjecnim ocjenama njihovih projekata (radova).
  642.     //Dakle, konacna rang lista ukljucuje nazive timova (u zavisnosti od kategorije i naziv projekta), te prosjecnu ocjenu.
  643.     void _rangirajKandidate(Kategorija kat) {
  644.         int brojOcjena = 0; bool ulaz = false, pronadjenaKat = false;
  645.         FITKolekcija<double, int> _bodoviIndeks;
  646.         for (int i = 0; i < _ocjene._getTrenutno(); i++) {
  647.             if (_ocjene._getElement1(i)->_getKategorija() == kat) {
  648.                 pronadjenaKat = true;
  649.                 for (int j = 0; j < _ocjene._getElement2(i)._getTrenutno(); j++) {
  650.                     ulaz = false;
  651.                     for (int e = 0; e < _bodoviIndeks._getTrenutno(); e++)
  652.                         if (_ocjene._getElement1(_bodoviIndeks._getElement2(e)) == _ocjene._getElement1(i)) {
  653.                             _bodoviIndeks._setElement1(e, (_bodoviIndeks._getElement1(e)+_ocjene._getElement2(i)._getElement2(j))/2); ulaz = true;
  654.                         }
  655.                     if (!ulaz)
  656.                         _bodoviIndeks.AddElement(_ocjene._getElement2(i)._getElement2(j), i);
  657.                 }
  658.             }
  659.         }
  660.         if (!pronadjenaKat) throw NedozvoljenaOperacija("Navedena Kategorija nije pronadjena!", __LINE__);
  661.         _bodoviIndeks.sortirajKolekcijuPoBodovima();
  662.         cout << crt << "Kategorija:  " << _ispisKategorije[kat] << endl << crt;
  663.         for (int i = 0; i < _bodoviIndeks._getTrenutno(); i++) {
  664.             cout << crt << *_ocjene._getElement1(_bodoviIndeks._getElement2(i)) << endl << crt;
  665.             cout << "Prosjek: " << _bodoviIndeks._getElement1(i) << endl << crt;
  666.         }
  667.     }
  668.     //Funkciju Info koja ispisuje sve podatke o takmicenju: prijave i clanove komisije po kategorijama, projekte i
  669.     void Info() {
  670.         cout << crt << " ..:: FIT Coding Challenge " << _godina << " ::.. " << endl << crt;
  671.         try {
  672.             this->_rangirajKandidate(CodingChallenge);
  673.         } catch (NedozvoljenaOperacija &greska) {
  674.             greska.Info();
  675.         }
  676.         try {
  677.             this->_rangirajKandidate(SQLChallenge);
  678.         } catch (NedozvoljenaOperacija &greska) {
  679.             greska.Info();
  680.         }
  681.         try {
  682.             this->_rangirajKandidate(InnovationChallenge);
  683.         } catch (NedozvoljenaOperacija &greska) {
  684.             greska.Info();
  685.         }
  686.         try {
  687.             this->_rangirajKandidate(MobileChallenge);
  688.         } catch (NedozvoljenaOperacija &greska) {
  689.             greska.Info();
  690.         }
  691.         try {
  692.             this->_rangirajKandidate(GameChallenge);
  693.         } catch (NedozvoljenaOperacija &greska) {
  694.             greska.Info();
  695.         }
  696.         _komisija.sortirajKolekcijuPoKategorijamaClanovaKomisije();
  697.         int brIspisa = 0;
  698.         for (int i = 0; i < _komisija._getTrenutno(); i++) {
  699.             if (i != 0 && _komisija._getElement2(i) != _komisija._getElement2(i-1)) { brIspisa = 0; }
  700.             if (brIspisa == 0) {
  701.                 cout << endl << crt << " ..:: CLANOVI KOMISIJE ZA " << _ispisKategorije[_komisija._getElement2(i)] << " :: .." << endl << crt; brIspisa++;
  702.             }
  703.             cout << crt << _komisija._getElement1(i) << crt;
  704.         }
  705.         cout << "\n-----****-----\n  MAKE CODE\n GREAT AGAIN\n-----****-----\n";
  706.     }
  707. };
  708. void main() {
  709.  
  710. #pragma region Ucesnici&ClanoviKomisije
  711.  
  712.     Ucesnik dzenana("Dzenana", "Kuric", 1994, "dzenana.kuric@etf.unsa.ba", "Dz3na", "ETF");
  713.     Ucesnik vehid("Vehid", "Djukic", 1991, "vehid.djukic@edu.fit.ba", "vegn4Gun", "FIT");
  714.     Ucesnik mirza("Mirza", "Smajic", 1992, "mirza.smajic@edu.fit.ba", "M1kik1", "FIT");
  715.     Ucesnik tarik("Tarik", "Djurdjevic", 1996, "tarik.djurdjevic@edu.fit.ba", "Djur4", "FIT");
  716.     Ucesnik borki("Dalibor", "Blazevic", 1992, "dalibor.blazevic@edu.fit.ba", "Dal1b0rkiC", "FIT");
  717.     Ucesnik ajdin("Ajdin", "Meskovic", 1998, "ajdin.meskovic@edu.fit.ba", "p4saMal1", "FIT");
  718.     Ucesnik rusmir("Rusmir", "Hockic", 1996, "rusmir.hockic@edu.fit.ba", "ruk1m0n", "FIT");
  719.     Ucesnik amer("Amer", "Karamustafic", 1996, "amer.karamustafic@edu.fit.ba", "k4raMu", "FIT");
  720.  
  721.     ClanKomisije adnan("Adnan", "Jusic", 1995, "jusic.adnan@edu.fit.ba", "uberG33k", "FIT", "Full-stack Developer", "MAKE CODE GREAT AGAIN");
  722.     ClanKomisije ensar("Ensar", "Meskovic", 1994, "ensar.meskovic@edu.fit.ba", "Lak1luk", "FIT", "K-dant", "MAKE CODE GREAT AGAIN");
  723.  
  724. #pragma endregion
  725.  
  726. #pragma region Prijave&PrijaveProjekata
  727.  
  728.     Prijava kod1("12.05.2017", CodingChallenge), kod2("13.05.2017", CodingChallenge), kod3("15.05.2017", CodingChallenge), kod4("14.05.2017", CodingChallenge);
  729.     Prijava sql1("11.05.2017", SQLChallenge), sql2("13.05.2017", SQLChallenge), sql3("23.05.2017", SQLChallenge);
  730.     PrijavaProjekta kacket("Eyetelligence", "Pomoc slijepim osobama", "01.05.2017", InnovationChallenge);
  731.     PrijavaProjekta ecomm("Fast-commerce", "New eway-commerce", "17.02.2019", InnovationChallenge);
  732.     PrijavaProjekta eSkola("eSkola", "Online skola", "17.04.2017", InnovationChallenge);
  733.     PrijavaProjekta igraFIT("FIT Game", "Igra", "20.04.2017", GameChallenge);
  734.  
  735.     try {
  736.         kod1.AddClanaTima(ajdin, true);
  737.         kod3.AddClanaTima(rusmir, true);
  738.         kod4.AddClanaTima(amer, true);
  739.         kod2.AddClanaTima(borki, true);
  740.         kod2.AddClanaTima(tarik, false);
  741.         kod2.AddClanaTima(amer, false);//izuzetak
  742.     } catch (NedozvoljenaOperacija &greska) {
  743.         greska.Info();
  744.     }
  745.     cout << crt << kod2;
  746.     try {
  747.         sql1.AddClanaTima(tarik, true);
  748.         sql2.AddClanaTima(vehid, false);
  749.         sql3.AddClanaTima(amer, true);
  750.     } catch (NedozvoljenaOperacija &greska) {
  751.         greska.Info();
  752.     }
  753.     cout << crt << sql2;
  754.     try {
  755.         sql2.PromjeniPredstavnikaTima(amer);//izuzetak
  756.     } catch (NedozvoljenaOperacija &greska) {
  757.         greska.Info();
  758.     }
  759.     sql2.PromjeniPredstavnikaTima(vehid);
  760.     sql3 = kod2;
  761.     if (sql3 == kod2) {
  762.         cout << "Identicne prijave!" << endl;
  763.     }
  764.     cout << crt << sql2;
  765.     try {
  766.         kacket.AddClanaTima(mirza, true);
  767.         kacket.AddClanaTima(borki, false);
  768.         igraFIT.AddClanaTima(tarik, true);
  769.     } catch (NedozvoljenaOperacija &greska) {
  770.         greska.Info();
  771.     }
  772.     cout << crt << kacket;
  773.     cout << crt << igraFIT;
  774. #pragma endregion
  775.  
  776. #pragma region TestiranjeFITCodingChallenge
  777.  
  778.     FITCodingChallenge CC17(2017, "22.05.2017");
  779.  
  780.     CC17(adnan, SQLChallenge);
  781.     CC17(ensar, InnovationChallenge);
  782.     CC17(adnan, CodingChallenge);
  783.     CC17(ensar, CodingChallenge);
  784.     CC17(adnan, GameChallenge);
  785.  
  786.     try {
  787.         CC17 += igraFIT; CC17 += kacket;
  788.         CC17 += kod1; CC17 += kod2; CC17 += kod3; CC17 += kod4;
  789.         CC17 += sql1; CC17 += sql2; CC17 += sql3;
  790.     } catch (NedozvoljenaOperacija &greska) {
  791.         greska.Info();
  792.     }
  793.  
  794.     CC17._finalizirajPrijavu(igraFIT);
  795.  
  796.     try {
  797.         CC17._ocjeniPrijavu(kacket, &ensar, 78);
  798.     } catch (NedozvoljenaOperacija &greska) {
  799.         greska.Info();
  800.     }
  801.     try {
  802.         CC17._ocjeniPrijavu(kod1, &ensar, 79);
  803.     } catch (NedozvoljenaOperacija &greska) {
  804.         greska.Info();
  805.     }
  806.     try {
  807.         CC17._ocjeniPrijavu(kod1, &adnan, 74);//
  808.     } catch (NedozvoljenaOperacija &greska) {
  809.         greska.Info();
  810.     }
  811.     try {
  812.         CC17._ocjeniPrijavu(sql2, &adnan, 83);//
  813.     } catch (NedozvoljenaOperacija &greska) {
  814.         greska.Info();
  815.     }
  816.     try {
  817.         CC17._ocjeniPrijavu(kod2, &ensar, 65);
  818.     } catch (NedozvoljenaOperacija &greska) {
  819.         greska.Info();
  820.     }
  821.     try {
  822.         CC17._ocjeniPrijavu(kod2, &adnan, 70);//
  823.     } catch (NedozvoljenaOperacija &greska) {
  824.         greska.Info();
  825.     }
  826.     try {
  827.         CC17._ocjeniPrijavu(kod3, &adnan, 72);//
  828.     } catch (NedozvoljenaOperacija &greska) {
  829.         greska.Info();
  830.     }
  831.     try {
  832.         CC17._ocjeniPrijavu(kod4, &adnan, 76);//
  833.     } catch (NedozvoljenaOperacija &greska) {
  834.         greska.Info();
  835.     }
  836.     try {
  837.         CC17._ocjeniPrijavu(sql1, &adnan, 69);//
  838.     } catch (NedozvoljenaOperacija &greska) {
  839.         greska.Info();
  840.     }
  841.     try {
  842.         CC17._ocjeniPrijavu(igraFIT, &adnan, 10);
  843.     } catch (NedozvoljenaOperacija &greska) {
  844.         greska.Info();
  845.     }
  846.  
  847.     CC17._pretragaClanovaKomisije("Adnan Jusic");
  848.     cout << "\n\n\n";
  849.     try {
  850.         CC17._ispisPrijavaPoKategorijama();
  851.     } catch (NedozvoljenaOperacija &greska) {
  852.         greska.Info();
  853.     }
  854.     try {
  855.         CC17._rangirajKandidate(CodingChallenge);
  856.     } catch (NedozvoljenaOperacija &greska) {
  857.         greska.Info();
  858.     }
  859.  
  860.     CC17.Info();
  861.  
  862. #pragma endregion
  863.     getchar();
  864. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement