Advertisement
Guest User

PREror

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