Advertisement
corbinjo

Untitled

Sep 18th, 2023 (edited)
3,177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 110.52 KB | None | 0 0
  1. ---------------------------------------------------------------------------------------------------------------------------------------
  2. #include <iostream>
  3. #include <vector>
  4. #include <string>
  5. using namespace std;
  6.  
  7. const char* crt = "\n-------------------------------------------\n";
  8. const char* nedozvoljena_operacija = "Nedozvoljena operacija";
  9. const char* not_set = "NOT_SET";
  10. const int min_polgavlja = 3;
  11. const int min_karaktera_po_poglavlju = 30;
  12.  
  13. char* AlocirajNizKaraktera(const char* sadrzaj) {
  14.     if (sadrzaj == nullptr)
  15.         return nullptr;
  16.     int vel = strlen(sadrzaj) + 1;
  17.     char* temp = new char[vel];
  18.     strcpy_s(temp, vel, sadrzaj);
  19.     return temp;
  20. }
  21.  
  22. template <class T1, class T2>
  23. class Kolekcija {
  24.     T1* _elementi1;
  25.     T2* _elementi2;
  26.     int* _trenutno;
  27. public:
  28.     Kolekcija() : _elementi1(nullptr), _elementi2(nullptr), _trenutno(new int(0)) {}
  29.     ~Kolekcija() {
  30.         delete[] _elementi1; _elementi1 = nullptr;
  31.         delete[] _elementi2; _elementi2 = nullptr;
  32.         delete _trenutno; _trenutno = nullptr;
  33.     }
  34.     T1* getElementi1Pok() { return _elementi1; }
  35.     T2* getElementi2Pok() { return _elementi2; }
  36.     T1& getElement1(int lokacija) { return _elementi1[lokacija]; }
  37.     T2& getElement2(int lokacija) { return _elementi2[lokacija]; }
  38.     int* getTrenutno() { return _trenutno; }
  39.  
  40.     void DodajElemente(const T1& el1, const T2& el2) {
  41.         T1* noviElem1 = new T1[*_trenutno + 1];
  42.         T2* noviElem2 = new T2[*_trenutno + 1];
  43.         for (int i = 0; i < *_trenutno; i++) {
  44.             noviElem1[i] = _elementi1[i];
  45.             noviElem2[i] = _elementi2[i];
  46.         }
  47.         noviElem1[*_trenutno] = el1;
  48.         noviElem2[*_trenutno] = el2;
  49.         delete[] _elementi1;
  50.         delete[] _elementi2;
  51.         _elementi1 = noviElem1;
  52.         _elementi2 = noviElem2;
  53.         (*_trenutno)++;
  54.     }
  55.  
  56.     friend ostream& operator<<(ostream& COUT, Kolekcija<T1, T2>& obj) {
  57.         for (int i = 0; i < *obj._trenutno; i++)
  58.             COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
  59.         return COUT;
  60.     }
  61. };
  62.  
  63. class Poglavlje {
  64.     char* _naslov;
  65.     char* _sadrzaj;
  66.     bool _prihvaceno;
  67.     int _ocjena; //da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6 - 10
  68. public:
  69.     Poglavlje(const char* naslov = nullptr, const char* sadrzaj = nullptr)
  70.         : _ocjena(0), _prihvaceno(false) {
  71.         _naslov = AlocirajNizKaraktera(naslov);
  72.         _sadrzaj = AlocirajNizKaraktera(sadrzaj);
  73.     }
  74.  
  75.     Poglavlje(const Poglavlje& p) : _ocjena(p._ocjena), _prihvaceno(p._prihvaceno) {
  76.         _naslov = AlocirajNizKaraktera(p._naslov);
  77.         _sadrzaj = AlocirajNizKaraktera(p._sadrzaj);
  78.     }
  79.  
  80.     ~Poglavlje() {
  81.         delete[] _naslov; _naslov = nullptr;
  82.         delete[] _sadrzaj; _sadrzaj = nullptr;
  83.     }
  84.  
  85.     friend ostream& operator<<(ostream& COUT, Poglavlje& obj) {
  86.         if (obj._naslov == nullptr || obj._sadrzaj == nullptr)
  87.             return COUT;
  88.         COUT << endl << obj._naslov << endl << obj._sadrzaj << endl;
  89.         if (obj._prihvaceno)
  90.             COUT << "Ocjena: " << obj._ocjena << endl;
  91.         return COUT;
  92.     }
  93.  
  94.     char* GetNaslov() { return _naslov; }
  95.     const char* GetSadrzaj() const { return _sadrzaj; }
  96.     bool GetPrihvaceno() const { return _prihvaceno; }
  97.     int GetOcjena() const { return _ocjena; }
  98.  
  99.     void OcijeniPoglavlje(int ocjena) {
  100.         _ocjena = ocjena;
  101.         if (_ocjena >= 6 && _ocjena <= 10)
  102.             _prihvaceno = true;
  103.     }
  104. };
  105.  
  106. class ZavrsniRad {
  107.     char* _tema;
  108.     vector<Poglavlje> _poglavljaRada;
  109.     string _datumOdbrane;
  110.     float _konacnaOcjena; //prosjek ocjena svih poglavlja u zavrsnom radu koja se izracunava u momentu zakazivanja odbrane
  111. public:
  112.     void SetKonacnaOcjena(float konacnaOcjena) {
  113.         _konacnaOcjena = konacnaOcjena;
  114.     }
  115.     ZavrsniRad(const char* nazivTeme = nullptr) : _konacnaOcjena(0), _datumOdbrane(not_set) {
  116.         _tema = AlocirajNizKaraktera(nazivTeme);
  117.     }
  118.  
  119.     ZavrsniRad(const ZavrsniRad& org) : _poglavljaRada(org._poglavljaRada), _konacnaOcjena(org._konacnaOcjena), _datumOdbrane(org._datumOdbrane) {
  120.         _tema = AlocirajNizKaraktera(org._tema);
  121.     }
  122.  
  123.     ~ZavrsniRad() {
  124.         delete[] _tema; _tema = nullptr;
  125.     }
  126.  
  127.     char* GetNazivTeme() const { return _tema; }
  128.     vector<Poglavlje>& GetPoglavlja() { return _poglavljaRada; }
  129.     string GetDatumOdbrane() const { return _datumOdbrane; }
  130.     float GetKonacnaOcjena() const { return _konacnaOcjena; }
  131.     void SetDatumOdbrane(string datumOdbrane) { _datumOdbrane = datumOdbrane; }
  132.  
  133.     ZavrsniRad& operator=(const ZavrsniRad& org) {
  134.         if (this != &org) {
  135.             delete[] _tema;
  136.             _tema = AlocirajNizKaraktera(org._tema);
  137.             _datumOdbrane = org._datumOdbrane;
  138.             _poglavljaRada = org._poglavljaRada;
  139.             _konacnaOcjena = org._konacnaOcjena;
  140.         }
  141.         return *this;
  142.     }
  143.  
  144.     friend ostream& operator<<(ostream& COUT, ZavrsniRad& obj) {
  145.         COUT << "Tema rada: " << obj._tema << endl;
  146.         COUT << "Sadrzaj: " << endl;
  147.         for (size_t i = 0; i < obj._poglavljaRada.size(); i++)
  148.             COUT << obj._poglavljaRada[i] << endl;
  149.         COUT << "Datum odbrane rada: " << obj._datumOdbrane << endl << " Ocjena: " << obj._konacnaOcjena << endl;
  150.         return COUT;
  151.     }
  152.  
  153.     void DodajPoglavlje(const char* naslov, const char* sadrzaj) {
  154.         Poglavlje novo(naslov, sadrzaj);
  155.         _poglavljaRada.push_back(novo);
  156.     }
  157.  
  158.     void OcijeniPoglavlje(const char* naslov, int ocjena) {
  159.         for (size_t i = 0; i < _poglavljaRada.size(); i++) {
  160.             if (strcmp(_poglavljaRada[i].GetNaslov(), naslov) == 0) {
  161.                 _poglavljaRada[i].OcijeniPoglavlje(ocjena);
  162.                 break;
  163.             }
  164.         }
  165.     }
  166. };
  167.  
  168. class Mentor {
  169.     char* _imePrezime;
  170.     Kolekcija<string, ZavrsniRad> _teme;
  171. public:
  172.     Mentor(const char* imePrezime) : _teme() {
  173.         _imePrezime = AlocirajNizKaraktera(imePrezime);
  174.     }
  175.  
  176.     ~Mentor() {
  177.         delete[] _imePrezime; _imePrezime = nullptr;
  178.     }
  179.  
  180.     Kolekcija<string, ZavrsniRad>& GetTeme() { return _teme; }
  181.     char* GetImePrezime() { return _imePrezime; }
  182.  
  183.     void Info() {
  184.         cout << _imePrezime << endl << _teme << endl;
  185.     }
  186.  
  187.     bool DodajZavrsniRad(const string& brojIndeksa, const ZavrsniRad& rad) {
  188.         for (int i = 0; i < *_teme.getTrenutno(); i++) {
  189.             if (_teme.getElement1(i) == brojIndeksa)
  190.                 return false; // Student already has a topic assigned by this mentor
  191.         }
  192.         _teme.DodajElemente(brojIndeksa, rad);
  193.         return true;
  194.     }
  195.  
  196.     ZavrsniRad* ZakaziOdbranuRada(const string& brojIndeksa, const string& datumOdbrane) {
  197.         for (int i = 0; i < *_teme.getTrenutno(); i++) {
  198.             if (_teme.getElement1(i) == brojIndeksa) {
  199.                 ZavrsniRad& rad = _teme.getElement2(i);
  200.                 if (rad.GetPoglavlja().size() >= min_polgavlja) {
  201.                     bool svePrihvaceno = true;
  202.                     for (const Poglavlje& poglavlje : rad.GetPoglavlja()) {
  203.                         if (strlen(poglavlje.GetSadrzaj()) < min_karaktera_po_poglavlju || !poglavlje.GetPrihvaceno()) {
  204.                             svePrihvaceno = false;
  205.                             break;
  206.                         }
  207.                     }
  208.                     if (svePrihvaceno) {
  209.                         float sumaOcjena = 0;
  210.                         for (const Poglavlje& poglavlje : rad.GetPoglavlja()) {
  211.                             sumaOcjena += poglavlje.GetOcjena();
  212.                         }
  213.                         rad.SetKonacnaOcjena(sumaOcjena / rad.GetPoglavlja().size());
  214.                         float finalGrade = rad.GetKonacnaOcjena();
  215.  
  216.                         return &rad;
  217.                     }
  218.                 }
  219.             }
  220.         }
  221.         return nullptr;
  222.     }
  223. };
  224.  
  225. int main() {
  226.     cout << crt << "UPLOAD RADA OBAVEZNO IZVRSITI U ODGOVARAJUCI FOLDER NA FTP SERVERU" << endl;
  227.     cout << "U slucaju da je Upload folder prazan pritisnite tipku F5" << crt;
  228.  
  229.     const int max = 4;
  230.     Mentor* mentori[max];
  231.  
  232.     mentori[0] = new Mentor("Armina Hubana");
  233.     mentori[1] = new Mentor("Zanin Vejzovic");
  234.     mentori[2] = new Mentor("Jasmin Azemovic");
  235.     mentori[3] = new Mentor("Emina Junuz");
  236.  
  237.     ZavrsniRad multimedijalni("Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
  238.     ZavrsniRad podrsa_operaterima("Sistem za podršku rada kablovskog operatera");
  239.     ZavrsniRad analiza_sigurnosti("Prakticna analiza sigurnosti bežičnih računarskih mreža");
  240.     ZavrsniRad kriptografija("Primjena teorije informacija u procesu generisanja kriptografskih ključeva");
  241.  
  242.     multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
  243.     multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
  244.     multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
  245.     multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistema, a neke od najznacajnijih su ...");
  246.     multimedijalni.DodajPoglavlje("Teorija multimedije", "Sadrzaj koji bi trebao stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130011");
  247.     multimedijalni.DodajPoglavlje("Zakljucak", "U ovom radu su predstavljeni osnovni koncepti i prakticna primjena...");
  248.  
  249.     try {
  250.         multimedijalni.OcijeniPoglavlje("Uvod", 8);
  251.         multimedijalni.OcijeniPoglavlje("Vrste multimedijalnih sistema", 8);
  252.         multimedijalni.OcijeniPoglavlje("Teorija multimedije", 9);
  253.         multimedijalni.OcijeniPoglavlje("Zakljucak", 7);
  254.         multimedijalni.OcijeniPoglavlje("Naziv poglavlja ne postoji", 8);
  255.     }
  256.     catch (exception& err) {
  257.         cout << "Greska -> " << err.what() << endl;
  258.     }
  259.  
  260.     if (mentori[0]->DodajZavrsniRad("IB130011", multimedijalni))
  261.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  262.     if (mentori[0]->DodajZavrsniRad("IB120051", podrsa_operaterima))
  263.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  264.     if (!mentori[0]->DodajZavrsniRad("IB120056", podrsa_operaterima))
  265.         cout << "Zavrsni rad nije dodat!" << endl;
  266.     if (!mentori[0]->DodajZavrsniRad("IB120051", kriptografija))
  267.         cout << "Zavrsni rad nije dodat!" << endl;
  268.     if (mentori[1]->DodajZavrsniRad("IB140102", analiza_sigurnosti))
  269.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  270.     if (mentori[2]->DodajZavrsniRad("IB140002", kriptografija))
  271.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  272.  
  273.     ZavrsniRad* zr1 = mentori[0]->ZakaziOdbranuRada("IB130011", "25.09.2018");
  274.     if (zr1 != nullptr)
  275.         cout << *zr1 << endl;
  276.  
  277.     zr1 = mentori[0]->ZakaziOdbranuRada("IB130111", "25.09.2018");
  278.     if (zr1 != nullptr)
  279.         cout << *zr1 << endl;
  280.  
  281.     mentori[0]->Info();
  282.  
  283.     for (int i = 0; i < max; i++) {
  284.         delete mentori[i];
  285.         mentori[i] = nullptr;
  286.     }
  287.  
  288.     system("pause>0");
  289.     return 0;
  290. }
  291. ---------------------------------------------------------------------------------------------------------------------------------------
  292.  
  293. #include<iostream>
  294. #include<vector>
  295. using namespace std;
  296.  
  297. /****************************************************************************
  298. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  299. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ĆE BITI OZNACENO KAO "RE"
  300. 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEČILO GUBLJENJE URAĐENOG ZADATKA
  301. 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.
  302. 5. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNAČENO.
  303. ****************************************************************************/
  304. const char* crt = "\n-------------------------------------------\n";
  305. const char* nedozvoljena_operacija = "Nedozvoljena operacija";
  306. const char* not_set = "NOT_SET";
  307. const int min_polgavlja = 3;
  308. const int min_karaktera_po_poglavlju = 30;
  309.  
  310. char* AlocirajNizKaraktera(const char* sadrzaj) {
  311.     if (sadrzaj == nullptr)
  312.         return nullptr;
  313.     int vel = strlen(sadrzaj) + 1;
  314.     char* temp = new char[vel];
  315.     strcpy_s(temp, vel, sadrzaj);
  316.     return temp;
  317. }
  318.  
  319. template<class T1, class T2>
  320. class Kolekcija {
  321.     T1* _elementi1;
  322.     T2* _elementi2;
  323.     int* _trenutno;
  324. public:
  325.  
  326.     bool AddElement(T1 el1, T2 el2) {
  327.         //napraviti provjeru da li se unutar _elementi1 ili _elementi2 vec nalaze el1 ii el2                           
  328.         for (int i = 0; i < *_trenutno; i++)
  329.         {
  330.             if (_elementi1[i] == el1 || _elementi2[i] == el2)
  331.             {
  332.                 return false;
  333.             }
  334.  
  335.         }
  336.  
  337.         //napraviti privremene temp nizove koji ce imati _trenutno +1 broj elemenata                           
  338.         T1* temp1 = new T1[*_trenutno + 1];
  339.         T2* temp2 = new T2[*_trenutno + 1];
  340.         // nizovi su prazni z temp nizove cemo prebaciti stare elemente                        
  341.  
  342.         for (int i = 0; i < *_trenutno; i++)
  343.         {
  344.             temp1[i] = _elementi1[i];
  345.             temp2[i] = _elementi2[i];
  346.  
  347.         }
  348.         temp1[*_trenutno] = el1;
  349.         temp2[*_trenutno] = el2;
  350.  
  351.         delete[]_elementi1;
  352.         delete[]_elementi2;
  353.  
  354.         _elementi1 = temp1;
  355.         _elementi2 = temp2;
  356.  
  357.         (*_trenutno)++;
  358.         return true;
  359.     }
  360.  
  361.     Kolekcija() :_elementi1(nullptr), _elementi2(nullptr) {
  362.         _trenutno = new int(0);
  363.     }
  364.  
  365.     ~Kolekcija() {
  366.         delete[] _elementi1; _elementi1 = nullptr;
  367.         delete[] _elementi2; _elementi2 = nullptr;
  368.         delete _trenutno; _trenutno = nullptr;
  369.     }
  370.     T1* getElementi1Pok() { return _elementi1; }
  371.     T2* getElementi2Pok() { return _elementi2; }
  372.     T1& getElement1(int lokacija) { return _elementi1[lokacija]; }
  373.     T2& getElement2(int lokacija) { return _elementi2[lokacija]; }
  374.     int* getTrenutno() { return _trenutno; }
  375.  
  376.     friend ostream& operator<<(ostream& COUT, Kolekcija<T1, T2>& obj) {
  377.         for (int i = 0; i < *obj._trenutno; i++)
  378.             COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
  379.         return COUT;
  380.     }
  381. };
  382. class Poglavlje {
  383.     char* _naslov;
  384.     char* _sadrzaj;
  385.     bool _prihvaceno;
  386.     int _ocjena;//da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6 - 10
  387. public:
  388.  
  389.     void addOcjena(int ocjena) {
  390.         _ocjena = ocjena;
  391.         if (ocjena >= 6 && ocjena <= 10)
  392.         {
  393.             _prihvaceno = true;
  394.         }
  395.  
  396.  
  397.     }
  398.     void addSadrzaj(string noviSadrzaj) {
  399.  
  400.         char* temp = AlocirajNizKaraktera((string(_sadrzaj) + " " + noviSadrzaj).c_str());
  401.         delete[]_sadrzaj;
  402.         _sadrzaj = temp;
  403.     }
  404.     Poglavlje(const char* naslov = nullptr, const char* sadrzaj = nullptr)
  405.         :_ocjena(0), _prihvaceno(false) {
  406.         _naslov = AlocirajNizKaraktera(naslov);
  407.         _sadrzaj = AlocirajNizKaraktera(sadrzaj);
  408.     }
  409.  
  410.     //const kopije
  411.     Poglavlje(const Poglavlje& obj) {
  412.         _naslov = AlocirajNizKaraktera(obj._naslov);
  413.         _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
  414.         _prihvaceno = obj._prihvaceno;
  415.         _ocjena = obj._ocjena;
  416.  
  417.     }
  418.  
  419.     //operator =
  420.     Poglavlje& operator=(const Poglavlje& obj) {
  421.         if (this != &obj)
  422.         {
  423.             delete[]_naslov;
  424.             delete[] _sadrzaj;
  425.             _naslov = AlocirajNizKaraktera(obj._naslov);
  426.             _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
  427.             _prihvaceno = obj._prihvaceno;
  428.             _ocjena = obj._ocjena;
  429.  
  430.         }
  431.         return*this;
  432.  
  433.     }
  434.     ~Poglavlje() {
  435.         delete[] _naslov; _naslov = nullptr;
  436.         delete[] _sadrzaj; _sadrzaj = nullptr;
  437.     }
  438.     friend ostream& operator<<(ostream& COUT, Poglavlje& obj) {
  439.         if (obj._naslov == nullptr || obj._sadrzaj == nullptr)
  440.             return COUT;
  441.         COUT << endl << obj._naslov << endl << obj._sadrzaj << endl;
  442.         if (obj._prihvaceno)
  443.             COUT << "Ocjena: " << obj._ocjena << endl;;
  444.         return COUT;
  445.     }
  446.     char* GetNaslov() { return _naslov; }
  447.     char* GetSadrzaj() { return _sadrzaj; }
  448.     bool GetPrihvaceno() { return _prihvaceno; }
  449.     int GetOcjena() { return _ocjena; }
  450.  
  451.     void OcijeniPoglavlje(int ocjena) {
  452.         _ocjena = ocjena;
  453.         if (_ocjena > 5 && ocjena <= 10)
  454.             _prihvaceno = true;
  455.     }
  456. };
  457.  
  458. class ZavrsniRad {
  459.     char* _tema;
  460.     vector<Poglavlje> _poglavljaRada;
  461.     string _datumOdbrane;
  462.     float _konacnaOcjena; //prosjek ocjena svih poglavlja u zavrsnom radu koja se izracunava u momentu zakazivanja odbrane
  463. public:
  464.  
  465.     friend bool operator==(const ZavrsniRad& obj1, const ZavrsniRad& obj2) {
  466.         if (strcmp(obj1.GetNazivTeme(), obj2.GetNazivTeme()) == 0)
  467.         {
  468.             return true;
  469.         }
  470.         else return false;
  471.     }
  472.  
  473.  
  474.     /*funkcija OcijeniPoglavlje, na osnovu naziva poglavlja, dodjeljuje ocjenu poglavlju te ukoliko je ocjena pozitivna (6 - 10) onda poglavlje oznacava prihvacenim. U slucaju da ocjena nije validna ili poglavlje ne postoji, funkcija baca izuzetak sa odgovarajucom porukom*/
  475. //parametri:nazivPoglavlja, ocjena
  476.  
  477.     void OcijeniPoglavlje(string nazivPoglavlja, int ocjena) {
  478.         if (ocjena < 6 || ocjena>10)
  479.         {
  480.             throw exception("Ocjena nije validna.\n");
  481.         }
  482.         for (int i = 0; i < _poglavljaRada.size(); i++)
  483.         {
  484.             if (strcmp(nazivPoglavlja.c_str(), _poglavljaRada[i].GetNaslov()) == 0)
  485.             {
  486.                 _poglavljaRada[i].addOcjena(ocjena);
  487.                 return;
  488.             }
  489.         }
  490.         throw exception("Poglavlje ne postoji.\n");
  491.  
  492.     }
  493.  
  494.     /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
  495. //parametri: nazivPoglavlja, sadrzajPoglavlja
  496.  
  497.     void DodajPoglavlje(string nazivPoglavlja, string sadrzajPoglavlja) {
  498.         for (int i = 0; i < _poglavljaRada.size(); i++)
  499.         {
  500.             if (strcmp(nazivPoglavlja.c_str(), _poglavljaRada[i].GetNaslov()) == 0)
  501.             {
  502.                 _poglavljaRada[i].addSadrzaj(sadrzajPoglavlja);
  503.                 return;
  504.             }
  505.         }
  506.         Poglavlje objPoglavlje(nazivPoglavlja.c_str(), sadrzajPoglavlja.c_str());
  507.         _poglavljaRada.push_back(objPoglavlje);
  508.  
  509.     }
  510.     ZavrsniRad(const char* nazivTeme = nullptr) : _konacnaOcjena(0), _datumOdbrane(not_set) {
  511.         _tema = AlocirajNizKaraktera(nazivTeme);
  512.     }
  513.  
  514.     //const kopije
  515.     ZavrsniRad(const ZavrsniRad& obj) {
  516.         _tema = AlocirajNizKaraktera(obj._tema);
  517.         _poglavljaRada = obj._poglavljaRada;
  518.         _datumOdbrane = obj._datumOdbrane;
  519.         _konacnaOcjena = obj._konacnaOcjena;
  520.     }
  521.     //operator =
  522.     ZavrsniRad& operator=(const ZavrsniRad& obj) {
  523.         if (this != &obj)
  524.         {
  525.             delete[]_tema;
  526.             _tema = AlocirajNizKaraktera(obj._tema);
  527.             _poglavljaRada = obj._poglavljaRada;
  528.             _datumOdbrane = obj._datumOdbrane;
  529.             _konacnaOcjena = obj._konacnaOcjena;
  530.         }
  531.         return*this;
  532.     }
  533.  
  534.     ~ZavrsniRad() {
  535.         delete[] _tema; _tema = nullptr;
  536.     }
  537.     char* GetNazivTeme()const { return _tema; }
  538.     vector<Poglavlje>& GetPoglavlja() { return _poglavljaRada; };
  539.     string GetDatumOdbrane()const { return _datumOdbrane; }
  540.     float GetOcjena() { return _konacnaOcjena; }
  541.     void SetDatumOdbrane(string datumOdbrane) { _datumOdbrane = datumOdbrane; }
  542.  
  543.  
  544.  
  545.     friend ostream& operator<<(ostream& COUT, ZavrsniRad& obj) {
  546.         COUT << "Tema rada: " << obj._tema << endl;
  547.         COUT << "Sadrzaj: " << endl;
  548.         for (size_t i = 0; i < obj._poglavljaRada.size(); i++)
  549.             COUT << obj._poglavljaRada[i] << endl;
  550.         COUT << "Datum odbrane rada: " << obj._datumOdbrane << endl << " Ocjena: " << obj._konacnaOcjena << endl;
  551.         return COUT;
  552.     }
  553. };
  554.  
  555. class Mentor {
  556.     char* _imePrezime;
  557.     //Parametar string predstavlja broj indeksa studenta koji prijavljuje zavrsni rad kod odredjenog Mentora
  558.     Kolekcija<string, ZavrsniRad> _teme;
  559. public:
  560.     /*funkcija DodajZavrsniRad ima zadatak da odredjenom Mentoru dodijeli mentorstvo na zavrsnom radu. zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
  561. sprijeciti dodavanje zavrsnih radova sa istom temom*/
  562. //parametri:brojIndeksa, zavrsniRad
  563.     bool DodajZavrsniRad(string brojIndeksa, ZavrsniRad obj) {
  564.         if (_teme.AddElement(brojIndeksa, obj) == true)
  565.         {
  566.             return true;
  567.         }
  568.         else return false;
  569.     }
  570.     friend ostream& operator<<(ostream& COUT, Mentor& obj) {
  571.         COUT << "Ime i Prezime: " << obj._imePrezime << endl;
  572.         COUT << "Teme: " << obj._teme << endl;
  573.  
  574.         return COUT;
  575.     }
  576.     Mentor(const char* imePrezime = nullptr) {
  577.         _imePrezime = AlocirajNizKaraktera(imePrezime);
  578.     }
  579.     ~Mentor() {
  580.         delete[] _imePrezime; _imePrezime = nullptr;
  581.     }
  582.     Kolekcija<string, ZavrsniRad>& GetTeme() { return _teme; };
  583.     char* GetImePrezime() { return _imePrezime; }
  584.     void Info() {
  585.         cout << _imePrezime << endl << _teme << endl;
  586.     }
  587. };
  588.  
  589. int main() {
  590.     cout << crt << "UPLOAD RADA OBAVEZNO IZVRSITI U ODGOVARAJUCI FOLDER NA FTP SERVERU" << endl;
  591.     cout << "U slucaju da je Upload folder prazan pritisnite tipku F5" << crt;
  592.  
  593.     const int max = 4;
  594.     Mentor* mentori[max];
  595.  
  596.     mentori[0] = new Mentor("Armina Hubana");
  597.     mentori[1] = new Mentor("Zanin Vejzovic");
  598.     mentori[2] = new Mentor("Jasmin Azemovic");
  599.     mentori[3] = new Mentor("Emina Junuz");
  600.  
  601.     cout << *mentori[1];
  602.     //parametri: naziv zavrsnog rada
  603.     ZavrsniRad multimedijalni("Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
  604.     ZavrsniRad podrsa_operaterima("Sistem za podršku rada kablovskog operatera");
  605.     ZavrsniRad analiza_sigurnosti("Prakticna analiza sigurnosti bežičnih računarskih mreža");
  606.     ZavrsniRad kriptografija("Primjena teorije informacija u procesu generisanja kriptografskih ključeva");
  607.  
  608.     /*  cout << multimedijalni;*/
  609.  
  610.         /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
  611.         //parametri: nazivPoglavlja, sadrzajPoglavlja
  612.  
  613.     multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
  614.     multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
  615.     multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
  616.     multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistema, a neke od najznacajnijih su ...");
  617.     multimedijalni.DodajPoglavlje("Teorija multimedije", "Sadrzaj koji bi trebao stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130011");
  618.     multimedijalni.DodajPoglavlje("Zakljucak", "U ovom radu su predstavljeni osnovni koncepti i prakticna primjena...");
  619.  
  620.     cout << multimedijalni;
  621.  
  622.     try {
  623.         /*funkcija OcijeniPoglavlje, na osnovu naziva poglavlja, dodjeljuje ocjenu poglavlju te ukoliko je ocjena pozitivna (6 - 10) onda poglavlje oznacava prihvacenim. U slucaju da ocjena nije validna ili poglavlje ne postoji, funkcija baca izuzetak sa odgovarajucom porukom*/
  624.         //parametri:nazivPoglavlja, ocjena
  625.  
  626.  
  627.  
  628.         multimedijalni.OcijeniPoglavlje("Uvod", 8);
  629.         multimedijalni.OcijeniPoglavlje("Vrste multimedijalnih sistema", 8);
  630.         multimedijalni.OcijeniPoglavlje("Teorija multimedije", 9);
  631.         multimedijalni.OcijeniPoglavlje("Zakljucak", 7);
  632.         multimedijalni.OcijeniPoglavlje("Naziv poglavlja ne postoji", 8);
  633.     }
  634.     catch (exception& err) {
  635.         cout << "Greska -> " << err.what() << endl;
  636.     }
  637.     cout << multimedijalni;
  638.     /*funkcija DodajZavrsniRad ima zadatak da odredjenom Mentoru dodijeli mentorstvo na zavrsnom radu. zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
  639.     sprijeciti dodavanje zavrsnih radova sa istom temom*/
  640.     //parametri:brojIndeksa, zavrsniRad
  641.  
  642.     if (mentori[0]->DodajZavrsniRad("IB130011", multimedijalni))
  643.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  644.     if (mentori[0]->DodajZavrsniRad("IB120051", podrsa_operaterima))
  645.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  646.     if (!mentori[0]->DodajZavrsniRad("IB120056", podrsa_operaterima))//dupliranje rada
  647.         cout << "Zavrsni rad nije dodat!" << endl;
  648.     if (!mentori[0]->DodajZavrsniRad("IB120051", kriptografija)) //studentu vec dodijeljen rad
  649.         cout << "Zavrsni rad nije dodat!" << endl;
  650.     if (mentori[1]->DodajZavrsniRad("IB140102", analiza_sigurnosti))
  651.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  652.     if (mentori[2]->DodajZavrsniRad("IB140002", kriptografija))
  653.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  654.  
  655.     cout << mentori[1];
  656.  
  657.     //  /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva definisanje
  658.     //  datuma odbrane. odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio i pri tom su zadovoljeni sljedeci uslovi:
  659.     //      1. zavrsni rad ima broj poglavlja veci od minimalnog
  660.     //      2. svako poglavlje ima broj karaktera veci od minimalnog
  661.     //      3. svako poglavlje je prihvaceno/odobreno
  662.     //  ukoliko su zadovoljeni prethodni kriteriji, izracunava se konacna ocjena rada (prosjek ocjena svih poglavlja), postavlja datum odbrane rada i vraca pokazivac na rad kome je zakazan odbrana.
  663.     //  u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija nije zadovoljen, funkcija vraca nullptr.
  664.     //*/
  665.     //
  666.     ////parametri:brojIndeksa, datumOdbrane
  667.     //  ZavrsniRad* zr1 = mentori[0]->ZakaziOdbranuRada("IB130011", "25.09.2018");
  668.     //  if (zr1 != nullptr)
  669.     //      cout << *zr1 << endl;
  670.     //
  671.     //  zr1 = mentori[0]->ZakaziOdbranuRada("IB130111", "25.09.2018");//student sa brojem indeksa IB130111 jos uvijek nije prijavio rad
  672.     //  if (zr1 != nullptr)
  673.     //      cout << *zr1 << endl;
  674.     //
  675.         //ispisuje sve podatke o Mentoru i njegovim mentorstvima
  676.         mentori[0]->Info();
  677.    
  678.         for (int i = 0; i < max; i++) {
  679.             delete mentori[i];
  680.             mentori[i] = nullptr;
  681.         }
  682.         system("pause>0");
  683.     return 0;
  684. }
  685.  
  686. ---------------------------------------------------------------------------------------------------------------------------------------
  687.  
  688.  
  689. #include <iostream>
  690. #include <vector>
  691. using namespace std;
  692. /****************************************************************************
  693. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  694. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR  E BITI OZNACENO KAO "RE"
  695. 3. SPA AVAJTE PROJEKAT KAKO BI SE SPRIJE ILO GUBLJENJE URA ENOG ZADATKA
  696. 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.
  697. 5. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNA ENO.
  698. ****************************************************************************/
  699. const char* crt = "\n-------------------------------------------\n";
  700. const char* nedozvoljena_operacija = "Nedozvoljena operacija";
  701. const char* not_set = "NOT_SET";
  702. const int min_polgavlja = 3;
  703. const int min_karaktera_po_poglavlju = 30;
  704.  
  705. char* AlocirajNizKaraktera(const char* sadrzaj) {
  706.     if (sadrzaj == nullptr)
  707.         return nullptr;
  708.     int vel = strlen(sadrzaj) + 1;
  709.     char* temp = new char[vel];
  710.     strcpy_s(temp, vel, sadrzaj);
  711.     return temp;
  712. }
  713.  
  714. template<class T1, class T2>
  715. class Kolekcija {
  716.     T1* _elementi1;
  717.     T2* _elementi2;
  718.     int* _trenutno;
  719. public:
  720.  
  721.     bool AddElement(T1 el1, T2 el2) {
  722.         //napraviti provjeru da li se unutar _elementi1 ili _elementi2 vec nalaze el1 ii el2
  723.         for (int i = 0; i < *_trenutno; i++)
  724.         {
  725.             if (_elementi1[i] == el1 || _elementi2[i] == el2)
  726.             {
  727.                 return false;
  728.             }
  729.  
  730.  
  731.         }
  732.  
  733.         //napraviti privremene temp nizove koji ce imati _trenutno +1 broj elemenata
  734.         T1* temp1 = new T1[*_trenutno + 1];
  735.         T2* temp2 = new T2[*_trenutno + 1];
  736.         // nizovi su prazni z temp nizove cemo prebaciti stare elemente
  737.  
  738.         for (int i = 0; i < *_trenutno; i++)
  739.         {
  740.             temp1[i] = _elementi1[i];
  741.             temp2[i] = _elementi2[i];
  742.  
  743.         }
  744.         temp1[*_trenutno] = el1;
  745.         temp2[*_trenutno] = el2;
  746.  
  747.         delete[]_elementi1;
  748.         delete[]_elementi2;
  749.  
  750.         _elementi1 = temp1;
  751.         _elementi2 = temp2;
  752.  
  753.         (*_trenutno)++;
  754.         return true;
  755.     }
  756.  
  757.     Kolekcija() : _elementi1(nullptr), _elementi2(nullptr) {
  758.         _trenutno = new int(0);
  759.  
  760.     }
  761.     ~Kolekcija() {
  762.         delete[] _elementi1; _elementi1 = nullptr;
  763.         delete[] _elementi2; _elementi1 = nullptr;
  764.     }
  765.     T1* getElementi1Pok() { return _elementi1; }
  766.     T2* getElementi2Pok() { return _elementi2; }
  767.     T1& getElement1(int lokacija) { return _elementi1[lokacija]; }
  768.     T2& getElement2(int lokacija) { return _elementi2[lokacija]; }
  769.     int getTrenutno() { return _trenutno; }
  770.  
  771.     friend ostream& operator<<(ostream& COUT, Kolekcija<T1, T2>& obj) {
  772.         for (size_t i = 0; i < *obj._trenutno; i++)
  773.             COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
  774.         return COUT;
  775.     }
  776. };
  777. class Poglavlje {
  778.     char* _naslov;
  779.     char* _sadrzaj;
  780.     bool _prihvaceno;
  781.     int* _ocjena;//da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6 - 10
  782. public:
  783.  
  784.     void AddOcjena(int ocjena) {
  785.         _ocjena = new int(ocjena);
  786.         if (ocjena >= 6 && ocjena <= 10)
  787.         {
  788.             _prihvaceno = true;
  789.         }
  790.     }
  791.  
  792.     void addSadrzaj(string NoviSadrzaj) {
  793.         char* temp = AlocirajNizKaraktera((string(_sadrzaj) + " " + NoviSadrzaj).c_str());
  794.         delete[]_sadrzaj;
  795.         _sadrzaj = temp;
  796.  
  797.     }
  798.  
  799.     //const koji prima dva parametra, naslov i sadrzaj
  800.  
  801.     Poglavlje(const char* naslov = nullptr, const char* sadrzaj = nullptr) {
  802.         _naslov = AlocirajNizKaraktera(naslov);
  803.         _sadrzaj = AlocirajNizKaraktera(sadrzaj);
  804.         _prihvaceno = false;
  805.         _ocjena = new int(0);
  806.  
  807.     }
  808.  
  809.     //const kopije
  810.  
  811.  
  812.     Poglavlje& operator=(const Poglavlje& obj) {
  813.  
  814.         if (this != &obj)
  815.         {
  816.             delete[]_sadrzaj;
  817.             delete[]_naslov;
  818.             delete _ocjena;
  819.  
  820.             _naslov = AlocirajNizKaraktera(obj._naslov);
  821.             _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
  822.             _prihvaceno = obj._prihvaceno;
  823.             _ocjena = new int(*obj._ocjena);
  824.  
  825.         }
  826.  
  827.         return *this;
  828.  
  829.  
  830.     }
  831.  
  832.     Poglavlje(const Poglavlje& obj) {
  833.  
  834.         _naslov = AlocirajNizKaraktera(obj._naslov);
  835.         _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
  836.         _prihvaceno = obj._prihvaceno;
  837.         _ocjena = new int(*obj._ocjena);
  838.  
  839.  
  840.     }
  841.  
  842.  
  843.     ~Poglavlje() {
  844.         delete[] _naslov; _naslov = nullptr;
  845.         delete[] _sadrzaj; _sadrzaj = nullptr;
  846.     }
  847.     friend ostream& operator<<(ostream& COUT, Poglavlje& obj) {
  848.         if (obj._naslov == nullptr || obj._sadrzaj == nullptr)
  849.             return COUT;
  850.         COUT << endl << obj._naslov << endl << obj._sadrzaj << endl;
  851.         if (obj._prihvaceno)
  852.             COUT << "Ocjena: " << *obj._ocjena << endl;;
  853.         return COUT;
  854.     }
  855.     char* GetNaslov() { return _naslov; }
  856.     char* GetSadrzaj() { return _sadrzaj; }
  857.     bool GetPrihvaceno() { return _prihvaceno; }
  858.     int GetOcjena() { return *_ocjena; }
  859.  
  860.     void OcijeniPoglavlje(int ocjena) {
  861.         _ocjena = new int(ocjena);
  862.         if (*_ocjena > 5 && ocjena <= 10)
  863.             _prihvaceno = true;
  864.     }
  865. };
  866.  
  867. class ZavrsniRad {
  868.     char* _tema;
  869.     vector<Poglavlje*> _poglavljaRada;
  870.     string _datumOdbrane;
  871.     float _konacnaOcjena; //prosjek ocjena svih poglavlja u zavrsnom radu koja se izracunava u momentu zakazivanja odbrane
  872. public:
  873.     friend bool operator== (const ZavrsniRad& obj1, const ZavrsniRad& obj2) {
  874.         if (strcmp(obj1.GetNazivTeme(), obj2.GetNazivTeme()) == 0) {
  875.             return true;
  876.         }
  877.         else
  878.             return false;
  879.     }
  880.  
  881.  
  882.     void OcijeniPoglavlje(string nazivPoglavlja, int ocjena) {
  883.         if (ocjena < 5 || ocjena >10)
  884.         {
  885.             throw exception("Ocijena nije validna.\n");
  886.         }
  887.         for (int i = 0; i < _poglavljaRada.size(); i++)
  888.         {
  889.             if (strcmp(nazivPoglavlja.c_str(), _poglavljaRada[i]->GetNaslov()) == 0)
  890.             {
  891.                 _poglavljaRada[i]->AddOcjena(ocjena);
  892.                 return;
  893.             }
  894.         }
  895.  
  896.         throw exception("Poglavlje ne postoji\.n");
  897.  
  898.     }
  899.  
  900.  
  901.     /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
  902. //parametri: nazivPoglavlja, sadrzajPoglavlja
  903.  
  904.     void DodajPoglavlje(string nazivPoglavlja, string sadrzajPoglavlja) {
  905.  
  906.         for (int i = 0; i < _poglavljaRada.size(); i++)
  907.         {
  908.             if (strcmp(nazivPoglavlja.c_str(), _poglavljaRada[i]->GetNaslov()) == 0)
  909.             {
  910.                 _poglavljaRada[i]->addSadrzaj(sadrzajPoglavlja);
  911.                 return;
  912.             }
  913.  
  914.         }
  915.  
  916.         Poglavlje objPoglavlje(nazivPoglavlja.c_str(), sadrzajPoglavlja.c_str());
  917.         _poglavljaRada.push_back(new Poglavlje(objPoglavlje));
  918.  
  919.  
  920.     }
  921.  
  922.     ZavrsniRad(const char* nazivTeme = nullptr) : _konacnaOcjena(0), _datumOdbrane(not_set) {
  923.         _tema = AlocirajNizKaraktera(nazivTeme);
  924.     }
  925.     // const kopije
  926.     ZavrsniRad(const ZavrsniRad& obj) {
  927.         _tema = AlocirajNizKaraktera(obj._tema);
  928.         _datumOdbrane = obj._datumOdbrane;
  929.         _konacnaOcjena = obj._konacnaOcjena;
  930.  
  931.         for (int i = 0; i < obj._poglavljaRada.size(); i++)
  932.         {
  933.             _poglavljaRada.push_back(new Poglavlje(*obj._poglavljaRada[i]));
  934.         }
  935.     }
  936.  
  937.     // operator dodjele
  938.     ZavrsniRad& operator=(const ZavrsniRad& obj) {
  939.         if (this != &obj)
  940.         {
  941.  
  942.             delete[]_tema;
  943.             for (int i = 0; i < _poglavljaRada.size(); i++)
  944.             {
  945.  
  946.                 delete _poglavljaRada[i];
  947.  
  948.             }
  949.             _tema = AlocirajNizKaraktera(obj._tema);
  950.             _datumOdbrane = obj._datumOdbrane;
  951.             _konacnaOcjena = obj._konacnaOcjena;
  952.  
  953.             for (int i = 0; i < obj._poglavljaRada.size(); i++)
  954.             {
  955.                 _poglavljaRada.push_back(new Poglavlje(*obj._poglavljaRada[i]));
  956.             }
  957.         }
  958.         return *this;
  959.  
  960.     }
  961.  
  962.  
  963.     ~ZavrsniRad() {
  964.         delete[] _tema; _tema = nullptr;
  965.     }
  966.     char* GetNazivTeme()const { return _tema; }
  967.     vector<Poglavlje*>& GetPoglavlja() { return _poglavljaRada; };
  968.     string GetDatumOdbrane()const { return _datumOdbrane; }
  969.     float GetOcjena() { return _konacnaOcjena; }
  970.     void SetDatumOdbrane(string datumOdbrane) { _datumOdbrane = datumOdbrane; }
  971.  
  972.  
  973.     friend ostream& operator<<(ostream& COUT, ZavrsniRad& obj) {
  974.         COUT << "Tema rada: " << obj._tema << endl;
  975.         COUT << "Sadrzaj: " << endl;
  976.         for (size_t i = 0; i < obj._poglavljaRada.size(); i++)
  977.             COUT << *obj._poglavljaRada[i] << endl;
  978.         COUT << "Datum odbrane rada: " << obj._datumOdbrane << endl << " Ocjena: " << obj._konacnaOcjena << endl;
  979.         return COUT;
  980.     }
  981. };
  982.  
  983. class Mentor {
  984.     string _imePrezime;
  985.     //Parametar string predstavlja broj indeksa studenta koji prijavljuje zavrsni rad kod odredjenog Mentora
  986.     Kolekcija<string, ZavrsniRad>* _teme;
  987. public:
  988.  
  989.     bool DodajZavrsniRad(string brojIndeksa, ZavrsniRad obj) {
  990.         if (_teme->AddElement(brojIndeksa, obj) == true)
  991.         {
  992.             return true;
  993.         }
  994.  
  995.         else return false;
  996.  
  997.     }
  998.  
  999.  
  1000.     friend ostream& operator<<(ostream& COUT, Mentor& obj) {
  1001.         COUT << "Ime i Prezime: " << obj._imePrezime << endl;
  1002.         COUT << "Teme: " << *obj._teme << endl;
  1003.  
  1004.         return COUT;
  1005.     }
  1006.     Mentor(string imePrezime) :_imePrezime(imePrezime) {
  1007.  
  1008.         _teme = new Kolekcija<string, ZavrsniRad>();
  1009.     }
  1010.     Kolekcija<string, ZavrsniRad>& GetTeme() { return *_teme; };
  1011.     string GetImePrezime() { return _imePrezime; }
  1012.     void Info() {
  1013.         cout << _imePrezime << endl << *_teme << endl;
  1014.     }
  1015. };
  1016.  
  1017. int main() {
  1018.     cout << crt << "UPLOAD RADA OBAVEZNO IZVRSITI U ODGOVARAJUCI FOLDER NA FTP SERVERU" << endl;
  1019.     cout << "U slucaju da je Upload folder prazan pritisnite tipku F5" << crt;
  1020.  
  1021.     const int max = 4;
  1022.     Mentor* mentori[max];
  1023.  
  1024.     mentori[0] = new Mentor("Armina Hubana");
  1025.     mentori[1] = new Mentor("Zanin Vejzovic");
  1026.     mentori[2] = new Mentor("Jasmin Azemovic");
  1027.     mentori[3] = new Mentor("Emina Junuz");
  1028.  
  1029.     //cout << *mentori[1];
  1030.     //parametri: naziv zavrsnog rada
  1031.     ZavrsniRad multimedijalni("Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
  1032.     ZavrsniRad podrsa_operaterima("Sistem za podr ku rada kablovskog operatera");
  1033.     ZavrsniRad analiza_sigurnosti("Prakticna analiza sigurnosti be i nih ra unarskih mre a");
  1034.     ZavrsniRad kriptografija("Primjena teorije informacija u procesu generisanja kriptografskih klju eva");
  1035.  
  1036.     cout << multimedijalni;
  1037.  
  1038.  
  1039.     /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
  1040.     //parametri: nazivPoglavlja, sadrzajPoglavlja
  1041.  
  1042.  
  1043.  
  1044.     multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
  1045.     multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
  1046.     multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
  1047.     multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistema, a neke od najznacajnijih su ...");
  1048.     multimedijalni.DodajPoglavlje("Teorija multimedije", "Sadrzaj koji bi trebao stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130011");
  1049.     multimedijalni.DodajPoglavlje("Zakljucak", "U ovom radu su predstavljeni osnovni koncepti i prakticna primjena...");
  1050.  
  1051.     //cout << multimedijalni;
  1052.  
  1053.  
  1054.     try {
  1055.         /*funkcija OcijeniPoglavlje, na osnovu naziva poglavlja, dodjeljuje ocjenu poglavlju te ukoliko je ocjena pozitivna (6 - 10) onda poglavlje oznacava prihvacenim. U slucaju da ocjena nije validna ili poglavlje ne postoji, funkcija baca izuzetak sa odgovarajucom porukom*/
  1056.         //parametri:nazivPoglavlja, ocjena
  1057.  
  1058.         multimedijalni.OcijeniPoglavlje("Uvod", 8);
  1059.         multimedijalni.OcijeniPoglavlje("Vrste multimedijalnih sistema", 8);
  1060.         multimedijalni.OcijeniPoglavlje("Teorija multimedije", 9);
  1061.         multimedijalni.OcijeniPoglavlje("Zakljucak", 7);
  1062.         multimedijalni.OcijeniPoglavlje("Naziv poglavlja ne postoji", 8);
  1063.     }
  1064.     catch (exception& err) {
  1065.         cout << "Greska -> " << err.what() << endl;
  1066.     }
  1067.  
  1068.     cout << multimedijalni;
  1069.  
  1070.     /*funkcija DodajZavrsniRad ima zadatak da odredjenom Mentoru dodijeli mentorstvo na zavrsnom radu. zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
  1071.     sprijeciti dodavanje zavrsnih radova sa istom temom*/
  1072.     //parametri:brojIndeksa, zavrsniRad
  1073.  
  1074.  
  1075.     if (mentori[0]->DodajZavrsniRad("IB130011", multimedijalni))
  1076.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  1077.     if (mentori[0]->DodajZavrsniRad("IB120051", podrsa_operaterima))
  1078.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  1079.     if (!mentori[0]->DodajZavrsniRad("IB120056", podrsa_operaterima))//dupliranje rada
  1080.         cout << "Zavrsni rad nije dodat!" << endl;
  1081.     if (!mentori[0]->DodajZavrsniRad("IB120051", kriptografija)) //studentu vec dodijeljen rad
  1082.         cout << "Zavrsni rad nije dodat!" << endl;
  1083.     if (mentori[1]->DodajZavrsniRad("IB140102", analiza_sigurnosti))
  1084.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  1085.     if (mentori[2]->DodajZavrsniRad("IB140002", kriptografija))
  1086.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  1087.  
  1088.     cout << *mentori[1];
  1089.  
  1090.     //
  1091. //  /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva definisanje
  1092. //  datuma odbrane. odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio i pri tom su zadovoljeni sljedeci uslovi:
  1093. //      1. zavrsni rad ima broj poglavlja veci od minimalnog
  1094. //      2. svako poglavlje ima broj karaktera veci od minimalnog
  1095. //      3. svako poglavlje je prihvaceno/odobreno
  1096. //  ukoliko su zadovoljeni prethodni kriteriji, izracunava se konacna ocjena rada (prosjek ocjena svih poglavlja), postavlja datum odbrane rada i vraca pokazivac na rad kome je zakazan odbrana.
  1097. //  u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija nije zadovoljen, funkcija vraca nullptr.
  1098. //*/
  1099. //
  1100. ////parametri:brojIndeksa, datumOdbrane
  1101. //  ZavrsniRad* zr1 = mentori[0]->ZakaziOdbranuRada("IB130011", "25.09.2018");
  1102. //  if (zr1 != nullptr)
  1103. //      cout << *zr1 << endl;
  1104. //
  1105. //  zr1 = mentori[0]->ZakaziOdbranuRada("IB130111", "25.09.2018");//student sa brojem indeksa IB130111 jos uvijek nije prijavio rad
  1106. //  if (zr1 != nullptr)
  1107. //      cout << *zr1 << endl;
  1108. //
  1109.     //ispisuje sve podatke o Mentoru i njegovim mentorstvima
  1110.     mentori[0]->Info();
  1111.  
  1112.     for (int i = 0; i < max; i++) {
  1113.         delete mentori[i];
  1114.         mentori[i] = nullptr;
  1115.     }
  1116.     system("pause>0");
  1117.     return 0;
  1118. }
  1119. ---------------------------------------------------------------------------------------------------------------------------------------
  1120.  
  1121. #include <iostream>
  1122. #include <vector>
  1123. using namespace std;
  1124.  
  1125. /****************************************************************************
  1126. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  1127. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR  E BITI OZNACENO KAO "RE"
  1128. 3. SPA AVAJTE PROJEKAT KAKO BI SE SPRIJE ILO GUBLJENJE URA ENOG ZADATKA
  1129. 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.
  1130. 5. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNA ENO.
  1131. ****************************************************************************/
  1132. const char* crt = "\n-------------------------------------------\n";
  1133. const char* nedozvoljena_operacija = "Nedozvoljena operacija";
  1134. const char* not_set = "NOT_SET";
  1135. const int min_polgavlja = 3;
  1136. const int min_karaktera_po_poglavlju = 30;
  1137.  
  1138. char* AlocirajNizKaraktera(const char* sadrzaj) {
  1139.     if (sadrzaj == nullptr)
  1140.         return nullptr;
  1141.     int vel = strlen(sadrzaj) + 1;
  1142.     char* temp = new char[vel];
  1143.     strcpy_s(temp, vel, sadrzaj);
  1144.     return temp;
  1145. }
  1146.  
  1147. template<class T1, class T2>
  1148. class Kolekcija {
  1149.     T1* _elementi1;
  1150.     T2* _elementi2;
  1151.     int* _trenutno;
  1152. public:
  1153.  
  1154.     bool addElement(T1 el1, T2 el2) {
  1155.         for (int i = 0; i < *_trenutno; i++)
  1156.         {
  1157.             if (_elementi1[i] == el1 || _elementi2[i] == el2)
  1158.             {
  1159.                 return false;
  1160.             }
  1161.         }
  1162.  
  1163.         T1* temp1 = new T1[*_trenutno + 1];
  1164.         T2* temp2 = new T2[*_trenutno + 1];
  1165.  
  1166.         for (int i = 0; i < *_trenutno; i++)
  1167.         {
  1168.             temp1[i] = _elementi1[i];
  1169.             temp2[i] = _elementi2[i];
  1170.  
  1171.         }
  1172.         temp1[*_trenutno] = el1;
  1173.         temp2[*_trenutno] = el2;
  1174.  
  1175.         delete[]_elementi1;
  1176.         delete[]_elementi2;
  1177.  
  1178.         _elementi1 = temp1;
  1179.         _elementi2 = temp2;
  1180.  
  1181.         (*_trenutno)++;
  1182.         return true;
  1183.  
  1184.     }
  1185.  
  1186.     //const
  1187.  
  1188.     Kolekcija() {
  1189.         _elementi1 = nullptr;
  1190.         _elementi2 = nullptr;
  1191.         _trenutno = new int(0);
  1192.  
  1193.     }
  1194.  
  1195.     ~Kolekcija() {
  1196.         delete[] _elementi1; _elementi1 = nullptr;
  1197.         delete[] _elementi2; _elementi1 = nullptr;
  1198.         delete[]_trenutno; _trenutno = nullptr;
  1199.     }
  1200.     T1* getElementi1Pok() { return _elementi1; }
  1201.     T2* getElementi2Pok() { return _elementi2; }
  1202.     T1& getElement1(int lokacija) { return _elementi1[lokacija]; }
  1203.     T2& getElement2(int lokacija) { return _elementi2[lokacija]; }
  1204.     int getTrenutno() { return _trenutno; }
  1205.  
  1206.     friend ostream& operator<<(ostream& COUT, Kolekcija<T1, T2>& obj) {
  1207.         for (size_t i = 0; i < *obj._trenutno; i++)
  1208.             COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
  1209.         return COUT;
  1210.     }
  1211. };
  1212. class Poglavlje {
  1213.     string* _naslov;
  1214.     char* _sadrzaj;
  1215.     bool _prihvaceno;
  1216.     int _ocjena;//da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6 - 10
  1217. public:
  1218.     void addOcjena(int ocjena) {
  1219.         _ocjena = ocjena;
  1220.         if (ocjena >= 6 && ocjena <= 10)
  1221.         {
  1222.             _prihvaceno = true;
  1223.         }
  1224.  
  1225.     }
  1226.     void addSadrzaj(string noviSadrzaj) {
  1227.         char* temp = AlocirajNizKaraktera((string(_sadrzaj) + " " + noviSadrzaj).c_str());
  1228.         delete[]_sadrzaj;
  1229.         _sadrzaj = temp;
  1230.  
  1231.     }
  1232.     Poglavlje(const char* naslov = nullptr, const char* sadrzaj = nullptr)
  1233.         :_ocjena(0), _prihvaceno(false) {
  1234.         _naslov = new string(naslov);
  1235.         _sadrzaj = AlocirajNizKaraktera(sadrzaj);
  1236.     }
  1237.  
  1238.     //const kopije
  1239.     Poglavlje(const Poglavlje& obj) {
  1240.         _naslov = new string(*obj._naslov);
  1241.         _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
  1242.         _prihvaceno = obj._prihvaceno;
  1243.         _ocjena = obj._ocjena;
  1244.  
  1245.     }
  1246.     //operator dodjele
  1247.     Poglavlje& operator=(const Poglavlje& obj) {
  1248.         if (this != &obj)
  1249.         {
  1250.             delete _naslov;
  1251.             delete[]_sadrzaj;
  1252.             _naslov = new string(*obj._naslov);
  1253.             _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
  1254.             _prihvaceno = obj._prihvaceno;
  1255.             _ocjena = obj._ocjena;
  1256.         }
  1257.         return *this;
  1258.  
  1259.     }
  1260.  
  1261.     ~Poglavlje() {
  1262.         delete _naslov; _naslov = nullptr;
  1263.         delete[] _sadrzaj; _sadrzaj = nullptr;
  1264.     }
  1265.     friend ostream& operator<<(ostream& COUT, Poglavlje& obj) {
  1266.         if (obj._naslov == nullptr || obj._sadrzaj == nullptr)
  1267.             return COUT;
  1268.         COUT << endl << *obj._naslov << endl << obj._sadrzaj << endl;
  1269.         if (obj._prihvaceno)
  1270.             COUT << "Ocjena: " << obj._ocjena << endl;;
  1271.         return COUT;
  1272.     }
  1273.     string* GetNaslov() { return _naslov; }
  1274.     char* GetSadrzaj() { return _sadrzaj; }
  1275.     bool GetPrihvaceno() { return _prihvaceno; }
  1276.     int GetOcjena() { return _ocjena; }
  1277.  
  1278.     void OcijeniPoglavlje(int ocjena) {
  1279.         _ocjena = ocjena;
  1280.         if (_ocjena > 5 && ocjena <= 10)
  1281.             _prihvaceno = true;
  1282.     }
  1283. };
  1284.  
  1285. class ZavrsniRad {
  1286.     char* _tema;
  1287.     vector<Poglavlje*> _poglavljaRada;
  1288.     string* _datumOdbrane;
  1289.     float _konacnaOcjena; //prosjek ocjena svih poglavlja u zavrsnom radu koja se izracunava u momentu zakazivanja odbrane
  1290. public:
  1291.  
  1292.     friend bool operator==(const ZavrsniRad& obj1, const ZavrsniRad& obj2) {
  1293.         if (strcmp(obj1.GetNazivTeme(), obj2.GetNazivTeme()) == 0)
  1294.         {
  1295.             return true;
  1296.         }
  1297.         else return false;
  1298.     }
  1299.  
  1300.     /*funkcija OcijeniPoglavlje, na osnovu naziva poglavlja, dodjeljuje ocjenu poglavlju te ukoliko je ocjena pozitivna (6 - 10) onda poglavlje oznacava prihvacenim. U slucaju da ocjena nije validna ili poglavlje ne postoji, funkcija baca izuzetak sa odgovarajucom porukom*/
  1301. //parametri:nazivPoglavlja, ocjena
  1302.  
  1303.     void OcijeniPoglavlje(string nazivPoglavlja, int ocjena) {
  1304.         if (ocjena < 6 || ocjena>10)
  1305.         {
  1306.             throw exception("Ocjena nije validna.\n");
  1307.         }
  1308.  
  1309.         for (int i = 0; i < _poglavljaRada.size(); i++)
  1310.         {
  1311.             if (strcmp(nazivPoglavlja.c_str(), _poglavljaRada[i]->GetNaslov()->c_str()) == 0)
  1312.                 //if (nazivPoglavlja==*_poglavljaRada[i]->GetNaslov())
  1313.             {
  1314.                 _poglavljaRada[i]->addOcjena(ocjena);
  1315.                 return;
  1316.             }
  1317.         }
  1318.         throw exception("Poglavlje ne postoji.\n");
  1319.  
  1320.     }
  1321.  
  1322.  
  1323.     /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
  1324.     //parametri: nazivPoglavlja, sadrzajPoglavlja
  1325.  
  1326.     void DodajPoglavlje(string nazivPoglavlja, string sadrzajPoglavlja) {
  1327.         for (int i = 0; i < _poglavljaRada.size(); i++)
  1328.         {
  1329.             if (strcmp(nazivPoglavlja.c_str(), _poglavljaRada[i]->GetNaslov()->c_str()) == 0)
  1330.                 //if (nazivPoglavlja==*_poglavljaRada[i]->GetNaslov())
  1331.             {
  1332.                 _poglavljaRada[i]->addSadrzaj(sadrzajPoglavlja);
  1333.                 return;
  1334.             }
  1335.         }
  1336.  
  1337.         Poglavlje objPoglavlje(nazivPoglavlja.c_str(), sadrzajPoglavlja.c_str());
  1338.         _poglavljaRada.push_back(new Poglavlje(objPoglavlje));
  1339.  
  1340.     }
  1341.     ZavrsniRad(const char* nazivTeme = nullptr) : _konacnaOcjena(0), _datumOdbrane(new string(not_set)) {
  1342.         _tema = AlocirajNizKaraktera(nazivTeme);
  1343.     }
  1344.     //const kopije
  1345.  
  1346.     ZavrsniRad(const ZavrsniRad& obj) {
  1347.  
  1348.         _tema = AlocirajNizKaraktera(obj._tema);
  1349.         _datumOdbrane = new string(*obj._datumOdbrane);
  1350.         _konacnaOcjena = obj._konacnaOcjena;
  1351.  
  1352.         for (int i = 0; i < obj._poglavljaRada.size(); i++)
  1353.         {
  1354.             _poglavljaRada.push_back(new Poglavlje(*obj._poglavljaRada[i]));
  1355.         }
  1356.  
  1357.     }
  1358.  
  1359.     //operator =
  1360.  
  1361.     ZavrsniRad& operator=(const ZavrsniRad& obj) {
  1362.  
  1363.         if (this != &obj) {
  1364.             delete[]_tema;
  1365.             delete _datumOdbrane;
  1366.  
  1367.             for (int i = 0; i < _poglavljaRada.size(); i++)
  1368.             {
  1369.                 delete _poglavljaRada[i];
  1370.             }
  1371.  
  1372.             _tema = AlocirajNizKaraktera(obj._tema);
  1373.             _datumOdbrane = new string(*obj._datumOdbrane);
  1374.             _konacnaOcjena = obj._konacnaOcjena;
  1375.  
  1376.             for (int i = 0; i < obj._poglavljaRada.size(); i++)
  1377.             {
  1378.                 _poglavljaRada.push_back(new Poglavlje(*obj._poglavljaRada[i]));
  1379.             }
  1380.  
  1381.         }
  1382.         return*this;
  1383.  
  1384.     }
  1385.  
  1386.  
  1387.     ~ZavrsniRad() {
  1388.         delete[] _tema; _tema = nullptr;
  1389.         delete _datumOdbrane; _datumOdbrane = nullptr;
  1390.  
  1391.         for (int i = 0; i < _poglavljaRada.size(); i++)
  1392.         {
  1393.             delete _poglavljaRada[i];
  1394.             _poglavljaRada[i] = nullptr;
  1395.         }
  1396.  
  1397.  
  1398.     }
  1399.     char* GetNazivTeme()const { return _tema; }
  1400.     vector<Poglavlje*>& GetPoglavlja() { return _poglavljaRada; };
  1401.     string* GetDatumOdbrane()const { return _datumOdbrane; }
  1402.     float GetOcjena() { return _konacnaOcjena; }
  1403.     void SetDatumOdbrane(string datumOdbrane) { _datumOdbrane = new string(datumOdbrane); }
  1404.  
  1405.  
  1406.     friend ostream& operator<<(ostream& COUT, ZavrsniRad& obj) {
  1407.         COUT << "Tema rada: " << obj._tema << endl;
  1408.         COUT << "Sadrzaj: " << endl;
  1409.         for (size_t i = 0; i < obj._poglavljaRada.size(); i++)
  1410.             COUT << *obj._poglavljaRada[i] << endl;
  1411.         COUT << "Datum odbrane rada: " << *obj._datumOdbrane << endl << " Ocjena: " << obj._konacnaOcjena << endl;
  1412.         return COUT;
  1413.     }
  1414. };
  1415.  
  1416. class Mentor {
  1417.     char* _imePrezime;
  1418.     //Parametar string predstavlja broj indeksa studenta koji prijavljuje zavrsni rad kod odredjenog Mentora
  1419.     Kolekcija<string, ZavrsniRad> _teme;
  1420. public:
  1421.  
  1422.     /*funkcija DodajZavrsniRad ima zadatak da odredjenom Mentoru dodijeli mentorstvo na zavrsnom radu. zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
  1423. sprijeciti dodavanje zavrsnih radova sa istom temom*/
  1424. //parametri:brojIndeksa, zavrsniRad
  1425.  
  1426.     bool DodajZavrsniRad(string brojIndeksa, ZavrsniRad obj) {
  1427.         if (_teme.addElement(brojIndeksa, obj) == true)
  1428.         {
  1429.             return true;
  1430.         }
  1431.         else return false;
  1432.  
  1433.     }
  1434.     friend ostream& operator<<(ostream& COUT, Mentor& obj) {
  1435.         COUT << "Ime i prezime: " << obj._imePrezime << endl;
  1436.         COUT << "Teme: " << obj._teme << endl;
  1437.  
  1438.         return COUT;
  1439.     }
  1440.  
  1441.     Mentor(string imePrezime) {
  1442.         _imePrezime = AlocirajNizKaraktera(imePrezime.c_str());
  1443.  
  1444.     }
  1445.     Kolekcija<string, ZavrsniRad>& GetTeme() { return _teme; };
  1446.     string GetImePrezime() { return _imePrezime; }
  1447.     void Info() {
  1448.         cout << _imePrezime << endl << _teme << endl;
  1449.     }
  1450. };
  1451.  
  1452. int main() {
  1453.     cout << crt << "UPLOAD RADA OBAVEZNO IZVRSITI U ODGOVARAJUCI FOLDER NA FTP SERVERU" << endl;
  1454.     cout << "U slucaju da je Upload folder prazan pritisnite tipku F5" << crt;
  1455.  
  1456.     const int max = 4;
  1457.     Mentor* mentori[max];
  1458.  
  1459.     mentori[0] = new Mentor("Armina Hubana");
  1460.     mentori[1] = new Mentor("Zanin Vejzovic");
  1461.     mentori[2] = new Mentor("Jasmin Azemovic");
  1462.     mentori[3] = new Mentor("Emina Junuz");
  1463.  
  1464.     /*  cout << *mentori[1];*/
  1465.  
  1466.         //parametri: naziv zavrsnog rada
  1467.     ZavrsniRad multimedijalni("Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
  1468.     ZavrsniRad podrsa_operaterima("Sistem za podr ku rada kablovskog operatera");
  1469.     ZavrsniRad analiza_sigurnosti("Prakticna analiza sigurnosti be i nih ra unarskih mre a");
  1470.     ZavrsniRad kriptografija("Primjena teorije informacija u procesu generisanja kriptografskih klju eva");
  1471.  
  1472.     //cout << multimedijalni;
  1473.  
  1474.     /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
  1475.     //parametri: nazivPoglavlja, sadrzajPoglavlja
  1476.  
  1477.  
  1478.     multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
  1479.     multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
  1480.     multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
  1481.     multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistema, a neke od najznacajnijih su ...");
  1482.     multimedijalni.DodajPoglavlje("Teorija multimedije", "Sadrzaj koji bi trebao stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130011");
  1483.     multimedijalni.DodajPoglavlje("Zakljucak", "U ovom radu su predstavljeni osnovni koncepti i prakticna primjena...");
  1484.  
  1485.     cout << multimedijalni;
  1486.  
  1487.     try {
  1488.         /*funkcija OcijeniPoglavlje, na osnovu naziva poglavlja, dodjeljuje ocjenu poglavlju te ukoliko je ocjena pozitivna (6 - 10) onda poglavlje oznacava prihvacenim. U slucaju da ocjena nije validna ili poglavlje ne postoji, funkcija baca izuzetak sa odgovarajucom porukom*/
  1489.         //parametri:nazivPoglavlja, ocjena
  1490.  
  1491.         multimedijalni.OcijeniPoglavlje("Uvod", 8);
  1492.         multimedijalni.OcijeniPoglavlje("Vrste multimedijalnih sistema", 8);
  1493.         multimedijalni.OcijeniPoglavlje("Teorija multimedije", 9);
  1494.         multimedijalni.OcijeniPoglavlje("Zakljucak", 7);
  1495.         multimedijalni.OcijeniPoglavlje("Naziv poglavlja ne postoji", 8);
  1496.     }
  1497.     catch (exception& err) {
  1498.         cout << "Greska -> " << err.what() << endl;
  1499.     }
  1500.  
  1501.     cout << multimedijalni;
  1502.  
  1503.     /*funkcija DodajZavrsniRad ima zadatak da odredjenom Mentoru dodijeli mentorstvo na zavrsnom radu. zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
  1504.     sprijeciti dodavanje zavrsnih radova sa istom temom*/
  1505.     //parametri:brojIndeksa, zavrsniRad
  1506.  
  1507.  
  1508.  
  1509.     if (mentori[0]->DodajZavrsniRad("IB130011", multimedijalni))
  1510.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  1511.     if (mentori[0]->DodajZavrsniRad("IB120051", podrsa_operaterima))
  1512.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  1513.     if (!mentori[0]->DodajZavrsniRad("IB120056", podrsa_operaterima))//dupliranje rada
  1514.         cout << "Zavrsni rad nije dodat!" << endl;
  1515.     if (!mentori[0]->DodajZavrsniRad("IB120051", kriptografija)) //studentu vec dodijeljen rad
  1516.         cout << "Zavrsni rad nije dodat!" << endl;
  1517.     if (mentori[1]->DodajZavrsniRad("IB140102", analiza_sigurnosti))
  1518.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  1519.     if (mentori[2]->DodajZavrsniRad("IB140002", kriptografija))
  1520.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  1521.  
  1522.     cout << mentori[2];
  1523.  
  1524.     //  /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva definisanje
  1525.     //  datuma odbrane. odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio i pri tom su zadovoljeni sljedeci uslovi:
  1526.     //      1. zavrsni rad ima broj poglavlja veci od minimalnog
  1527.     //      2. svako poglavlje ima broj karaktera veci od minimalnog
  1528.     //      3. svako poglavlje je prihvaceno/odobreno
  1529.     //  ukoliko su zadovoljeni prethodni kriteriji, izracunava se konacna ocjena rada (prosjek ocjena svih poglavlja), postavlja datum odbrane rada i vraca pokazivac na rad kome je zakazan odbrana.
  1530.     //  u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija nije zadovoljen, funkcija vraca nullptr.
  1531.     //*/
  1532.     //
  1533.     ////parametri:brojIndeksa, datumOdbrane
  1534.     //  ZavrsniRad* zr1 = mentori[0]->ZakaziOdbranuRada("IB130011", "25.09.2018");
  1535.     //  if (zr1 != nullptr)
  1536.     //      cout << *zr1 << endl;
  1537.     //
  1538.     //  zr1 = mentori[0]->ZakaziOdbranuRada("IB130111", "25.09.2018");//student sa brojem indeksa IB130111 jos uvijek nije prijavio rad
  1539.     //  if (zr1 != nullptr)
  1540.     //      cout << *zr1 << endl;
  1541.     //
  1542.         //ispisuje sve podatke o Mentoru i njegovim mentorstvima
  1543.         mentori[0]->Info();
  1544.    
  1545.         for (int i = 0; i < max; i++) {
  1546.             delete mentori[i];
  1547.             mentori[i] = nullptr;
  1548.         }
  1549.         system("pause>0");
  1550.     return 0;
  1551. }
  1552.  
  1553.  
  1554. ---------------------------------------------------------------------------------------------------------------------------------------
  1555. #include<iostream>
  1556. #include<vector>
  1557. using namespace std;
  1558.  
  1559. //NC
  1560. //RE=>kada nesto nije alocirano i dolazi do pucanja programa
  1561. //TM=>task modified=> ne smijes mijenjati main
  1562.  
  1563. /****************************************************************************
  1564. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  1565. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR �E BITI OZNACENO KAO "RE"
  1566. 3. SPA�AVAJTE PROJEKAT KAKO BI SE SPRIJE�ILO GUBLJENJE URA�ENOG ZADATKA
  1567. 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.
  1568. 5. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNA�ENO.
  1569. ****************************************************************************/
  1570. const char* crt = "\n-------------------------------------------\n";
  1571. const char* nedozvoljena_operacija = "Nedozvoljena operacija";
  1572. const char* not_set = "NOT_SET";
  1573. const int min_polgavlja = 3;
  1574. const int min_karaktera_po_poglavlju = 30;
  1575.  
  1576. char* AlocirajNizKaraktera(const char* sadrzaj) {
  1577.     if (sadrzaj == nullptr)
  1578.         return nullptr;
  1579.     int vel = strlen(sadrzaj) + 1;
  1580.     char* temp = new char[vel];
  1581.     strcpy_s(temp, vel, sadrzaj);
  1582.     return temp;
  1583. }
  1584.  
  1585. template<class T1, class T2>
  1586. class Kolekcija {
  1587.     T1* _elementi1;
  1588.     T2* _elementi2;
  1589.     int _trenutno;
  1590. public:
  1591.     Kolekcija() :_trenutno(0), _elementi1(nullptr), _elementi2(nullptr) { }
  1592.     ~Kolekcija() {
  1593.         delete[] _elementi1; _elementi1 = nullptr;
  1594.         delete[] _elementi2; _elementi1 = nullptr;
  1595.     }
  1596.     T1* getElementi1Pok() { return _elementi1; }
  1597.     T2* getElementi2Pok() { return _elementi2; }
  1598.     T1& getElement1(int lokacija) { return _elementi1[lokacija]; }
  1599.     T2& getElement2(int lokacija) { return _elementi2[lokacija]; }
  1600.     int getTrenutno() { return _trenutno; }
  1601.  
  1602.     friend ostream& operator<<(ostream& COUT, Kolekcija<T1, T2>& obj) {
  1603.         for (size_t i = 0; i < obj._trenutno; i++)
  1604.             COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
  1605.         return COUT;
  1606.     }
  1607. };
  1608. class Poglavlje {
  1609.     char* _naslov;
  1610.     char* _sadrzaj;
  1611.     bool _prihvaceno;
  1612.     int _ocjena;//da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6 - 10
  1613. public:
  1614.  
  1615.  
  1616.     void AddOcjena(int ocjena) {
  1617.         _ocjena = ocjena;
  1618.         if (ocjena >= 6 && ocjena <= 10) {
  1619.             _prihvaceno = true;
  1620.         }
  1621.     }
  1622.  
  1623.     //const char* nekaRecenica = "Ovo je recenica\0";
  1624.     //string nekaRecenicaString = "String recenica";
  1625.  
  1626.     void AddSadrzaj(string noviSadrzaj) {
  1627.         char* temp = AlocirajNizKaraktera((string(_sadrzaj) + " " + noviSadrzaj).c_str());
  1628.         delete[]_sadrzaj;
  1629.         _sadrzaj = temp; //temp ima vrijednost starog i novog sadrzaja
  1630.  
  1631.     }
  1632.  
  1633.     //operator dodjele
  1634.     Poglavlje& operator=(const Poglavlje& obj) {
  1635.         if (this != &obj)
  1636.         {
  1637.             delete[]_naslov;
  1638.             delete[]_sadrzaj;
  1639.             _naslov = AlocirajNizKaraktera(obj._naslov);
  1640.             _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
  1641.             _prihvaceno = obj._prihvaceno;
  1642.             _ocjena = obj._ocjena;
  1643.         }
  1644.         return *this;
  1645.     }
  1646.  
  1647.  
  1648.     //konstruktor kopije
  1649.     Poglavlje(const Poglavlje& obj) {
  1650.         _naslov = AlocirajNizKaraktera(obj._naslov);
  1651.         _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
  1652.         _prihvaceno = obj._prihvaceno;
  1653.         //_ocjena = new int (*obj._ocjena);
  1654.         _ocjena = obj._ocjena;
  1655.     }
  1656.  
  1657.  
  1658.     Poglavlje(const char* naslov = nullptr, const char* sadrzaj = nullptr)
  1659.         :_ocjena(0), _prihvaceno(false) {
  1660.         _naslov = AlocirajNizKaraktera(naslov);
  1661.         _sadrzaj = AlocirajNizKaraktera(sadrzaj);
  1662.     }
  1663.     ~Poglavlje() {
  1664.         delete[] _naslov; _naslov = nullptr;
  1665.         delete[] _sadrzaj; _sadrzaj = nullptr;
  1666.     }
  1667.     friend ostream& operator<<(ostream& COUT, Poglavlje& obj) {
  1668.         if (obj._naslov == nullptr || obj._sadrzaj == nullptr)
  1669.             return COUT;
  1670.         COUT << endl << obj._naslov << endl << obj._sadrzaj << endl;
  1671.         if (obj._prihvaceno)
  1672.             COUT << "Ocjena: " << obj._ocjena << endl;;
  1673.         return COUT;
  1674.     }
  1675.     char* GetNaslov() { return _naslov; }
  1676.     char* GetSadrzaj() { return _sadrzaj; }
  1677.     bool GetPrihvaceno() { return _prihvaceno; }
  1678.     int GetOcjena() { return _ocjena; }
  1679.  
  1680.     void OcijeniPoglavlje(int ocjena) {
  1681.         _ocjena = ocjena;
  1682.         if (_ocjena > 5 && ocjena <= 10)
  1683.             _prihvaceno = true;
  1684.     }
  1685. };
  1686.  
  1687. class ZavrsniRad {
  1688.     char* _tema;
  1689.     vector<Poglavlje> _poglavljaRada;
  1690.     string _datumOdbrane;
  1691.     float _konacnaOcjena; //prosjek ocjena svih poglavlja u zavrsnom radu koja se izracunava u momentu zakazivanja odbrane
  1692. public:
  1693.     void OcijeniPoglavlje(string NaslovPoglavlja, int ocjena) {
  1694.         if (ocjena < 5 || ocjena>10) {
  1695.             throw exception("Ocjena nije validna.\n");
  1696.         }
  1697.  
  1698.         for (int i = 0; i < _poglavljaRada.size(); i++) {
  1699.             if (strcmp(NaslovPoglavlja.c_str(), _poglavljaRada[i].GetNaslov()) == 0)
  1700.             {
  1701.                 _poglavljaRada[i].AddOcjena(ocjena);
  1702.                 return;
  1703.             }
  1704.         }
  1705.  
  1706.         throw exception("Poglavlje ne postoji");
  1707.  
  1708.     }
  1709.  
  1710.  
  1711.  
  1712.     void DodajPoglavlje(string NaslovPoglavlja, string SadrzajPoglavlja) {
  1713.         //prvo provjeravamo da li naslov vec postoji unutar vektora _poglavljaRada
  1714.         //[0][1][2][3]
  1715.         for (int i = 0; i < _poglavljaRada.size(); i++) {
  1716.             if (strcmp(NaslovPoglavlja.c_str(), _poglavljaRada[i].GetNaslov()) == 0)
  1717.             {
  1718.                 _poglavljaRada[i].AddSadrzaj(SadrzajPoglavlja);
  1719.                 return;
  1720.             }
  1721.         }
  1722.  
  1723.         Poglavlje obj(NaslovPoglavlja.c_str(), SadrzajPoglavlja.c_str());
  1724.         _poglavljaRada.push_back(obj);
  1725.     }
  1726.     //operator=
  1727.     ZavrsniRad& operator=(const ZavrsniRad& obj) {
  1728.         if (this != &obj) {
  1729.             delete[]_tema;
  1730.             _tema = AlocirajNizKaraktera(obj._tema);
  1731.             _poglavljaRada = obj._poglavljaRada;
  1732.             _datumOdbrane = obj._datumOdbrane;
  1733.             _konacnaOcjena = obj._konacnaOcjena;
  1734.  
  1735.         }
  1736.         return *this;
  1737.     }
  1738.  
  1739.     //konstruktor kopije
  1740.     ZavrsniRad(const ZavrsniRad& obj) {
  1741.         _tema = AlocirajNizKaraktera(obj._tema);
  1742.         _poglavljaRada = obj._poglavljaRada;
  1743.         _datumOdbrane = obj._datumOdbrane;
  1744.         _konacnaOcjena = obj._konacnaOcjena;
  1745.     }
  1746.  
  1747.  
  1748.  
  1749.     ZavrsniRad(const char* nazivTeme = nullptr) : _konacnaOcjena(0), _datumOdbrane(not_set) {
  1750.         _tema = AlocirajNizKaraktera(nazivTeme);
  1751.     }
  1752.  
  1753.     //ZavrsniRad(const ZavrsniRad& org) : _poglavljaRada//(org._poglavljaRada), _konacnaOcjena(org._konacnaOcjena), //_datumOdbrane(org._datumOdbrane) {
  1754.     //  _tema = AlocirajNizKaraktera(org._tema);
  1755.     //}
  1756.  
  1757.     ~ZavrsniRad() {
  1758.         delete[] _tema; _tema = nullptr;
  1759.     }
  1760.     char* GetNazivTeme()const { return _tema; }
  1761.     vector<Poglavlje>& GetPoglavlja() { return _poglavljaRada; };
  1762.     string GetDatumOdbrane()const { return _datumOdbrane; }
  1763.     float GetOcjena() { return _konacnaOcjena; }
  1764.     void SetDatumOdbrane(string datumOdbrane) { _datumOdbrane = datumOdbrane; }
  1765.  
  1766.     //ZavrsniRad& operator=(const ZavrsniRad& org) {
  1767.     //  if (this != &org) {
  1768.     //      delete[] _tema;
  1769.     //      _tema = AlocirajNizKaraktera(org._tema);
  1770.     //      _datumOdbrane = org._datumOdbrane;
  1771.     //      _poglavljaRada = org._poglavljaRada;
  1772.     //      _konacnaOcjena = org._konacnaOcjena;
  1773.     //  }
  1774.     //  return *this;
  1775.     //}
  1776.  
  1777.     friend ostream& operator<<(ostream& COUT, ZavrsniRad& obj) {
  1778.         COUT << "Tema rada: " << obj._tema << endl;
  1779.         COUT << "Sadrzaj: " << endl;
  1780.         for (size_t i = 0; i < obj._poglavljaRada.size(); i++)
  1781.             COUT << obj._poglavljaRada[i] << endl;
  1782.         COUT << "Datum odbrane rada: " << obj._datumOdbrane << endl << " Ocjena: " << obj._konacnaOcjena << endl;
  1783.         return COUT;
  1784.     }
  1785. };
  1786.  
  1787. class Mentor {
  1788.     string _imePrezime;
  1789.     //Parametar string predstavlja broj indeksa studenta koji prijavljuje zavrsni rad kod odredjenog Mentora
  1790.     Kolekcija<string, ZavrsniRad> _teme;
  1791. public:
  1792.     friend ostream& operator<<(ostream& ISPIS, Mentor& obj) {
  1793.         ISPIS << "Ime prezime mentora : " << obj._imePrezime << endl;
  1794.         ISPIS << "Teme kod mentora : " << obj._teme << endl;
  1795.         return ISPIS;
  1796.     }
  1797.  
  1798.     //ako ti ne ispisuje ime i prezime mentora
  1799.     //provjeriti da li je pravilno dodijeljen u konstruktoru klase Mentor
  1800.     Mentor(string imePrezime) /*:_imePrezime(imePrezime)*/ {
  1801.         _imePrezime = imePrezime;
  1802.     }
  1803.     Kolekcija<string, ZavrsniRad>& GetTeme() { return _teme; };
  1804.     string GetImePrezime() { return _imePrezime; }
  1805.     void Info() {
  1806.         cout << _imePrezime << endl << _teme << endl;
  1807.     }
  1808. };
  1809.  
  1810. int main() {
  1811. #pragma region ovaj dio nije u sklopu postavke.
  1812.     //Poglavlje obj1("naslov1", "sadrzaj1");
  1813. //  Poglavlje obj2(obj1);//ctor kopije
  1814. //  Poglavlje obj3("neki treci", "neki treci");
  1815.     //cout << obj1;
  1816. //  obj3 = obj2;//operator=
  1817. #pragma endregion
  1818.  
  1819.  
  1820.  
  1821.     cout << crt << "UPLOAD RADA OBAVEZNO IZVRSITI U ODGOVARAJUCI FOLDER NA FTP SERVERU" << endl;
  1822.     cout << "U slucaju da je Upload folder prazan pritisnite tipku F5" << crt;
  1823.     //
  1824.     const int max = 4;
  1825.     Mentor* mentori[max];
  1826.     //
  1827.     mentori[0] = new Mentor("Armina Hubana");
  1828.     mentori[1] = new Mentor("Zanin Vejzovic");
  1829.     mentori[2] = new Mentor("Jasmin Azemovic");
  1830.     mentori[3] = new Mentor("Emina Junuz");
  1831.  
  1832.     //dereferencirati objekat kako bismo pristupili vrijednostima .
  1833.     //provjeriti da li je u operatoru<< pravilno definisano da se ispisuje ime i prezime
  1834.     //provjeriti da li je pravilno dodijeljen u konstruktoru klase Mentor
  1835.     cout << *mentori[2] << endl;
  1836.  
  1837.     //  //parametri: naziv zavrsnog rada
  1838.     ZavrsniRad multimedijalni("Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
  1839.     ZavrsniRad podrsa_operaterima("Sistem za podr�ku rada kablovskog operatera");
  1840.     ZavrsniRad analiza_sigurnosti("Prakticna analiza sigurnosti be�i�nih ra�unarskih mre�a");
  1841.     ZavrsniRad kriptografija("Primjena teorije informacija u procesu generisanja kriptografskih klju�eva");
  1842.  
  1843.  
  1844.     //
  1845.     //  /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
  1846.     //  //parametri: nazivPoglavlja, sadrzajPoglavlja
  1847.  
  1848.  
  1849.  
  1850.     multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
  1851.     multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
  1852.     multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
  1853.     multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistema, a neke od najznacajnijih su ...");
  1854.     multimedijalni.DodajPoglavlje("Teorija multimedije", "Sadrzaj koji bi trebao stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130011");
  1855.     multimedijalni.DodajPoglavlje("Zakljucak", "U ovom radu su predstavljeni osnovni koncepti i prakticna primjena...");
  1856.  
  1857.  
  1858.  
  1859.  
  1860.     //
  1861.     try {
  1862.         /*funkcija OcijeniPoglavlje, na osnovu naziva poglavlja, dodjeljuje ocjenu poglavlju te ukoliko je ocjena pozitivna (6 - 10) onda poglavlje oznacava prihvacenim. U slucaju da ocjena nije validna ili poglavlje ne postoji, funkcija baca izuzetak sa odgovarajucom porukom*/
  1863.         //parametri:nazivPoglavlja, ocjena
  1864.  
  1865.  
  1866.         multimedijalni.OcijeniPoglavlje("Uvod", 8);
  1867.         multimedijalni.OcijeniPoglavlje("Vrste multimedijalnih sistema", 8);
  1868.         multimedijalni.OcijeniPoglavlje("Teorija multimedije", 9);
  1869.         multimedijalni.OcijeniPoglavlje("Zakljucak", 7);
  1870.         multimedijalni.OcijeniPoglavlje("Naziv poglavlja ne postoji", 8);
  1871.     }
  1872.     catch (exception& err) {
  1873.         cout << "Greska -> " << err.what() << endl;
  1874.     }
  1875.     cout << multimedijalni;
  1876.  
  1877.     //  /*funkcija DodajZavrsniRad ima zadatak da odredjenom Mentoru dodijeli mentorstvo na zavrsnom radu. zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
  1878.     //  sprijeciti dodavanje zavrsnih radova sa istom temom*/
  1879.     //  //parametri:brojIndeksa, zavrsniRad
  1880.     //  if (mentori[0]->DodajZavrsniRad("IB130011", multimedijalni))
  1881.     //      cout << "Zavrsni rad uspjesno dodat!" << endl;
  1882.     //  if (mentori[0]->DodajZavrsniRad("IB120051", podrsa_operaterima))
  1883.     //      cout << "Zavrsni rad uspjesno dodat!" << endl;
  1884.     //  if (!mentori[0]->DodajZavrsniRad("IB120056", podrsa_operaterima))//dupliranje rada
  1885.     //      cout << "Zavrsni rad nije dodat!" << endl;
  1886.     //  if (!mentori[0]->DodajZavrsniRad("IB120051", kriptografija)) //studentu vec dodijeljen rad
  1887.     //      cout << "Zavrsni rad nije dodat!" << endl;
  1888.     //  if (mentori[1]->DodajZavrsniRad("IB140102", analiza_sigurnosti))
  1889.     //      cout << "Zavrsni rad uspjesno dodat!" << endl;
  1890.     //  if (mentori[2]->DodajZavrsniRad("IB140002", kriptografija))
  1891.     //      cout << "Zavrsni rad uspjesno dodat!" << endl;
  1892.     //
  1893.     //  /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva definisanje
  1894.     //  datuma odbrane. odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio i pri tom su zadovoljeni sljedeci uslovi:
  1895.     //      1. zavrsni rad ima broj poglavlja veci od minimalnog
  1896.     //      2. svako poglavlje ima broj karaktera veci od minimalnog
  1897.     //      3. svako poglavlje je prihvaceno/odobreno
  1898.     //  ukoliko su zadovoljeni prethodni kriteriji, izracunava se konacna ocjena rada (prosjek ocjena svih poglavlja), postavlja datum odbrane rada i vraca pokazivac na rad kome je zakazan odbrana.
  1899.     //  u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija nije zadovoljen, funkcija vraca nullptr.
  1900.     //*/
  1901.     //
  1902.     ////parametri:brojIndeksa, datumOdbrane
  1903.     //  ZavrsniRad* zr1 = mentori[0]->ZakaziOdbranuRada("IB130011", "25.09.2018");
  1904.     //  if (zr1 != nullptr)
  1905.     //      cout << *zr1 << endl;
  1906.     //
  1907.     //  zr1 = mentori[0]->ZakaziOdbranuRada("IB130111", "25.09.2018");//student sa brojem indeksa IB130111 jos uvijek nije prijavio rad
  1908.     //  if (zr1 != nullptr)
  1909.     //      cout << *zr1 << endl;
  1910.     //
  1911.         //ispisuje sve podatke o Mentoru i njegovim mentorstvima
  1912.         mentori[0]->Info();
  1913.    
  1914.         for (int i = 0; i < max; i++) {
  1915.             delete mentori[i];
  1916.             mentori[i] = nullptr;
  1917.         }
  1918.     system("pause>0");
  1919.     return 0;
  1920. }
  1921.  
  1922. ---------------------------------------------------------------------------------------------------------------------------------------
  1923.  
  1924. #include<iostream>
  1925. #include<string>
  1926. #include<vector>
  1927. #include <exception>
  1928. using namespace std;
  1929.  
  1930. /****************************************************************************
  1931. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  1932. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ĆE BITI OZNACENO KAO "RE"
  1933. 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEČILO GUBLJENJE URAĐENOG ZADATKA
  1934. 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.
  1935. 5. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNAČENO.
  1936. ****************************************************************************/
  1937. const char* crt = "\n-------------------------------------------\n";
  1938. const char* nedozvoljena_operacija = "Nedozvoljena operacija";
  1939. const char* not_set = "NOT_SET";
  1940. const int min_polgavlja = 3;
  1941. const int min_karaktera_po_poglavlju = 30;
  1942. char * AlocirajNizKaraktera(const char * sadrzaj) {
  1943.     if (sadrzaj == nullptr)
  1944.         return nullptr;
  1945.     int vel = strlen(sadrzaj) + 1;
  1946.     char * temp = new char[vel];
  1947.     strcpy_s(temp, vel, sadrzaj);
  1948.     return temp;
  1949. }
  1950.  
  1951. template<class T1, class T2>
  1952. class Kolekcija {
  1953.     T1 * _elementi1;
  1954.     T2 * _elementi2;
  1955.     int _trenutno;
  1956. public:
  1957.     Kolekcija() :_trenutno(0), _elementi1(nullptr), _elementi2(nullptr) { }
  1958.     Kolekcija(const Kolekcija & obj)
  1959.     {
  1960.         _trenutno = obj._trenutno;
  1961.         _elementi1 = new T1[_trenutno];
  1962.         _elementi2 = new T2[_trenutno];
  1963.         for (int i = 0; i < _trenutno; i++)
  1964.         {
  1965.             _elementi1[i] = obj._elementi1[i];
  1966.             _elementi2[i] = obj._elementi2[i];
  1967.         }
  1968.     }
  1969.     Kolekcija & operator=(const Kolekcija & obj)
  1970.     {
  1971.         if (this != &obj)
  1972.         {
  1973.             if (_trenutno != 0)
  1974.             {
  1975.                 delete[]_elementi1;
  1976.                 delete[]_elementi2;
  1977.             }
  1978.             _trenutno = obj._trenutno;
  1979.             _elementi1 = new T1[_trenutno];
  1980.             _elementi2 = new T2[_trenutno];
  1981.             for (int i = 0; i < _trenutno; i++)
  1982.             {
  1983.                 _elementi1[i] = obj._elementi1[i];
  1984.                 _elementi2[i] = obj._elementi2[i];
  1985.             }
  1986.         }
  1987.         return *this;
  1988.     }
  1989.     ~Kolekcija() {
  1990.         delete[] _elementi1; _elementi1 = nullptr;
  1991.         delete[] _elementi2; _elementi2 = nullptr;
  1992.     }
  1993. T1 * getElementi1Pok() { return _elementi1; }
  1994.     T2 * getElementi2Pok() { return _elementi2; }
  1995.     T1 & getElement1(int lokacija) { return _elementi1[lokacija]; }
  1996.     T2 & getElement2(int lokacija) { return _elementi2[lokacija]; }
  1997.     int getTrenutno() { return _trenutno; }
  1998.  
  1999.     friend ostream & operator<<(ostream & COUT, Kolekcija<T1, T2> & obj) {
  2000.         for (size_t i = 0; i < obj._trenutno; i++)
  2001.             COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
  2002.         return COUT;
  2003.     }
  2004.     void AddElement(T1 el1, T2 el2)
  2005.     {
  2006.         T1 *temp1 = new T1[_trenutno + 1];
  2007.         T2 *temp2 = new T2[_trenutno + 1];
  2008.         for (int i = 0; i < _trenutno; i++)
  2009.         {
  2010.             temp1[i] = _elementi1[i];
  2011.             temp2[i] = _elementi2[i];
  2012.         }
  2013.         delete[]_elementi1;
  2014.         delete[]_elementi2;
  2015.         temp1[_trenutno] = el1;
  2016.         temp2[_trenutno] = el2;
  2017.         _elementi1 = temp1;
  2018.         _elementi2 = temp2;
  2019.         temp1 = nullptr;
  2020.         temp2 = nullptr;
  2021.         _trenutno++;
  2022.     }
  2023. };
  2024. class Poglavlje {
  2025.     char * _naslov;
  2026.     char * _sadrzaj;
  2027.     bool _prihvaceno;
  2028.     int _ocjena;//da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6 - 10
  2029. public:
  2030.     Poglavlje(const char * naslov = nullptr, const char * sadrzaj = nullptr)
  2031.         :_ocjena(0), _prihvaceno(false) {
  2032.         _naslov = AlocirajNizKaraktera(naslov);
  2033.         _sadrzaj = AlocirajNizKaraktera(sadrzaj);
  2034.     }
  2035.     Poglavlje(const Poglavlje& obj)
  2036.     {
  2037.         _naslov = AlocirajNizKaraktera(obj._naslov);
  2038.         _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
  2039.         _prihvaceno = obj._prihvaceno;
  2040.         _ocjena = obj._ocjena;
  2041.     }
  2042.     Poglavlje& operator=(const Poglavlje& obj)
  2043.     {
  2044.         if (this != &obj)
  2045.         {
  2046.             if (_naslov != nullptr)
  2047.                 delete[]_naslov;
  2048.             _naslov = AlocirajNizKaraktera(obj._naslov);
  2049.             if (_sadrzaj != nullptr)
  2050.                 delete[]_sadrzaj;
  2051.             _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
  2052.             _prihvaceno = obj._prihvaceno;
  2053.             _ocjena = obj._ocjena;
  2054.         }
  2055.         return *this;
  2056.     }
  2057.     ~Poglavlje() {
  2058.         delete[] _naslov; _naslov = nullptr;
  2059.         delete[] _sadrzaj; _sadrzaj = nullptr;
  2060.     }
  2061.     friend ostream & operator<<(ostream & COUT, Poglavlje & obj) {
  2062.         if (obj._naslov == nullptr || obj._sadrzaj == nullptr)
  2063.             return COUT;
  2064.         COUT << endl << obj._naslov << endl << obj._sadrzaj << endl;
  2065.         if (obj._prihvaceno)
  2066.             COUT << "Ocjena: " << obj._ocjena << endl;;
  2067.         return COUT;
  2068.     }
  2069.     char * GetNaslov() { return _naslov; }
  2070.     char * GetSadrzaj() { return _sadrzaj; }
  2071.     bool GetPrihvaceno() { return _prihvaceno; }
  2072.     int GetOcjena() { return _ocjena; }
  2073.  
  2074.     void OcijeniPoglavlje(int ocjena) {
  2075.         _ocjena = ocjena;
  2076.         if (_ocjena > 5 && ocjena <= 10)
  2077.             _prihvaceno = true;
  2078.     }
  2079. };
  2080.  
  2081. class ZavrsniRad {
  2082.     char* _tema;
  2083.     vector<Poglavlje> _poglavljaRada;
  2084.     string _datumOdbrane;
  2085.     float _konacnaOcjena; //prosjek ocjena svih poglavlja u zavrsnom radu koja se izracunava u momentu zakazivanja odbrane
  2086.     int Postoji(string naziv)
  2087.     {
  2088.         for (int i = 0; i < _poglavljaRada.size(); i++)
  2089.         {
  2090.             if (strcmp(naziv.c_str(), _poglavljaRada[i].GetNaslov()) == 0)
  2091.                 return i;
  2092.         }
  2093.         return -1;
  2094.     }
  2095.    
  2096. public:
  2097.     ZavrsniRad(const char * nazivTeme = nullptr) : _konacnaOcjena(0), _datumOdbrane(not_set) {
  2098.         _tema = AlocirajNizKaraktera(nazivTeme);
  2099.     }
  2100.  
  2101.     ZavrsniRad(const ZavrsniRad& org) : _poglavljaRada(org._poglavljaRada), _konacnaOcjena(org._konacnaOcjena), _datumOdbrane(org._datumOdbrane) {
  2102.         _tema = AlocirajNizKaraktera(org._tema);
  2103.     }
  2104.  
  2105.     ~ZavrsniRad() {
  2106.         delete[] _tema; _tema = nullptr;
  2107.     }
  2108.     char* GetNazivTeme()const { return _tema; }
  2109.     vector<Poglavlje>& GetPoglavlja() { return _poglavljaRada; };
  2110.     string GetDatumOdbrane()const { return _datumOdbrane; }
  2111.     float GetOcjena() { return _konacnaOcjena; }
  2112.     void SetDatumOdbrane(string datumOdbrane) { _datumOdbrane = datumOdbrane; }
  2113.     float GetProsjek()
  2114.     {
  2115.         float prosjek = 0;
  2116.         for (int i = 0; i < _poglavljaRada.size(); i++)
  2117.         {
  2118.             prosjek += _poglavljaRada[i].GetOcjena();
  2119.         }
  2120.         return prosjek / _poglavljaRada.size();
  2121.     }
  2122.     void SetKonacnaOcjena(float prosjek)
  2123.     {
  2124.         _konacnaOcjena = prosjek;
  2125.     }
  2126.     ZavrsniRad& operator=(const ZavrsniRad& org) {
  2127.         if (this != &org) {
  2128.             delete[] _tema;
  2129.             _tema = AlocirajNizKaraktera(org._tema);
  2130.             _datumOdbrane = org._datumOdbrane;
  2131.             _poglavljaRada = org._poglavljaRada;
  2132.             _konacnaOcjena = org._konacnaOcjena;
  2133.         }
  2134.         return *this;
  2135.     }
  2136.  
  2137.     friend ostream& operator<<(ostream& COUT, ZavrsniRad& obj) {
  2138.         COUT << "Tema rada: " << obj._tema << endl;
  2139.         COUT << "Sadrzaj: " << endl;
  2140.         for (size_t i = 0; i < obj._poglavljaRada.size(); i++)
  2141.             COUT << obj._poglavljaRada[i] << endl;
  2142.         COUT << "Datum odbrane rada: " << obj._datumOdbrane << endl << " Ocjena: " << obj._konacnaOcjena << endl;
  2143.         return COUT;
  2144.     }
  2145.     void DodajPoglavlje(string nazivPoglavlja, string sadrzajPoglavlja)
  2146.     {
  2147.         if (Postoji(nazivPoglavlja) > -1)
  2148.         {
  2149.             string s = _poglavljaRada[Postoji(nazivPoglavlja)].GetSadrzaj();
  2150.             s += " " + sadrzajPoglavlja;
  2151.         }
  2152.         _poglavljaRada.push_back(Poglavlje(nazivPoglavlja.c_str(), sadrzajPoglavlja.c_str()));
  2153.     }
  2154.     void OcijeniPoglavlje(string nazivPoglavlja, int ocjena)
  2155.     {
  2156.         if (ocjena < 6 || ocjena>10)
  2157.             throw exception(nedozvoljena_operacija);
  2158.         if (Postoji(nazivPoglavlja) < 0)
  2159.             throw exception("Ne postoji poglavlje\n");
  2160.         _poglavljaRada[Postoji(nazivPoglavlja)].OcijeniPoglavlje(ocjena);
  2161.     }
  2162.     bool validno()
  2163.     {
  2164.         for (int i = 0; i < _poglavljaRada.size(); i++)
  2165.         {
  2166.             int v = strlen(_poglavljaRada[i].GetSadrzaj());
  2167.             if (v < min_karaktera_po_poglavlju || !_poglavljaRada[i].GetPrihvaceno())
  2168.                 return false;
  2169.         }
  2170.         return true;
  2171.     }
  2172. };
  2173.  
  2174. class Mentor {
  2175.     string _imePrezime;
  2176.     //Parametar string predstavlja broj indeksa studenta koji prijavljuje zavrsni rad kod odredjenog Mentora
  2177.     Kolekcija<string, ZavrsniRad> _teme;
  2178.     bool istatema(string tema)
  2179.     {
  2180.         for (int i = 0; i < _teme.getTrenutno(); i++)
  2181.         {
  2182.             if (strcmp(_teme.getElement2(i).GetNazivTeme(), tema.c_str()) == 0)
  2183.                 return true;
  2184.         }
  2185.         return false;
  2186.     }
  2187. public:
  2188.     Mentor(string imePrezime) :_imePrezime(imePrezime) {}
  2189.     Mentor(const Mentor& obj)
  2190.     {
  2191.         _imePrezime = obj._imePrezime;
  2192.         _teme = obj._teme;
  2193.     }
  2194.     Mentor& operator=(const Mentor& obj)
  2195.     {
  2196.         if (this != &obj)
  2197.         {
  2198.             _imePrezime = obj._imePrezime;
  2199.             _teme = obj._teme;
  2200.         }
  2201.         return *this;
  2202.     }
  2203.     Kolekcija<string, ZavrsniRad>& GetTeme() { return _teme; };
  2204.     string GetImePrezime() { return _imePrezime; }
  2205.     void Info() {
  2206.         cout << _imePrezime << endl << _teme << endl;
  2207.     }
  2208.     bool DodajZavrsniRad(string brojIndeksa, ZavrsniRad zavrsniRad)
  2209.     {
  2210.         if (istatema(zavrsniRad.GetNazivTeme()) == true)
  2211.             return false;
  2212.         for (int i = 0; i < _teme.getTrenutno(); i++)
  2213.         {
  2214.             if (_teme.getElement1(i) != brojIndeksa)
  2215.                 return false;
  2216.         }
  2217.         _teme.AddElement(brojIndeksa, zavrsniRad);
  2218.         return true;
  2219.     }
  2220.     ZavrsniRad*ZakaziOdbranuRada(string brojIndeksa,string datumOdbrane)
  2221.     {
  2222.         for (int i = 0; i < _teme.getTrenutno(); i++)
  2223.         {
  2224.             if (_teme.getElement2(i).GetPoglavlja().size() > min_polgavlja&&_teme.getElement2(i).validno())
  2225.             {
  2226.                 _teme.getElement2(i).SetDatumOdbrane(datumOdbrane);
  2227.                 _teme.getElement2(i).SetKonacnaOcjena(_teme.getElement2(i).GetProsjek());
  2228.                 return &_teme.getElement2(i);
  2229.             }
  2230.         }
  2231.         return nullptr;
  2232.     }
  2233. };
  2234. int main() {
  2235.     cout << crt << "UPLOAD RADA OBAVEZNO IZVRSITI U ODGOVARAJUCI FOLDER NA FTP SERVERU" << endl;
  2236.     cout << "U slucaju da je Upload folder prazan pritisnite tipku F5" << crt;
  2237.  
  2238.     const int max = 4;
  2239.     Mentor* mentori[max];
  2240.  
  2241.     mentori[0] = new Mentor("Armina Hubana");
  2242.     mentori[1] = new Mentor("Zanin Vejzovic");
  2243.     mentori[2] = new Mentor("Jasmin Azemovic");
  2244.     mentori[3] = new Mentor("Emina Junuz");
  2245.     //parametri: naziv zavrsnog rada
  2246.     ZavrsniRad multimedijalni("Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
  2247.     ZavrsniRad podrsa_operaterima("Sistem za podršku rada kablovskog operatera");
  2248.     ZavrsniRad analiza_sigurnosti("Prakticna analiza sigurnosti bežičnih računarskih mreža");
  2249.     ZavrsniRad kriptografija("Primjena teorije informacija u procesu generisanja kriptografskih ključeva");
  2250.  
  2251.     /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
  2252.     //parametri: nazivPoglavlja, sadrzajPoglavlja
  2253.     multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
  2254.     multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
  2255.     multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
  2256.     multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistema, a neke od najznacajnijih su ...");
  2257.     multimedijalni.DodajPoglavlje("Teorija multimedije", "Sadrzaj koji bi trebao stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130011");
  2258.     multimedijalni.DodajPoglavlje("Zakljucak", "U ovom radu su predstavljeni osnovni koncepti i prakticna primjena...");
  2259. //
  2260.     try {
  2261.         /*funkcija OcijeniPoglavlje, na osnovu naziva poglavlja, dodjeljuje ocjenu poglavlju te ukoliko je ocjena pozitivna (6 - 10) onda poglavlje oznacava prihvacenim. U slucaju da ocjena nije validna ili poglavlje ne postoji, funkcija baca izuzetak sa odgovarajucom porukom*/
  2262.         //parametri:nazivPoglavlja, ocjena
  2263.  
  2264.         multimedijalni.OcijeniPoglavlje("Uvod", 8);
  2265.         multimedijalni.OcijeniPoglavlje("Vrste multimedijalnih sistema", 8);
  2266.         multimedijalni.OcijeniPoglavlje("Teorija multimedije", 9);
  2267.         multimedijalni.OcijeniPoglavlje("Zakljucak", 7);
  2268.         multimedijalni.OcijeniPoglavlje("Naziv poglavlja ne postoji", 8);
  2269.     }
  2270.     catch (exception & err) {
  2271.         cout << "Greska -> " << err.what() << endl;
  2272.     }
  2273.  
  2274.     /*funkcija DodajZavrsniRad ima zadatak da odredjenom Mentoru dodijeli mentorstvo na zavrsnom radu. zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
  2275.     sprijeciti dodavanje zavrsnih radova sa istom temom*/
  2276.     //parametri:brojIndeksa, zavrsniRad
  2277.     if (mentori[0]->DodajZavrsniRad("IB130011", multimedijalni))
  2278.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  2279.     if (mentori[0]->DodajZavrsniRad("IB120051", podrsa_operaterima))
  2280.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  2281.     if (!mentori[0]->DodajZavrsniRad("IB120056", podrsa_operaterima))//dupliranje rada
  2282.         cout << "Zavrsni rad nije dodat!" << endl;
  2283.     if (!mentori[0]->DodajZavrsniRad("IB120051", kriptografija)) //studentu vec dodijeljen rad
  2284.         cout << "Zavrsni rad nije dodat!" << endl;
  2285.     if (mentori[1]->DodajZavrsniRad("IB140102", analiza_sigurnosti))
  2286.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  2287.     if (mentori[2]->DodajZavrsniRad("IB140002", kriptografija))
  2288.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  2289.  
  2290.     /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva definisanje
  2291.     datuma odbrane. odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio i pri tom su zadovoljeni sljedeci uslovi:
  2292.         1. zavrsni rad ima broj poglavlja veci od minimalnog
  2293.         2. svako poglavlje ima broj karaktera veci od minimalnog
  2294.         3. svako poglavlje je prihvaceno/odobreno
  2295.     ukoliko su zadovoljeni prethodni kriteriji, izracunava se konacna ocjena rada (prosjek ocjena svih poglavlja), postavlja datum odbrane rada i vraca pokazivac na rad kome je zakazan odbrana.
  2296.     u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija nije zadovoljen, funkcija vraca nullptr.
  2297. */
  2298.  
  2299. //parametri:brojIndeksa, datumOdbrane
  2300.     ZavrsniRad * zr1 = mentori[0]->ZakaziOdbranuRada("IB130011", "25.09.2018");
  2301.     if (zr1 != nullptr)
  2302.         cout << *zr1 << endl;
  2303.  
  2304.     zr1 = mentori[0]->ZakaziOdbranuRada("IB130111", "25.09.2018");//student sa brojem indeksa IB130111 jos uvijek nije prijavio rad
  2305.     if (zr1 != nullptr)
  2306.         cout << *zr1 << endl;
  2307.  
  2308.     //ispisuje sve podatke o Mentoru i njegovim mentorstvima
  2309.     mentori[0]->Info();
  2310.  
  2311.     for (int i = 0; i < max; i++) {
  2312.         delete mentori[i];
  2313.         mentori[i] = nullptr;
  2314.     }
  2315.     system("pause>0");
  2316.     return 0;
  2317. }
  2318.  
  2319. ---------------------------------------------------------------------------------------------------------------------------------------
  2320.  
  2321. #include<iostream>
  2322. #include<vector>
  2323. #include<string>
  2324.  
  2325. using namespace std;
  2326.  
  2327. /****************************************************************************
  2328. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  2329. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ÆE BITI OZNACENO KAO "RE"
  2330. 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEÈILO GUBLJENJE URAÐENOG ZADATKA
  2331. 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.
  2332. 5. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNAÈENO.
  2333. ****************************************************************************/
  2334. const char* crt = "\n-------------------------------------------\n";
  2335. const char* nedozvoljena_operacija = "Nedozvoljena operacija";
  2336. const char* not_set = "NOT_SET";
  2337. const int min_polgavlja = 3;
  2338. const int min_karaktera_po_poglavlju = 30;
  2339.  
  2340. char* AlocirajNizKaraktera(const char* sadrzaj) {
  2341.     if (sadrzaj == nullptr)
  2342.         return nullptr;
  2343.     int vel = strlen(sadrzaj) + 1;
  2344.     char* temp = new char[vel];
  2345.     strcpy_s(temp, vel, sadrzaj);
  2346.     return temp;
  2347. }
  2348.  
  2349. template<class T1, class T2>
  2350. class Kolekcija {
  2351.     T1* _elementi1;
  2352.     T2* _elementi2;
  2353.     int* _trenutno;
  2354. public:
  2355.     Kolekcija() :_trenutno(nullptr), _elementi1(nullptr), _elementi2(nullptr) {
  2356.         _trenutno = new int(0);
  2357.     }
  2358.  
  2359.  
  2360.     Kolekcija(const Kolekcija& obj)
  2361.     {
  2362.         _trenutno = new int(*obj._trenutno);
  2363.         _elementi1 = new T1[*_trenutno];
  2364.         _elementi2 = new T2[*_trenutno];
  2365.         for (size_t i = 0; i < *_trenutno; i++)
  2366.         {
  2367.             _elementi1[i] = obj._elementi1[i];
  2368.             _elementi2[i] = obj._elementi2[i];
  2369.         }
  2370.     }
  2371.  
  2372.     Kolekcija& operator =(const Kolekcija& obj)
  2373.     {
  2374.         if (this!= &obj)
  2375.         {
  2376.             delete[] _elementi1;
  2377.             delete[] _elementi2;
  2378.             delete _trenutno;
  2379.             _trenutno = new int(*obj._trenutno);
  2380.             _elementi1 = new T1[*_trenutno];
  2381.             _elementi2 = new T2[*_trenutno];
  2382.             for (size_t i = 0; i < *_trenutno; i++)
  2383.             {
  2384.                 _elementi1[i] = obj._elementi1[i];
  2385.                 _elementi2[i] = obj._elementi2[i];
  2386.             }
  2387.         }
  2388.         return *this;
  2389.     }
  2390.  
  2391.     void AddElement(T1& el1, T2& el2)
  2392.     {
  2393.         T1* temp1 = new T1[*_trenutno + 1];
  2394.         T2* temp2 = new T2[*_trenutno + 1] ;
  2395.         for (size_t i = 0; i < *_trenutno; i++)
  2396.         {
  2397.             temp1[i] = _elementi1[i];
  2398.             temp2[i] = _elementi2[i];
  2399.         }
  2400.         delete[] _elementi1;
  2401.         delete[] _elementi2;
  2402.         _elementi1 = temp1;
  2403.         _elementi2 = temp2;
  2404.         temp1 = nullptr;
  2405.         temp2 = nullptr;
  2406.         _elementi1[*_trenutno] = el1;
  2407.         _elementi2[*_trenutno] = el2;
  2408.         (*_trenutno)++;
  2409.     }
  2410.  
  2411.     ~Kolekcija() {
  2412.         delete[] _elementi1;
  2413.         _elementi1 = nullptr;
  2414.         delete[] _elementi2;
  2415.         _elementi2 = nullptr;
  2416.         delete _trenutno;
  2417.         _trenutno = nullptr;
  2418.     }
  2419.     T1* getElementi1Pok() { return _elementi1; }
  2420.     T2* getElementi2Pok() { return _elementi2; }
  2421.     T1& getElement1(int lokacija) { return _elementi1[lokacija]; }
  2422.     T2& getElement2(int lokacija) { return _elementi2[lokacija]; }
  2423.     int getTrenutno() { return *_trenutno; }
  2424.  
  2425.     friend ostream& operator<<(ostream& COUT, Kolekcija<T1, T2>& obj) {
  2426.         for (size_t i = 0; i < *obj._trenutno; i++)
  2427.             COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
  2428.         return COUT;
  2429.     }
  2430. };
  2431. class Poglavlje {
  2432.     char* _naslov;
  2433.     char* _sadrzaj;
  2434.     bool _prihvaceno;
  2435.     int _ocjena;//da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6 - 10
  2436. public:
  2437.     Poglavlje(const char* naslov = nullptr, const char* sadrzaj = nullptr)
  2438.         :_ocjena(0), _prihvaceno(false) {
  2439.         _naslov = AlocirajNizKaraktera (naslov);
  2440.         _sadrzaj = AlocirajNizKaraktera(sadrzaj);
  2441.     }
  2442.  
  2443.     Poglavlje(const Poglavlje& obj)
  2444.     {
  2445.         _naslov = AlocirajNizKaraktera(obj._naslov);
  2446.         _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
  2447.         _prihvaceno = obj._prihvaceno;
  2448.         _ocjena = obj._ocjena;
  2449.     }
  2450.  
  2451.     Poglavlje& operator =(const Poglavlje& obj)
  2452.     {
  2453.         if (this!=&obj)
  2454.         {
  2455.             delete[] _naslov;
  2456.             delete[] _sadrzaj;
  2457.             _naslov = AlocirajNizKaraktera(obj._naslov);
  2458.             _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
  2459.             _prihvaceno = obj._prihvaceno;
  2460.             _ocjena = obj._ocjena;
  2461.         }
  2462.         return *this;
  2463.     }
  2464.  
  2465.     ~Poglavlje() {
  2466.         delete[] _naslov; _naslov = nullptr;
  2467.         delete[] _sadrzaj; _sadrzaj = nullptr;
  2468.     }
  2469.     friend ostream& operator<<(ostream& COUT, Poglavlje& obj) {
  2470.         if (obj._naslov == nullptr || obj._sadrzaj == nullptr)
  2471.             return COUT;
  2472.         COUT << endl << obj._naslov << endl << obj._sadrzaj << endl;
  2473.         if (obj._prihvaceno)
  2474.             COUT << "Ocjena: " << obj._ocjena << endl;;
  2475.         return COUT;
  2476.     }
  2477.     char* GetNaslov() { return _naslov; }
  2478.     char* GetSadrzaj() { return _sadrzaj; }
  2479.     bool GetPrihvaceno() { return _prihvaceno; }
  2480.     int GetOcjena() { return _ocjena; }
  2481.  
  2482.     void DodajNoviSadrzaj(const char* noviSadrzaj)
  2483.     {
  2484.         int vel = strlen(_sadrzaj) + strlen(noviSadrzaj) + 2;
  2485.         char* temp = new char[vel];
  2486.         strcpy_s(temp, vel, _sadrzaj);
  2487.         strcat_s(temp, vel, " ");
  2488.         strcat_s(temp, vel, noviSadrzaj);
  2489.         delete[] _sadrzaj;
  2490.         _sadrzaj = temp;
  2491.         temp = nullptr;
  2492.     }
  2493.  
  2494.     void OcijeniPoglavlje(int ocjena) {
  2495.         _ocjena = ocjena;
  2496.         if (_ocjena > 5 && ocjena <= 10)
  2497.             _prihvaceno = true;
  2498.     }
  2499. };
  2500.  
  2501. class ZavrsniRad {
  2502.     char* _tema;
  2503.     vector<Poglavlje> _poglavljaRada;
  2504.     string _datumOdbrane;
  2505.     float _konacnaOcjena; //prosjek ocjena svih poglavlja u zavrsnom radu koja se izracunava u momentu zakazivanja odbrane
  2506. public:
  2507.     ZavrsniRad(const char* nazivTeme = nullptr) : _konacnaOcjena(0), _datumOdbrane(not_set) {
  2508.         _tema = AlocirajNizKaraktera(nazivTeme);
  2509.     }
  2510.  
  2511.     ZavrsniRad(const ZavrsniRad& org) : _poglavljaRada(org._poglavljaRada), _konacnaOcjena(org._konacnaOcjena), _datumOdbrane(org._datumOdbrane) {
  2512.         _tema = AlocirajNizKaraktera(org._tema);
  2513.     }
  2514.  
  2515.     ~ZavrsniRad() {
  2516.         delete[] _tema; _tema = nullptr;
  2517.     }
  2518.     char* GetNazivTeme()const { return _tema; }
  2519.     vector<Poglavlje>& GetPoglavlja() { return _poglavljaRada; };
  2520.     string GetDatumOdbrane()const { return _datumOdbrane; }
  2521.     float GetOcjena() { return _konacnaOcjena; }
  2522.     void SetDatumOdbrane(string datumOdbrane) { _datumOdbrane = datumOdbrane; }
  2523.  
  2524.     ZavrsniRad& operator=(const ZavrsniRad& org) {
  2525.         if (this != &org) {
  2526.             delete[] _tema;
  2527.             _tema = AlocirajNizKaraktera(org._tema);
  2528.             _datumOdbrane = org._datumOdbrane;
  2529.             _poglavljaRada = org._poglavljaRada;
  2530.             _konacnaOcjena = org._konacnaOcjena;
  2531.         }
  2532.         return *this;
  2533.     }
  2534.  
  2535.     /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj.
  2536.     ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i
  2537.     pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
  2538.     //parametri: nazivPoglavlja, sadrzajPoglavlja
  2539.  
  2540.     void DodajPoglavlje(const char* nazivPoglavlja, const char* sadrzajPoglavlja)
  2541.     {
  2542.         for (size_t i = 0; i < _poglavljaRada.size(); i++)
  2543.         {
  2544.             if (strcmp(nazivPoglavlja,_poglavljaRada[i].GetNaslov())==0)
  2545.             {
  2546.                 _poglavljaRada[i].DodajNoviSadrzaj(sadrzajPoglavlja);
  2547.                 return;
  2548.             }
  2549.         }
  2550.         _poglavljaRada.push_back(Poglavlje(nazivPoglavlja, sadrzajPoglavlja));
  2551.     }
  2552.  
  2553.     /*funkcija OcijeniPoglavlje, na osnovu naziva poglavlja,
  2554.     dodjeljuje ocjenu poglavlju te ukoliko je ocjena pozitivna (6 - 10) onda poglavlje oznacava prihvacenim.
  2555.     U slucaju da ocjena nije validna ili poglavlje ne postoji, funkcija baca izuzetak sa odgovarajucom porukom*/
  2556.         //parametri:nazivPoglavlja, ocjena
  2557.  
  2558.     void OcijeniPoglavlje(const char* nazivPoglavlja, int ocjena)
  2559.     {
  2560.         if (ocjena < 6 || ocjena>10)
  2561.             throw(exception("nije validna ocjena"));
  2562.         for (size_t i = 0; i < _poglavljaRada.size(); i++)
  2563.         {
  2564.             if (strcmp(nazivPoglavlja, _poglavljaRada[i].GetNaslov()) == 0)
  2565.             {
  2566.                 _poglavljaRada[i].OcijeniPoglavlje(ocjena);
  2567.                 return;
  2568.             }
  2569.         }
  2570.         throw(exception("nismo pronasli poglavlje"));
  2571.     }
  2572.  
  2573.     friend ostream& operator<<(ostream& COUT, ZavrsniRad& obj) {
  2574.         COUT << "Tema rada: " << obj._tema << endl;
  2575.         COUT << "Sadrzaj: " << endl;
  2576.         for (size_t i = 0; i < obj._poglavljaRada.size(); i++)
  2577.             COUT << obj._poglavljaRada[i] << endl;
  2578.         COUT << "Datum odbrane rada: " << obj._datumOdbrane << endl << " Ocjena: " << obj._konacnaOcjena << endl;
  2579.         return COUT;
  2580.     }
  2581. };
  2582.  
  2583. class Mentor {
  2584.     string _imePrezime;
  2585.     //Parametar string predstavlja broj indeksa studenta koji prijavljuje zavrsni rad kod odredjenog Mentora
  2586.     Kolekcija<string, ZavrsniRad> _teme;
  2587. public:
  2588.     Mentor(string imePrezime) :_imePrezime(imePrezime) {}
  2589.     Kolekcija<string, ZavrsniRad>& GetTeme() { return _teme; };
  2590.     string GetImePrezime() { return _imePrezime; }
  2591.  
  2592.     /*funkcija DodajZavrsniRad ima zadatak da odredjenom Mentoru dodijeli mentorstvo na zavrsnom radu.
  2593.     zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
  2594.     sprijeciti dodavanje zavrsnih radova sa istom temom*/
  2595.     //parametri:brojIndeksa, zavrsniRad
  2596.  
  2597.     bool DodajZavrsniRad(string brojIndeksa, ZavrsniRad zavrsniRad)
  2598.     {
  2599.         for (size_t i = 0; i < _teme.getTrenutno(); i++)
  2600.         {
  2601.             if (strcmp(zavrsniRad.GetNazivTeme(), _teme.getElement2(i).GetNazivTeme()) == 0)
  2602.                 return false;
  2603.         }
  2604.         _teme.AddElement(brojIndeksa, zavrsniRad);
  2605.         return true;
  2606.     }
  2607.  
  2608.     void Info() {
  2609.         cout << _imePrezime << endl << _teme << endl;
  2610.     }
  2611. };
  2612.  
  2613. int main() {
  2614.     cout << crt << "UPLOAD RADA OBAVEZNO IZVRSITI U ODGOVARAJUCI FOLDER NA FTP SERVERU" << endl;
  2615.     cout << "U slucaju da je Upload folder prazan pritisnite tipku F5" << crt;
  2616.  
  2617.     const int max = 4;
  2618.     Mentor* mentori[max];
  2619.  
  2620.     mentori[0] = new Mentor("Armina Hubana");
  2621.     mentori[1] = new Mentor("Zanin Vejzovic");
  2622.     mentori[2] = new Mentor("Jasmin Azemovic");
  2623.     mentori[3] = new Mentor("Emina Junuz");
  2624.     //parametri: naziv zavrsnog rada
  2625.     ZavrsniRad multimedijalni("Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
  2626.     ZavrsniRad podrsa_operaterima("Sistem za podršku rada kablovskog operatera");
  2627.     ZavrsniRad analiza_sigurnosti("Prakticna analiza sigurnosti bežiènih raèunarskih mreža");
  2628.     ZavrsniRad kriptografija("Primjena teorije informacija u procesu generisanja kriptografskih kljuèeva");
  2629.  
  2630.     /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
  2631.     //parametri: nazivPoglavlja, sadrzajPoglavlja
  2632.     multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
  2633.     multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
  2634.     multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
  2635.     multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistema, a neke od najznacajnijih su ...");
  2636.     multimedijalni.DodajPoglavlje("Teorija multimedije", "Sadrzaj koji bi trebao stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130011");
  2637.     multimedijalni.DodajPoglavlje("Zakljucak", "U ovom radu su predstavljeni osnovni koncepti i prakticna primjena...");
  2638.  
  2639.     try {
  2640.         /*funkcija OcijeniPoglavlje, na osnovu naziva poglavlja, dodjeljuje ocjenu poglavlju te ukoliko je ocjena pozitivna (6 - 10) onda poglavlje oznacava prihvacenim. U slucaju da ocjena nije validna ili poglavlje ne postoji, funkcija baca izuzetak sa odgovarajucom porukom*/
  2641.         //parametri:nazivPoglavlja, ocjena
  2642.  
  2643.         multimedijalni.OcijeniPoglavlje("Uvod", 8);
  2644.         multimedijalni.OcijeniPoglavlje("Vrste multimedijalnih sistema", 8);
  2645.         multimedijalni.OcijeniPoglavlje("Teorija multimedije", 9);
  2646.         multimedijalni.OcijeniPoglavlje("Zakljucak", 7);
  2647.     multimedijalni.OcijeniPoglavlje("Naziv poglavlja ne postoji", 8);
  2648.     }
  2649.     catch (exception& err) {
  2650.         cout << "Greska -> " << err.what() << endl;
  2651.     }
  2652.  
  2653.     /*funkcija DodajZavrsniRad ima zadatak da odredjenom Mentoru dodijeli mentorstvo na zavrsnom radu. zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
  2654.     sprijeciti dodavanje zavrsnih radova sa istom temom*/
  2655.     //parametri:brojIndeksa, zavrsniRad
  2656.     if (mentori[0]->DodajZavrsniRad("IB130011", multimedijalni))
  2657.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  2658.     if (mentori[0]->DodajZavrsniRad("IB120051", podrsa_operaterima))
  2659.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  2660.     if (!mentori[0]->DodajZavrsniRad("IB120056", podrsa_operaterima))//dupliranje rada
  2661.         cout << "Zavrsni rad nije dodat!" << endl;
  2662.     if (!mentori[0]->DodajZavrsniRad("IB120051", kriptografija)) //studentu vec dodijeljen rad
  2663.         cout << "Zavrsni rad nije dodat!" << endl;
  2664.     if (mentori[1]->DodajZavrsniRad("IB140102", analiza_sigurnosti))
  2665.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  2666.     if (mentori[2]->DodajZavrsniRad("IB140002", kriptografija))
  2667.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  2668.  
  2669. //  /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva definisanje
  2670. //  datuma odbrane. odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio i pri tom su zadovoljeni sljedeci uslovi:
  2671. //      1. zavrsni rad ima broj poglavlja veci od minimalnog
  2672. //      2. svako poglavlje ima broj karaktera veci od minimalnog
  2673. //      3. svako poglavlje je prihvaceno/odobreno
  2674. //  ukoliko su zadovoljeni prethodni kriteriji, izracunava se konacna ocjena rada (prosjek ocjena svih poglavlja), postavlja datum odbrane rada i vraca pokazivac na rad kome je zakazan odbrana.
  2675. //  u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija nije zadovoljen, funkcija vraca nullptr.
  2676. //*/
  2677. //
  2678. ////parametri:brojIndeksa, datumOdbrane
  2679. //  ZavrsniRad* zr1 = mentori[0]->ZakaziOdbranuRada("IB130011", "25.09.2018");
  2680. //  if (zr1 != nullptr)
  2681. //      cout << *zr1 << endl;
  2682. //
  2683. //  zr1 = mentori[0]->ZakaziOdbranuRada("IB130111", "25.09.2018");//student sa brojem indeksa IB130111 jos uvijek nije prijavio rad
  2684. //  if (zr1 != nullptr)
  2685. //      cout << *zr1 << endl;
  2686.  
  2687.     //ispisuje sve podatke o Mentoru i njegovim mentorstvima
  2688.     mentori[0]->Info();
  2689.  
  2690.     for (int i = 0; i < max; i++) {
  2691.         delete mentori[i];
  2692.         mentori[i] = nullptr;
  2693.     }
  2694.     system("pause>0");
  2695.     return 0;
  2696. }
  2697. ---------------------------------------------------------------------------------------------------------------------------------------
  2698.  
  2699. #include <iostream>
  2700. #include <string>
  2701. #include <vector>
  2702. #include <cstring>
  2703. #include <exception>
  2704.  
  2705. using namespace std;
  2706.  
  2707. const char* crt = "\n-------------------------------------------\n";
  2708. const char* nedozvoljena_operacija = "Nedozvoljena operacija";
  2709. const char* not_set = "NOT_SET";
  2710. const int min_polgavlja = 3;
  2711. const int min_karaktera_po_poglavlju = 30;
  2712.  
  2713. char* AlocirajNizKaraktera(const char* sadrzaj) {
  2714.     if (sadrzaj == nullptr)
  2715.         return nullptr;
  2716.     int vel = strlen(sadrzaj) + 1;
  2717.     char* temp = new char[vel];
  2718.     strcpy_s(temp, vel, sadrzaj);
  2719.     return temp;
  2720. }
  2721.  
  2722. template<class T1, class T2>
  2723. class Kolekcija {
  2724.     T1* _elementi1;
  2725.     T2* _elementi2;
  2726.     int _trenutno;
  2727. public:
  2728.     Kolekcija() : _trenutno(0), _elementi1(nullptr), _elementi2(nullptr) {
  2729.     }
  2730.     Kolekcija(const Kolekcija& obj)
  2731.     {
  2732.         _trenutno = obj._trenutno;
  2733.         _elementi1 = new T1[_trenutno];
  2734.         _elementi2 = new T2[_trenutno];
  2735.         for (size_t i = 0; i < _trenutno; i++)
  2736.         {
  2737.             _elementi1[i] = obj._elementi1[i];
  2738.             _elementi2[i] = obj._elementi2[i];
  2739.         }
  2740.     }
  2741.     Kolekcija& operator=(const Kolekcija& obj)
  2742.     {
  2743.         if (this != &obj)
  2744.         {
  2745.             delete[]_elementi1;
  2746.             delete[]_elementi2;
  2747.             _trenutno = obj._trenutno;
  2748.             _elementi1 = new T1[_trenutno];
  2749.             _elementi2 = new T2[_trenutno];
  2750.             for (size_t i = 0; i < _trenutno; i++)
  2751.             {
  2752.                 _elementi1[i] = obj._elementi1[i];
  2753.                 _elementi2[i] = obj._elementi2[i];
  2754.             }
  2755.         }
  2756.         return *this;
  2757.     }
  2758.     void AddElement(T1& el1, T2& el2)
  2759.     {
  2760.         T1* temp1 = new T1[_trenutno + 1];
  2761.         T2* temp2 = new T2[_trenutno + 1];
  2762.         for (size_t i = 0; i < _trenutno; i++)
  2763.         {
  2764.             temp1[i] = _elementi1[i];
  2765.             temp2[i] = _elementi2[i];
  2766.         }
  2767.         delete[]_elementi1;
  2768.         delete[]_elementi2;
  2769.         _elementi1 = temp1;
  2770.         _elementi2 = temp2;
  2771.         _elementi1[_trenutno] = el1;
  2772.         _elementi2[_trenutno] = el2;
  2773.         _trenutno++;
  2774.         temp1 = nullptr;
  2775.         temp2 = nullptr;
  2776.     }
  2777.     ~Kolekcija() {
  2778.         delete[] _elementi1; _elementi1 = nullptr;
  2779.         delete[] _elementi2; _elementi1 = nullptr;
  2780.     }
  2781.     T1* getElementi1Pok() { return _elementi1; }
  2782.     T2* getElementi2Pok() { return _elementi2; }
  2783.     T1& getElement1(int lokacija) { return _elementi1[lokacija]; }
  2784.     T2& getElement2(int lokacija) { return _elementi2[lokacija]; }
  2785.     int getTrenutno() { return _trenutno; }
  2786.  
  2787.     friend ostream& operator<<(ostream& COUT, Kolekcija<T1, T2>& obj) {
  2788.         for (size_t i = 0; i < obj._trenutno; i++)
  2789.             COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
  2790.         return COUT;
  2791.     }
  2792. };
  2793.  
  2794. class Poglavlje {
  2795.     char* _naslov;
  2796.     char* _sadrzaj;
  2797.     bool _prihvaceno;
  2798.     int _ocjena; // da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6 - 10
  2799. public:
  2800.     Poglavlje(const char* naslov = nullptr, const char* sadrzaj = nullptr)
  2801.         : _ocjena(0), _prihvaceno(false) {
  2802.         _naslov = AlocirajNizKaraktera(naslov);
  2803.         _sadrzaj = AlocirajNizKaraktera(sadrzaj);
  2804.     }
  2805.     Poglavlje(const Poglavlje& obj)
  2806.         : _prihvaceno(obj._prihvaceno), _ocjena(obj._ocjena) {
  2807.         _naslov = AlocirajNizKaraktera(obj._naslov);
  2808.         _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
  2809.     }
  2810.     Poglavlje& operator=(const Poglavlje& obj) {
  2811.         if (this != &obj) {
  2812.             delete[] _naslov;
  2813.             delete[] _sadrzaj;
  2814.             _naslov = AlocirajNizKaraktera(obj._naslov);
  2815.             _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
  2816.             _prihvaceno = obj._prihvaceno;
  2817.             _ocjena = obj._ocjena;
  2818.         }
  2819.         return *this;
  2820.     }
  2821.  
  2822.     void DodajSadrzaj(const char* noviSadrzaj) {
  2823.         int velicina = strlen(_sadrzaj) + strlen(noviSadrzaj) + 2;
  2824.         char* temp = new char[velicina];
  2825.         strcpy_s(temp, velicina, _sadrzaj);
  2826.         strcat_s(temp, velicina, " ");
  2827.         strcat_s(temp, velicina, noviSadrzaj);
  2828.         delete[] _sadrzaj;
  2829.         _sadrzaj = temp;
  2830.         temp = nullptr;
  2831.     }
  2832.  
  2833.     ~Poglavlje() {
  2834.         delete[] _naslov; _naslov = nullptr;
  2835.         delete[] _sadrzaj; _sadrzaj = nullptr;
  2836.     }
  2837.     friend ostream& operator<<(ostream& COUT, Poglavlje& obj) {
  2838.         if (obj._naslov == nullptr || obj._sadrzaj == nullptr)
  2839.             return COUT;
  2840.         COUT << endl << obj._naslov << endl << obj._sadrzaj << endl;
  2841.         if (obj._prihvaceno)
  2842.             COUT << "Ocjena: " << obj._ocjena << endl;;
  2843.         return COUT;
  2844.     }
  2845.     char* GetNaslov() { return _naslov; }
  2846.     char* GetSadrzaj() { return _sadrzaj; }
  2847.     bool GetPrihvaceno() { return _prihvaceno; }
  2848.     int GetOcjena() { return _ocjena; }
  2849.  
  2850.     void OcijeniPoglavlje(int ocjena) {
  2851.         _ocjena = ocjena;
  2852.         if (_ocjena >= 6 && _ocjena <= 10)
  2853.             _prihvaceno = true;
  2854.     }
  2855. };
  2856.  
  2857. class ZavrsniRad {
  2858.     char* _tema;
  2859.     vector<Poglavlje> _poglavljaRada;
  2860.     string _datumOdbrane;
  2861.     float _konacnaOcjena; // prosjek ocjena svih poglavlja u zavrsnom radu koja se izracunava u momentu zakazivanja odbrane
  2862. public:
  2863.     ZavrsniRad(const char* nazivTeme = nullptr)
  2864.         : _konacnaOcjena(0), _datumOdbrane(not_set) {
  2865.         _tema = AlocirajNizKaraktera(nazivTeme);
  2866.     }
  2867.  
  2868.     ZavrsniRad(const ZavrsniRad& org)
  2869.         : _poglavljaRada(org._poglavljaRada), _konacnaOcjena(org._konacnaOcjena), _datumOdbrane(org._datumOdbrane) {
  2870.         _tema = AlocirajNizKaraktera(org._tema);
  2871.     }
  2872.  
  2873.     ~ZavrsniRad() {
  2874.         delete[] _tema; _tema = nullptr;
  2875.     }
  2876.  
  2877.     char* GetNazivTeme() const { return _tema; }
  2878.     vector<Poglavlje>& GetPoglavlja() { return _poglavljaRada; };
  2879.     string GetDatumOdbrane() const { return _datumOdbrane; }
  2880.     float GetOcjena() { return _konacnaOcjena; }
  2881.     void SetDatumOdbrane(string datumOdbrane) { _datumOdbrane = datumOdbrane; }
  2882.  
  2883.     ZavrsniRad& operator=(const ZavrsniRad& org) {
  2884.         if (this != &org) {
  2885.             delete[] _tema;
  2886.             _tema = AlocirajNizKaraktera(org._tema);
  2887.             _datumOdbrane = org._datumOdbrane;
  2888.             _poglavljaRada = org._poglavljaRada;
  2889.             _konacnaOcjena = org._konacnaOcjena;
  2890.         }
  2891.         return *this;
  2892.     }
  2893.  
  2894.     void DodajPoglavlje(const char* nazivPoglavlja, const char* sadrzajPoglavlja) {
  2895.         for (size_t i = 0; i < _poglavljaRada.size(); i++) {
  2896.             if (strcmp(nazivPoglavlja, _poglavljaRada[i].GetNaslov()) == 0) {
  2897.                 _poglavljaRada[i].DodajSadrzaj(sadrzajPoglavlja);
  2898.                 return;
  2899.             }
  2900.         }
  2901.         _poglavljaRada.push_back(Poglavlje(nazivPoglavlja, sadrzajPoglavlja));
  2902.     }
  2903.  
  2904.     void OcijeniPoglavlje(const char* nazivPoglavlja, int ocjena) {
  2905.         if (ocjena < 6 || ocjena > 10)
  2906.             throw exception("Ocjena nije validna!");
  2907.         for (size_t i = 0; i < _poglavljaRada.size(); i++) {
  2908.             if (strcmp(nazivPoglavlja, _poglavljaRada[i].GetNaslov()) == 0) {
  2909.                 _poglavljaRada[i].OcijeniPoglavlje(ocjena);
  2910.                 return;
  2911.             }
  2912.         }
  2913.         throw exception("Poglavlje nije pronadjeno!");
  2914.     }
  2915.  
  2916.     void SetKonacnaOcjena() {
  2917.         float prosjek = 0.0f;
  2918.         for (size_t i = 0; i < _poglavljaRada.size(); i++) {
  2919.             prosjek += _poglavljaRada[i].GetOcjena();
  2920.         }
  2921.         _konacnaOcjena = prosjek / _poglavljaRada.size();
  2922.     }
  2923.  
  2924.     friend ostream& operator<<(ostream& COUT, ZavrsniRad& obj) {
  2925.         COUT << "Tema rada: " << obj._tema << endl;
  2926.         COUT << "Sadrzaj: " << endl;
  2927.         for (size_t i = 0; i < obj._poglavljaRada.size(); i++)
  2928.             COUT << obj._poglavljaRada[i] << endl;
  2929.         COUT << "Datum odbrane rada: " << obj._datumOdbrane << endl << " Ocjena: " << obj._konacnaOcjena << endl;
  2930.         return COUT;
  2931.     }
  2932. };
  2933.  
  2934. class Mentor {
  2935.     string _imePrezime;
  2936.     // Parametar string predstavlja broj indeksa studenta koji prijavljuje zavrsni rad kod odredjenog Mentora
  2937.     Kolekcija<string, ZavrsniRad> _teme;
  2938.  
  2939. public:
  2940.     Mentor(string imePrezime) : _imePrezime(imePrezime) {}
  2941.  
  2942.     Kolekcija<string, ZavrsniRad>& GetTeme() { return _teme; };
  2943.     string GetImePrezime() { return _imePrezime; }
  2944.  
  2945.     void Info() {
  2946.         cout << _imePrezime << endl << _teme << endl;
  2947.     }
  2948.  
  2949.     bool DodajZavrsniRad(string brojIndeksa, ZavrsniRad zavrsniRad) {
  2950.         for (size_t i = 0; i < _teme.getTrenutno(); i++) {
  2951.             if (strcmp(zavrsniRad.GetNazivTeme(), _teme.getElement2(i).GetNazivTeme()) == 0) {
  2952.                 return false;
  2953.             }
  2954.         }
  2955.         _teme.AddElement(brojIndeksa, zavrsniRad);
  2956.         return true;
  2957.     }
  2958.  
  2959.     ZavrsniRad* ZakaziOdbranuRada(string brojIndeksa, string datumOdbrane) {
  2960.         for (size_t i = 0; i < _teme.getTrenutno(); i++) {
  2961.             if (brojIndeksa == _teme.getElement1(i)) {
  2962.                 if (_teme.getElement2(i).GetPoglavlja().size() > min_polgavlja) {
  2963.                     for (size_t j = 0; j < _teme.getElement2(i).GetPoglavlja().size(); j++) {
  2964.                         if (strlen(_teme.getElement2(i).GetPoglavlja()[j].GetSadrzaj()) <= min_karaktera_po_poglavlju ||
  2965.                             !_teme.getElement2(i).GetPoglavlja()[j].GetPrihvaceno()) {
  2966.                             return nullptr;
  2967.                         }
  2968.                     }
  2969.                     _teme.getElement2(i).SetDatumOdbrane(datumOdbrane);
  2970.                     _teme.getElement2(i).SetKonacnaOcjena();
  2971.                     return &_teme.getElement2(i);
  2972.                 }
  2973.                 return nullptr;
  2974.             }
  2975.         }
  2976.         return nullptr;
  2977.     }
  2978. };
  2979.  
  2980.  
  2981. int main() {
  2982.     cout << crt << "UPLOAD RADA OBAVEZNO IZVRSITI U ODGOVARAJUCI FOLDER NA FTP SERVERU" << endl;
  2983.     cout << "U slucaju da je Upload folder prazan pritisnite tipku F5" << crt;
  2984.  
  2985.     const int max = 4;
  2986.     Mentor* mentori[max];
  2987.  
  2988.     mentori[0] = new Mentor("Armina Hubana");
  2989.     mentori[1] = new Mentor("Zanin Vejzovic");
  2990.     mentori[2] = new Mentor("Jasmin Azemovic");
  2991.     mentori[3] = new Mentor("Emina Junuz");
  2992.     //parametri: naziv zavrsnog rada
  2993.     ZavrsniRad multimedijalni("Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
  2994.     ZavrsniRad podrsa_operaterima("Sistem za podršku rada kablovskog operatera");
  2995.     ZavrsniRad analiza_sigurnosti("Prakticna analiza sigurnosti bežiènih raèunarskih mreža");
  2996.     ZavrsniRad kriptografija("Primjena teorije informacija u procesu generisanja kriptografskih kljuèeva");
  2997.  
  2998.     /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj.
  2999.     ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor).
  3000.     u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
  3001.     //parametri: nazivPoglavlja, sadrzajPoglavlja
  3002.     multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
  3003.     multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
  3004.     multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
  3005.     multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistema, a neke od najznacajnijih su ...");
  3006.     multimedijalni.DodajPoglavlje("Teorija multimedije", "Sadrzaj koji bi trebao stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130011");
  3007.     multimedijalni.DodajPoglavlje("Zakljucak", "U ovom radu su predstavljeni osnovni koncepti i prakticna primjena...");
  3008.  
  3009.     try {
  3010.         /*funkcija OcijeniPoglavlje, na osnovu naziva poglavlja, dodjeljuje ocjenu poglavlju te ukoliko je ocjena pozitivna (6 - 10) onda poglavlje oznacava prihvacenim.
  3011.         U slucaju da ocjena nije validna ili poglavlje ne postoji, funkcija baca izuzetak sa odgovarajucom porukom*/
  3012.         //parametri:nazivPoglavlja, ocjena
  3013.  
  3014.         multimedijalni.OcijeniPoglavlje("Uvod", 8);
  3015.         multimedijalni.OcijeniPoglavlje("Vrste multimedijalnih sistema", 8);
  3016.         multimedijalni.OcijeniPoglavlje("Teorija multimedije", 9);
  3017.         multimedijalni.OcijeniPoglavlje("Zakljucak", 7);
  3018.         multimedijalni.OcijeniPoglavlje("Naziv poglavlja ne postoji", 8);
  3019.     }
  3020.     catch (exception& err) {
  3021.         cout << "Greska -> " << err.what() << endl;
  3022.     }
  3023.  
  3024.     /*funkcija DodajZavrsniRad ima zadatak da odredjenom Mentoru dodijeli mentorstvo na zavrsnom radu.
  3025.     zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
  3026.     sprijeciti dodavanje zavrsnih radova sa istom temom*/
  3027.     //parametri:brojIndeksa, zavrsniRad
  3028.     if (mentori[0]->DodajZavrsniRad("IB130011", multimedijalni))
  3029.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  3030.     if (mentori[0]->DodajZavrsniRad("IB120051", podrsa_operaterima))
  3031.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  3032.     if (!mentori[0]->DodajZavrsniRad("IB120056", podrsa_operaterima))//dupliranje rada
  3033.         cout << "Zavrsni rad nije dodat!" << endl;
  3034.     if (!mentori[0]->DodajZavrsniRad("IB120051", kriptografija)) //studentu vec dodijeljen rad
  3035.         cout << "Zavrsni rad nije dodat!" << endl;
  3036.     if (mentori[1]->DodajZavrsniRad("IB140102", analiza_sigurnosti))
  3037.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  3038.     if (mentori[2]->DodajZavrsniRad("IB140002", kriptografija))
  3039.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  3040.  
  3041.     /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva definisanje
  3042.     datuma odbrane. odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio i pri tom su zadovoljeni sljedeci uslovi:
  3043.         1. zavrsni rad ima broj poglavlja veci od minimalnog
  3044.         2. svako poglavlje ima broj karaktera veci od minimalnog
  3045.         3. svako poglavlje je prihvaceno/odobreno
  3046.     ukoliko su zadovoljeni prethodni kriteriji, izracunava se konacna ocjena rada (prosjek ocjena svih poglavlja)
  3047.     , postavlja datum odbrane rada i vraca pokazivac na rad kome je zakazan odbrana.
  3048.     u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija nije zadovoljen, funkcija vraca nullptr.
  3049. */
  3050.  
  3051. //parametri:brojIndeksa, datumOdbrane
  3052.     ZavrsniRad* zr1 = mentori[0]->ZakaziOdbranuRada("IB130011", "25.09.2018");
  3053.     if (zr1 != nullptr)
  3054.         cout << *zr1 << endl;
  3055.  
  3056.     zr1 = mentori[0]->ZakaziOdbranuRada("IB130111", "25.09.2018");//student sa brojem indeksa IB130111 jos uvijek nije prijavio rad
  3057.     if (zr1 != nullptr)
  3058.         cout << *zr1 << endl;
  3059.  
  3060.     //ispisuje sve podatke o Mentoru i njegovim mentorstvima
  3061.     mentori[0]->Info();
  3062.  
  3063.     for (int i = 0; i < max; i++) {
  3064.         delete mentori[i];
  3065.         mentori[i] = nullptr;
  3066.     }
  3067.     system("pause>0");
  3068.     return 0;
  3069. }
  3070.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement