Advertisement
adnanj

Privremeno 2

Feb 19th, 2018
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 17.67 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <vector>
  4. #include <string>
  5. #include <regex>
  6. #include <mutex>
  7. #include <thread>
  8. using namespace std;
  9.  
  10. char crt[] = "\n=======================================================\n";
  11.  
  12. mutex cuvarResursa;
  13.  
  14.  
  15. bool GodinaPrestupna(int godina)
  16. {
  17.     return (godina % 400 == 0 || godina % 100 != 0) && godina % 4 == 0;
  18. }
  19.  
  20.  
  21. class Datum {
  22.     int *_dan, *_mjesec, *_godina;
  23. public:
  24.     Datum(int dan = 1, int mjesec = 1, int godina = 2000) {
  25.         _dan = new int(dan);
  26.         _mjesec = new int(mjesec);
  27.         _godina = new int(godina);
  28.     }
  29.     Datum(const Datum &dat) {
  30.         _dan = new int(*dat._dan);
  31.         _mjesec = new int(*dat._mjesec);
  32.         _godina = new int(*dat._godina);
  33.     }
  34.  
  35.     Datum& operator=(const Datum& other)
  36.     {
  37.         if (this != &other)
  38.         {
  39.             *_dan = *other._dan;
  40.             *_mjesec = *other._mjesec;
  41.             *_godina = *other._godina;
  42.         }
  43.         return *this;
  44.     }
  45.  
  46.     ~Datum() {
  47.         delete _dan; _dan = nullptr;
  48.         delete _mjesec; _mjesec = nullptr;
  49.         delete _godina; _godina = nullptr;
  50.     }
  51.  
  52.     int GetBrojDana()
  53.     {
  54.         int daniUMjesecima[12] = { 31, 28 + GodinaPrestupna(*_godina), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  55.  
  56.         int sumaDana = *_dan;
  57.  
  58.         for (int i = *_mjesec - 2; i >= 0 ; i--)
  59.             sumaDana += daniUMjesecima[i];
  60.  
  61.         for (int i = *_godina - 1; i >= 2005; i--)
  62.             sumaDana += GodinaPrestupna(i) ? 366 : 365;
  63.         return sumaDana;
  64.     }
  65.  
  66.     int RazlikaUDanima(Datum d2)
  67.     {
  68.         return abs(GetBrojDana() - d2.GetBrojDana());
  69.     }
  70.  
  71.     friend ostream &operator<<(ostream &COUT, const Datum &obj) {
  72.         COUT << *obj._dan << " " << *obj._mjesec << " " << *obj._godina;
  73.         return COUT;
  74.     }
  75.  
  76. };
  77.  
  78. class Izuzetak : public exception {
  79.     string _tekst; // dodato jer se prosljeduje pri bacanju izuzetaka
  80.     string _funkcija;
  81. public:
  82.     Izuzetak(string tekst, string funkcija) : exception()
  83.     {
  84.         _tekst = tekst;
  85.         _funkcija = funkcija;
  86.     }
  87.  
  88.     friend ostream&operator<<(ostream &COUT, Izuzetak &obj)
  89.     {
  90.         COUT << "GRESKA: " <<  obj._tekst << " - FUNKCIJA: " << obj._funkcija << endl;
  91.         return COUT;
  92.     }
  93. };
  94.  
  95. template <class T1, class T2>
  96. class Kolekcija {
  97.     T1 * _elementi1;
  98.     T2 * _elementi2;
  99.     int _trenutnoElemenata;
  100.     bool _omoguciDupliranjeElemenata;
  101. public:
  102.     Kolekcija(bool omoguciDupliranjeElemenata = false) {
  103.         _trenutnoElemenata = 0;
  104.         _omoguciDupliranjeElemenata = omoguciDupliranjeElemenata;
  105.         _elementi1 = nullptr;
  106.         _elementi2 = nullptr;
  107.     }
  108.  
  109.     ~Kolekcija() {
  110.         delete[]_elementi2; _elementi2 = nullptr;
  111.         delete[]_elementi1; _elementi1 = nullptr;
  112.         _trenutnoElemenata = 0;
  113.     }
  114.    
  115.     Kolekcija(const Kolekcija& other)
  116.     {
  117.         _trenutnoElemenata = other._trenutnoElemenata;
  118.         _omoguciDupliranjeElemenata = other._omoguciDupliranjeElemenata;
  119.         _elementi1 = new T1[_trenutnoElemenata];
  120.         _elementi2 = new T2[_trenutnoElemenata];
  121.  
  122.         for (int i = 0; i < _trenutnoElemenata; i++)
  123.         {
  124.             _elementi1[i] = other._elementi1[i];
  125.             _elementi2[i] = other._elementi2[i];
  126.         }
  127.     }
  128.  
  129.     Kolekcija& operator=(const Kolekcija& other)
  130.     {
  131.         if (this != &other)
  132.         {
  133.             delete[] _elementi1; delete[] _elementi2;
  134.             _trenutnoElemenata = other._trenutnoElemenata;
  135.             _omoguciDupliranjeElemenata = other._omoguciDupliranjeElemenata;
  136.             _elementi1 = new T1[_trenutnoElemenata];
  137.             _elementi2 = new T2[_trenutnoElemenata];
  138.  
  139.             for (int i = 0; i < _trenutnoElemenata; i++)
  140.             {
  141.                 _elementi1[i] = other._elementi1[i];
  142.                 _elementi2[i] = other._elementi2[i];
  143.             }
  144.         }
  145.         return *this;
  146.     }
  147.     bool AddElement(T1 e1, T2 e2)
  148.     {
  149.         if (!_omoguciDupliranjeElemenata)
  150.         {
  151.             for (int i = 0; i < _trenutnoElemenata; i++)
  152.                 if (_elementi1[i] == e1 && _elementi2[i] == e2)
  153.                     return false;
  154.         }
  155.  
  156.         T1 * tempE1 = new T1[_trenutnoElemenata + 1];
  157.         T2 * tempE2 = new T2[_trenutnoElemenata + 1];
  158.  
  159.         for (int i = 0; i < _trenutnoElemenata; i++)
  160.         {
  161.             tempE1[i] = _elementi1[i];
  162.             tempE2[i] = _elementi2[i];
  163.         }
  164.  
  165.         delete[] _elementi1; delete[] _elementi2;
  166.         _elementi1 = tempE1;
  167.         _elementi2 = tempE2;
  168.         _elementi1[_trenutnoElemenata] = e1;
  169.         _elementi2[_trenutnoElemenata++] = e2;
  170.         return true;
  171.     }
  172.  
  173.     bool RemoveElement(T1 e1)
  174.     {
  175.         int brojKojiZadovoljavajuUslov = 0;
  176.         for (int i = 0; i < _trenutnoElemenata; i++)
  177.             if (_elementi1[i] == e1)
  178.                 brojKojiZadovoljavajuUslov++;
  179.  
  180.         if (brojKojiZadovoljavajuUslov == 0)
  181.             return false;
  182.  
  183.         T1 * tempE1 = new T1[_trenutnoElemenata - brojKojiZadovoljavajuUslov];
  184.         T2 * tempE2 = new T2[_trenutnoElemenata - brojKojiZadovoljavajuUslov];
  185.  
  186.         for (int i = 0, j = 0; i < _trenutnoElemenata; i++)
  187.         {
  188.             if (_elementi1[i] != e1)
  189.             {
  190.                 tempE1[j] = _elementi1[i];
  191.                 tempE2[j++] = _elementi2[i];
  192.             }
  193.         }
  194.  
  195.         delete[] _elementi1; delete[] _elementi2;
  196.         _elementi1 = tempE1;
  197.         _elementi2 = tempE2;
  198.         _trenutnoElemenata--;
  199.         return true;
  200.     }
  201.  
  202.     int GetTrenutno() const { return _trenutnoElemenata; }
  203.     T1& GetElement1(int lokacija) const
  204.     {
  205.         if (lokacija < 0 || lokacija >= _trenutnoElemenata)
  206.             throw Izuzetak("Nepostojeca lokacija", __FUNCTION__);
  207.         return _elementi1[lokacija];
  208.     }
  209.  
  210.     T2& GetElement2(int lokacija) const
  211.     {
  212.         if (lokacija < 0 || lokacija >= _trenutnoElemenata)
  213.             throw Izuzetak("Nepostojeca lokacija", __FUNCTION__);
  214.         return _elementi2[lokacija];
  215.     }
  216.  
  217.     void SetElement2(int lokacija, T2 value)
  218.     {
  219.         if (lokacija < 0 || lokacija >= _trenutnoElemenata)
  220.             throw Izuzetak("Nepostojeca lokacija", __FUNCTION__);
  221.         _elementi2[lokacija] = value;
  222.     }
  223.  
  224.     friend ostream &operator<<(ostream &COUT, const Kolekcija &obj) {
  225.         for (size_t i = 0; i < obj.GetTrenutno(); i++)
  226.             COUT << obj._elementi1[i] << " " << obj._elementi2[i] << endl;
  227.         return COUT;
  228.     }
  229. };
  230.  
  231. class Dogadjaj
  232. {
  233.     Datum _datumOdrzavanja;
  234.     Kolekcija<string, bool> * _obaveze; //cuva informaciju o obavezama koje je potrebno ispuniti prije samog dogadjaja, string se odnosi na opis, a bool na izvrsenje te obaveze (da li je zavrsena ili ne)
  235.  
  236.     char *_naziv;
  237.     int _notificirajPrije; //oznacava broj dana prije samog dogadjaja kada ce krenuti notifikacija/podsjetnik
  238.     bool _rekurzivnaNotifikacija; //ako je vrijednost true onda se korisnik notificira svaki dan do _datumaOdrzavanja dogadjaja, a pocevsi prije dogadjaja za _brojDanaZaNotifikaciju
  239.  
  240. public:
  241.     Dogadjaj(Datum datumOdrzavanja, const char *naziv, int brojDana = 1,
  242.         bool rekurzivnaNotifikacija = false) : _datumOdrzavanja(datumOdrzavanja)
  243.     {
  244.         _naziv = new char[strlen(naziv) + 1];
  245.         strcpy_s(_naziv, strlen(naziv) + 1, naziv);
  246.  
  247.         _notificirajPrije = brojDana;
  248.         _rekurzivnaNotifikacija = rekurzivnaNotifikacija;
  249.         _obaveze = new Kolekcija<string, bool>;
  250.     }
  251.  
  252.     Dogadjaj(const Dogadjaj &obj) : _datumOdrzavanja(obj._datumOdrzavanja)
  253.     {
  254.         _naziv = new char[strlen(obj._naziv) + 1];
  255.         strcpy_s(_naziv, strlen(obj._naziv) + 1, obj._naziv);
  256.  
  257.         _notificirajPrije = obj._notificirajPrije;
  258.         _rekurzivnaNotifikacija = obj._rekurzivnaNotifikacija;
  259.         _obaveze = new Kolekcija<string, bool>(*obj._obaveze);
  260.     }
  261.  
  262.     Dogadjaj& operator=(const Dogadjaj &obj)
  263.     {
  264.         if (this != &obj)
  265.         {
  266.             delete[] _obaveze; delete[] _naziv;
  267.             _naziv = new char[strlen(obj._naziv) + 1];
  268.             strcpy_s(_naziv, strlen(obj._naziv) + 1, obj._naziv);
  269.  
  270.             _datumOdrzavanja = obj._datumOdrzavanja;
  271.             _notificirajPrije = obj._notificirajPrije;
  272.             _rekurzivnaNotifikacija = obj._rekurzivnaNotifikacija;
  273.             _obaveze = new Kolekcija<string, bool>(*obj._obaveze);
  274.         }
  275.         return *this;
  276.     }
  277.  
  278.     ~Dogadjaj()
  279.     {
  280.         delete[] _naziv;
  281.         _naziv = nullptr;
  282.         delete _obaveze;
  283.         _obaveze = nullptr;
  284.     }
  285.  
  286.     bool AddObavezu(string obaveza)
  287.     {
  288.         const int brojZabranjenihRijeci = 2;
  289.         string zabranjeneRijeci[brojZabranjenihRijeci] = { "ubiti", "rat" };
  290.  
  291.         for (int i = 0; i < brojZabranjenihRijeci; i++)
  292.         {
  293.             regex pravilo(zabranjeneRijeci[i]);
  294.             if (regex_search(obaveza, pravilo))
  295.                 return false;
  296.         }
  297.  
  298.         for (int i = 0; i < _obaveze->GetTrenutno(); i++)
  299.             if (obaveza == _obaveze->GetElement1(i))
  300.                 return false;
  301.  
  302.         _obaveze->AddElement(obaveza, false);
  303.  
  304.         return true;
  305.     }
  306.  
  307.     char *GetNaziv() { return _naziv; }
  308.     Datum GetDatumOdrzavanja() { return _datumOdrzavanja; }
  309.     int GetBrojDanaPrijeZaNotifikaciju() { return _notificirajPrije; }
  310.     Kolekcija<string, bool> *GetObaveze() { return _obaveze; }
  311.  
  312. };
  313.  
  314. class Student
  315. {
  316.     int _indeks;
  317.     string _imePrezime;
  318.     vector<Dogadjaj> _dogadjaji;
  319. public:
  320.  
  321.     Student(int indeks, string imePrezime) : _indeks(indeks), _imePrezime(imePrezime) {}
  322.  
  323.     int GetIndeks() const { return _indeks; }
  324.     string GetImePrezime() const { return _imePrezime; }
  325.  
  326.     vector<Dogadjaj>& GetDogadjaji() { return _dogadjaji; }
  327.  
  328.     bool AddDogadjaj(Dogadjaj& dogadjaj)
  329.     {
  330.         for (int i = 0; i < _dogadjaji.size(); i++)
  331.             if (strcmp(_dogadjaji[i].GetNaziv(), dogadjaj.GetNaziv()))
  332.                 return false;
  333.         _dogadjaji.push_back(dogadjaj);
  334.         return true;
  335.     }
  336.  
  337.     friend bool operator==(Student s1, Student s2)
  338.     {
  339.         return s1.GetIndeks() == s2.GetIndeks();
  340.     }
  341.  
  342.     friend ostream &operator<<(ostream &COUT, const Student &obj)
  343.     {
  344.         COUT << obj._imePrezime << " (" << obj._indeks << ")" << endl;
  345.         return COUT;
  346.     }
  347. };
  348.  
  349.  
  350. void Print(string imePrezimeStudenta, int brojDanaDoIspita, int procenatIspunjenihObaveza, Dogadjaj d) {
  351.     cuvarResursa.lock();
  352.     cout << crt;
  353.     cout << "Postovani, " << imePrezimeStudenta << ", " << endl;
  354.     cout << "Dogadjaj " << d.GetNaziv() << " je zakazan za " << brojDanaDoIspita << " dana, a do sada ste obavili " << procenatIspunjenihObaveza << "% obaveza vezanih za ovaj dogadjaj.Neispunjene obaveze su :" << endl;
  355.     for (int i = 0, brojac = 1; i < d.GetObaveze()->GetTrenutno(); i++)
  356.     {
  357.         if (d.GetObaveze()->GetElement2(i) == false)
  358.         {
  359.             cout << brojac++ << ". " << d.GetObaveze()->GetElement1(i) << endl;
  360.         }
  361.     }
  362.     cout << "Predlazemo Vam da ispunite i ostale planirane obaveze." << endl;
  363.     cout << "FIT Reminder" << endl;
  364.     cout << crt;
  365.     this_thread::sleep_for(chrono::seconds(1));
  366.     cuvarResursa.unlock();
  367. }
  368.  
  369. class DLWMSReminder
  370. {
  371.     vector<Student> _reminiderList;
  372.  
  373. public:
  374.     void AddStudent(Student& student)
  375.     {
  376.         for (int i = 0; i < _reminiderList.size(); i++)
  377.             if (_reminiderList[i] == student)
  378.                 throw Izuzetak("Student vec postoji!", __FUNCTION__);
  379.         _reminiderList.push_back(student);
  380.     }
  381.  
  382.     bool OznaciObavezuKaoZavrsenu(int indeks, char * dogadjaj, string obaveza)
  383.     {
  384.         int indeksStudenta = -1;
  385.         for (int i = 0; i < _reminiderList.size() && indeksStudenta == -1; i++)
  386.             if (_reminiderList[i].GetIndeks() == indeks)
  387.                 indeksStudenta = i;
  388.  
  389.         if (indeksStudenta == -1) return false;
  390.  
  391.         int indeksDogadjaja = -1;
  392.         int indeksObaveze = -1;
  393.  
  394.         for (int i = 0; i < _reminiderList[indeksStudenta].GetDogadjaji().size() && indeksDogadjaja == -1; i++)
  395.         {
  396.             char * nazivTrenutnogDogadjaja = _reminiderList[indeksStudenta].GetDogadjaji()[i].GetNaziv();
  397.             if (strcmp(nazivTrenutnogDogadjaja, dogadjaj) == 0)
  398.             {
  399.                 Kolekcija<string, bool> * obaveze = _reminiderList[indeksStudenta].GetDogadjaji()[i].GetObaveze();
  400.                 for (int j = 0; j < obaveze->GetTrenutno() && indeksObaveze == -1; j++)
  401.                 {
  402.                     if (_reminiderList[indeksStudenta].GetDogadjaji()[i].GetObaveze()->GetElement1(j) == obaveza)
  403.                     {
  404.                         indeksDogadjaja = i;
  405.                         indeksObaveze = j;
  406.                     }
  407.                 }
  408.                    
  409.             }
  410.         }
  411.  
  412.         if (indeksObaveze == -1) return false;
  413.  
  414.         if (_reminiderList[indeksStudenta].GetDogadjaji()[indeksDogadjaja].GetObaveze()->GetElement2(indeksObaveze))
  415.             return false;
  416.         _reminiderList[indeksStudenta].GetDogadjaji()[indeksDogadjaja].GetObaveze()->SetElement2(indeksObaveze, true);
  417.         return true;
  418.     }
  419.  
  420.     int PosaljiNotifikacije(Datum datum)
  421.     {
  422.         int brojPoslanihNotifikacija = 0;
  423.         for (int i = 0; i < _reminiderList.size(); i++)
  424.         {
  425.             for (int j = 0; j < _reminiderList[i].GetDogadjaji().size(); j++)
  426.             {
  427.                 int razlika = _reminiderList[i].GetDogadjaji()[j].GetDatumOdrzavanja().RazlikaUDanima(datum);
  428.                 if (razlika <= _reminiderList[i].GetDogadjaji()[j].GetBrojDanaPrijeZaNotifikaciju())
  429.                 {
  430.                     brojPoslanihNotifikacija++;
  431.                     int ukupnoObaveza = _reminiderList[i].GetDogadjaji()[j].GetObaveze()->GetTrenutno();
  432.                     int zavrseneObaveze = 0;
  433.                     for (int z = 0; z < _reminiderList[i].GetDogadjaji()[j].GetObaveze()->GetTrenutno(); z++)
  434.                         if (_reminiderList[i].GetDogadjaji()[j].GetObaveze()->GetElement2(z) == true)
  435.                             zavrseneObaveze++;
  436.                     thread printThread(&Print, _reminiderList[i].GetImePrezime(), razlika, (float)zavrseneObaveze / ukupnoObaveza * 100, ref(_reminiderList[i].GetDogadjaji()[j]));
  437.                     printThread.join();
  438.                 }
  439.             }
  440.         }
  441.         return brojPoslanihNotifikacija;
  442.     }
  443.  
  444. };
  445.  
  446. void main() {
  447.  
  448.     /**************************************************************************
  449.     1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  450.     2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR CE BITI OZNACENO KAO "RE"
  451.     3. SPASAVAJTE PROJEKAT KAKO BI SE SPRIJECILO GUBLJENJE URADJENOG ZADATKA
  452.     4. PROGRAMSKI CODE SE TAKODJER NALAZI U FAJLU CODE_ParcijalniII.TXT
  453.     5. NAZIVI FUNKCIJA MORAJU BITI IDENTIČNI ONIMA KOJI SU KORIŠTENI U TESTNOM CODE-U.OSTALE, POMOĆNE FUNKCIJE MOŽETE IMENOVATI PO ŽELJI.
  454.     ****************************************************************************/
  455.  
  456. #pragma region Datum
  457.  
  458.     Datum danas(28, 1, 2018), sutra(29, 1, 2018);
  459.     Datum datumIspitaPRIII(30, 1, 2018), datumIspitBPII(31, 1, 2018);
  460.     Datum prekosutra(danas);
  461.     prekosutra = danas;
  462.     cout << danas << endl
  463.         << sutra << endl
  464.         << prekosutra << crt;
  465.  
  466. #pragma endregion
  467.  
  468. #pragma region Kolekcija
  469.  
  470.     /*
  471.     AddElement :: omogucava dodavanje novog elementa u kolekciju. Ukoliko je moguce, osigurati automatsko prosiranje kolekcije prilikom dodavanja svakog novog
  472.     elementa, te onemoguciti ponavljanje elemenata
  473.    
  474.     RemoveElement :: na osnovu parametra tipa T1 uklanja elemente iz kolekcije i ukoliko je moguce smanjuje velicinu niza/kolekcije.
  475.     Prilikom uklanjanja elemenata ocuvati redoslijed njihovog dodavanja
  476.     */
  477.     const int brElemenata = 10;
  478.     Kolekcija<int, float> kolekcija1;
  479.     for (size_t i = 0; i < brElemenata; i++)
  480.         if (!kolekcija1.AddElement(i, i + (0.6 * i)))
  481.             cout << "Elementi " << i << " i " << i + (0.6 * i) << " nisu dodati u kolekciju" << endl;
  482.  
  483.     cout << kolekcija1.GetElement1(0) << " " << kolekcija1.GetElement2(0) << endl;
  484.     cout << kolekcija1 << endl;
  485.  
  486.     kolekcija1.RemoveElement(1);
  487.  
  488.     Kolekcija<int, float> kolekcija2;
  489.     kolekcija2 = kolekcija1;
  490.     cout << kolekcija2 << crt;
  491.  
  492.     if (kolekcija1.GetTrenutno() == kolekcija2.GetTrenutno())
  493.         cout << "ISTI BROJ ELEMENATA" << endl;
  494.  
  495.     Kolekcija<int, float> kolekcija3(kolekcija2);
  496.     cout << kolekcija3 << crt;
  497.  
  498. #pragma endregion
  499.  
  500. //#pragma region Dogadjaj
  501. //
  502.     Dogadjaj ispitPRIII(datumIspitaPRIII, "Ispit iz PRIII", 5, true),
  503.         ispitBPII(datumIspitBPII, "Ispit iz BPII", 7, true);
  504.     /*po vlasitom izboru definisati listu zabranjenih rijeci koje ce onemoguciti dodavanje odredjene obaveze. Prilikom provjere koristiti regex*/
  505.     if (ispitPRIII.AddObavezu("Preraditi pdf materijale"))cout << "Obaveza dodana!" << endl;
  506.     //onemoguciti dupliranje obaveza
  507.     if (!ispitPRIII.AddObavezu("Preraditi pdf materijale"))cout << "Obaveza nije dodana!" << endl;
  508.     if (ispitPRIII.AddObavezu("Pregledati video materijale"))cout << "Obaveza dodana!" << endl;
  509.     if (ispitPRIII.AddObavezu("Preraditi ispitne zadatke"))cout << "Obaveza dodana!" << endl;
  510.     if (ispitPRIII.AddObavezu("Samostalno vjezbati"))cout << "Obaveza dodana!" << endl;
  511.  
  512.     if (ispitBPII.AddObavezu("Preraditi knjigu SQL za 24 h"))cout << "Obaveza dodana!" << endl;
  513.     if (ispitBPII.AddObavezu("Pregledati video materijale"))cout << "Obaveza dodana!" << endl;
  514.     if (ispitBPII.AddObavezu("Napraviti bazu za konkretnu aplikaciju"))cout << "Obaveza dodana!" << endl;
  515.  
  516.     Student jasmin(150051, "Jasmin Azemovic"), adel(160061, "Adel Handzic");
  517.  
  518.     if (jasmin.AddDogadjaj(ispitPRIII) && jasmin.AddDogadjaj(ispitBPII))
  519.         cout << "Dogadjaj uspjesno dodan!" << endl;
  520.  
  521.     if (adel.AddDogadjaj(ispitPRIII) && adel.AddDogadjaj(ispitBPII))
  522.         cout << "Dogadjaj uspjesno dodan!" << endl;
  523.     //onemoguciti dupliranje dogadjaja
  524.     if (!adel.AddDogadjaj(ispitPRIII))
  525.         cout << "Dogadjaj nije uspjesno dodan!" << endl;
  526.  
  527.     DLWMSReminder reminder;
  528.  
  529.     try
  530.     {
  531.         reminder.AddStudent(jasmin);
  532.         reminder.AddStudent(adel);
  533.         //u slucaju dupliranja studenata funkcija baca izuzetak tipa Izuzetak
  534.         reminder.AddStudent(jasmin);
  535.     }
  536.     catch (Izuzetak &err)
  537.     {
  538.         cout << err;
  539.         //ispisati sve informacije o nastalom izuzetku
  540.     }
  541.  
  542.     //da bi bila oznacena kao zavrsena, obaveza mora postojati i mora biti oznacena kao nezavrsena (false)
  543.     if (reminder.OznaciObavezuKaoZavrsenu(150051, "Ispit iz PRIII", "Pregledati video materijale"))
  544.         cout << "Obaveza oznacena kao zavrsena" << endl;
  545.  
  546.  
  547.     /*metodi PosaljiNotifikacije se salje trenutni datum na osnovu cega ona pretrazuje sve studente koje treba podsjetiti/notoficirati o dogadjajima koji se priblizavaju.
  548.     Koristeci multithread-ing, svim studentima se salju notifikacije sa sljedecim sadrzajem:
  549.     -------------------------------------------------------------------------
  550.     Postovani Jasmin Azemovic,
  551.     Dogadjaj Ispit iz PRIII je zakazan za 3 dana, a do sada ste obavili 56% obaveza vezanih za ovaj dogadjaj. Neispunjene obaveze su:
  552.     1.Preraditi ispitne zadatke
  553.     2.Samostalno vjezbati
  554.     Predlazemo Vam da ispunite i ostale planirane obaveze.
  555.     FIT Reminder
  556.     -------------------------------------------------------------------------
  557.     Dakle, notifikacije ce biti poslane svim studentima koji su dodali dogadjaj za 30.01.2018. godine i oznacili da zele da budu podsjecani ponovo/rekurzivno najmanje 2 dana prije samog dogadjaja (podaci se odnose na konkretan dogadjaj: Ispit iz PRIII)
  558.  
  559.     */
  560.     int poslato = 0;
  561.     //funkcija vraca broj poslatih podsjetnika/notifikacija
  562.     poslato = reminder.PosaljiNotifikacije(danas);
  563.     cout << "Za " << danas << " poslato ukupno " << poslato << " podsjetnika!" << endl;
  564.     poslato = reminder.PosaljiNotifikacije(sutra);
  565.     cout << "Za " << sutra << " poslato ukupno " << poslato << " podsjetnika!" << endl;
  566.  
  567. //#pragma endregion
  568.  
  569.     system("pause");
  570. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement