Advertisement
Meshail

Zavrsni rad zadnji rok(ne radi sve kako treba)

Jul 22nd, 2019
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 18.03 KB | None | 0 0
  1. #include<iostream>
  2. #include<vector>
  3. #include<string>
  4. #include<regex>
  5. #include<thread>
  6. #include<mutex>
  7.  
  8. using namespace std;
  9.  
  10. /****************************************************************************
  11. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  12. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ĆE BITI OZNACENO KAO "RE"
  13. 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEČILO GUBLJENJE URAĐENOG ZADATKA
  14. 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.
  15. 5. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNAČENO.
  16. ****************************************************************************/
  17.  
  18. const char* crt = "\n-------------------------------------------\n";
  19. const char* nedozvoljena_operacija = "Nedozvoljena operacija";
  20. const char* not_set = "NOT_SET";
  21. const int min_polgavlja = 3;
  22. const int min_karaktera_po_poglavlju = 30;
  23.  
  24. char * AlocirajNizKaraktera(const char * sadrzaj) {
  25.     if (sadrzaj == nullptr)
  26.         return nullptr;
  27.     int vel = strlen(sadrzaj) + 1;
  28.     char * temp = new char[vel];
  29.     strcpy_s(temp, vel, sadrzaj);
  30.     return temp;
  31. }
  32.  
  33. template<class T1, class T2>
  34. class Kolekcija {
  35.     T1 * _elementi1;
  36.     T2 * _elementi2;
  37.     int _trenutno;
  38. public:
  39.     Kolekcija() :_trenutno(0), _elementi1(nullptr), _elementi2(nullptr) { }
  40.     ~Kolekcija() {
  41.         delete[] _elementi1; _elementi1 = nullptr;
  42.         delete[] _elementi2; _elementi2 = nullptr;
  43.     }
  44.     Kolekcija(const Kolekcija& k)
  45.     {
  46.  
  47.         _trenutno = k._trenutno;
  48.         _elementi1 = new T1[k._trenutno];
  49.         _elementi2 = new T2[k._trenutno];
  50.         for (size_t i = 0; i < k._trenutno; i++)
  51.         {
  52.             _elementi1[i] = k._elementi1[i];
  53.             _elementi2[i] = k._elementi2[i];
  54.  
  55.         }
  56.     }
  57.     Kolekcija & operator=(Kolekcija & k)
  58.     {
  59.         if (this != &k)
  60.         {
  61.             if (_elementi1 != nullptr)
  62.                 delete[] _elementi1;
  63.  
  64.             if (_elementi2 != nullptr)
  65.                 delete[] _elementi2;
  66.             _trenutno = k._trenutno;
  67.             _elementi1 = new T1[k._trenutno];
  68.             _elementi2 = new T2[k._trenutno];
  69.             for (size_t i = 0; i < k._trenutno; i++)
  70.             {
  71.                 _elementi1[i] = k._elementi1[i];
  72.                 _elementi2[i] = k._elementi2[i];
  73.  
  74.             }
  75.  
  76.  
  77.         }
  78.     }
  79.     void AddElement(T1 & a, T2&b) {
  80.         for (size_t i = 0; i < _trenutno; i++)
  81.         {
  82.             if (_elementi1[i] == a || _elementi2[i] == b)
  83.                 throw exception("zabranjeno dodavanje duplih");
  84.         }
  85.  
  86.         T1 *temp = new T1[_trenutno + 1];
  87.         T2 *temp2 = new T2[_trenutno + 1];
  88.  
  89.         for (size_t i = 0; i < _trenutno; i++)
  90.         {
  91.             temp[i] = _elementi1[i];
  92.             temp2[i] = _elementi2[i];
  93.         }
  94.         delete[] _elementi1;
  95.         delete[] _elementi2;
  96.  
  97.         _elementi1 = temp;
  98.         _elementi2 = temp2;
  99.  
  100.         _elementi1[_trenutno] = a;
  101.         _elementi2[_trenutno] = b;
  102.         _trenutno++;
  103.  
  104.  
  105.     }
  106.  
  107.     T1 * getElementi1Pok() { return _elementi1; }
  108.     T2 * getElementi2Pok() { return _elementi2; }
  109.     T1 & getElement1(int lokacija) { return _elementi1[lokacija]; }
  110.     T2 & getElement2(int lokacija) { return _elementi2[lokacija]; }
  111.     int getTrenutno() { return _trenutno; }
  112.  
  113.     friend ostream & operator<<(ostream & COUT, Kolekcija<T1, T2> & obj) {
  114.         for (size_t i = 0; i < obj._trenutno; i++)
  115.             COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
  116.         return COUT;
  117.     }
  118. };// operator dodjele const kopije i defaultni
  119. class Poglavlje {
  120. protected:
  121.     char * _naslov;
  122.     char * _sadrzaj;
  123.     bool _prihvaceno;
  124.     int _ocjena;//da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6 - 10
  125. public:
  126.     Poglavlje(const char * naslov = nullptr, const char * sadrzaj = nullptr)
  127.         :_ocjena(0), _prihvaceno(false) {
  128.         _naslov = AlocirajNizKaraktera(naslov);
  129.         _sadrzaj = AlocirajNizKaraktera(sadrzaj);
  130.     }
  131.     ~Poglavlje() {
  132.         delete[] _naslov; _naslov = nullptr;
  133.         delete[] _sadrzaj; _sadrzaj = nullptr;
  134.     }
  135.     Poglavlje(const Poglavlje& p) {
  136.         _naslov = AlocirajNizKaraktera(p._naslov);
  137.         _sadrzaj = AlocirajNizKaraktera(p._sadrzaj);
  138.  
  139.         _ocjena = p._ocjena;
  140.  
  141.     }
  142.     Poglavlje & operator=(Poglavlje & p)
  143.     {
  144.         if (this != &p)
  145.         {
  146.             if (_naslov != nullptr)
  147.                 delete[]_naslov;
  148.             if (_sadrzaj != nullptr)
  149.                 delete[] _sadrzaj;
  150.             _naslov = AlocirajNizKaraktera(p._naslov);
  151.             _sadrzaj = AlocirajNizKaraktera(p._sadrzaj);
  152.  
  153.             _ocjena = p._ocjena;
  154.  
  155.         }
  156.         return *this;
  157.     }
  158.     void Setocjena(int ocjena)
  159.     {
  160.  
  161.        
  162.             _ocjena = ocjena;
  163.             _prihvaceno = true;
  164.        
  165.  
  166.     }
  167.  
  168.     friend ostream & operator<<(ostream & COUT, Poglavlje & obj) {
  169.         if (obj._naslov == nullptr || obj._sadrzaj == nullptr)
  170.             return COUT;
  171.         COUT << endl << obj._naslov << endl << obj._sadrzaj << endl;
  172.         if (obj._prihvaceno)
  173.             COUT << "Ocjena: " << obj._ocjena << endl;;
  174.         return COUT;
  175.     }
  176.  
  177.     char * GetNaslov() { return _naslov; }
  178.     char * GetSadrzaj() { return _sadrzaj; }
  179.     bool GetPrihvaceno() { return _prihvaceno; }
  180.     int GetOcjena() { return _ocjena; }
  181.     void SetSadrzaj(string sadrzaj) {
  182.         sadrzaj = sadrzaj + " ";
  183.         char * temp = AlocirajNizKaraktera((sadrzaj + string(_sadrzaj)).c_str());
  184.         delete[]_sadrzaj;
  185.         _sadrzaj = temp;
  186.  
  187.     }
  188. };
  189.  
  190. class ZavrsniRad {
  191.     char* _tema;
  192.     vector<Poglavlje> _poglavljaRada;
  193.     string _datumOdbrane;
  194.     float _konacnaOcjena; //prosjek ocjena svih poglavlja u zavrsnom radu koja se izracunava u momentu zakazivanja odbrane
  195. public:
  196.     ZavrsniRad(const char * nazivTeme = nullptr) : _konacnaOcjena(0), _datumOdbrane(not_set) {
  197.         _tema = AlocirajNizKaraktera(nazivTeme);
  198.     }
  199.  
  200.     ZavrsniRad(const ZavrsniRad& org) : _poglavljaRada(org._poglavljaRada), _konacnaOcjena(org._konacnaOcjena), _datumOdbrane(org._datumOdbrane) {
  201.         _tema = AlocirajNizKaraktera(org._tema);
  202.     }
  203.  
  204.     ~ZavrsniRad() {
  205.         delete[] _tema; _tema = nullptr;
  206.     }
  207.     ZavrsniRad & operator=(ZavrsniRad & org) {
  208.         if (this != &org) {
  209.             delete[] _tema;
  210.             _tema = AlocirajNizKaraktera(org._tema);
  211.             _poglavljaRada = org._poglavljaRada;
  212.             _datumOdbrane = org._datumOdbrane;
  213.             _konacnaOcjena = org._konacnaOcjena;
  214.         }
  215.         return *this;
  216.  
  217.     }
  218.  
  219.     char* GetNazivTeme()const { return _tema; }
  220.     vector<Poglavlje>& GetPoglavlja() { return _poglavljaRada; };
  221.     string GetDatumOdbrane()const { return _datumOdbrane; }
  222.     float GetOcjena() { return _konacnaOcjena; }
  223.     void SetDatumOdbrane(string datumOdbrane) { _datumOdbrane = datumOdbrane; }
  224.  
  225.     void DodajPoglavlje(string naziv, string sadr)
  226.     {
  227.  
  228.         for (vector<Poglavlje>::iterator it = _poglavljaRada.begin(); it != _poglavljaRada.end(); it++)
  229.         {
  230.             if (strcmp(it->GetNaslov(), naziv.c_str()) == 0)
  231.                 it->SetSadrzaj(sadr);
  232.  
  233.  
  234.         }
  235.         Poglavlje p(naziv.c_str(), sadr.c_str());
  236.         _poglavljaRada.push_back(p);
  237.  
  238.     }
  239.     //parametri:nazivPoglavlja, ocjena
  240.     void OcijeniPoglavlje(string naziv, int ocjena)
  241.     {
  242.         int brojac = 0;
  243.         int index = -1;
  244.         for (int i = 0; i < _poglavljaRada.size(); i++) {
  245.             if (strcmp(naziv.c_str(), _poglavljaRada[i].GetNaslov())==0 ){
  246.                 brojac++;
  247.                 index = i;
  248.             }
  249.         }
  250.         if (brojac == 0)
  251.             throw exception("poglavlje ne postoji");
  252.         if (ocjena < 6 || ocjena>10) {
  253.             throw exception("ocjena nije validna");
  254.         }
  255.         else {
  256.             _poglavljaRada[index].Setocjena(ocjena);
  257.         }
  258.  
  259.  
  260.  
  261.  
  262.     }
  263.  
  264.  
  265.     friend ostream& operator<<(ostream& COUT, ZavrsniRad& obj) {
  266.         COUT << "Tema rada: " << obj._tema << endl;
  267.         COUT << "Sadrzaj: " << endl;
  268.         for (size_t i = 0; i < obj._poglavljaRada.size(); i++)
  269.             COUT << obj._poglavljaRada[i] << endl;
  270.         COUT << "Datum odbrane rada: " << obj._datumOdbrane << endl << " Ocjena: " << obj._konacnaOcjena << endl;
  271.         return COUT;
  272.     }
  273.     bool operator==(ZavrsniRad& z) {
  274.         return strcmp(z.GetNazivTeme(), _tema) == 0;
  275.     }
  276. };
  277.  
  278. class Osoba {
  279. protected:
  280.     string _imePrezime;
  281. public:
  282.     Osoba(string imePrezime) : _imePrezime(imePrezime) {}
  283.     string GetImePrezime() { return _imePrezime; }
  284.  
  285.     friend ostream& operator<<(ostream& COUT, const Osoba& o)
  286.     {
  287.         COUT << "Ime i prezime->" << o._imePrezime << endl;
  288.  
  289.         return COUT;
  290.     }
  291.     virtual void Info() = 0;
  292. };
  293.  
  294. class Nastavnik :public Osoba {
  295.     //Parametar string predstavlja broj indeksa studenta koji prijavljuje zavrsni rad kod odredjenog nastavnika
  296.     Kolekcija<string, ZavrsniRad> _teme;
  297. public:
  298.     Nastavnik(string ime) :Osoba(ime)
  299.     {
  300.  
  301.     }
  302.     Kolekcija<string, ZavrsniRad>& GetTeme() { return _teme; };
  303.     void Info() {
  304.        
  305.        
  306.        
  307.        
  308.     }
  309.     /*funkcija DodajZavrsniRad ima zadatak da odredjenom nastavniku dodijeli mentorstvo na zavrsnom radu. zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
  310.     sprijeciti dodavanje zavrsnih radova sa istom temom*/
  311.     //parametri: brojIndeksa, zavrsniRad
  312.     bool DodajZavrsniRad(string index, ZavrsniRad & z) {
  313.         for (size_t i = 0; i < _teme.getTrenutno(); i++)
  314.         {
  315.             if (_teme.getElement1(i) == index)
  316.                 return false;
  317.                 if (strcmp(_teme.getElement2(i).GetNazivTeme() ,z.GetNazivTeme())==0)
  318.                     return false;
  319.                
  320.            
  321.  
  322.         }
  323.         _teme.AddElement(index, z);
  324.  
  325.         return true;
  326.     }
  327.  
  328.  
  329.     /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva definisanje
  330.     datuma odbrane. odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio i pri tom su zadovoljeni sljedeci uslovi:
  331.         1. zavrsni rad ima broj poglavlja veci od minimalnog
  332.         2. svako poglavlje ima broj karaktera veci od minimalnog
  333.         3. svako poglavlje je prihvaceno/odobreno
  334.     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.
  335.     u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija nije zadovoljen, funkcija vraca nullptr.
  336. */
  337. //parametri: brojIndeksa, datumOdbrane
  338.  
  339.     ZavrsniRad * ZakaziOdbranuRada(string index, string datum)
  340.     {
  341.         float suma = 0;
  342.         float prosjek = 0;
  343.         for (size_t i = 0; i < _teme.getTrenutno(); i++)
  344.         {
  345.             if (_teme.getElement1(i) == index)
  346.             {
  347.  
  348.                 if (_teme.getElement2(i).GetPoglavlja().size() < min_polgavlja)
  349.                     return nullptr;
  350.                 suma = 0;
  351.                 for (vector<Poglavlje>::iterator it = _teme.getElement2(i).GetPoglavlja().begin(); it != _teme.getElement2(i).GetPoglavlja().end(); it++)
  352.                 {
  353.                     if (strlen(it->GetSadrzaj()) < min_karaktera_po_poglavlju)
  354.                         return nullptr;
  355.                     if (!it->GetPrihvaceno())
  356.                         return nullptr;
  357.                     suma += it->GetOcjena();
  358.                 }
  359.                 suma /= _teme.getElement2(i).GetPoglavlja().size();
  360.                 _teme.getElement2(i).SetDatumOdbrane(datum);
  361.                
  362.  
  363.                 return &_teme.getElement2(i);
  364.  
  365.             }
  366.         }
  367.  
  368.         return nullptr;
  369.     }
  370.  
  371.     //"Postovani {brojIndeksa}, uzimajuci u obzir cinjenicu da ste kod mentora {imePrezimeMentora} uspjesno odbranili rad sa ocjenom {ocjena} cast nam je pozvati vas na dodjelu nagrada za najbolje studente koja ce se odrzatu u na FIT-u 03.07.2019. godine."    .
  372.         //  funkcija treba da vrati sadrzaj svih poslatih email poruka
  373.  
  374. };
  375. mutex cuvamResurse;
  376. void Mail(string kome, string ovo)
  377. {
  378.     cuvamResurse.lock();
  379.     cout << endl << " To" << kome<< endl;
  380.     cout << ovo << endl;
  381.     cuvamResurse.unlock();
  382.    
  383. }
  384.  
  385. string PosaljiPozivZaDodjeluNagrada(Nastavnik **n, int max, int ocjena) {
  386.     bool PronadenoMentorstvo = false;
  387.     float prosjek = 0;
  388.     int pozicija = 0;
  389.     float najnizi = INT_MAX;
  390.  
  391.     for (size_t i = 0; i < max; i++)
  392.     {
  393.         if (n[i]->GetTeme().getTrenutno() > 0)
  394.         {
  395.             PronadenoMentorstvo = true;
  396.         }
  397.         if (!PronadenoMentorstvo)
  398.             return not_set;
  399.         prosjek = 0;
  400.         for (size_t j = 0; j < n[i]->GetTeme().getTrenutno(); j++)
  401.         {
  402.             prosjek += n[i]->GetTeme().getElement2(j).GetOcjena();
  403.         }
  404.         prosjek /= n[i]->GetTeme().getTrenutno();
  405.  
  406.         if (prosjek < najnizi)
  407.         {
  408.             najnizi = prosjek;
  409.             pozicija = i;
  410.         }
  411.  
  412.     }
  413.     string sadrzaj = "";
  414.     for (size_t i = 0; i < n[pozicija]->GetTeme().getTrenutno(); i++)
  415.     {
  416.         float KonacnaOcjena = n[pozicija]->GetTeme().getElement2(i).GetOcjena();
  417.         if (KonacnaOcjena > ocjena)
  418.         {
  419.             string saljem = "Postovani" + n[pozicija]->GetTeme().getElement1(i) + " , uzimajjuci u obzir cinjenicu da ste kod mentora ";
  420.             saljem += n[pozicija]->GetImePrezime() + " uspjesno odbranili rad sa ocjenom" + to_string(KonacnaOcjena);
  421.             saljem += "Cast nam je pozvati vas na dodjelu nagrada za najbolje studente koja ce se odrzati U prostorijama FITA\n";
  422.  
  423.             thread zaseban(&
  424.                 Mail, n[pozicija]->GetTeme().getElement1(i),saljem);
  425.            
  426.             sadrzaj += saljem;
  427.         }
  428.     }
  429.    
  430.     return sadrzaj;
  431. }
  432. int main() {
  433.     cout << crt << "UPLOAD RADA OBAVEZNO IZVRSITI U ODGOVARAJUCI FOLDER NA FTP SERVERU" << endl;
  434.     cout << "U slucaju da je Upload folder prazan pritisnite tipku F5" << crt;
  435.  
  436.     const int max = 4;
  437.     Nastavnik * nastavnici[max];
  438.  
  439.     nastavnici[0] = new Nastavnik("Denis Music");
  440.     nastavnici[1] = new Nastavnik("Zanin Vejzovic");
  441.     nastavnici[2] = new Nastavnik("Jasmin Azemovic");
  442.     nastavnici[3] = new Nastavnik("Emina Junuz");
  443.     //  //parametri: naziv zavrsnog rada
  444.     ZavrsniRad multimedijalni("Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
  445.     ZavrsniRad podrsa_operaterima("Sistem za podršku rada kablovskog operatera");
  446.     ZavrsniRad analiza_sigurnosti("Prakticna analiza sigurnosti bežičnih računarskih mreža");
  447.     ZavrsniRad kriptografija("Primjena teorije informacija u procesu generisanja kriptografskih ključeva");
  448.     //
  449.         //  /*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*/
  450.             //parametri: nazivPoglavlja, sadrzajPoglavlja
  451.     multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
  452.     multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
  453.     multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
  454.     multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistema, a neke od najznacajnijih su ...");
  455.     multimedijalni.DodajPoglavlje("Teorija multimedije", "Sadrzaj koji bi trebao stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130011");
  456.     multimedijalni.DodajPoglavlje("Zakljucak", "U ovom radu su predstavljeni osnovni koncepti i prakticna primjena...");
  457.     //
  458.     try {
  459.         /*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*/
  460.         //parametri:nazivPoglavlja, ocjena
  461.  
  462.         multimedijalni.OcijeniPoglavlje("Uvod", 8);
  463.         multimedijalni.OcijeniPoglavlje("Vrste multimedijalnih sistema", 8);
  464.         multimedijalni.OcijeniPoglavlje("Teorija multimedije", 9);
  465.         multimedijalni.OcijeniPoglavlje("Zakljucak", 7);
  466.         multimedijalni.OcijeniPoglavlje("Naziv poglavlja ne postoji", 8);
  467.  
  468.     }
  469.     catch (exception & err) {
  470.         cout << "Greska -> " << err.what() << endl;
  471.     }
  472.     cout << multimedijalni << endl;
  473.  
  474.  
  475.    
  476.         /*funkcija DodajZavrsniRad ima zadatak da odredjenom nastavniku dodijeli mentorstvo na zavrsnom radu. zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
  477.         sprijeciti dodavanje zavrsnih radova sa istom temom*/
  478.         /*parametri: brojIndeksa, zavrsniRad*/
  479.     if (nastavnici[0]->DodajZavrsniRad("IB130011", multimedijalni))
  480.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  481.     if (nastavnici[0]->DodajZavrsniRad("IB120051", podrsa_operaterima))
  482.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  483.     if (!nastavnici[0]->DodajZavrsniRad("IB120056", podrsa_operaterima))//dupliranje rada
  484.         cout << "Zavrsni rad nije dodat!" << endl;
  485.     if (!nastavnici[0]->DodajZavrsniRad("IB120051", kriptografija)) //studentu vec dodijeljen rad
  486.         cout << "Zavrsni rad nije dodat!" << endl;
  487.     if (nastavnici[1]->DodajZavrsniRad("IB140102", analiza_sigurnosti))
  488.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  489.     if (nastavnici[2]->DodajZavrsniRad("IB140002", kriptografija))
  490.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  491.    
  492.       /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva definisanje
  493.       datuma odbrane. odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio i pri tom su zadovoljeni sljedeci uslovi:
  494.           1. zavrsni rad ima broj poglavlja veci od minimalnog
  495.           2. svako poglavlje ima broj karaktera veci od minimalnog
  496.           3. svako poglavlje je prihvaceno/odobreno
  497.       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.
  498.       u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija nije zadovoljen, funkcija vraca nullptr.
  499.     */
  500.    
  501.     /*parametri: brojIndeksa, datumOdbrane*/
  502.     ZavrsniRad * zr1 = nastavnici[0]->ZakaziOdbranuRada("IB130011", "25.09.2018");
  503.     if (zr1 != nullptr)
  504.         cout << *zr1 << endl;
  505.  
  506.     zr1 = nastavnici[0]->ZakaziOdbranuRada("IB130111", "25.09.2018");//student sa brojem indeksa IB130111 jos uvijek nije prijavio rad
  507.     if (zr1 != nullptr)
  508.         cout << *zr1 << endl;
  509.  
  510.     /*ispisuje sve podatke o nastavniku i njegovim mentorstvima
  511.     nastavnici[0]->Info();
  512. */
  513.       /*Funkcija PosaljiPozivZaDodjeluNagrada ima zadatak da svim studentima koji su uspjesno okoncali svoj zavrsni rad kod odredjenog nastavnika/mentora
  514.       i tom prilikom ostvarili ocjenu vecu od proslijedjene, u zasebnom thread.u, posalje email poruku (mail adresa: brojIndeksa@edu.fit.ba) sa sadrzajem:
  515.       "Postovani {brojIndeksa}, uzimajuci u obzir cinjenicu da ste kod mentora {imePrezimeMentora} uspjesno odbranili rad sa ocjenom {ocjena} cast nam je pozvati vas na dodjelu nagrada za najbolje studente koja ce se odrzatu u na FIT-u 03.07.2019. godine."  .
  516.       funkcija treba da vrati sadrzaj svih poslatih email poruka, a ukoliko niti jedan od nastavnika ne posjeduje evidentirano mentorstvo na zavrsnom radu, funkcija vraca not_set*/
  517.     cout << "Studenti za dodjelu nagrada: " << PosaljiPozivZaDodjeluNagrada(nastavnici, max, 9.5) << endl;
  518.    
  519.       for (int i = 0; i < max; i++) {
  520.           delete nastavnici[i];
  521.           nastavnici[i] = nullptr;
  522.       }
  523.     system("pause>0");
  524.     return 0;
  525. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement