Advertisement
Guest User

Untitled

a guest
Feb 17th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.37 KB | None | 0 0
  1. #include<iostream>
  2. #include<string>
  3. #include<vector>
  4. #include<regex>
  5. using namespace std;
  6. class Datum {
  7.     int *_dan, *_mjesec, *_godina;
  8. public:
  9.     Datum(int dan = 1, int mjesec = 1, int godina = 2000) {
  10.         _dan = new int(dan);
  11.         _mjesec = new int(mjesec);
  12.         _godina = new int(godina);
  13.     }
  14.     Datum(const Datum &dat) {
  15.         _dan = new int(*dat._dan);
  16.         _mjesec = new int(*dat._mjesec);
  17.         _godina = new int(*dat._godina);
  18.     }
  19.     ~Datum() {
  20.         delete _dan; _dan = nullptr;
  21.         delete _mjesec; _mjesec = nullptr;
  22.         delete _godina; _godina = nullptr;
  23.     }
  24.     void operator = (Datum &dat) {
  25.         _dan = new int(*dat._dan);
  26.         _mjesec = new int(*dat._mjesec);
  27.         _godina = new int(*dat._godina);
  28.     }
  29.     bool operator == (Datum dat) {
  30.         if (_dan == dat._dan && _mjesec == dat._mjesec && _godina == dat._godina)
  31.             return true;
  32.         else
  33.             return false;
  34.     }
  35.     friend ostream &operator<<(ostream &COUT, const Datum &obj) {
  36.         COUT << *obj._dan << " " << *obj._mjesec << " " << *obj._godina;
  37.         return COUT;
  38.     }
  39.  
  40. };
  41. class Izuzetak : public exception {
  42.     string _funkcija;
  43. public:
  44.     Izuzetak(char * text, string funkcija) :exception(text) {
  45.         _funkcija = funkcija;
  46.     }
  47. };
  48.  
  49. template <class T1, class T2>
  50. class Kolekcija {
  51.     T1 * _elementi1;
  52.     T2 * _elementi2;
  53.     int _trenutnoElemenata;
  54.     bool _omoguciDupliranjeElemenata;
  55. public:
  56.     Kolekcija(bool omoguciDupliranjeElemenata = false) {
  57.         _trenutnoElemenata = 0;
  58.         _omoguciDupliranjeElemenata = omoguciDupliranjeElemenata;
  59.         _elementi1 = nullptr;
  60.         _elementi2 = nullptr;
  61.     }
  62.     Kolekcija(const Kolekcija<T1, T2> &kol) {
  63.         _elementi1 = new T1[kol._trenutnoElemenata];
  64.         _elementi2 = new T2[kol._trenutnoElemenata];
  65.         for (int i = 0; i < kol._trenutnoElemenata; i++)
  66.         {
  67.             _elementi1[i] = kol._elementi1[i];
  68.             _elementi2[i] = kol._elementi2[i];
  69.         }
  70.         _trenutnoElemenata = kol._trenutnoElemenata;
  71.         _omoguciDupliranjeElemenata = kol._omoguciDupliranjeElemenata;
  72.     }
  73.     ~Kolekcija() {
  74.         delete[]_elementi2; _elementi2 = nullptr;
  75.         delete[]_elementi1; _elementi1 = nullptr;
  76.         _trenutnoElemenata = 0;
  77.     }
  78.     bool AddElement(T1 e1, T2 e2) {
  79.         if (!_omoguciDupliranjeElemenata) {
  80.             for (int i = 0; i < _trenutnoElemenata; i++)
  81.             {
  82.                 if (_elementi1[i] == e1 && _elementi2[i] == e2)
  83.                     return false;
  84.             }
  85.         }
  86.         T1 *temp1 = new T1[_trenutnoElemenata+1];
  87.         T2 *temp2 = new T2[_trenutnoElemenata+1];
  88.         for (int i = 0; i < _trenutnoElemenata; i++)
  89.         {
  90.             temp1[i] = _elementi1[i];
  91.             temp2[i] = _elementi2[i];
  92.         }
  93.         temp1[_trenutnoElemenata] = e1;
  94.         temp2[_trenutnoElemenata] = e2;
  95.         delete[] _elementi1;
  96.         delete[] _elementi2;
  97.         _elementi1 = temp1;
  98.         _elementi2 = temp2;
  99.         _trenutnoElemenata++;
  100.         return true;
  101.     }
  102.     bool RemoveElement(T1 e1) {
  103.         T1 *temp1 = new T1[_trenutnoElemenata];
  104.         T2 *temp2 = new T2[_trenutnoElemenata];
  105.         for (int i = 0; i < _trenutnoElemenata; i++)
  106.         {
  107.             if (_elementi1[i] == e1) {
  108.                 for (int j = 0; j < _trenutnoElemenata; j++)
  109.                 {
  110.                     if (i > j) {
  111.                         temp1[j] = _elementi1[j];
  112.                         temp2[j] = _elementi2[j];
  113.                     }
  114.                     if (i < j) {
  115.                         temp1[j-1] = _elementi1[j];
  116.                         temp2[j-1] = _elementi2[j];
  117.                     }
  118.                 }
  119.                 delete[] _elementi1;
  120.                 delete[] _elementi2;
  121.                 _elementi1 = temp1;
  122.                 _elementi2 = temp2;
  123.                 _trenutnoElemenata--;
  124.                 return true;
  125.             }
  126.            
  127.         }
  128.         return false;
  129.     }
  130.     int GetTrenutno() const { return _trenutnoElemenata; }
  131.     T1& GetElement1(int lokacija) const
  132.     {
  133.         if (lokacija < 0 || lokacija >= _trenutnoElemenata)
  134.             throw Izuzetak("Nepostojeca lokacija", __FUNCTION__);
  135.         return _elementi1[lokacija];
  136.     }
  137.  
  138.     T2& GetElement2(int lokacija) const
  139.     {
  140.         if (lokacija < 0 || lokacija >= _trenutnoElemenata)
  141.             throw Izuzetak("Nepostojeca lokacija", __FUNCTION__);
  142.         return _elementi2[lokacija];
  143.     }
  144.  
  145.     void operator = (Kolekcija<T1, T2> &kol) {
  146.         _elementi1 = new T1[kol._trenutnoElemenata];
  147.         _elementi2 = new T2[kol._trenutnoElemenata];
  148.         for (int i = 0; i < kol._trenutnoElemenata; i++)
  149.         {
  150.             _elementi1[i] = kol._elementi1[i];
  151.             _elementi2[i] = kol._elementi2[i];
  152.         }
  153.         _trenutnoElemenata = kol._trenutnoElemenata;
  154.         _omoguciDupliranjeElemenata = kol._omoguciDupliranjeElemenata;
  155.     }
  156.     friend ostream &operator<<(ostream &COUT, const Kolekcija &obj) {
  157.         for (size_t i = 0; i < obj.GetTrenutno(); i++)
  158.             COUT << obj._elementi1[i] << " " << obj._elementi2[i] << endl;
  159.         return COUT;
  160.     }
  161. };
  162.  
  163. class Dogadjaj
  164. {
  165.     Datum _datumOdrzavanja;
  166.     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)
  167.  
  168.     char *_naziv;
  169.     int _notificirajPrije; //oznacava broj dana prije samog dogadjaja kada ce krenuti notifikacija/podsjetnik
  170.     bool _rekurzivnaNotifikacija; //ako je vrijednost true onda se korisnik notificira svaki dan do _datumaOdrzavanja dogadjaja, a pocevsi prije dogadjaja za _brojDanaZaNotifikaciju
  171.  
  172. public:
  173.     Dogadjaj(Datum datumOdrzavanja, const char *naziv, int brojDana = 1,
  174.         bool rekurzivnaNotifikacija = false) : _datumOdrzavanja(datumOdrzavanja)
  175.     {
  176.         _naziv = new char[strlen(naziv) + 1];
  177.         strcpy_s(_naziv, strlen(naziv) + 1, naziv);
  178.  
  179.         _notificirajPrije = brojDana;
  180.         _rekurzivnaNotifikacija = rekurzivnaNotifikacija;
  181.         _obaveze = new Kolekcija<string, bool>;
  182. //      _obaveze = nullptr;
  183.     }
  184.  
  185.     Dogadjaj(const Dogadjaj &obj) : _datumOdrzavanja(obj._datumOdrzavanja)
  186.     {
  187.         _naziv = new char[strlen(obj._naziv) + 1];
  188.         strcpy_s(_naziv, strlen(obj._naziv) + 1, obj._naziv);
  189.  
  190.         _notificirajPrije = obj._notificirajPrije;
  191.         _rekurzivnaNotifikacija = obj._rekurzivnaNotifikacija;
  192.     //  _obaveze = new Kolekcija<string, bool>;
  193.         _obaveze = obj._obaveze;
  194.     }
  195.     ~Dogadjaj()
  196.     {
  197.         delete[] _naziv;
  198.         _naziv = nullptr;
  199.         delete _obaveze;
  200.         _obaveze = nullptr;
  201.     }
  202.     bool AddObavezu(string obaveza) {
  203.         for (int i = 0; i < _obaveze->GetTrenutno(); i++)
  204.         {
  205.             if (_obaveze->GetElement1(i) == obaveza)
  206.                 return false;
  207.         }
  208.         _obaveze->AddElement(obaveza, false);
  209.     }
  210.     char *GetNaziv() { return _naziv; }
  211.     Kolekcija<string, bool> *GetObaveze() { return _obaveze; }
  212.     bool operator == (Dogadjaj dog) {
  213.         if (_naziv == dog._naziv && _datumOdrzavanja == dog._datumOdrzavanja)
  214.             return true;
  215.         else return false;
  216.     }
  217. };
  218.  
  219. class Student
  220. {
  221.     int _indeks;
  222.     string _imePrezime;
  223.     vector<Dogadjaj> _dogadjaji;
  224. public:
  225.  
  226.     Student(int indeks, string imePrezime) : _indeks(indeks), _imePrezime(imePrezime) {}
  227.  
  228.     int GetIndeks() const { return _indeks; }
  229.  
  230.     vector<Dogadjaj>& GetDogadjaji() { return _dogadjaji; }
  231.  
  232.  
  233.     bool AddDogadjaj(Dogadjaj &dog) {
  234.         for (int i = 0; i < _dogadjaji.size(); i++)
  235.         {
  236.             if (_dogadjaji[i] == dog) {
  237.                 return false;
  238.             }
  239.         }
  240.             _dogadjaji.push_back(dog);
  241.             return true;
  242.     }
  243.  
  244.  
  245.     friend ostream &operator<<(ostream &COUT, const Student &obj)
  246.     {
  247.         COUT << obj._imePrezime << " (" << obj._indeks << ")" << endl;
  248.         return COUT;
  249.     }
  250. };
  251.  
  252. class DLWMSReminder
  253. {
  254.     vector<Student> _reminiderList;
  255. };
  256.  
  257. void main() {
  258.  
  259.     /**************************************************************************
  260.     1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  261.     2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR CE BITI OZNACENO KAO "RE"
  262.     3. SPASAVAJTE PROJEKAT KAKO BI SE SPRIJECILO GUBLJENJE URADJENOG ZADATKA
  263.     4. PROGRAMSKI CODE SE TAKODJER NALAZI U FAJLU CODE_ParcijalniII.TXT
  264.     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.
  265.     ****************************************************************************/
  266.     char* crt = "\n/**************************************************************************/\n";
  267. #pragma region Datum
  268.  
  269.     Datum danas(28, 1, 2018), sutra(29, 1, 2018);
  270.     Datum datumIspitaPRIII(30, 1, 2018), datumIspitBPII(31, 1, 2018);
  271.     Datum prekosutra(danas);
  272.     prekosutra = danas;
  273.     cout << danas << endl
  274.         << sutra << endl
  275.         << prekosutra << crt;
  276.  
  277. #pragma endregion
  278.  
  279. #pragma region Kolekcija
  280.  
  281.     /*
  282.     AddElement :: omogucava dodavanje novog elementa u kolekciju. Ukoliko je moguce, osigurati automatsko prosiranje kolekcije prilikom dodavanja svakog novog elementa, te onemoguciti ponavljanje elemenata
  283.     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
  284.     */
  285.     const int brElemenata = 10;
  286.     Kolekcija<int, float> kolekcija1;
  287.     for (size_t i = 0; i < brElemenata; i++)
  288.         if (!kolekcija1.AddElement(i, i + (0.6 * i)))
  289.             cout << "Elementi " << i << " i " << i + (0.6 * i) << " nisu dodati u kolekciju" << endl;
  290.  
  291.     cout << kolekcija1.GetElement1(0) << " " << kolekcija1.GetElement2(0) << endl;
  292.     cout << kolekcija1 << endl;
  293.  
  294.     kolekcija1.RemoveElement(1);
  295.  
  296.     Kolekcija<int, float> kolekcija2;
  297.     kolekcija2 = kolekcija1;
  298.     cout << kolekcija2 << crt;
  299.  
  300.     if (kolekcija1.GetTrenutno() == kolekcija2.GetTrenutno())
  301.         cout << "ISTI BROJ ELEMENATA" << endl;
  302.  
  303.     Kolekcija<int, float> kolekcija3(kolekcija2);
  304.     cout << kolekcija3 << crt;
  305.  
  306. #pragma endregion
  307.  
  308. #pragma region Dogadjaj
  309.  
  310.     Dogadjaj ispitPRIII(datumIspitaPRIII, "Ispit iz PRIII", 5, true),
  311.         ispitBPII(datumIspitBPII, "Ispit iz BPII", 7, true);
  312.     ///*po vlasitom izboru definisati listu zabranjenih rijeci koje ce onemoguciti dodavanje odredjene obaveze. Prilikom provjere koristiti regex*/
  313.     if (ispitPRIII.AddObavezu("Preraditi pdf materijale"))cout << "Obaveza dodana!" << endl;
  314.     //onemoguciti dupliranje obaveza
  315.     if (!ispitPRIII.AddObavezu("Preraditi pdf materijale"))cout << "Obaveza nije dodana!" << endl;
  316.     if (ispitPRIII.AddObavezu("Pregledati video materijale"))cout << "Obaveza dodana!" << endl;
  317.     if (ispitPRIII.AddObavezu("Preraditi ispitne zadatke"))cout << "Obaveza dodana!" << endl;
  318.     if (ispitPRIII.AddObavezu("Samostalno vjezbati"))cout << "Obaveza dodana!" << endl;
  319.  
  320.     if (ispitBPII.AddObavezu("Preraditi knjigu SQL za 24 h"))cout << "Obaveza dodana!" << endl;
  321.     if (ispitBPII.AddObavezu("Pregledati video materijale"))cout << "Obaveza dodana!" << endl;
  322.     if (ispitBPII.AddObavezu("Napraviti bazu za konkretnu aplikaciju"))cout << "Obaveza dodana!" << endl;
  323.  
  324.     Student jasmin(150051, "Jasmin Azemovic"), adel(160061, "Adel Handzic");
  325.  
  326.     if (jasmin.AddDogadjaj(ispitPRIII) && jasmin.AddDogadjaj(ispitBPII))
  327.         cout << "Dogadjaj uspjesno dodan!" << endl;
  328.  
  329.     if (adel.AddDogadjaj(ispitPRIII) && adel.AddDogadjaj(ispitBPII))
  330.         cout << "Dogadjaj uspjesno dodan!" << endl;
  331.     //onemoguciti dupliranje dogadjaja
  332.     if (!adel.AddDogadjaj(ispitPRIII))
  333.         cout << "Dogadjaj nije uspjesno dodan!" << endl;
  334.  
  335.     //DLWMSReminder reminder;
  336.  
  337.     //try
  338.     //{
  339.     //  reminder.AddStudent(jasmin);
  340.     //  reminder.AddStudent(adel);
  341.     //  //u slucaju dupliranja studenata funkcija baca izuzetak tipa Izuzetak
  342.     //  reminder.AddStudent(jasmin);
  343.     //}
  344.     //catch (exception &err)
  345.     //{
  346.     //  //ispisati sve informacije o nastalom izuzetku
  347.     //}
  348.  
  349.     ////da bi bila oznacena kao zavrsena, obaveza mora postojati i mora biti oznacena kao nezavrsena (false)
  350.     //if (reminder.OznaciObavezuKaoZavrsenu(150051, "Ispit iz PRIII", "Pregledati video materijale"))
  351.     //  cout << "Obaveza oznacena kao zavrsena" << endl;
  352.  
  353.     ///*metodi PosaljiNotifikacije se salje trenutni datum na osnovu cega ona pretrazuje sve studente koje treba podsjetiti/notoficirati o dogadjajima koji se priblizavaju.
  354.     //Koristeci multithread-ing, svim studentima se salju notifikacije sa sljedecim sadrzajem:
  355.     //-------------------------------------------------------------------------
  356.     //Postovani Jasmin Azemovic,
  357.     //Dogadjaj Ispit iz PRIII je zakazan za 3 dana, a do sada ste obavili 56% obaveza vezanih za ovaj dogadjaj. Neispunjene obaveze su:
  358.     //1.Preraditi ispitne zadatke
  359.     //2.Samostalno vjezbati
  360.     //Predlazemo Vam da ispunite i ostale planirane obaveze.
  361.     //FIT Reminder
  362.     //-------------------------------------------------------------------------
  363.     //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)
  364.  
  365.     //*/
  366.     //int poslato = 0;
  367.     ////funkcija vraca broj poslatih podsjetnika/notifikacija
  368.     //poslato = reminder.PosaljiNotifikacije(danas);
  369.     //cout << "Za " << danas << " poslato ukupno " << poslato << " podsjetnika!" << endl;
  370.     //poslato = reminder.PosaljiNotifikacije(sutra);
  371.     //cout << "Za " << sutra << " poslato ukupno " << poslato << " podsjetnika!" << endl;
  372.  
  373. //#pragma endregion
  374.  
  375.     system("pause");
  376. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement