Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <iostream>
- #include <vector>
- #include <string>
- #include <regex>
- #include <mutex>
- #include <thread>
- using namespace std;
- char crt[] = "\n=======================================================\n";
- mutex cuvarResursa;
- bool GodinaPrestupna(int godina)
- {
- return (godina % 400 == 0 || godina % 100 != 0) && godina % 4 == 0;
- }
- class Datum {
- int *_dan, *_mjesec, *_godina;
- public:
- Datum(int dan = 1, int mjesec = 1, int godina = 2000) {
- _dan = new int(dan);
- _mjesec = new int(mjesec);
- _godina = new int(godina);
- }
- Datum(const Datum &dat) {
- _dan = new int(*dat._dan);
- _mjesec = new int(*dat._mjesec);
- _godina = new int(*dat._godina);
- }
- Datum& operator=(const Datum& other)
- {
- if (this != &other)
- {
- *_dan = *other._dan;
- *_mjesec = *other._mjesec;
- *_godina = *other._godina;
- }
- return *this;
- }
- ~Datum() {
- delete _dan; _dan = nullptr;
- delete _mjesec; _mjesec = nullptr;
- delete _godina; _godina = nullptr;
- }
- int GetBrojDana()
- {
- int daniUMjesecima[12] = { 31, 28 + GodinaPrestupna(*_godina), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
- int sumaDana = *_dan;
- for (int i = *_mjesec - 2; i >= 0 ; i--)
- sumaDana += daniUMjesecima[i];
- for (int i = *_godina - 1; i >= 2005; i--)
- sumaDana += GodinaPrestupna(i) ? 366 : 365;
- return sumaDana;
- }
- int RazlikaUDanima(Datum d2)
- {
- return abs(GetBrojDana() - d2.GetBrojDana());
- }
- friend ostream &operator<<(ostream &COUT, const Datum &obj) {
- COUT << *obj._dan << " " << *obj._mjesec << " " << *obj._godina;
- return COUT;
- }
- };
- class Izuzetak : public exception {
- string _tekst; // dodato jer se prosljeduje pri bacanju izuzetaka
- string _funkcija;
- public:
- Izuzetak(string tekst, string funkcija) : exception()
- {
- _tekst = tekst;
- _funkcija = funkcija;
- }
- friend ostream&operator<<(ostream &COUT, Izuzetak &obj)
- {
- COUT << "GRESKA: " << obj._tekst << " - FUNKCIJA: " << obj._funkcija << endl;
- return COUT;
- }
- };
- template <class T1, class T2>
- class Kolekcija {
- T1 * _elementi1;
- T2 * _elementi2;
- int _trenutnoElemenata;
- bool _omoguciDupliranjeElemenata;
- public:
- Kolekcija(bool omoguciDupliranjeElemenata = false) {
- _trenutnoElemenata = 0;
- _omoguciDupliranjeElemenata = omoguciDupliranjeElemenata;
- _elementi1 = nullptr;
- _elementi2 = nullptr;
- }
- ~Kolekcija() {
- delete[]_elementi2; _elementi2 = nullptr;
- delete[]_elementi1; _elementi1 = nullptr;
- _trenutnoElemenata = 0;
- }
- Kolekcija(const Kolekcija& other)
- {
- _trenutnoElemenata = other._trenutnoElemenata;
- _omoguciDupliranjeElemenata = other._omoguciDupliranjeElemenata;
- _elementi1 = new T1[_trenutnoElemenata];
- _elementi2 = new T2[_trenutnoElemenata];
- for (int i = 0; i < _trenutnoElemenata; i++)
- {
- _elementi1[i] = other._elementi1[i];
- _elementi2[i] = other._elementi2[i];
- }
- }
- Kolekcija& operator=(const Kolekcija& other)
- {
- if (this != &other)
- {
- delete[] _elementi1; delete[] _elementi2;
- _trenutnoElemenata = other._trenutnoElemenata;
- _omoguciDupliranjeElemenata = other._omoguciDupliranjeElemenata;
- _elementi1 = new T1[_trenutnoElemenata];
- _elementi2 = new T2[_trenutnoElemenata];
- for (int i = 0; i < _trenutnoElemenata; i++)
- {
- _elementi1[i] = other._elementi1[i];
- _elementi2[i] = other._elementi2[i];
- }
- }
- return *this;
- }
- bool AddElement(T1 e1, T2 e2)
- {
- if (!_omoguciDupliranjeElemenata)
- {
- for (int i = 0; i < _trenutnoElemenata; i++)
- if (_elementi1[i] == e1 && _elementi2[i] == e2)
- return false;
- }
- T1 * tempE1 = new T1[_trenutnoElemenata + 1];
- T2 * tempE2 = new T2[_trenutnoElemenata + 1];
- for (int i = 0; i < _trenutnoElemenata; i++)
- {
- tempE1[i] = _elementi1[i];
- tempE2[i] = _elementi2[i];
- }
- delete[] _elementi1; delete[] _elementi2;
- _elementi1 = tempE1;
- _elementi2 = tempE2;
- _elementi1[_trenutnoElemenata] = e1;
- _elementi2[_trenutnoElemenata++] = e2;
- return true;
- }
- bool RemoveElement(T1 e1)
- {
- int brojKojiZadovoljavajuUslov = 0;
- for (int i = 0; i < _trenutnoElemenata; i++)
- if (_elementi1[i] == e1)
- brojKojiZadovoljavajuUslov++;
- if (brojKojiZadovoljavajuUslov == 0)
- return false;
- T1 * tempE1 = new T1[_trenutnoElemenata - brojKojiZadovoljavajuUslov];
- T2 * tempE2 = new T2[_trenutnoElemenata - brojKojiZadovoljavajuUslov];
- for (int i = 0, j = 0; i < _trenutnoElemenata; i++)
- {
- if (_elementi1[i] != e1)
- {
- tempE1[j] = _elementi1[i];
- tempE2[j++] = _elementi2[i];
- }
- }
- delete[] _elementi1; delete[] _elementi2;
- _elementi1 = tempE1;
- _elementi2 = tempE2;
- _trenutnoElemenata--;
- return true;
- }
- int GetTrenutno() const { return _trenutnoElemenata; }
- T1& GetElement1(int lokacija) const
- {
- if (lokacija < 0 || lokacija >= _trenutnoElemenata)
- throw Izuzetak("Nepostojeca lokacija", __FUNCTION__);
- return _elementi1[lokacija];
- }
- T2& GetElement2(int lokacija) const
- {
- if (lokacija < 0 || lokacija >= _trenutnoElemenata)
- throw Izuzetak("Nepostojeca lokacija", __FUNCTION__);
- return _elementi2[lokacija];
- }
- void SetElement2(int lokacija, T2 value)
- {
- if (lokacija < 0 || lokacija >= _trenutnoElemenata)
- throw Izuzetak("Nepostojeca lokacija", __FUNCTION__);
- _elementi2[lokacija] = value;
- }
- friend ostream &operator<<(ostream &COUT, const Kolekcija &obj) {
- for (size_t i = 0; i < obj.GetTrenutno(); i++)
- COUT << obj._elementi1[i] << " " << obj._elementi2[i] << endl;
- return COUT;
- }
- };
- class Dogadjaj
- {
- Datum _datumOdrzavanja;
- 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)
- char *_naziv;
- int _notificirajPrije; //oznacava broj dana prije samog dogadjaja kada ce krenuti notifikacija/podsjetnik
- bool _rekurzivnaNotifikacija; //ako je vrijednost true onda se korisnik notificira svaki dan do _datumaOdrzavanja dogadjaja, a pocevsi prije dogadjaja za _brojDanaZaNotifikaciju
- public:
- Dogadjaj(Datum datumOdrzavanja, const char *naziv, int brojDana = 1,
- bool rekurzivnaNotifikacija = false) : _datumOdrzavanja(datumOdrzavanja)
- {
- _naziv = new char[strlen(naziv) + 1];
- strcpy_s(_naziv, strlen(naziv) + 1, naziv);
- _notificirajPrije = brojDana;
- _rekurzivnaNotifikacija = rekurzivnaNotifikacija;
- _obaveze = new Kolekcija<string, bool>;
- }
- Dogadjaj(const Dogadjaj &obj) : _datumOdrzavanja(obj._datumOdrzavanja)
- {
- _naziv = new char[strlen(obj._naziv) + 1];
- strcpy_s(_naziv, strlen(obj._naziv) + 1, obj._naziv);
- _notificirajPrije = obj._notificirajPrije;
- _rekurzivnaNotifikacija = obj._rekurzivnaNotifikacija;
- _obaveze = new Kolekcija<string, bool>(*obj._obaveze);
- }
- Dogadjaj& operator=(const Dogadjaj &obj)
- {
- if (this != &obj)
- {
- delete[] _obaveze; delete[] _naziv;
- _naziv = new char[strlen(obj._naziv) + 1];
- strcpy_s(_naziv, strlen(obj._naziv) + 1, obj._naziv);
- _datumOdrzavanja = obj._datumOdrzavanja;
- _notificirajPrije = obj._notificirajPrije;
- _rekurzivnaNotifikacija = obj._rekurzivnaNotifikacija;
- _obaveze = new Kolekcija<string, bool>(*obj._obaveze);
- }
- return *this;
- }
- ~Dogadjaj()
- {
- delete[] _naziv;
- _naziv = nullptr;
- delete _obaveze;
- _obaveze = nullptr;
- }
- bool AddObavezu(string obaveza)
- {
- const int brojZabranjenihRijeci = 2;
- string zabranjeneRijeci[brojZabranjenihRijeci] = { "ubiti", "rat" };
- for (int i = 0; i < brojZabranjenihRijeci; i++)
- {
- regex pravilo(zabranjeneRijeci[i]);
- if (regex_search(obaveza, pravilo))
- return false;
- }
- for (int i = 0; i < _obaveze->GetTrenutno(); i++)
- if (obaveza == _obaveze->GetElement1(i))
- return false;
- _obaveze->AddElement(obaveza, false);
- return true;
- }
- char *GetNaziv() { return _naziv; }
- Datum GetDatumOdrzavanja() { return _datumOdrzavanja; }
- int GetBrojDanaPrijeZaNotifikaciju() { return _notificirajPrije; }
- Kolekcija<string, bool> *GetObaveze() { return _obaveze; }
- };
- class Student
- {
- int _indeks;
- string _imePrezime;
- vector<Dogadjaj> _dogadjaji;
- public:
- Student(int indeks, string imePrezime) : _indeks(indeks), _imePrezime(imePrezime) {}
- int GetIndeks() const { return _indeks; }
- string GetImePrezime() const { return _imePrezime; }
- vector<Dogadjaj>& GetDogadjaji() { return _dogadjaji; }
- bool AddDogadjaj(Dogadjaj& dogadjaj)
- {
- for (int i = 0; i < _dogadjaji.size(); i++)
- if (strcmp(_dogadjaji[i].GetNaziv(), dogadjaj.GetNaziv()))
- return false;
- _dogadjaji.push_back(dogadjaj);
- return true;
- }
- friend bool operator==(Student s1, Student s2)
- {
- return s1.GetIndeks() == s2.GetIndeks();
- }
- friend ostream &operator<<(ostream &COUT, const Student &obj)
- {
- COUT << obj._imePrezime << " (" << obj._indeks << ")" << endl;
- return COUT;
- }
- };
- void Print(string imePrezimeStudenta, int brojDanaDoIspita, int procenatIspunjenihObaveza, Dogadjaj d) {
- cuvarResursa.lock();
- cout << crt;
- cout << "Postovani, " << imePrezimeStudenta << ", " << endl;
- cout << "Dogadjaj " << d.GetNaziv() << " je zakazan za " << brojDanaDoIspita << " dana, a do sada ste obavili " << procenatIspunjenihObaveza << "% obaveza vezanih za ovaj dogadjaj.Neispunjene obaveze su :" << endl;
- for (int i = 0, brojac = 1; i < d.GetObaveze()->GetTrenutno(); i++)
- {
- if (d.GetObaveze()->GetElement2(i) == false)
- {
- cout << brojac++ << ". " << d.GetObaveze()->GetElement1(i) << endl;
- }
- }
- cout << "Predlazemo Vam da ispunite i ostale planirane obaveze." << endl;
- cout << "FIT Reminder" << endl;
- cout << crt;
- this_thread::sleep_for(chrono::seconds(1));
- cuvarResursa.unlock();
- }
- class DLWMSReminder
- {
- vector<Student> _reminiderList;
- public:
- void AddStudent(Student& student)
- {
- for (int i = 0; i < _reminiderList.size(); i++)
- if (_reminiderList[i] == student)
- throw Izuzetak("Student vec postoji!", __FUNCTION__);
- _reminiderList.push_back(student);
- }
- bool OznaciObavezuKaoZavrsenu(int indeks, char * dogadjaj, string obaveza)
- {
- int indeksStudenta = -1;
- for (int i = 0; i < _reminiderList.size() && indeksStudenta == -1; i++)
- if (_reminiderList[i].GetIndeks() == indeks)
- indeksStudenta = i;
- if (indeksStudenta == -1) return false;
- int indeksDogadjaja = -1;
- int indeksObaveze = -1;
- for (int i = 0; i < _reminiderList[indeksStudenta].GetDogadjaji().size() && indeksDogadjaja == -1; i++)
- {
- char * nazivTrenutnogDogadjaja = _reminiderList[indeksStudenta].GetDogadjaji()[i].GetNaziv();
- if (strcmp(nazivTrenutnogDogadjaja, dogadjaj) == 0)
- {
- Kolekcija<string, bool> * obaveze = _reminiderList[indeksStudenta].GetDogadjaji()[i].GetObaveze();
- for (int j = 0; j < obaveze->GetTrenutno() && indeksObaveze == -1; j++)
- {
- if (_reminiderList[indeksStudenta].GetDogadjaji()[i].GetObaveze()->GetElement1(j) == obaveza)
- {
- indeksDogadjaja = i;
- indeksObaveze = j;
- }
- }
- }
- }
- if (indeksObaveze == -1) return false;
- if (_reminiderList[indeksStudenta].GetDogadjaji()[indeksDogadjaja].GetObaveze()->GetElement2(indeksObaveze))
- return false;
- _reminiderList[indeksStudenta].GetDogadjaji()[indeksDogadjaja].GetObaveze()->SetElement2(indeksObaveze, true);
- return true;
- }
- int PosaljiNotifikacije(Datum datum)
- {
- int brojPoslanihNotifikacija = 0;
- for (int i = 0; i < _reminiderList.size(); i++)
- {
- for (int j = 0; j < _reminiderList[i].GetDogadjaji().size(); j++)
- {
- int razlika = _reminiderList[i].GetDogadjaji()[j].GetDatumOdrzavanja().RazlikaUDanima(datum);
- if (razlika <= _reminiderList[i].GetDogadjaji()[j].GetBrojDanaPrijeZaNotifikaciju())
- {
- brojPoslanihNotifikacija++;
- int ukupnoObaveza = _reminiderList[i].GetDogadjaji()[j].GetObaveze()->GetTrenutno();
- int zavrseneObaveze = 0;
- for (int z = 0; z < _reminiderList[i].GetDogadjaji()[j].GetObaveze()->GetTrenutno(); z++)
- if (_reminiderList[i].GetDogadjaji()[j].GetObaveze()->GetElement2(z) == true)
- zavrseneObaveze++;
- thread printThread(&Print, _reminiderList[i].GetImePrezime(), razlika, (float)zavrseneObaveze / ukupnoObaveza * 100, ref(_reminiderList[i].GetDogadjaji()[j]));
- printThread.join();
- }
- }
- }
- return brojPoslanihNotifikacija;
- }
- };
- void main() {
- /**************************************************************************
- 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
- 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR CE BITI OZNACENO KAO "RE"
- 3. SPASAVAJTE PROJEKAT KAKO BI SE SPRIJECILO GUBLJENJE URADJENOG ZADATKA
- 4. PROGRAMSKI CODE SE TAKODJER NALAZI U FAJLU CODE_ParcijalniII.TXT
- 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.
- ****************************************************************************/
- #pragma region Datum
- Datum danas(28, 1, 2018), sutra(29, 1, 2018);
- Datum datumIspitaPRIII(30, 1, 2018), datumIspitBPII(31, 1, 2018);
- Datum prekosutra(danas);
- prekosutra = danas;
- cout << danas << endl
- << sutra << endl
- << prekosutra << crt;
- #pragma endregion
- #pragma region Kolekcija
- /*
- AddElement :: omogucava dodavanje novog elementa u kolekciju. Ukoliko je moguce, osigurati automatsko prosiranje kolekcije prilikom dodavanja svakog novog
- elementa, te onemoguciti ponavljanje elemenata
- RemoveElement :: na osnovu parametra tipa T1 uklanja elemente iz kolekcije i ukoliko je moguce smanjuje velicinu niza/kolekcije.
- Prilikom uklanjanja elemenata ocuvati redoslijed njihovog dodavanja
- */
- const int brElemenata = 10;
- Kolekcija<int, float> kolekcija1;
- for (size_t i = 0; i < brElemenata; i++)
- if (!kolekcija1.AddElement(i, i + (0.6 * i)))
- cout << "Elementi " << i << " i " << i + (0.6 * i) << " nisu dodati u kolekciju" << endl;
- cout << kolekcija1.GetElement1(0) << " " << kolekcija1.GetElement2(0) << endl;
- cout << kolekcija1 << endl;
- kolekcija1.RemoveElement(1);
- Kolekcija<int, float> kolekcija2;
- kolekcija2 = kolekcija1;
- cout << kolekcija2 << crt;
- if (kolekcija1.GetTrenutno() == kolekcija2.GetTrenutno())
- cout << "ISTI BROJ ELEMENATA" << endl;
- Kolekcija<int, float> kolekcija3(kolekcija2);
- cout << kolekcija3 << crt;
- #pragma endregion
- //#pragma region Dogadjaj
- //
- Dogadjaj ispitPRIII(datumIspitaPRIII, "Ispit iz PRIII", 5, true),
- ispitBPII(datumIspitBPII, "Ispit iz BPII", 7, true);
- /*po vlasitom izboru definisati listu zabranjenih rijeci koje ce onemoguciti dodavanje odredjene obaveze. Prilikom provjere koristiti regex*/
- if (ispitPRIII.AddObavezu("Preraditi pdf materijale"))cout << "Obaveza dodana!" << endl;
- //onemoguciti dupliranje obaveza
- if (!ispitPRIII.AddObavezu("Preraditi pdf materijale"))cout << "Obaveza nije dodana!" << endl;
- if (ispitPRIII.AddObavezu("Pregledati video materijale"))cout << "Obaveza dodana!" << endl;
- if (ispitPRIII.AddObavezu("Preraditi ispitne zadatke"))cout << "Obaveza dodana!" << endl;
- if (ispitPRIII.AddObavezu("Samostalno vjezbati"))cout << "Obaveza dodana!" << endl;
- if (ispitBPII.AddObavezu("Preraditi knjigu SQL za 24 h"))cout << "Obaveza dodana!" << endl;
- if (ispitBPII.AddObavezu("Pregledati video materijale"))cout << "Obaveza dodana!" << endl;
- if (ispitBPII.AddObavezu("Napraviti bazu za konkretnu aplikaciju"))cout << "Obaveza dodana!" << endl;
- Student jasmin(150051, "Jasmin Azemovic"), adel(160061, "Adel Handzic");
- if (jasmin.AddDogadjaj(ispitPRIII) && jasmin.AddDogadjaj(ispitBPII))
- cout << "Dogadjaj uspjesno dodan!" << endl;
- if (adel.AddDogadjaj(ispitPRIII) && adel.AddDogadjaj(ispitBPII))
- cout << "Dogadjaj uspjesno dodan!" << endl;
- //onemoguciti dupliranje dogadjaja
- if (!adel.AddDogadjaj(ispitPRIII))
- cout << "Dogadjaj nije uspjesno dodan!" << endl;
- DLWMSReminder reminder;
- try
- {
- reminder.AddStudent(jasmin);
- reminder.AddStudent(adel);
- //u slucaju dupliranja studenata funkcija baca izuzetak tipa Izuzetak
- reminder.AddStudent(jasmin);
- }
- catch (Izuzetak &err)
- {
- cout << err;
- //ispisati sve informacije o nastalom izuzetku
- }
- //da bi bila oznacena kao zavrsena, obaveza mora postojati i mora biti oznacena kao nezavrsena (false)
- if (reminder.OznaciObavezuKaoZavrsenu(150051, "Ispit iz PRIII", "Pregledati video materijale"))
- cout << "Obaveza oznacena kao zavrsena" << endl;
- /*metodi PosaljiNotifikacije se salje trenutni datum na osnovu cega ona pretrazuje sve studente koje treba podsjetiti/notoficirati o dogadjajima koji se priblizavaju.
- Koristeci multithread-ing, svim studentima se salju notifikacije sa sljedecim sadrzajem:
- -------------------------------------------------------------------------
- Postovani Jasmin Azemovic,
- Dogadjaj Ispit iz PRIII je zakazan za 3 dana, a do sada ste obavili 56% obaveza vezanih za ovaj dogadjaj. Neispunjene obaveze su:
- 1.Preraditi ispitne zadatke
- 2.Samostalno vjezbati
- Predlazemo Vam da ispunite i ostale planirane obaveze.
- FIT Reminder
- -------------------------------------------------------------------------
- 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)
- */
- int poslato = 0;
- //funkcija vraca broj poslatih podsjetnika/notifikacija
- poslato = reminder.PosaljiNotifikacije(danas);
- cout << "Za " << danas << " poslato ukupno " << poslato << " podsjetnika!" << endl;
- poslato = reminder.PosaljiNotifikacije(sutra);
- cout << "Za " << sutra << " poslato ukupno " << poslato << " podsjetnika!" << endl;
- //#pragma endregion
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement