Advertisement
mujkic_n

W13

Jan 29th, 2017
582
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 35.70 KB | None | 0 0
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <string>
  4. #include <vector>
  5. #include <regex>
  6. #include <iomanip>
  7. using namespace std;
  8.  
  9. const string ln = "\n-----------------------------------------------------------\n";
  10.  
  11. //Koristiti klasu NedozvoljenaOperacija za bacanje izuzetaka u cijelom programu
  12. class NedozvoljenaOperacija : public exception
  13. {
  14.     int _linijaKoda;
  15. public:
  16.     NedozvoljenaOperacija(char* poruka, int linijaKoda) : exception(poruka)
  17.     {
  18.         _linijaKoda = linijaKoda;
  19.     }
  20.  
  21.     void Info()
  22.     {
  23.         cout << "Greska u liniji koda " << _linijaKoda << ": " << exception::what() << endl;
  24.     }
  25. };
  26.  
  27. bool ValidirajPodatak(const string & podatak, const string & pravilo, string funkcija = "match")
  28. {
  29.     if (funkcija == "match")
  30.         return regex_match(podatak, regex(pravilo));
  31.     return regex_search(podatak, regex(pravilo));
  32. }
  33.  
  34. template<class T>
  35. void Swap(T & prvi, T & drugi)
  36. {
  37.     T temp = prvi;
  38.     prvi = drugi;
  39.     drugi = temp;
  40. }
  41.  
  42. template<class T1, class T2>
  43. class Kolekcija
  44. {
  45.     T1* _elementi1;
  46.     T2* _elementi2;
  47.     int _trenutno;
  48. public:
  49.     Kolekcija()
  50.     {
  51.         _trenutno = 0;
  52.  
  53.         _elementi1 = nullptr;
  54.         _elementi2 = nullptr;
  55.     }
  56.  
  57.     Kolekcija(const Kolekcija & obj)
  58.     {
  59.         _trenutno = obj._trenutno;
  60.  
  61.         _elementi1 = new T1[_trenutno];
  62.         _elementi2 = new T2[_trenutno];
  63.  
  64.         for (size_t i = 0; i < _trenutno; i++)
  65.         {
  66.             _elementi1[i] = obj._elementi1[i];
  67.             _elementi2[i] = obj._elementi2[i];
  68.         }
  69.     }
  70.  
  71.     ~Kolekcija()
  72.     {
  73.         delete[]_elementi1;
  74.         _elementi1 = nullptr;
  75.         delete[]_elementi2;
  76.         _elementi2 = nullptr;
  77.     }
  78.  
  79.     Kolekcija & operator =(const Kolekcija & right)
  80.     {
  81.         if (this != &right)
  82.         {
  83.             delete[]_elementi1;
  84.             delete[]_elementi2;
  85.  
  86.             _trenutno = right._trenutno;
  87.  
  88.             _elementi1 = new T1[_trenutno];
  89.             _elementi2 = new T2[_trenutno];
  90.  
  91.             for (size_t i = 0; i < _trenutno; i++)
  92.             {
  93.                 _elementi1[i] = right._elementi1[i];
  94.                 _elementi2[i] = right._elementi2[i];
  95.             }
  96.         }
  97.         return *this;
  98.     }
  99.  
  100.     void Add(const T1 & element_1, const T2 & element_2)
  101.     {
  102.         for (size_t i = 0; i < _trenutno; i++)
  103.             if (_elementi1[i] == element_1 && _elementi2[i] == element_2)
  104.                 throw NedozvoljenaOperacija("Ne mozete dodavati iste elemente u kolekciju", __LINE__);
  105.  
  106.         T1 * temp_1 = new T1[_trenutno + 1];
  107.         T2 * temp_2 = new T2[_trenutno + 1];
  108.  
  109.         for (size_t i = 0; i < _trenutno; i++)
  110.         {
  111.             temp_1[i] = _elementi1[i];
  112.             temp_2[i] = _elementi2[i];
  113.         }
  114.         temp_1[_trenutno] = element_1;
  115.         temp_2[_trenutno++] = element_2;
  116.  
  117.         delete[]_elementi1;
  118.         delete[]_elementi2;
  119.  
  120.         _elementi1 = temp_1;
  121.         _elementi2 = temp_2;
  122.     }
  123.  
  124.     int size()const
  125.     {
  126.         return _trenutno;
  127.     }
  128.  
  129.     void sort(int NaOsnovuKojegElementa = 2)
  130.     {
  131.         int indikatorZamjene = 0;
  132.         int length = _trenutno;
  133.  
  134.         do
  135.         {
  136.             indikatorZamjene = 1;
  137.             for (size_t i = 0; i < length - 1; i++)
  138.             {
  139.                 if (NaOsnovuKojegElementa == 2)
  140.                 {
  141.                     if (_elementi2[i] < _elementi2[i + 1])
  142.                     {
  143.                         Swap(_elementi1[i], _elementi1[i + 1]);
  144.                         Swap(_elementi2[i], _elementi2[i + 1]);
  145.                         indikatorZamjene = 0;
  146.                     }
  147.                 }
  148.                 else
  149.                 {
  150.                     if (_elementi1[i] < _elementi1[i + 1])
  151.                     {
  152.                         Swap(_elementi1[i], _elementi1[i + 1]);
  153.                         Swap(_elementi2[i], _elementi2[i + 1]);
  154.                         indikatorZamjene = 0;
  155.                     }
  156.                 }
  157.             }
  158.             length--;
  159.         } while (length > 1 && indikatorZamjene == 0);
  160.     }
  161.  
  162.     T1 & operator [](int index)const
  163.     {
  164.         if (index >= 0 && index < _trenutno)
  165.             return _elementi1[index];
  166.         throw NedozvoljenaOperacija("Index lokacija nije validna", __LINE__);
  167.     }
  168.  
  169.     T2 & GetElement_2(int index)const
  170.     {
  171.         if (index >= 0 && index < _trenutno)
  172.             return _elementi2[index];
  173.         throw NedozvoljenaOperacija("Index lokacija nije validna", __LINE__);
  174.     }
  175.  
  176.     friend bool operator == <>(const Kolekcija &, const Kolekcija &);
  177.     friend bool operator != <>(const Kolekcija &, const Kolekcija &);
  178. };
  179. template<class T1, class T2>
  180. bool operator == <>(const Kolekcija<T1, T2> & left, const Kolekcija<T1, T2> & right)
  181. {
  182.     if (left._trenutno != right._trenutno)
  183.         return false;
  184.     else
  185.     {
  186.         for (size_t i = 0; i < left._trenutno; i++)
  187.             if (left._elementi1[i] != right._elementi1[i] || left._elementi2[i] != right._elementi2[i])
  188.                 return false;
  189.     }
  190.     return true;
  191. }
  192. template<class T1, class T2>
  193. bool operator != <>(const Kolekcija<T1, T2> & left, const Kolekcija<T1, T2> & right)
  194. {
  195.     return !(left == right);
  196. }
  197.  
  198. enum Kategorija { GameChallenge, InnovationChallenge, MobileChallenge, SQLChallenge, CodingChallenge, IspisiSveKategorije };
  199. char * ispisKategorije[] = { "GameChallenge", "InnovationChallenge", "MobileChallenge", "SQLChallenge", "CodingChallenge" };
  200.  
  201. class Osoba
  202. {
  203.     char* _ime;
  204.     char* _prezime;
  205.     int _godiste;
  206. public:
  207.     Osoba()
  208.     {
  209.         _ime = _prezime = nullptr;
  210.         _godiste = 1997;
  211.     }
  212.  
  213.     Osoba(char* ime, char* prezime, int godiste)
  214.     {
  215.         int vel = strlen(ime) + 1;
  216.         _ime = new char[vel];
  217.         strcpy_s(_ime, vel, ime);
  218.  
  219.         vel = strlen(prezime) + 1;
  220.         _prezime = new char[vel];
  221.         strcpy_s(_prezime, vel, prezime);
  222.  
  223.         _godiste = godiste;
  224.     }
  225.  
  226.     Osoba(const Osoba & obj)
  227.     {
  228.         int vel = strlen(obj._ime) + 1;
  229.         _ime = new char[vel];
  230.         strcpy_s(_ime, vel, obj._ime);
  231.  
  232.         vel = strlen(obj._prezime) + 1;
  233.         _prezime = new char[vel];
  234.         strcpy_s(_prezime, vel, obj._prezime);
  235.  
  236.         _godiste = obj._godiste;
  237.     }
  238.  
  239.     virtual ~Osoba() = 0
  240.     {
  241.         delete[] _ime;
  242.         _ime = nullptr;
  243.  
  244.         delete[] _prezime;
  245.         _prezime = nullptr;
  246.     }
  247.  
  248.     Osoba & operator =(const Osoba & right)
  249.     {
  250.         if (this != &right)
  251.         {
  252.             delete[] _ime;
  253.             delete[] _prezime;
  254.  
  255.             int vel = strlen(right._ime) + 1;
  256.             _ime = new char[vel];
  257.             strcpy_s(_ime, vel, right._ime);
  258.  
  259.             vel = strlen(right._prezime) + 1;
  260.             _prezime = new char[vel];
  261.             strcpy_s(_prezime, vel, right._prezime);
  262.  
  263.             _godiste = right._godiste;
  264.         }
  265.         return *this;
  266.     }
  267.  
  268.     const char * GetIme() const
  269.     {
  270.         return _ime;
  271.     }
  272.     const char * GetPrezime() const
  273.     {
  274.         return _prezime;
  275.     }
  276.     string GetImePrezime()const
  277.     {
  278.         return string(_ime) + " " + string(_prezime);
  279.     }
  280.     int GetGodiste()const
  281.     {
  282.         return _godiste;
  283.     }
  284. };
  285.  
  286. //I ucesnici i clanovi komisije trebaju imati podatke za pristup sistemu (email i password)
  287. class Ucesnik : public Osoba
  288. {
  289.     char* _email;
  290.     string _password; //Najmanje 5 karaktera, kombinacija brojeva i velikih slova
  291.     string _obrazovnaInstitucija;
  292. public:
  293.     Ucesnik()
  294.     {
  295.         _email = nullptr;
  296.     }
  297.  
  298.     Ucesnik(char* ime, char* prezime, int godiste, char * email, string password, string obrzInst) : Osoba(ime, prezime, godiste)
  299.     {
  300.         if (ValidirajPodatak(password, "(?=.{5,})(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])", "search"))
  301.         {
  302.             int size = strlen(email) + 1;
  303.             _email = new char[size];
  304.             strcpy_s(_email, size, email);
  305.  
  306.             _password = password;
  307.             _obrazovnaInstitucija = obrzInst;
  308.         }
  309.         else
  310.             throw NedozvoljenaOperacija("Procitatjte uslove koje vasa lozinka mora ispuniti", __LINE__);
  311.     }
  312.  
  313.     Ucesnik(const Ucesnik & obj) : Osoba(obj)
  314.     {
  315.         int size = strlen(obj._email) + 1;
  316.         _email = new char[size];
  317.         strcpy_s(_email, size, obj._email);
  318.  
  319.         _password = obj._password;
  320.         _obrazovnaInstitucija = obj._obrazovnaInstitucija;
  321.     }
  322.  
  323.     ~Ucesnik()
  324.     {
  325.         delete[] _email;
  326.         _email = nullptr;
  327.     }
  328.  
  329.     Ucesnik & operator =(const Ucesnik & right)
  330.     {
  331.         if (this != &right)
  332.         {
  333.             delete[]_email;
  334.  
  335.             Osoba::operator=(right);
  336.  
  337.             int size = strlen(right._email) + 1;
  338.             _email = new char[size];
  339.             strcpy_s(_email, size, right._email);
  340.  
  341.             _password = right._password;
  342.             _obrazovnaInstitucija = right._obrazovnaInstitucija;
  343.         }
  344.         return *this;
  345.     }
  346.  
  347.     const char * GetEmail()const
  348.     {
  349.         return _email;
  350.     }
  351.     string GetPassword()const
  352.     {
  353.         return _password;
  354.     }
  355.     string GetInstitucija()const
  356.     {
  357.         return _obrazovnaInstitucija;
  358.     }
  359.  
  360.     friend bool operator ==(const Ucesnik &, const Ucesnik &);
  361.     friend bool operator !=(const Ucesnik &, const Ucesnik &);
  362.     friend ostream & operator <<(ostream &, const Ucesnik &);
  363. };
  364.  
  365. ostream & operator <<(ostream & cout, const Ucesnik & obj)
  366. {
  367.     cout << "Ime i prezime: " << obj.GetImePrezime() << " - " << obj.GetGodiste() << endl;
  368.     cout << "Obrazovna institucija: " << obj._obrazovnaInstitucija << endl;
  369.     cout << "Email: " << obj._email << endl;
  370.  
  371.     return cout;
  372. }
  373.  
  374. bool operator ==(const Ucesnik & left, const Ucesnik & right)
  375. {
  376.     if (left.GetImePrezime() != right.GetImePrezime())
  377.         return false;
  378.     else if (left.GetGodiste() != right.GetGodiste())
  379.         return false;
  380.     else if (left._obrazovnaInstitucija != right._obrazovnaInstitucija)
  381.         return false;
  382.     else if (strcmp(left._email, right._email) != 0)
  383.         return false;
  384.     else if (left._password != right._password)
  385.         return false;
  386.     return true;
  387. }
  388. bool operator !=(const Ucesnik & left, const Ucesnik & right)
  389. {
  390.     return !(left == right);
  391. }
  392.  
  393. class ClanKomisije : public Ucesnik
  394. {
  395.     char* _pozicija; //Radno mjesto u firmi
  396.     string _firma;
  397. public:
  398.     ClanKomisije()
  399.     {
  400.         _pozicija = nullptr;
  401.     }
  402.  
  403.     ClanKomisije(char* ime, char* prezime, int godiste, char * pozicija, char * email, string password, string obrzInst, string firma) :
  404.         Ucesnik(ime, prezime, godiste, email, password, obrzInst)
  405.     {
  406.         int size = strlen(pozicija) + 1;
  407.         _pozicija = new char[size];
  408.         strcpy_s(_pozicija, size, pozicija);
  409.  
  410.         _firma = firma;
  411.     }
  412.  
  413.     ClanKomisije(const ClanKomisije & obj) : Ucesnik(obj)
  414.     {
  415.         int size = strlen(obj._pozicija) + 1;
  416.         _pozicija = new char[size];
  417.         strcpy_s(_pozicija, size, obj._pozicija);
  418.  
  419.         _firma = obj._firma;
  420.     }
  421.  
  422.     ~ClanKomisije()
  423.     {
  424.         delete[] _pozicija;
  425.         _pozicija = nullptr;
  426.     }
  427.  
  428.     ClanKomisije & operator =(const ClanKomisije & right)
  429.     {
  430.         if (this != &right)
  431.         {
  432.             delete[] _pozicija;
  433.  
  434.             Ucesnik::operator=(right);
  435.  
  436.             int size = strlen(right._pozicija) + 1;
  437.             _pozicija = new char[size];
  438.             strcpy_s(_pozicija, size, right._pozicija);
  439.  
  440.             _firma = right._firma;
  441.         }
  442.         return *this;
  443.     }
  444.  
  445.     const char * GetPozicija()const
  446.     {
  447.         return _pozicija;
  448.     }
  449.     string GetFirma()const
  450.     {
  451.         return _firma;
  452.     }
  453.  
  454.     friend ostream & operator <<(ostream &, const ClanKomisije &);
  455. };
  456.  
  457. ostream & operator <<(ostream & cout, const ClanKomisije & obj)
  458. {
  459.     cout << ClanKomisije(obj);
  460.     cout << "Pozicija: " << obj._pozicija << endl;
  461.     cout << "Firma: " << obj._firma << endl;
  462.  
  463.     return cout;
  464. }
  465.  
  466. //Prijave koje ne ukljucuju izradu i predaju projekata (kategorije: SQLChallenge i CodingChallenge)
  467. class Prijava
  468. {
  469.     string _datum; //Podrzani format: dd.MM.yyyy
  470.     Kategorija _kategorija;
  471.     Kolekcija<Ucesnik, bool> _tim; //Tim se sastoji od jednog ili vise ucesnika, drugi paramtetar oznacava predstavnika tima
  472.  
  473.     bool ImaLiPredstavnika()const
  474.     {
  475.         for (size_t i = 0; i < _tim.size(); i++)
  476.             if (_tim.GetElement_2(i))
  477.                 return true;
  478.         return false;
  479.     }
  480.     void PonistiPredstavnika()
  481.     {
  482.         for (size_t i = 0; i < _tim.size(); i++)
  483.             if (_tim.GetElement_2(i))
  484.                 _tim.GetElement_2(i) = false;
  485.     }
  486. public:
  487.     Prijava(string datum, Kategorija kategorija)
  488.     {
  489.         if (ValidirajPodatak(datum, "(\\d{2})\\.(\\d{2})\\.(\\d{4})"))
  490.         {
  491.             _datum = datum;
  492.             _kategorija = kategorija;
  493.         }
  494.         else
  495.             throw NedozvoljenaOperacija("Niste unijeli datum u trazenom formatu", __LINE__);
  496.     }
  497.     Prijava(const Prijava & obj)
  498.     {
  499.         _datum = obj._datum;
  500.         _tim = obj._tim;
  501.         _kategorija = obj._kategorija;
  502.     }
  503.     virtual ~Prijava()
  504.     {
  505.  
  506.     }
  507.     //Funkciju za dodavanje clanova tima uz postivanje ogranicenja maksimalno dozvoljenog broja clanova u timu.
  508.     //SQLChallenge i CodingChallenge: 2
  509.     //GameChallenge i MobileChallenge: 3
  510.     //InnovationChallenge: 4
  511.     //Onemoguciti dodavanje istog ucesnika vise puta. Tim moze imati najvise jednog predstavnika.
  512.     void DodajClana(const Ucesnik & ucesnik, bool predstavnik = false)
  513.     {
  514.         for (size_t i = 0; i < _tim.size(); i++)
  515.             if (_tim[i] == ucesnik)
  516.                 throw NedozvoljenaOperacija("Ne mozete dodati istog ucesnika vise puta", __LINE__);
  517.  
  518.         int ukupnoClanova = _tim.size();
  519.  
  520.         if (_kategorija == SQLChallenge || _kategorija == CodingChallenge)
  521.         {
  522.             if (ukupnoClanova < 2)
  523.             {
  524.                 if (ImaLiPredstavnika() && predstavnik)
  525.                     throw NedozvoljenaOperacija("Ovaj tim vec ima predstavnika", __LINE__);
  526.  
  527.                 if (ukupnoClanova == 1 && !ImaLiPredstavnika() && !predstavnik)
  528.                     throw NedozvoljenaOperacija("Neko u timu mora biti predstavnik", __LINE__);
  529.  
  530.                 //cout << ucesnik.GetImePrezime() << " uspjesno dodan u tim" << endl;
  531.                 _tim.Add(ucesnik, predstavnik);
  532.             }
  533.             else
  534.                 throw NedozvoljenaOperacija("Tim moze imati maksimalno 2 clana", __LINE__);
  535.         }
  536.         else if (_kategorija == GameChallenge || _kategorija == MobileChallenge)
  537.         {
  538.             if (ukupnoClanova < 3)
  539.             {
  540.                 if (ImaLiPredstavnika() && predstavnik)
  541.                     throw NedozvoljenaOperacija("Ovaj tim vec ima predstavnika", __LINE__);
  542.  
  543.                 if (ukupnoClanova == 2 && !ImaLiPredstavnika() && !predstavnik)
  544.                     throw NedozvoljenaOperacija("Neko u timu mora biti predstavnik", __LINE__);
  545.  
  546.                 //cout << ucesnik.GetImePrezime() << " uspjesno dodan u tim" << endl;
  547.                 _tim.Add(ucesnik, predstavnik);
  548.             }
  549.             else
  550.                 throw NedozvoljenaOperacija("Tim moze imati maksimalno 3 clana", __LINE__);
  551.         }
  552.         else
  553.         {
  554.             if (ukupnoClanova < 4)
  555.             {
  556.                 if (ImaLiPredstavnika() && predstavnik)
  557.                     throw NedozvoljenaOperacija("Ovaj tim vec ima predstavnika", __LINE__);
  558.  
  559.                 if (ukupnoClanova == 3 && !ImaLiPredstavnika() && !predstavnik)
  560.                     throw NedozvoljenaOperacija("Neko u timu mora biti predstavnik", __LINE__);
  561.  
  562.                 //cout << ucesnik.GetImePrezime() << " uspjesno dodan u tim" << endl;
  563.                 _tim.Add(ucesnik, predstavnik);
  564.             }
  565.             else
  566.                 throw NedozvoljenaOperacija("Tim moze imati maksimalno 4 clana", __LINE__);
  567.         }
  568.  
  569.     }
  570.  
  571.     Prijava & operator =(const Prijava & right)
  572.     {
  573.         if (this != &right)
  574.         {
  575.             _tim = right._tim;
  576.             _datum = right._datum;
  577.             _kategorija = right._kategorija;
  578.         }
  579.         return *this;
  580.     }
  581.  
  582.     //Funkciju za promjenu predstavnika tima.
  583.     void PromjeniPredstavnikaTima(const Ucesnik & ucesnik)
  584.     {
  585.         if (!ImaLiPredstavnika())
  586.             throw NedozvoljenaOperacija("Tim jos uvijek nema predstavnika", __LINE__);
  587.  
  588.         bool pronadjen = false;
  589.         for (size_t i = 0; i < _tim.size(); i++)
  590.         {
  591.             if (_tim[i] == ucesnik)
  592.             {
  593.                 PonistiPredstavnika();
  594.                 _tim.GetElement_2(i) = true;
  595.                 pronadjen = true;
  596.             }
  597.         }
  598.         if (!pronadjen)
  599.             throw NedozvoljenaOperacija("Ovaj ucesnik nije registrovan u timu", __LINE__);
  600.     }
  601.  
  602.     string GetDatumKategorija()const
  603.     {
  604.         return string(ispisKategorije[_kategorija]) + " (" + _datum + ")";
  605.     }
  606.     string GetDatum()const
  607.     {
  608.         return _datum;
  609.     }
  610.     Kategorija GetKategorija()const
  611.     {
  612.         return _kategorija;
  613.     }
  614.     Kolekcija<Ucesnik, bool> GetTim()const
  615.     {
  616.         return _tim;
  617.     }
  618.  
  619.     friend ostream & operator <<(ostream &, const Prijava &);
  620.     friend bool operator ==(const Prijava &, const Prijava &);
  621.     friend bool operator !=(const Prijava &, const Prijava &);
  622. };
  623. bool operator ==(const Prijava & left, const Prijava & right)
  624. {
  625.     if (left._datum != right._datum)
  626.         return false;
  627.     else if (left._kategorija != right._kategorija)
  628.         return false;
  629.     if (left._tim != right._tim)
  630.         return false;
  631.     return true;
  632. }
  633. bool operator !=(const Prijava & left, const Prijava & right)
  634. {
  635.     return !(left == right);
  636. }
  637.  
  638. ostream & operator <<(ostream & cout, const Prijava & obj)
  639. {
  640.     cout << "Datum prijave: " << obj._datum << endl;
  641.     cout << "Kategorija: " << ispisKategorije[obj._kategorija] << endl;
  642.     cout << "\t:::TIM INFO:::\n";
  643.     for (size_t i = 0; i < obj._tim.size(); i++)
  644.     {
  645.         cout << i + 1 << ". " << obj._tim[i].GetImePrezime();
  646.         if (obj._tim.GetElement_2(i))
  647.             cout << " - Predstavnik tima" << endl;
  648.         else
  649.             cout << endl;
  650.     }
  651.  
  652.     return cout;
  653. }
  654.  
  655. //Prijave koje ukljucuju izradu projekata (kategorije: GameChallenge, InnovationChallenge i MobileChallenge)
  656. class PrijavaProjekta : public Prijava
  657. {
  658.     char* _nazivProjekta;
  659.     string _opisProjekta;
  660.     bool _finalizirano; //Atribut oznacava da li je projekat zavrsen i predan u predvidjenom roku
  661.     bool _prezentacija; //Projekti koji se prezentuju i ocjenjuju
  662.  
  663. public:
  664.     PrijavaProjekta(char * nazivProjekta, string opisProjekta, string datum, Kategorija kategorija) : Prijava(datum, kategorija)
  665.     {
  666.         int size = strlen(nazivProjekta) + 1;
  667.         _nazivProjekta = new char[size];
  668.         strcpy_s(_nazivProjekta, size, nazivProjekta);
  669.  
  670.         _opisProjekta = opisProjekta;
  671.  
  672.         _finalizirano = _prezentacija = false;
  673.     }
  674.  
  675.     PrijavaProjekta(const PrijavaProjekta & obj) : Prijava(obj)
  676.     {
  677.         int size = strlen(obj._nazivProjekta) + 1;
  678.         _nazivProjekta = new char[size];
  679.         strcpy_s(_nazivProjekta, size, obj._nazivProjekta);
  680.  
  681.         _opisProjekta = obj._opisProjekta;
  682.  
  683.         _finalizirano = obj._finalizirano;
  684.  
  685.         _prezentacija = obj._prezentacija;
  686.     }
  687.  
  688.     ~PrijavaProjekta()
  689.     {
  690.         delete[] _nazivProjekta;
  691.         _nazivProjekta = nullptr;
  692.     }
  693.  
  694.     PrijavaProjekta & operator =(const PrijavaProjekta & right)
  695.     {
  696.         if (this != &right)
  697.         {
  698.             delete[]_nazivProjekta;
  699.  
  700.             Prijava::operator=(right);
  701.  
  702.             int size = strlen(right._nazivProjekta) + 1;
  703.             _nazivProjekta = new char[size];
  704.             strcpy_s(_nazivProjekta, size, right._nazivProjekta);
  705.  
  706.             _opisProjekta = right._opisProjekta;
  707.  
  708.             _finalizirano = right._finalizirano;
  709.  
  710.             _prezentacija = right._prezentacija;
  711.         }
  712.         return *this;
  713.     }
  714.  
  715.     void Finaliziraj(bool odabranoZaPrezentaciju)
  716.     {
  717.         _finalizirano = true;
  718.         _prezentacija = odabranoZaPrezentaciju;
  719.     }
  720.  
  721.     bool GetFinalizirano()const
  722.     {
  723.         return _finalizirano;
  724.     }
  725.     bool GetPrezentacija()const
  726.     {
  727.         return _prezentacija;
  728.     }
  729.     const char * GetNazivProjekta()const
  730.     {
  731.         return _nazivProjekta;
  732.     }
  733.  
  734.     friend ostream & operator <<(ostream &, const PrijavaProjekta &);
  735.     friend bool operator ==(const PrijavaProjekta &, const PrijavaProjekta &);
  736.     friend bool operator !=(const PrijavaProjekta &, const PrijavaProjekta &);
  737. };
  738.  
  739. ostream & operator <<(ostream & cout, const PrijavaProjekta & obj)
  740. {
  741.     cout << "Naziv projekta: " << obj._nazivProjekta << endl;
  742.     cout << "Kratak opis projekta: " << obj._opisProjekta << endl;
  743.     cout << "Odabrano za prezentaciju: " << boolalpha << obj._prezentacija << endl;
  744.     cout << "Finalizirano: " << boolalpha << obj._finalizirano << endl;
  745.     cout << Prijava(obj);
  746.  
  747.     return cout;
  748. }
  749.  
  750. bool operator ==(const PrijavaProjekta & left, const PrijavaProjekta & right)
  751. {
  752.     if (Prijava(left) != Prijava(right))
  753.         return false;
  754.     else if (strcmp(left._nazivProjekta, right._nazivProjekta) != 0)
  755.         return false;
  756.     else if (left._opisProjekta != right._opisProjekta)
  757.         return false;
  758.     return true;
  759. }
  760. bool operator !=(const PrijavaProjekta & left, const PrijavaProjekta & right)
  761. {
  762.     return !(left == right);
  763. }
  764.  
  765. class FITCodingChallenge
  766. {
  767.     int _godina;                              //01.34.6789
  768.     string _prijaveDo; //Podrzani format unosa: dd.MM.yyyy (koristiti regex)
  769.     vector<Prijava*> _prijave;
  770.     Kolekcija<ClanKomisije, Kategorija> _komisija;
  771.     Kolekcija<Prijava*, Kolekcija<ClanKomisije*, double>> _ocjene;
  772.  
  773.     int GetDan(string datum)
  774.     {
  775.         char dan[3] = { datum[0], datum[1], '\0' };
  776.         return atoi(dan);
  777.     }
  778.     int GetMjesec(string datum)
  779.     {
  780.         char mjesec[3] = { datum[3], datum[4], '\0' };
  781.         return atoi(mjesec);
  782.     }
  783.     int GetGodina(string datum)
  784.     {
  785.         char godina[5] = { datum[6], datum[7], datum[8],datum[9], '\0' };
  786.         return atoi(godina);
  787.     }
  788.  
  789.     bool ProvjeriDatumPrijave(string datum)
  790.     {
  791.         // _prijaveDo
  792.         int _dan = GetDan(_prijaveDo);
  793.         int _mjesec = GetMjesec(_prijaveDo);
  794.         int _godina = GetGodina(_prijaveDo);
  795.  
  796.         // datum nove prijave
  797.         int dan = GetDan(datum);
  798.         int mjesec = GetMjesec(datum);
  799.         int godina = GetGodina(datum);
  800.  
  801.         if (_godina > godina)
  802.             return true;
  803.         else if (_godina == godina)
  804.         {
  805.             if (_mjesec > mjesec)
  806.                 return true;
  807.             else if (_mjesec == mjesec)
  808.             {
  809.                 if (_dan > dan)
  810.                     return true;
  811.             }
  812.         }
  813.         return false;
  814.     }
  815.  
  816.     void PrikaziOcjeneProjekta(Prijava & prijava)
  817.     {
  818.         /*PrijavaProjekta * p1 = dynamic_cast<PrijavaProjekta*>(&prijava);
  819.         if (p1 != nullptr)
  820.         {
  821.         PrijavaProjekta * p2 = nullptr;
  822.         for (size_t i = 0; i < _ocjene.size(); i++)
  823.         {
  824.         p2 = dynamic_cast<PrijavaProjekta*>(_ocjene[i]);
  825.         if (p2 != nullptr)
  826.         {
  827.         if (*p1 == *p2)
  828.         {
  829.         for (size_t j = 0; j < _ocjene.GetElement_2(i).size(); j++)
  830.         {
  831.         cout << _ocjene.GetElement_2(i)[j]->GetImePrezime() << " dao ocjenu " << _ocjene.GetElement_2(i).GetElement_2(j) << endl;
  832.         }
  833.         }
  834.         }
  835.         }
  836.         }
  837.         else
  838.         {
  839.         for (size_t i = 0; i < _ocjene.size(); i++)
  840.         {
  841.         if (_ocjene[i] != nullptr && (_ocjene[i]->GetKategorija() == CodingChallenge || _ocjene[i]->GetKategorija() == SQLChallenge))
  842.         {
  843.         for (size_t j = 0; j < _ocjene.GetElement_2(i).size(); j++)
  844.         {
  845.         cout << _ocjene.GetElement_2(i)[j]->GetImePrezime() << " dao ocjenu " << _ocjene.GetElement_2(i).GetElement_2(j) << endl;
  846.         }
  847.         }
  848.  
  849.         }
  850.         }*/
  851.  
  852.         for (size_t i = 0; i < _ocjene.size(); i++)
  853.         {
  854.             if (*_ocjene[i] == prijava)
  855.             {
  856.                 for (size_t j = 0; j < _ocjene.GetElement_2(i).size(); j++)
  857.                 {
  858.                     cout << _ocjene.GetElement_2(i)[j]->GetImePrezime() << " je ocijenio/la rad sa ocjenom " << _ocjene.GetElement_2(i).GetElement_2(j) << endl;
  859.                 }
  860.             }
  861.  
  862.         }
  863.     }
  864.  
  865.     bool NalaziLiSeUTimu(const Prijava & prijava, const string & imePrezime)
  866.     {
  867.         for (size_t i = 0; i < prijava.GetTim().size(); i++)
  868.             if (prijava.GetTim()[i].GetImePrezime() == imePrezime)
  869.                 return true;
  870.         return false;
  871.  
  872.     }
  873.  
  874.     double GetProsjecnaOcjena(Prijava & prijava)
  875.     {
  876.         int suma = 0;
  877.         int brojOcjena = 0;
  878.         for (size_t i = 0; i < _ocjene.size(); i++)
  879.         {
  880.             for (size_t j = 0; j < _ocjene.GetElement_2(i).size(); j++)
  881.             {
  882.                 if (*_ocjene[i] == prijava)
  883.                 {
  884.                     suma += _ocjene.GetElement_2(i).GetElement_2(j);
  885.                     brojOcjena++;
  886.                 }
  887.             }
  888.         }
  889.         return (double)suma / brojOcjena;
  890.     }
  891.  
  892.     void IspisiKategoriju(Kategorija kategorija)
  893.     {
  894.         PrijavaProjekta * pp = nullptr;
  895.         cout << "\t===" << ispisKategorije[kategorija] << "===\n";
  896.         for (size_t i = 0; i < _prijave.size(); i++)
  897.         {
  898.             if (kategorija == SQLChallenge || kategorija == CodingChallenge)
  899.             {
  900.                 if (_prijave[i]->GetKategorija() == kategorija)
  901.                     cout << *_prijave[i];
  902.             }
  903.             else
  904.             {
  905.                 pp = dynamic_cast<PrijavaProjekta*>(_prijave[i]);
  906.                 if (pp != nullptr)
  907.                 {
  908.                     if (pp->GetKategorija() == kategorija)
  909.                         cout << *pp;
  910.                 }
  911.             }
  912.         }
  913.         cout << ln;
  914.     }
  915.  
  916. public:
  917.  
  918.     FITCodingChallenge(int godina, string prijaveDo)
  919.     {
  920.         if (ValidirajPodatak(prijaveDo, "(\\d{2})\\.(\\d{2})\\.(\\d{4})"))
  921.         {
  922.             _prijaveDo = prijaveDo;
  923.             _godina = godina;
  924.         }
  925.         else
  926.             throw NedozvoljenaOperacija("Niste unijeli datum u trazenom formatu", __LINE__);
  927.     }
  928.  
  929.     ~FITCodingChallenge()
  930.     {
  931.         for (size_t i = 0; i < _prijave.size(); i++)
  932.         {
  933.             delete _prijave[i];
  934.             _prijave[i] = nullptr;
  935.         }
  936.     }
  937.     //Operator += za dodavanje novih prijava. Isti ucesnik ne moze imati vise prijava u sklopu iste kategorije.
  938.     //Postovati ogranicenje roka za prijave (_prijaveDo).
  939.     //Voditi racuna o alokaciji memorije za prijave (ne zadrzavati adresu proslijedjenog objekta)
  940.     FITCodingChallenge & operator +=(Prijava & prijava)
  941.     {
  942.         if (!ProvjeriDatumPrijave(prijava.GetDatum()))
  943.             throw NedozvoljenaOperacija("Kasno ste prijavili projekat", __LINE__);
  944.  
  945.         for (size_t i = 0; i < _prijave.size(); i++)
  946.         {
  947.             for (size_t j = 0; j < _prijave[i]->GetTim().size(); j++)
  948.             {
  949.                 for (size_t k = 0; k < prijava.GetTim().size(); k++)
  950.                 {
  951.                     if (_prijave[i]->GetTim()[j] == prijava.GetTim()[k] && _prijave[i]->GetKategorija() == prijava.GetKategorija())
  952.                         throw NedozvoljenaOperacija("Isti ucesnik ne moze imati vise prijava u sklopu iste kategorije", __LINE__);
  953.                 }
  954.             }
  955.         }
  956.  
  957.         PrijavaProjekta * pp = dynamic_cast<PrijavaProjekta*>(&prijava);
  958.  
  959.         if (pp != nullptr)
  960.         {
  961.             PrijavaProjekta * novaPrijava = new PrijavaProjekta(*pp);
  962.  
  963.             if (pp->GetFinalizirano() && pp->GetPrezentacija())
  964.                 novaPrijava->Finaliziraj(pp->GetPrezentacija());
  965.             _prijave.push_back(new PrijavaProjekta(*novaPrijava));
  966.         }
  967.  
  968.         else
  969.             _prijave.push_back(new Prijava(prijava));
  970.  
  971.         return *this;
  972.     }
  973.     //Funkciju koja odredjenu prijavu oznacava kao finaliziranu i odabranu za prezentaciju ili ne.
  974.     void FinalizirajPrijavu(PrijavaProjekta & prijavaProjekta, bool odabranaZaPrezentaciju)
  975.     {
  976.         PrijavaProjekta * pp = nullptr;
  977.  
  978.         bool pronadjena = false;
  979.         for (size_t i = 0; i < _prijave.size(); i++)
  980.         {
  981.             pp = dynamic_cast<PrijavaProjekta*>(_prijave[i]);
  982.             if (pp != nullptr)
  983.             {
  984.                 if (prijavaProjekta == *pp)
  985.                 {
  986.                     pp->Finaliziraj(odabranaZaPrezentaciju);
  987.                     pronadjena = true;
  988.                 }
  989.             }
  990.         }
  991.         if (!pronadjena)
  992.             throw NedozvoljenaOperacija("Nismo uspjeli pronaci trazenu prijavu", __LINE__);
  993.     };
  994.     //Operator () za dodavanje clanova komisije po kategorijama. Sprijeciti dodavanje istih clanova u sklopu jedne kategorije.
  995.     FITCodingChallenge & operator()(const ClanKomisije & clanKomisije, Kategorija kategorija)
  996.     {
  997.         for (size_t i = 0; i < _komisija.size(); i++)
  998.             if (_komisija[i] == clanKomisije && _komisija.GetElement_2(i) == kategorija)
  999.                 throw NedozvoljenaOperacija("Nije dozvoljeno dodavati iste clanove u sklopu jedne kategorije", __LINE__);
  1000.  
  1001.         _komisija.Add(clanKomisije, kategorija);
  1002.         //cout << clanKomisije.GetImePrezime() << " uspjesno dodan/a u komisiju za kategoriju " << ispisKategorije[kategorija] << endl;
  1003.         return *this;
  1004.     }
  1005.     //Funkciju za ispis svih prijava po kategorijama. Funkcija neobavezno prima parametar kategoriju.
  1006.     //Ispis treba da ukljuci i podatke o ucesnicima, odnosno clanovima tima.
  1007.     //Ukoliko kategorija nije proslijedjena, podaci treba da budu grupisani po kategorijama.
  1008.  
  1009.     void IspisPoKategorijama(Kategorija kategorija = IspisiSveKategorije)
  1010.     {
  1011.         if (kategorija == IspisiSveKategorije)
  1012.         {
  1013.             IspisiKategoriju(SQLChallenge);
  1014.             IspisiKategoriju(CodingChallenge);
  1015.             IspisiKategoriju(MobileChallenge);
  1016.             IspisiKategoriju(GameChallenge);
  1017.             IspisiKategoriju(InnovationChallenge);
  1018.         }
  1019.         else
  1020.         {
  1021.             if (kategorija == SQLChallenge)
  1022.                 IspisiKategoriju(SQLChallenge);
  1023.             else if (kategorija == CodingChallenge)
  1024.                 IspisiKategoriju(CodingChallenge);
  1025.             else if (kategorija == MobileChallenge)
  1026.                 IspisiKategoriju(MobileChallenge);
  1027.             else if (kategorija == GameChallenge)
  1028.                 IspisiKategoriju(GameChallenge);
  1029.             else if (kategorija == InnovationChallenge)
  1030.                 IspisiKategoriju(InnovationChallenge);
  1031.         }
  1032.     }
  1033.     //Funkciju za ocjenu projekata (radova) od strane clanova komisije (kolekcija _ocjene).
  1034.     //Kolekcija sadrzi samo pokazivace (bez alokacije nove memorije) na postojece prijave i vec definisane clanove komisije.
  1035.     //Voditi racuna da se ne mogu ocijeniti projekti koji nisu finalizirani i nisu odabrani za prezentaciju,
  1036.     //niti da ocjenu mogu dati clanovi komisije koji
  1037.     //nisu pridruzeni odgovarajucoj kategoriji prijave. Svaki clan komisije daje ocjenu za svaki projekat, odnosno rad, u
  1038.     //kategoriji gdje je dodijeljen. Ocjene se krecu u rasponu od 1 do 10 za projekte, a za radove u kategoriji SQL ili CodingChallenge
  1039.     //u rasponu osvojenih bodova od 0 do 100. Pretpostaviti da su svi ucesnici prijavljeni u kategorijama SQL i CodingChallenge predali radove.
  1040.     void OcijeniProjekte(Prijava & prijava, ClanKomisije & clanKomisije, double ocjena)
  1041.     {
  1042.         PrijavaProjekta * pp = nullptr;
  1043.         Kolekcija<ClanKomisije*, double> ocjenaClan;
  1044.  
  1045.         pp = dynamic_cast<PrijavaProjekta*>(&prijava);
  1046.  
  1047.         PrijavaProjekta * projekat = nullptr;
  1048.  
  1049.         bool ok = false;
  1050.         for (size_t i = 0; i < _prijave.size(); i++)
  1051.         {
  1052.             projekat = dynamic_cast<PrijavaProjekta*>(_prijave[i]);
  1053.             if (projekat != nullptr && pp != nullptr)
  1054.             {
  1055.                 if (*projekat == *pp)
  1056.                 {
  1057.                     ok = true;
  1058.                     break;
  1059.                 }
  1060.             }
  1061.         }
  1062.         if (ok)
  1063.         {
  1064.             if (!projekat->GetFinalizirano() || !projekat->GetPrezentacija())
  1065.                 throw NedozvoljenaOperacija("Projekti koji nisu finalizirani i odabrani za prezentaciju se ne mogu ocijenjivati", __LINE__);
  1066.             else if (ocjena < 1 || ocjena > 10)
  1067.                 throw NedozvoljenaOperacija("Ocjene za projekte se krecu od 1 do 10", __LINE__);
  1068.         }
  1069.         else
  1070.         {
  1071.             if (ocjena < 0 || ocjena > 100)
  1072.                 throw NedozvoljenaOperacija("Ocjene za radove se krecu od 0 do 100", __LINE__);
  1073.         }
  1074.  
  1075.         bool mozeOcjenjivati = false;
  1076.         for (size_t i = 0; i < _komisija.size(); i++)
  1077.         {
  1078.             if (clanKomisije == _komisija[i] && prijava.GetKategorija() == _komisija.GetElement_2(i))
  1079.                 mozeOcjenjivati = true;
  1080.         }
  1081.         if (!mozeOcjenjivati)
  1082.             throw NedozvoljenaOperacija("Ovaj clan ne moze ocjenjivati ovu kategoriju", __LINE__);
  1083.  
  1084.         ocjenaClan.Add(&clanKomisije, ocjena);
  1085.         _ocjene.Add(&prijava, ocjenaClan);
  1086.     }
  1087.     //Funkcija koja na osnovu imena i prezimena clana komisije ispisuje podatke o njegovim ocjenama uključujući
  1088.     //prijave na koje se one odnose.
  1089.     void InfoClanKomisije(const string & imePrezime)
  1090.     {
  1091.         bool pronadjen = false;
  1092.         for (size_t i = 0; i < _komisija.size(); i++)
  1093.             if (_komisija[i].GetImePrezime() == imePrezime)
  1094.                 pronadjen = true;
  1095.         if (!pronadjen)
  1096.             throw NedozvoljenaOperacija("Ne postoji clan komisije sa imenom koje ste unijeli", __LINE__);
  1097.  
  1098.         cout << "Clan komisije " << imePrezime << " je ocjenio sljedece projekte:\n";
  1099.         PrijavaProjekta * pp = nullptr;
  1100.         for (size_t i = 0; i < _ocjene.size(); i++)
  1101.         {
  1102.             pp = dynamic_cast<PrijavaProjekta*>(_ocjene[i]);
  1103.             for (size_t j = 0; j < _ocjene.GetElement_2(i).size(); j++)
  1104.             {
  1105.                 if (_ocjene.GetElement_2(i)[j]->GetImePrezime() == imePrezime)
  1106.                 {
  1107.                     if (pp != nullptr)
  1108.                         cout << pp->GetNazivProjekta() << " - Ocjena: " << _ocjene.GetElement_2(i).GetElement_2(j) << endl;
  1109.                     else
  1110.                         cout << _ocjene[i]->GetDatumKategorija() << " - Ocjena: " << _ocjene.GetElement_2(i).GetElement_2(j) << endl;
  1111.                 }
  1112.             }
  1113.         }
  1114.         cout << "---------------------------------------------------------\n";
  1115.     }
  1116.     //Funkcija koja na osnovu imena i prezimena ucesnika ispisuje podatke o njegovim prijavama na takmicenju, zajedno sa
  1117.     //ocjenama, ukoliko su one definisane za prijavu/e datog ucenika.
  1118.     void InfoUcesnik(const string & imePrezime)
  1119.     {
  1120.         bool pronadjen = false;
  1121.         for (size_t i = 0; i < _prijave.size(); i++)
  1122.         {
  1123.             for (size_t j = 0; j < _prijave[i]->GetTim().size(); j++)
  1124.                 if (_prijave[i]->GetTim()[j].GetImePrezime() == imePrezime)
  1125.                     pronadjen = true;
  1126.         }
  1127.         if (!pronadjen)
  1128.             throw NedozvoljenaOperacija("Ne postoji ucesnik sa imenom koje ste unijeli", __LINE__);
  1129.  
  1130.         PrijavaProjekta * pp = nullptr;
  1131.         cout << "Ucesnik " << imePrezime << " je ucestvovao na sljedecim projektima:\n";
  1132.  
  1133.         for (size_t i = 0; i < _prijave.size(); i++)
  1134.         {
  1135.             pp = dynamic_cast<PrijavaProjekta*>(_prijave[i]);
  1136.             if (pp != nullptr)
  1137.             {
  1138.                 if (NalaziLiSeUTimu(*_prijave[i], imePrezime))
  1139.                 {
  1140.                     cout << "\t==== " << pp->GetNazivProjekta() << " ====" << endl;
  1141.                     PrikaziOcjeneProjekta(*_prijave[i]);
  1142.  
  1143.                 }
  1144.             }
  1145.             else
  1146.             {
  1147.                 if (NalaziLiSeUTimu(*_prijave[i], imePrezime))
  1148.                 {
  1149.                     cout << "\t==== " << _prijave[i]->GetDatumKategorija() << " ====" << endl;
  1150.                     PrikaziOcjeneProjekta(*_prijave[i]);
  1151.                 }
  1152.             }
  1153.                    
  1154.         }
  1155.  
  1156.     }
  1157.     //Funkciju za rangiranje kandidata na osnovu kategorije proslijedjene kao parametar.
  1158.     //Funkcija treba da na osnovu ocjena clanova komisije ispise rang liste timova zajedno sa prosjecnim ocjenama njihovih projekata (radova).
  1159.     //Dakle, konacna rang lista ukljucuje nazive timova (u zavisnosti od kategorije i naziv projekta), te prosjecnu ocjenu.
  1160.     void RangirajKandidate(Kategorija kategorija)
  1161.     {
  1162.         Kolekcija<string, double> rezultat;
  1163.  
  1164.         PrijavaProjekta * pp = nullptr;
  1165.  
  1166.         for (size_t i = 0; i < _prijave.size(); i++)
  1167.         {
  1168.             if (_prijave[i]->GetKategorija() == kategorija)
  1169.             {
  1170.                 pp = dynamic_cast<PrijavaProjekta*>(_prijave[i]);
  1171.                 if (pp != nullptr)
  1172.                     rezultat.Add(pp->GetNazivProjekta(), GetProsjecnaOcjena(*pp));
  1173.                 else
  1174.                     rezultat.Add(_prijave[i]->GetDatumKategorija(), GetProsjecnaOcjena(*_prijave[i]));
  1175.             }
  1176.         }
  1177.  
  1178.         rezultat.sort();
  1179.  
  1180.         cout << "\t:::RANKING " << ispisKategorije[kategorija] << ":::\n";
  1181.         for (size_t i = 0; i < rezultat.size(); i++)
  1182.             cout << i + 1 << ". " << rezultat[i] << " - " << rezultat.GetElement_2(i) << endl;
  1183.     }
  1184.     //Funkciju Info koja ispisuje sve podatke o takmicenju: prijave i clanove komisije po kategorijama, projekte i ocjene
  1185.     void InfoTakmicenje()
  1186.     {
  1187.         cout << "\t\t>>>>> FIT Coding Challenge " << to_string(_godina) << " <<<<<" << endl;
  1188.         cout << ln << "Prijave se mogu vrsiti do: " << _prijaveDo << endl;
  1189.  
  1190.         PrijavaProjekta * pp = nullptr;
  1191.  
  1192.         int izbor = 0;
  1193.         do
  1194.         {
  1195.             cout << "Izbornik:\n\t1. Prikazi sve prijave\n\t2. Prikazi clanove komisije\n\t3. Prikazi pojedinacne ocjene projekata\n";
  1196.             cout << "Vas izbor: ";
  1197.             cin >> izbor;
  1198.             cin.ignore();
  1199.             system("cls");
  1200.         } while (izbor < 1 || izbor > 3);
  1201.  
  1202.         switch (izbor)
  1203.         {
  1204.         case 1:
  1205.             system("cls");
  1206.             cout << "\t:::Prikaz svih prijava na ovogodisnji FITCC:::\n";
  1207.             cout << "Ukupan broj prijava: " << _prijave.size() << endl;
  1208.  
  1209.             for (size_t i = 0; i < _prijave.size(); i++)
  1210.             {
  1211.                 pp = dynamic_cast<PrijavaProjekta*>(_prijave[i]);
  1212.                 cout << "\tPROJEKAT[" << i + 1 << "/" << _prijave.size() << "]\n\n";
  1213.                 if (pp != nullptr)
  1214.                     cout << *pp << endl;
  1215.                 else
  1216.                     cout << *_prijave[i] << endl;
  1217.             }
  1218.             break;
  1219.         case 2:
  1220.             system("cls");
  1221.             cout << "\t:::Prikaz clanova komisije:::\n\n";
  1222.             for (size_t i = 0; i < _komisija.size(); i++)
  1223.                 cout << i + 1 << ". " << _komisija[i].GetImePrezime() << " - " << ispisKategorije[_komisija.GetElement_2(i)] << "\n";
  1224.             break;
  1225.         case 3:
  1226.             system("cls");
  1227.             cout << "\t:::Prikaz ocjena na projektima:::\n";
  1228.             for (size_t i = 0; i < _prijave.size(); i++)
  1229.             {
  1230.                 pp = dynamic_cast<PrijavaProjekta*>(_prijave[i]);
  1231.                 if (pp != nullptr)
  1232.                 {
  1233.                     cout << "\t..:[" << pp->GetNazivProjekta() << "]:.." << endl;
  1234.                 }
  1235.                 else
  1236.                     cout << "\t..:[" << _prijave[i]->GetDatumKategorija() << "]:.." << endl;
  1237.                 PrikaziOcjeneProjekta(*_prijave[i]);
  1238.             }
  1239.             break;
  1240.         }
  1241.     }
  1242. };
  1243.  
  1244. void main()
  1245. {
  1246. #pragma region DodavanjeUcesnika
  1247.  
  1248.     Ucesnik nisvet("Nisvet", "Mujkic", 1996, "nisvet.mujkic@edu.fit.ba", "n1sveT", "FIT");
  1249.     Ucesnik sahzudin("Sahzudin", "Mahmic", 1996, "sahzudin.mahmic@edu.fit.ba", "S4hz0", "FIT");
  1250.     Ucesnik adnan("Adnan", "Pasic", 1994, "adnan.pasic@edu.fit.ba", "4dN4n", "FIT");
  1251.     Ucesnik eman("Eman", "Basic", 1997, "eman.basic@tu.au", "B4sic", "TU");
  1252.     Ucesnik elvedin("Elvedin", "Dzihanovic", 1993, "elvedin.dzihanovic@edu.fit.ba", "3Lv3DiN", "FIT");
  1253.  
  1254.     ClanKomisije mirza("Mirza", "Muratovic", 1997, "Full stack dev", "mirza.murat@tu.au", "M1rz4", "TU", "MMdev");
  1255.     ClanKomisije ahmed("Ahmed", "Arnaut", 1997, "Developer", "ahmed.arnaut@tu.au", "4hmEd", "TU", "DevDevs");
  1256.     ClanKomisije eldin("Eldin", "Husic", 1998, "Beta tester", "eldin.husic@etr.slo", "3ld1N", "ETR", "CrnaMunja");
  1257.     ClanKomisije emina("Emina", "Junuz", 1977, "SQL PRO", "emina@fit.ba", "3Mina", "FIT", "Profesor"); // sql
  1258.     ClanKomisije admir("Admir", "Sehidic", 1985, "SQL PRO", "admir@fit.ba", "4dm1R", "FIT", "Asistent"); // sql
  1259.     ClanKomisije denis("Denis", "Music", 1983, "C# Pro", "denis@fit.ba", "d3n1S", "FIT", "Profesor"); // innovation
  1260.     ClanKomisije larisa("Larisa", "Dedovic", 1986, "Web dev", "larisa@fit.ba", "LaR1sa", "FIT", "Asistent"); // innovation
  1261. #pragma endregion
  1262.  
  1263.     PrijavaProjekta brzaPosta("Brza Posta", "SpeedyExpress", "20.05.2017", InnovationChallenge);
  1264.  
  1265.     brzaPosta.DodajClana(sahzudin);
  1266.     brzaPosta.DodajClana(adnan, true);
  1267.     brzaPosta.DodajClana(nisvet);
  1268.  
  1269.     PrijavaProjekta GTA("Grand Theft Auto 7", "GTA7", "26.05.2017", GameChallenge);
  1270.     GTA.DodajClana(elvedin, true);
  1271.     GTA.DodajClana(eman);
  1272.  
  1273.     Prijava ccPrijava("27.05.2017", CodingChallenge);
  1274.  
  1275.     ccPrijava.DodajClana(nisvet, true);
  1276.  
  1277.     FITCodingChallenge CC(2017, "31.05.2017");
  1278.  
  1279.     CC(emina, SQLChallenge);
  1280.     CC(admir, SQLChallenge);
  1281.     CC(denis, InnovationChallenge);
  1282.     CC(denis, CodingChallenge);
  1283.     CC(larisa, InnovationChallenge);
  1284.     CC(larisa, CodingChallenge);
  1285.     CC(ahmed, GameChallenge);
  1286.  
  1287.     CC += brzaPosta;
  1288.     CC += GTA;
  1289.     CC += ccPrijava;
  1290.  
  1291.     CC.FinalizirajPrijavu(brzaPosta, true);
  1292.     CC.FinalizirajPrijavu(GTA, true);
  1293.     try
  1294.     {
  1295.         CC.OcijeniProjekte(ccPrijava, larisa, 88);
  1296.  
  1297.         CC.OcijeniProjekte(brzaPosta, denis, 10);
  1298.         CC.OcijeniProjekte(brzaPosta, larisa, 8);
  1299.  
  1300.         CC.OcijeniProjekte(GTA, ahmed, 7);
  1301.     }
  1302.     catch (NedozvoljenaOperacija & e)
  1303.     {
  1304.         e.Info();
  1305.     }
  1306.  
  1307.     CC.InfoClanKomisije("Larisa Dedovic"); // ocijenila CC i IC
  1308.  
  1309.     CC.InfoUcesnik("Nisvet Mujkic");  // brzaPosta i CC
  1310.  
  1311.     CC.RangirajKandidate(InnovationChallenge);
  1312.  
  1313.     //CC.InfoTakmicenje();
  1314.  
  1315.  
  1316.     _getch();
  1317. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement