Advertisement
Guest User

Untitled

a guest
Jun 19th, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.98 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4.  
  5. /****************************************************************************
  6. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  7. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ĆE BITI OZNACENO KAO "RE"
  8. 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEČILO GUBLJENJE URAĐENOG ZADATKA
  9. 4. NAZIVI FUNKCIJA, TE BROJ I TIP PARAMETARA MORAJU BITI IDENTIČNI ONIMA KOJI SU KORIŠTENI U TESTNOM CODE-U, OSIM U SLUČAJU DA POSTOJI ADEKVATAN RAZLOG ZA NJIHOVU MODIFIKACIJU. OSTALE, POMOĆNE FUNKCIJE MOŽETE IMENOVATI I DODAVATI PO ŽELJI.
  10. 5. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNAČENO.
  11. ****************************************************************************/
  12.  
  13. using namespace std;
  14.  
  15. enum Oblast { SoftverskiInzinjering, KomunikacijskiSistemi, SigurnostInformacijskihSistema, InteligentniSistemi };
  16. const char* oblast_txt[] = { "Softverski inzinjering", "Komunikacijski sistemi", "Sigurnost informacijskih sistema", "Inteligentni sistemi" };
  17. char* AlocirajNizKaraktera(const char* n)
  18. {
  19.     if (n == nullptr)
  20.         return nullptr;
  21.     int vel = strlen(n) + 1;
  22.     char* temp = new char[vel];
  23.     strcpy_s(temp, vel, n);
  24.     return temp;
  25. }
  26. template<class T1, class T2, int max>
  27. class Kolekcija
  28. {
  29.     T1 _elementi1[max];
  30.     T2 _elementi2[max];
  31.     int _trenutno;
  32. public:
  33.     Kolekcija()
  34.     {
  35.         _trenutno = 0;
  36.     }
  37.  
  38.     void AddElement(const T1& elem1, const T2& elem2)
  39.     {
  40.         if (_trenutno == max)
  41.             throw exception("Dostigli ste maksimalan broj elemenata u kolekciji!");
  42.  
  43.         for (int i = 0; i < _trenutno; i++)
  44.         {
  45.             if (_elementi1[i] == elem1 || _elementi2[i] == elem2)
  46.                 throw exception("Nije moguce dodati duple elemente u kolekciju!");
  47.         }
  48.         _elementi1[_trenutno] = elem1;
  49.         _elementi2[_trenutno++] = elem2;
  50.     }
  51.  
  52.     T1* getElementi1Pok() { return _elementi1; }
  53.     T2* getElementi2Pok() { return _elementi2; }
  54.     T1& getElement1(int lokacija) { return _elementi1[lokacija]; }
  55.     T2& getElement2(int lokacija) { return _elementi2[lokacija]; }
  56.     int getTrenutno() { return _trenutno; }
  57.  
  58.     friend ostream& operator<<(ostream& COUT, Kolekcija<T1, T2, max>& obj)
  59.     {
  60.         for (size_t i = 0; i < obj._trenutno; i++)
  61.         {
  62.             COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
  63.         }
  64.         return COUT;
  65.     }
  66. };
  67.  
  68. //Deklaracija klase Nastavnik omogucava njeno koristenje u klasi ZavrsniRad, a definicija je data naknadno
  69. class Nastavnik;
  70.  
  71. class ZavrsniRad
  72. {
  73.     char* _nazivTeme;
  74.     Oblast* _oblastTeme;
  75.     string _datumPrijave; //Format: dd.MM.gggg
  76.     //U vector pohraniti samo adresu objekta tipa Nastavnik, dakle bez alokacije nove memorije
  77.     vector<Nastavnik*> _komisija;
  78.     string _datumOdbrane; //Format: dd.MM.gggg (najranije 2 mjeseca od datuma prijave)
  79.     int _ocjena;
  80. public:
  81.     ZavrsniRad() :_nazivTeme(nullptr), _oblastTeme(nullptr), _datumPrijave("NEMA VRIJEDNOST"), _datumOdbrane("NEMA VRIJEDNOST"), _ocjena(5)
  82.     { }
  83.  
  84.     ZavrsniRad(string nazivTeme, Oblast oblastTeme, string datumPrijave) : _datumPrijave(datumPrijave), _oblastTeme(new Oblast(oblastTeme))
  85.     {
  86.         _nazivTeme = new char[nazivTeme.size() + 1];
  87.         strcpy_s(_nazivTeme, nazivTeme.size() + 1, nazivTeme.c_str());
  88.     }
  89.     bool& operator ==(const ZavrsniRad& n)
  90.     {
  91.         bool temp= strcmp(_nazivTeme, n._nazivTeme) == 0;
  92.         return temp;
  93.     }
  94.     ZavrsniRad(const ZavrsniRad& org) :_oblastTeme(new Oblast(*org._oblastTeme))
  95.     {
  96.         _nazivTeme = AlocirajNizKaraktera(org._nazivTeme);
  97.         _datumPrijave = org._datumPrijave;
  98.         _datumOdbrane = org._datumOdbrane;
  99.         _ocjena = org._ocjena;
  100.         for (int i = 0; i < _komisija.size(); i++)
  101.         {
  102.             _komisija[i] = org._komisija[i];
  103.         }
  104.        
  105.     }
  106.     void operator =(const ZavrsniRad& n)
  107.     {
  108.         if (this != &n) {
  109.             delete[] _nazivTeme;
  110.             _nazivTeme = AlocirajNizKaraktera(n._nazivTeme);
  111.             delete _oblastTeme;
  112.             _oblastTeme = new Oblast(*n._oblastTeme);
  113.             _datumPrijave = n._datumPrijave;
  114.             _datumOdbrane = n._datumOdbrane;
  115.             for (int i = 0; i < _komisija.size(); i++)
  116.             {
  117.                 _komisija[i] = n._komisija[i];
  118.             }
  119.             _ocjena = n._ocjena;
  120.         }
  121.  
  122.     }
  123.     ~ZavrsniRad()
  124.     {
  125.         delete[] _nazivTeme; _nazivTeme = nullptr;
  126.         delete _oblastTeme; _oblastTeme = nullptr;
  127.         for (int i = 0; i < _komisija.size(); i++)
  128.         {
  129.             delete _komisija[i];
  130.             _komisija[i] = nullptr;
  131.         }
  132.     }
  133.  
  134.     char* GetNazivTeme()const { return _nazivTeme; }
  135.     Oblast GetOblastTeme()const { return *_oblastTeme; }
  136.     string GetDatumOdbrane() { return _datumOdbrane; }
  137.     int GetOcjena() { return _ocjena; }
  138.     vector<Nastavnik*>& GetKomisija() { return _komisija; };
  139.  
  140.     friend ostream& operator<<(ostream& COUT, ZavrsniRad& r)
  141.     {
  142.         COUT << "Tema rada: " << r._nazivTeme << endl;
  143.         COUT << "Oblast teme: " << oblast_txt[*r._oblastTeme] << endl;
  144.         COUT << "Datum prijave rada: " << r._datumPrijave << endl;
  145.         //Podatke o nastavnicima nije moguce ispisati ovdje jer klasa jos nije definisana
  146.         return COUT;
  147.     }
  148. };
  149.  
  150. class Nastavnik
  151. {
  152.     string _imePrezime;
  153.     Oblast _oblastIzboraUZvanje;
  154.     //Parametar string predstavlja broj indeksa studenta koji prijavljuje zavrsni rad kod odredjenog nastavnika
  155.     Kolekcija<string, ZavrsniRad, 10> _teme;
  156.  
  157. public:
  158.     Nastavnik(string imePrezime, Oblast oblastIzboraUZvanje) : _imePrezime(imePrezime), _oblastIzboraUZvanje(oblastIzboraUZvanje)
  159.     {}
  160.  
  161.     string GetImePrezime() { return _imePrezime; }
  162.     Oblast GetOblast() { return _oblastIzboraUZvanje; }
  163.     Kolekcija<string, ZavrsniRad, 10> & GetTeme() { return _teme; };
  164.     void DodajZavrsniRad(string index,string naziv,const Oblast n,const string d)
  165.     {
  166.         //string nazivTeme, Oblast oblastTeme, string datumPrijave
  167.         ZavrsniRad temp(naziv, n, d);
  168.         _teme.AddElement(index, temp);
  169.     }
  170.     void ZakaziOdbranuRada(string index, string datum, vector<Nastavnik*> komisija)
  171.     {
  172.         for (int i = 0; i < _teme.getTrenutno(); i++)
  173.         {
  174.             if (_teme.getElement1 == index)
  175.             {
  176.              
  177.             }
  178.         }
  179.     }
  180. };
  181. void main()
  182. {
  183.     const int max = 4;
  184.     Nastavnik* nastavnici[max];
  185.  
  186.     nastavnici[0] = new Nastavnik("Denis Music", SoftverskiInzinjering);
  187.     nastavnici[1] = new Nastavnik("Zanin Vejzovic", KomunikacijskiSistemi);
  188.     nastavnici[2] = new Nastavnik("Jasmin Azemovic", SigurnostInformacijskihSistema);
  189.     nastavnici[3] = new Nastavnik("Emina Junuz", SoftverskiInzinjering);
  190.  
  191.     try
  192.     {
  193.         //Funkcija DodajZavrsniRad ima zadatak da odredjenom nastavniku dodijeli mentorstvo na zavrsnom radu.
  194.         //Sprijeciti dodavanje zavrsnih radova sa istom temom vise puta. Nastavnik moze imati (mentorisati)
  195.         //samo radove iz oblasti za koju posjeduje izbor u zvanje.U slucaju da se nastavniku pokusa dodati
  196.         //rad koji nije iz njegove oblasti funkcija treba da baci izuzetak sa odgovarajucom porukom
  197.  
  198.         //indeks, naslov, oblast, datum prijave
  199.         nastavnici[0]->DodajZavrsniRad("IB130011", "Multimedijalni informacijski sistem za visoko-obrazovnu ustanovu", SoftverskiInzinjering, "01.04.2017");
  200.         nastavnici[0]->DodajZavrsniRad("IB120051", "Sistem za podršku rada kablovskog operatera", SoftverskiInzinjering, "03.03.2017");
  201.  
  202.         nastavnici[1]->DodajZavrsniRad("IB140102", "Praktična analiza sigurnosti bežičnih računarskih mreža", KomunikacijskiSistemi, "22.08.2017");
  203.  
  204.         nastavnici[2]->DodajZavrsniRad("IB140002", "Primjena teorije informacija u procesu generisanja kriptografskih ključeva", SigurnostInformacijskihSistema, "10.09.2017");
  205.  
  206.         vector<Nastavnik*> komisija;//formira se komisija
  207.         komisija.push_back(nastavnici[0]);
  208.         komisija.push_back(nastavnici[2]);
  209.         komisija.push_back(nastavnici[3]);
  210.  
  211.         // Funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu
  212.         // zavrsnog rada sto podrazumijeva definisanje datuma odbrane i liste clanova komisije pred kojima ce
  213.         // student braniti zavrsni rad. Odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio.
  214.         // Komisiju trebaju ciniti najmanje 2 nastavnika koji imaju izbor u zvanje u oblasti kojoj pripada tema rada.
  215.         // Datum odbrane ne smije biti manji od datuma prijave. U slucaju da bilo koji od navedenih uslova nije ispunjen
  216.         //  funkcija treba  da baci izuzetak
  217.         nastavnici[0]->ZakaziOdbranuRada("IB130011", "25.09.2017", komisija);
  218.         nastavnici[0]->ZakaziOdbranuRada("IB130111", "25.09.2017", komisija);//student sa brojem indeksa IB130111
  219.                                                                              //jos uvijek nije prijavio rad
  220.  
  221.     //  // Studentu sa brojem indeksa IB130011 dodjeljuje ocjenu 8 na zavrsnom radu. Uslov za
  222.     //  // dodjelu ocjene je da student posjeduje definisan datum odbrane i listu clanova komisije. U zavisnosti od
  223.     //  // uspjesnosti izvrsenja, funkcija vraca true ili false
  224.  
  225.     //  if ((*nastavnici[0])("IB130011", 8))
  226.     //      cout << "Uspjesno ste ocijenili zavrsni rad!" << endl;
  227.  
  228.     //  // Ispisuje sve podatke o nastavniku i njegovim mentorstvima. Za clanove komisije je dovoljno
  229.     //  // ispisati samo ime i prezime.
  230.     //  cout << *nastavnici[0] << endl;
  231.  
  232.     //  //Funkcija PronadjiNajStudenta ima zadatak da pronadje broj indeksa studenta koji je na zavrsnom
  233.     //  //radu ostvario najvecu ocjenu kod nastavnika koji posjeduje najvecu prosjecnu ocjenu na zavrsnim radovima.
  234.     //  //Ukoliko se kod nastavnika sa najvecom prosjecnom ocjenom pojavi vise studenata sa istom ocjenom,
  235.     //  //onda funkcija vraca broj indeksa prvog pronadjenog studenta. Svim studentima koji su odbranili
  236.     //  //rad kod nastavnika sa najvecom prosjecno ocjenom, u zasebnom thread.u, poslati email poruku
  237.     //  //(mail adresa: brojIndeksa@edu.fit.ba) sa sadrzajem da su svoj zavrsni rad uspjesno odbranili sa
  238.     //  //vecom ili manjom ocjenom od prosjecne. Ukoliko niti jedan od nastavnika ne posjeduje evidentirano
  239.     //  //mentorstvo na zavrsnom radu, funkcija vraca tekst: NIJE PRONADJEN
  240.  
  241.     //  cout << "Najsupjesniji student: " << PronadjiNajStudenta(nastavnici, max) << endl;
  242.  
  243.     //  //Baca izuzetak zbog neadekvatnog izbora u zvanje, odnosno oblasti
  244.     //  nastavnici[2]->DodajZavrsniRad("IB150008", "Razvoj sistema autentifikacije na osnovu biometrije glasa", InteligentniSistemi, "15.05.2017");
  245.     }
  246.     catch (exception& ex)
  247.     {
  248.         cout << "GRESKA -> " << ex.what() << endl;
  249.     }
  250.  
  251.     //for (int i = 0; i < max; i++)
  252.     //{
  253.     //  delete nastavnici[i];
  254.     //  nastavnici[i] = nullptr;
  255.     //}
  256.     system("pause>0");
  257. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement