Advertisement
Guest User

Untitled

a guest
Jan 15th, 2019
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.13 KB | None | 0 0
  1. #include<iostream>
  2. #include<string>
  3. #include<regex>
  4. #include<exception>
  5.  
  6. using namespace std;
  7.  
  8. //Koristiti klasu NedozvoljenaOperacija za bacanje izuzetaka u cijelom programu
  9. class NedozvoljenaOperacija : public exception
  10. {
  11.     int _linijaKoda;
  12. public:
  13.     NedozvoljenaOperacija(const char* poruka, int linijaKoda) : exception(poruka)
  14.     {
  15.         _linijaKoda = linijaKoda;
  16.     }
  17.  
  18.     void Info()
  19.     {
  20.         cout << "Greska u liniji koda " << _linijaKoda << ": " << exception::what() << endl;
  21.     }
  22. };
  23.  
  24. template<class T1, class T2>
  25. class FITKolekcija
  26. {
  27.     T1* _elementi1;
  28.     T2* _elementi2;
  29.     int _trenutno;
  30. public:
  31.     //Konstruktor, destruktor i ostale funkcije potrebne za rad sa klasom
  32.  
  33.     FITKolekcija()
  34.     {
  35.         _elementi1 = nullptr;
  36.         _elementi2 = nullptr;
  37.         _trenutno = 0;
  38.     }
  39.  
  40.     ~FITKolekcija()
  41.     {
  42.         delete[] _elementi1;
  43.         _elementi1 = nullptr;
  44.  
  45.         delete[] _elementi2;
  46.         _elementi2 = nullptr;
  47.     }
  48.  
  49.     void Add(T1& el1, T2& el2)
  50.     {
  51.         T1* temp1 = new T1[_trenutno + 1];
  52.         T2* temp2 = new T2[_trenutno + 1];
  53.  
  54.         for (int i = 0; i < _trenutno; i++)
  55.         {
  56.             temp1[i] = _elementi1[i]; // operator=
  57.             temp2[i] = _elementi2[i];
  58.         }
  59.         delete[] _elementi1;
  60.         delete[] _elementi2;
  61.  
  62.         temp1[_trenutno] = el1; // operator=
  63.         temp2[_trenutno++] = el2;
  64.  
  65.         _elementi1 = temp1;
  66.         _elementi2 = temp2;
  67.     }
  68.  
  69.     int GetTrenutno() { return _trenutno; }
  70.     T1& GetElementi1(int i)
  71.     {
  72.         return _elementi1[i];
  73.     }
  74.  
  75.     T2& GetElementi2(int i)
  76.     {
  77.         return _elementi2[i];
  78.     }
  79.  
  80.     friend ostream& operator<< <>(ostream&, FITKolekcija&);
  81. };
  82.  
  83. template<class T1, class T2>
  84. ostream& operator<<(ostream& cout, FITKolekcija<T1, T2>& k)
  85. {
  86.     for (int i = 0; i < k._trenutno; i++)
  87.     {
  88.         cout << k._elementi1[i] << "    " << k._elementi2[i] << endl; //operator<<
  89.     }
  90.     return cout;
  91. }
  92.  
  93. enum Kategorija { GameChallenge, InnovationChallenge, MobileChallenge, SQLChallenge, CodingChallenge };
  94. const char *KategorijaChar[] = { "GameChallenge", "InnovationChallenge", "MobileChallenge", "SQLChallenge", "CodingChallenge" };
  95. //Klasu proglasiti apstraktnom
  96. class Osoba
  97. {
  98. protected:
  99.     char* _ime;
  100.     char* _prezime;
  101.     int _godiste;
  102. public:
  103.     Osoba()
  104.     {
  105.         _ime = nullptr;
  106.         _prezime = nullptr;
  107.         _godiste = 0;
  108.     }
  109.     Osoba(const char* ime, const char* prezime, int godiste)
  110.     {
  111.         int vel = strlen(ime) + 1;
  112.         _ime = new char[vel];
  113.         strcpy_s(_ime, vel, ime);
  114.  
  115.         vel = strlen(prezime) + 1;
  116.         _prezime = new char[vel];
  117.         strcpy_s(_prezime, vel, prezime);
  118.  
  119.         _godiste = godiste;
  120.     }
  121.  
  122.     virtual ~Osoba() = 0
  123.     {
  124.         delete[] _ime;
  125.         _ime = nullptr;
  126.  
  127.         delete[] _prezime;
  128.         _prezime = nullptr;
  129.     }
  130.  
  131.     Osoba& operator=(Osoba& o)
  132.     {
  133.         delete[] _ime;
  134.         delete[] _prezime;
  135.  
  136.         int vel = strlen(o._ime) + 1;
  137.  
  138.         if (o._ime != nullptr)
  139.         {
  140.             _ime = new char[vel];
  141.             strcpy_s(_ime, vel, o._ime);
  142.         }
  143.         else
  144.         {
  145.             _ime = nullptr;
  146.         }
  147.  
  148.         if (o._prezime != nullptr)
  149.         {
  150.             vel = strlen(o._prezime) + 1;
  151.             _prezime = new char[vel];
  152.             strcpy_s(_prezime, vel, o._prezime);
  153.         }
  154.         else
  155.         {
  156.             _prezime = nullptr;
  157.         }
  158.         _godiste = o._godiste;
  159.  
  160.         return *this;
  161.     }
  162.  
  163.     virtual void Info()
  164.     {
  165.         cout << "Ime: " << _ime << endl;
  166.         cout << "Prezime :" << _prezime << endl;
  167.         cout << "Godiste: " << _godiste << endl;
  168.     }
  169.  
  170.     char* GetIme() { return _ime; }
  171.     char* GetPrezime() { return _prezime; }
  172. };
  173.  
  174. //Prepoznati nasljedjivanje izmedju odgovarajućih klasa
  175. //I učesnici i članovi komisije trebaju imati podatke za pristup sistemu (email i password)
  176. class Ucesnik: public Osoba
  177. {
  178. protected:
  179.     char* _email;
  180.     string _password; //Najmanje 5 karaktera, kombinacija brojeva i velikih slova (dopuniti sa regex-ima)
  181.     string _obrazovnaInstitucija;
  182. public:
  183.     //Potrebne funkcije za rad sa klasom
  184.     Ucesnik()
  185.     {
  186.         _email = nullptr;
  187.         _password = "NOT SET";
  188.         _obrazovnaInstitucija = "NOT SET";
  189.     }
  190.     Ucesnik(const char* ime, const char* prezime, int godiste, const char* email, string pass, string obrazovnaInstitucija)
  191.         :Osoba(ime, prezime, godiste)
  192.     {
  193.         int vel = strlen(email) + 1;
  194.         _email = new char[vel];
  195.         strcpy_s(_email, vel, email);
  196.  
  197.         _password = pass;
  198.         _obrazovnaInstitucija = obrazovnaInstitucija;
  199.     }
  200.  
  201.     virtual ~Ucesnik()
  202.     {
  203.         delete[] _email; _email = nullptr;
  204.     }
  205.  
  206.     virtual void Info()
  207.     {
  208.         cout << "Ime: " << _ime << endl;
  209.         cout << "Prezime :" << _prezime << endl;
  210.         cout << "Godiste: " << _godiste << endl;
  211.         cout << "Email: " << _email << endl;
  212.         cout << "Obrazovna institucija: " << _obrazovnaInstitucija << endl;
  213.     }
  214.     Ucesnik& operator=(Ucesnik& u)
  215.     {
  216.         (Osoba&)*this = u;
  217.  
  218.         delete[] _email;
  219.  
  220.         if (u._email != nullptr)
  221.         {
  222.             int vel = strlen(u._email) + 1;
  223.             _email = new char[vel];
  224.             strcpy_s(_email, vel, u._email);
  225.         }
  226.         else
  227.         {
  228.             _email = nullptr;
  229.         }
  230.  
  231.         _password = u._password;
  232.         _obrazovnaInstitucija = u._obrazovnaInstitucija;
  233.  
  234.         return *this;
  235.  
  236.     }
  237.  
  238.     friend bool operator==(Ucesnik&, Ucesnik&);
  239. };
  240.  
  241. bool operator==(Ucesnik& u1, Ucesnik& u2)
  242. {
  243.     return strcmp(u1._ime, u2._ime) == 0 && strcmp(u1._prezime, u2._prezime) == 0 && u1._godiste == u2._godiste;
  244. }
  245.  
  246.  
  247. class ClanKomisije : public Ucesnik
  248. {
  249.     char* _pozicija; //Radno mjesto u firmi
  250.     string _firma;
  251. public:
  252.     //Potrebne funkcije za rad sa klasom
  253.     ClanKomisije(const char* ime, const char* prezime, int godiste, const char* email, string pass, string obrazovnaInstitucija, const char* pozicija, string firma)
  254.         :Ucesnik(ime, prezime, godiste, email, pass, obrazovnaInstitucija)
  255.     {
  256.         int vel = strlen(pozicija) + 1;
  257.         _pozicija = new char[vel];
  258.         strcpy_s(_pozicija, vel, pozicija);
  259.  
  260.         _firma = firma;
  261.     }
  262.  
  263.     ~ClanKomisije()
  264.     {
  265.         delete[] _pozicija;
  266.         _pozicija = nullptr;
  267.     }
  268.  
  269.     virtual void Info()
  270.     {
  271.         cout << "Ime: " << _ime << endl;
  272.         cout << "Prezime :" << _prezime << endl;
  273.         cout << "Godiste: " << _godiste << endl;
  274.         cout << "Email: " << _email << endl;
  275.         cout << "Obrazovna institucija: " << _obrazovnaInstitucija << endl;
  276.         cout << "Pozicija: " << _pozicija << endl;
  277.         cout << "Firma: " << _firma << endl;
  278.     }
  279. };
  280.  
  281. //Prijave koje ne uključuju izradu i predaju projekata (kategorije: SQLChallenge i CodingChallenge)
  282. class Prijava
  283. {
  284.     string _datum; //Podržani format: dd.MM.yyyy (dopuniti sa regex-ima)
  285.     Kategorija _kategorija;
  286.     FITKolekcija<Ucesnik, bool> _tim; //Tim se sastoji od jednog ili više učesnika, drugi parametar označava predstavnika tima
  287.    
  288.     void PonistiPredsavnika()
  289.     {
  290.         for (int i = 0; i < _tim.GetTrenutno(); i++)
  291.         {
  292.             _tim.GetElementi2(i) = false;
  293.         }
  294.     }
  295. public:
  296.     //Konstruktor
  297.     Prijava(string datum, Kategorija kategorija)
  298.     {
  299.         _datum = datum;
  300.         _kategorija = kategorija;
  301.     }
  302.     Prijava(Prijava& p)
  303.     {
  304.         _datum = p._datum;
  305.         _kategorija = p._kategorija;
  306.  
  307.         for (int i = 0; i < p._tim.GetTrenutno(); i++)
  308.         {
  309.             _tim.Add(p._tim.GetElementi1(i), p._tim.GetElementi2(i));
  310.         }
  311.     }
  312.     //Funkciju za dodavanje članova tima uz poštivanje ograničenja maksimalno dozvoljenog broja članova u timu.
  313.     //SQLChallenge i CodingChallenge: 2
  314.     //GameChallenge i MobileChallenge: 3
  315.     //InnovationChallenge: 4
  316.     //Onemogućiti dodavanje istog učesnika više puta. Tim može imati najviše jednog predstavnika.
  317.  
  318.     void DodajClana(Ucesnik* ucesnik, bool predstavnik)
  319.     {
  320.         if (GetBrojPredstavnika() == 1 && predstavnik == true)
  321.             throw NedozvoljenaOperacija("Vec je dodan predstavnik tima!", __LINE__);
  322.  
  323.         for (int i = 0; i < _tim.GetTrenutno(); i++)
  324.         {
  325.             if (_tim.GetElementi1(i) == *ucesnik)
  326.             {
  327.                 throw NedozvoljenaOperacija("Nije moguce dodati istog ucesnika!", __LINE__);
  328.             }
  329.         }
  330.  
  331.         if ((_kategorija == SQLChallenge || _kategorija == CodingChallenge) && _tim.GetTrenutno() == 2)
  332.         {
  333.             throw NedozvoljenaOperacija("Dodan je maksimalan broj clanova, dodavanje nije uspijelo!", __LINE__);
  334.         }
  335.  
  336.         if ((_kategorija == GameChallenge || _kategorija == MobileChallenge) && _tim.GetTrenutno() == 3)
  337.         {
  338.             throw NedozvoljenaOperacija("Dodan je maksimalan broj clanova, dodavanje nije uspijelo!", __LINE__);
  339.         }
  340.  
  341.         if (_kategorija == InnovationChallenge && _tim.GetTrenutno() == 4)
  342.         {
  343.             throw NedozvoljenaOperacija("Dodan je maksimalan broj clanova, dodavanje nije uspijelo!", __LINE__);
  344.         }
  345.  
  346.         _tim.Add(*ucesnik, predstavnik);
  347.     }
  348.  
  349.     int GetBrojPredstavnika()
  350.     {
  351.         int brojac = 0;
  352.  
  353.         for (int i = 0; i < _tim.GetTrenutno(); i++)
  354.         {
  355.             if (_tim.GetElementi2(i))
  356.                 brojac++;
  357.         }
  358.         return brojac;
  359.     }
  360.  
  361.  
  362.  
  363.     //Funkciju za promjenu predstavnika tima.
  364.     bool PromijeniPredstavnika(const char* ime, const char* prezime)
  365.     {
  366.         PonistiPredsavnika();
  367.         for (int i = 0; i < _tim.GetTrenutno(); i++)
  368.         {
  369.             if (strcmp(_tim.GetElementi1(i).GetIme(), ime) == 0 && strcmp(_tim.GetElementi1(i).GetPrezime(), prezime) == 0)
  370.             {
  371.                 _tim.GetElementi2(i) = true;
  372.                 cout << "Predstavnik tima postavljen!" << endl;
  373.                 return true;
  374.             }
  375.         }
  376.         cout << "Unesnik sa unesenim imenom i prezimenom nije pronadjen!" << endl;
  377.         return false;
  378.     }
  379.    
  380.     virtual void Info()
  381.     {
  382.  
  383.     }
  384.     friend bool operator==(Prijava&, Prijava&);
  385. };
  386. bool operator==(Prijava& p1, Prijava& p2)
  387. {
  388.     for (int i = 0; i < p1._tim.GetTrenutno(); i++)
  389.     {
  390.         for (int j = 0; j < p2._tim.GetTrenutno(); j++)
  391.         {
  392.             if (p1._tim.GetElementi1(i) == p2._tim.GetElementi1(j) && p1._kategorija == p2._kategorija)
  393.             {
  394.                 return true;
  395.             }
  396.         }
  397.     }
  398.     return false;
  399. }
  400.  
  401.  
  402. //Prijave koje uključuju izradu projekata (kategorije: GameChallenge, InnovationChallenge i MobileChallenge)
  403. class PrijavaProjekta : public Prijava
  404. {
  405.     char* _nazivProjekta;
  406.     string _opisProjekta;
  407.     bool _finalizirano; //Atribut označava da li je projekat završen i predan u predviđenom roku
  408.     bool _prezentacija; //Projekti koji se prezentuju i ocjenjuju
  409. public:
  410.     //Konstruktor i destruktor
  411.     PrijavaProjekta(const char* nazivProjekta, string datum, Kategorija kategorija, string opisProjekta, bool finalizirano, bool prezentacija)
  412.         :Prijava(datum, kategorija)
  413.     {
  414.         int vel = strlen(nazivProjekta) + 1;
  415.         _nazivProjekta = new char[vel];
  416.         strcpy_s(_nazivProjekta, vel, nazivProjekta);
  417.  
  418.         _opisProjekta = opisProjekta;
  419.         _finalizirano = finalizirano;
  420.         _prezentacija = prezentacija;
  421.     }
  422.     //Ostale potrebne funkcije za rad sa klasom
  423.  
  424.     PrijavaProjekta(PrijavaProjekta& p): Prijava(p)
  425.     {
  426.         int vel = strlen(p._nazivProjekta) + 1;
  427.         _nazivProjekta = new char[vel];
  428.         strcpy_s(_nazivProjekta, vel, p._nazivProjekta);
  429.  
  430.         _opisProjekta = p._opisProjekta;
  431.         _finalizirano = p._finalizirano;
  432.         _prezentacija = p._prezentacija;
  433.     }
  434.  
  435.     virtual void Info()
  436.     {
  437.  
  438.     }
  439. };
  440.  
  441. class FITCodingChallenge
  442. {
  443.     int _godina;
  444.     string _prijaveDo; //Podržani format unosa: dd.MM.yyyy (dopuniti sa regex-ima)
  445.     vector<Prijava*> _prijave;
  446.     FITKolekcija<ClanKomisije, Kategorija> _komisija;
  447.     FITKolekcija<Prijava*, FITKolekcija<ClanKomisije*, double>> _ocjene;
  448. public:
  449.     //Konstruktor
  450.     FITCodingChallenge(int godina, string prijaveDo)
  451.     {
  452.         _godina = godina;
  453.         _prijaveDo = prijaveDo;
  454.     }
  455.     //Operator += za dodavanje novih prijava. Isti učesnik ne može imati više prijava u sklopu iste kategorije.
  456.     //Poštovati ograničenje roka za prijave (_prijaveDo).
  457.     //Voditi računa o alokaciji memorije za prijave (ne zadržavati adresu proslijeđenog objekta)
  458.     void operator+=(Prijava* novaPrijava)
  459.     {
  460.         for (int i = 0; i < _prijave.size(); i++)
  461.         {
  462.             if (*_prijave[i] == *novaPrijava)
  463.             {
  464.                 throw NedozvoljenaOperacija("Isti ucesnik ne moze imati vise prijava u sklopu iste kategorije", __LINE__);
  465.             }
  466.         }
  467.  
  468.         PrijavaProjekta *t = dynamic_cast<PrijavaProjekta*>(novaPrijava);
  469.  
  470.         if (t != nullptr)
  471.         {
  472.             cout << "Dodana je prijava s projektom!" << endl;
  473.             _prijave.push_back(new PrijavaProjekta(*t));
  474.         }
  475.         else
  476.         {
  477.             cout << "Dodana je obicna prijava!" << endl;
  478.             _prijave.push_back(new Prijava(*t));
  479.         }
  480.     }
  481.  
  482.     //Funkciju koja određenu prijavu označava kao finaliziranu i odabranu za prezentaciju ili ne.
  483.  
  484.     //Operator () za dodavanje članova komisije po kategorijama. Spriječiti dodavanje istih članova u sklopu jedne kategorije.
  485.  
  486.     //Funkciju za ispis svih prijava po kategorijama. Funkcija neobavezno prima parametar kategoriju.
  487.     //Ispis treba da uključi i podatke o učesnicima, odnosno članovima tima.
  488.     //Ukoliko kategorija nije proslijeđena, podaci treba da budu grupisani po kategorijama.
  489.  
  490.     //Funkciju za ocjenu projekata (radova) od strane članova komisije (kolekcija _ocjene).
  491.     //Kolekcija sadrzi samo pokazivače (bez alokacije nove memorije) na postojeće prijave i vec definisane članove komisije.
  492.     //Voditi računa da se ne mogu ocijeniti projekti koji nisu finalizirani i nisu odabrani za prezentaciju, niti da ocjenu mogu dati članovi komisije koji
  493.     //nisu pridruženi odgovarajućoj kategoriji prijave. Svaki član komisije daje ocjenu za svaki projekat, odnosno rad, u
  494.     //kategoriji gdje je dodijeljen. Ocjene se kreću u rasponu od 1 do 10 za projekte, a za radove u kategoriji SQL ili CodingChallenge
  495.     //u rasponu osvojenih bodova od 0 do 100. Pretpostaviti da su svi učesnici prijavljeni u kategorijama SQL i CodingChallenge predali radove.
  496.  
  497.     //Funkcija koja na osnovu imena i prezimena člana komisije ispisuje podatke o njegovim ocjenama uključujući
  498.     //prijave na koje se one odnose.
  499.  
  500.     //Funkcija koja na osnovu imena i prezimena učesnika ispisuje podatke o njegovim prijavama na takmičenju, zajedno sa
  501.     //ocjenama, ukoliko su one definisane za prijavu/e datog učesnika.
  502.  
  503.     //Funkciju za rangiranje kandidata na osnovu kategorije proslijeđene kao parametar.
  504.     //Funkcija treba da na osnovu ocjena članova komisije ispiše rang liste timova zajedno sa prosječnim ocjenama njihovih projekata (radova).
  505.     //Dakle, konačna rang lista uključuje nazive timova (u zavisnosti od kategorije i naziv projekta), te prosječnu ocjenu.
  506.  
  507.     //Funkciju Info koja ispisuje sve podatke o takmičenju.
  508. };
  509.  
  510.  
  511. int main()
  512. {
  513.     //Kreirati objekat klase FITCodingChallenge, te demonstrirati sve implementirane funkcionalnosti.
  514.  
  515.     FITKolekcija<int, int> kol;
  516.    
  517.     for (int i = 0; i < 10; i++)
  518.     {
  519.         kol.Add(i, i);
  520.     }
  521.  
  522.     cout << kol << endl;
  523.  
  524.     Osoba* osobe[10] = { nullptr };
  525.     //for (int i = 0; i < 10; i++)
  526.     //{
  527.     //  osobe[i] = nullptr;
  528.     //}
  529.  
  530.     cout << "-----------------------------------" << endl;
  531.     osobe[0] = new Ucesnik("Salko", "Sehic", 1997, "salalex48@gmail.com", "password123", "FIT");
  532.     osobe[0]->Info();
  533.     cout << "-----------------------------------" << endl;
  534.    
  535.     osobe[1] = new Ucesnik("Haris", "Sehic", 1999, "hariss@gmail.com", "password321", "FIT");
  536.     osobe[1]->Info();
  537.     cout << "-----------------------------------" << endl;
  538.  
  539.     osobe[2] = new ClanKomisije("Alen", "Hondjo", 1997, "alenh@gmail.com", "passworddd", "FIT", "Direktor", "EuroDemex");
  540.     osobe[2]->Info();
  541.     cout << "-----------------------------------" << endl;
  542.  
  543.  
  544.     Prijava* prijava = new Prijava("15.1.2019", CodingChallenge);
  545.     PrijavaProjekta* prijavaProjekta = new PrijavaProjekta("eBolnica", "3.1.2019", InnovationChallenge, "Projekat s ciljem unapredjena rada zdravstva", true, true);
  546.  
  547.     Prijava* prijave[5] = { nullptr };
  548.    
  549.     prijave[0] = new Prijava("15.1.2019", CodingChallenge);
  550.     prijave[1] = new PrijavaProjekta("eBolnica", "3.1.2019", InnovationChallenge, "Projekat s ciljem unapredjena rada zdravstva", true, true);
  551.  
  552.     FITCodingChallenge fitCC(2019, "25.6.2019");
  553.  
  554.     //fitCC += prijava; ovo ne radi
  555.  
  556.     fitCC += prijave[1];
  557.     fitCC += prijavaProjekta;
  558.  
  559.     for (int i = 0; i < 3; i++)
  560.     {
  561.         delete osobe[i]; osobe[i] = nullptr;
  562.     }
  563.  
  564.     system("pause");
  565.  
  566.     return 0;
  567. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement