Advertisement
AbidK

PR3 | 2017-19 ispiti for Macola

May 14th, 2019
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 59.96 KB | None | 0 0
  1. char *crt = "\n-----------------------------------------------\n";
  2.  
  3. enum Status { ZAHTJEV_ZAPRIMLJEN, ODUSTAO, ODBIJENA, IZDATA, ISTEKLA, PONISTENA };
  4. enum Sortiranje {RASTUCI, OPADAJUCI};
  5. enum Drzava {SAD, AUSTRALIJA, ENGLESKA};
  6.  
  7. class Datum {
  8. int *_dan, *_mjesec, *_godina;
  9. public:
  10. Datum(int dan = 1, int mjesec = 1, int godina = 2000) {
  11. _dan = new int(dan);
  12. _mjesec = new int(mjesec);
  13. _godina = new int(godina);
  14. }
  15. ~Datum() {
  16. delete _dan; _dan = nullptr;
  17. delete _mjesec; _mjesec = nullptr;
  18. delete _godina; _godina = nullptr;
  19. }
  20. friend ostream& operator<< (ostream &COUT, Datum &obj) {
  21. COUT << *obj._dan << "." << *obj._mjesec << "." << *obj._godina;
  22. return COUT;
  23. }  
  24. };
  25.  
  26. template<class T1, class T2, int max>
  27. class FITKolekcija {
  28. T1 * _elementi1[max];
  29. T2 * _elementi2[max];
  30. int _trenutno;
  31. public:
  32. FITKolekcija() {
  33. for (size_t i = 0; i < max; i++) {
  34. _elementi1[i] = nullptr;
  35. _elementi2[i] = nullptr;
  36. }
  37. _trenutno = 0;
  38. }
  39. ~FITKolekcija() {
  40. for (size_t i = 0; i < max; i++) {
  41. delete _elementi1[i]; _elementi1[i] = nullptr;
  42. delete _elementi2[i]; _elementi2[i] = nullptr;
  43. }
  44. }
  45. T1 ** GetT1() { return _elementi1; }
  46. T2 ** GetT2() { return _elementi2; }
  47. int GetTrenutno() { return _trenutno; }
  48.  
  49. friend ostream& operator<< (ostream &COUT, FITKolekcija &obj) {
  50. for (size_t i = 0; i < obj._trenutno; i++)
  51. COUT << *obj._elementi1[i] << " " << *obj._elementi2[i] << endl;
  52. return COUT;
  53. }  
  54. };
  55.  
  56.  
  57. class Viza {
  58. protected:
  59. Drzava _drzava;
  60. Datum _vazenjeOD;
  61. Datum _vazenjeDO;
  62. char * _napomena;
  63. // string se odnosi na razlog promjene statusa, a moguće je samo 10 izmjena statusa
  64. FITKolekcija<Status, string, 10> _statusi;
  65. public:
  66. Viza(Drzava drzava, Datum _OD, Datum _DO, char * napomena = nullptr) :_vazenjeDO(_DO), _vazenjeOD(_OD)
  67. {
  68. if (napomena != nullptr) {
  69. _napomena = new char[strlen(napomena) + 1];
  70. strcpy_s(_napomena, strlen(napomena) + 1, napomena);
  71. }
  72. else
  73. _napomena = nullptr;
  74. _drzava = drzava;
  75. }
  76. ~Viza() { delete[] _napomena; _napomena = nullptr; }   
  77. Datum GetVazenjeOD() { return _vazenjeOD; }
  78. Datum GetVazenjeDO() { return _vazenjeDO; }
  79. char * GetNapomena() { return _napomena; }
  80. FITKolekcija<Status, string, 10> & GetStatuse() { return _statusi; }
  81. virtual void Info() = 0;
  82. };
  83.  
  84. class PoslovnaViza :public Viza {
  85. string _kompanija; //naziv kompanije koja potvrđuje da posluje sa aplikantom
  86. public:
  87. PoslovnaViza(Drzava drzava, Datum _OD, Datum _DO, string kompanija, char * napomena = nullptr) : Viza(drzava,_OD, _DO, napomena) {
  88. _kompanija = kompanija;
  89. }
  90. friend ostream & operator << (ostream & COUT, PoslovnaViza & obj) {
  91. COUT << obj._drzava << " " << obj._vazenjeOD << " " << obj._vazenjeDO << " " << obj._kompanija << endl;
  92. COUT<< ((obj._napomena!=nullptr)? obj._napomena: "") << endl;
  93. COUT << "STATUSI -> " << obj._statusi << endl;
  94. return COUT;
  95.  
  96. }
  97.  
  98. };
  99. class TuristickaViza : public Viza {
  100. string _adresa; //adresa hotele ili drugog smještaja na kojoj će aplikant boraviti
  101. public:
  102. TuristickaViza(Drzava drzava, Datum _OD, Datum _DO, string adresa, char * napomena = nullptr) : Viza(drzava,_OD, _DO, napomena) {
  103. _adresa = adresa;
  104. }
  105. friend ostream & operator << (ostream & COUT, TuristickaViza & obj) {
  106. COUT << obj._drzava << " " << obj._vazenjeOD << " " << obj._vazenjeDO << " " << obj._adresa << endl;
  107. COUT << ((obj._napomena != nullptr) ? obj._napomena : "") << endl;
  108. COUT << "STATUSI -> " << obj._statusi << endl;
  109. return COUT;
  110.  
  111. }  
  112. };
  113.  
  114. class Aplikant {
  115. char * _imePrezime;
  116. Datum * _datumRodjenja;
  117. char * _brojPasosa;
  118. vector<Viza *> _vize;
  119. public:
  120. Aplikant(char * imePrezime, Datum datumRodjenja, char * brPasosa) {
  121. int vel = strlen(imePrezime) + 1;
  122. _imePrezime = new char[vel];
  123. strcpy_s(_imePrezime, vel, imePrezime);
  124. vel = strlen(brPasosa) + 1;
  125. _brojPasosa = new char[vel];
  126. strcpy_s(_brojPasosa, vel, brPasosa);
  127. _datumRodjenja = new Datum(datumRodjenja);
  128. }
  129. ~Aplikant() {
  130. delete[]_imePrezime; _imePrezime = nullptr;
  131. delete[]_brojPasosa; _brojPasosa = nullptr;
  132. delete _datumRodjenja; _datumRodjenja = nullptr;
  133. for (size_t i = 0; i < _vize.size(); i++)
  134. {
  135. delete _vize[i]; _vize[i] = nullptr;
  136. }
  137. }
  138. friend ostream & operator << (ostream & COUT, Aplikant & obj) {
  139. COUT << obj._imePrezime << " " << obj._datumRodjenja << " " << obj._brojPasosa << endl;
  140. COUT << "VIZE -> " << endl;
  141. for (size_t i = 0; i < obj._vize.size(); i++)  
  142. COUT<< obj._vize[i] << endl;   
  143. return COUT;
  144. }
  145.  
  146. vector<Viza * > GetVize() { return _vize; }
  147. };
  148.  
  149. void main() {
  150.  
  151. /****************************************************************************
  152. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  153. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ĆE BITI OZNACENO KAO "RE"
  154. 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEČILO GUBLJENJE URAĐENOG ZADATKA
  155. 4. PROGRAMSKI CODE SE TAKOĐER NALAZI U FAJLU CODE.TXT
  156. 5. 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.
  157. 6. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNAČENO.
  158. ****************************************************************************/
  159.  
  160.  
  161.  
  162. Datum danas(15, 2, 2017);
  163. Datum sutra(++danas); // inkrementiranjem se uvecava dan za 1
  164. Datum prekosutra;
  165. Datum dat15022017(15, 2, 2017), dat18082017(18, 8, 2017), dat11052018(11, 5, 2018), dat11122017(11, 12, 2017);
  166.  
  167.  
  168. prekosutra = danas;
  169. if (prekosutra == danas)
  170. cout << "Datumi su jednaki" << endl;
  171. cout << danas << endl << sutra << endl << prekosutra << crt;
  172.  
  173. int v6 = 6, v13 = 13, v32 = 32, v63 = 63, v98 = 98, v109 = 109, v196 = 196;
  174.  
  175. FITKolekcija<int, int, 7> brojevi;
  176. brojevi.Dodaj(v196, v6);
  177. brojevi.Dodaj(v13, v32);
  178. brojevi.Dodaj(v98, v196);
  179. brojevi.Dodaj(v63, v13);
  180. brojevi.Dodaj(v98, v196);
  181. brojevi.Dodaj(v196, v6);
  182.  
  183. cout << brojevi << crt;
  184. //NA KOJI NAČIN ĆE SE VRŠITI SORTIRANJE PRVENSTVENO ZAVISI OD VRIJEDNOSTI PARAMETRA, A VRŠI SE NA OSNOVU VRIJEDNOSTI TIPA T1
  185. brojevi.Sortiraj(RASTUCI);
  186. cout << brojevi << crt;
  187. brojevi.Sortiraj(OPADAJUCI);
  188. cout << brojevi << crt;
  189.  
  190. try
  191. {
  192. //U SLUČAJU PREKORAČENJA DEFINISANE VELIČINE KOLEKCIJE, POTREBNO JE BACITI IZUZETAK
  193. brojevi.Dodaj(v13, v196);
  194. }
  195. catch (exception & err)
  196. {
  197. cout << "Error -> " << err.what() << endl;
  198. }
  199.  
  200. Aplikant jasmin ("Jasmin Azemovic", Datum(15, 5, 1979), "BS6985645");  
  201. PoslovnaViza poslovna (SAD, dat15022017, dat18082017, "Microsoft");
  202.  
  203. /*
  204. NOVA VIZA SE NE MOŽE DODATI UKOLIKO:
  205. -   JE APLIKANT MLAĐI OD 10 GODINA
  206. -   U TOM PERIODU (ODNOSI SE NA PERIOD VIZE OD - DO) NE POSTOJI VAŽEĆA (POJAM VAŽEĆA PODRAZUMIJEVA DA JE POSLJEDNJI STATUS VIZE BIO IZDATA TJ. DA VIZA NIJE PONIŠTENA ILI ISTEKLA) VIZA ZA TU DRŽAVU, BEZ OBZIRA NA NJENU VRSTU. 
  207. -   JE NEKA OD RANIJIH VIZA PONIŠTENA (OVO SE ODNOSI SAMO NA VIZE ZA DRŽAVU: SAD)
  208. */
  209. if (jasmin.DodajVizu(&poslovna))
  210. cout << "Podaci o vizi uspješno zaprimljeni" << endl;
  211. /*
  212. STATUSI SE MOGU DODAVATI SAMO U REDOSLIJEDU U KOJEM SE NALAZE U ENUMERACIJI NPR.
  213. -   NIJE MOGUĆE ODBITI VIZU AKO PRETHODNO NIJE IMALA STATUS DA JE ZAHTJEV_ZAPRIMLJEN;
  214. -   NIJE MOGUĆE PONIŠTITI VIZU KOJA PRETHODNO NIJE IZDATA
  215. */
  216. if (jasmin.DodajStatus(&poslovna, ZAHTJEV_ZAPRIMLJEN, "provjeriti navode sa predstavnicima kompanije Microsoft"))
  217. cout << "Status vize uspijesno promijenjen" << endl;
  218. else
  219. cout << "Aplikant " << jasmin << " ne posjeduje evidentiranu trazenu vizu ili status vize nema odgovarajucu vrijednost" << endl;
  220.  
  221.  
  222. if (jasmin.DodajStatus(&poslovna, PONISTENA, "predstavnicima kompanije Microsoft nemaju informaciju o posjeti navedenog aplikanta"))
  223. cout << "Status vize uspijesno promijenjen" << endl;
  224. else
  225. cout << "Aplikant " << jasmin << " ne posjeduje evidentiranu trazenu vizu ili status vize nema odgovarajucu vrijednost" << endl;
  226.  
  227. TuristickaViza turisticka (ENGLESKA, dat18082017, dat11122017, "Whitehall Pl, London SW1A 2BD, UK");
  228.  
  229. if (jasmin.DodajStatus(&turisticka, ZAHTJEV_ZAPRIMLJEN))
  230. cout << "Status vize uspijesno promijenjen" << endl;
  231. else
  232. cout << "Aplikant " << jasmin << " ne posjeduje evidentiranu trazenu vizu ili status vize nema odgovarajucu vrijednost" << endl;
  233.  
  234. if (jasmin.DodajStatus(&turisticka, IZDATA)){
  235. cout << "Status vize uspijesno promijenjen" << endl;
  236. //U ZASEBNOJ NITI URADITI PRINTANJE VIZE...KORISTITI METODU SLEEP_FOR
  237. jasmin.PrintajVizu(&turisticka);
  238. }
  239. else
  240. cout << "Aplikant " << jasmin << " ne posjeduje evidentiranu trazenu vizu ili status vize nema odgovarajucu vrijednost" << endl;
  241. //VRAĆA PODATKE O SVIM VIZAMA KOJE SU IZDATE ZA ODREĐENU DRŽAVU, A KOJE SU IMALE ODREĐENI STATUS
  242. vector<Viza *> jasminVize = jasmin.GetVizeByDrzava(SAD, PONISTENA);
  243.  
  244. //UNUTAR NAPOMENE MIJENJA SADRŽAJ "nemaju informaciju" SA "su upoznti sa" - KORISTITI REGEX
  245. jasmin.ZamijeniRijec("nemaju informaciju", "su upoznti sa");
  246.  
  247. }
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264. #include<iostream>
  265. #include<string>
  266. using namespace std;
  267.  
  268. char *crt = "\n-------------------------------------------\n";
  269. enum stringFormat { DDMMGG, DDMMGGGG, DDMMGGSSMM, DDMMGGGGSSMM };
  270. enum prikazPoruka { SVE_PORUKE, SAKRIJ_POBRISANE, PRIKAZI_SAMO_POBRISANE };
  271. vector<string> nedozvoljeneRijeci;
  272. /*
  273. DDMMGG - 29.8.17
  274. DDMMGGGG - 29.8.2017
  275. DDMMGGGGSSMM - 29.8.2017 10:15
  276. */
  277.  
  278. template<class T1, class T2>
  279. class Kolekcija {
  280. T1 * _elementi1;
  281. T2 * _elementi2;
  282. int * _trenutno;
  283. public:
  284. Kolekcija()
  285. {
  286. _elementi1 = nullptr;
  287. _elementi2 = nullptr;
  288. _trenutno = new int(0);
  289. }
  290.  
  291. Kolekcija & operator=(Kolekcija<T1, T2> & orig)
  292. {
  293. if (this != &orig)
  294. {
  295. delete[]_elementi1;
  296. delete[]_elementi2;
  297.  
  298. _elementi1 = new T1[*orig._trenutno];
  299. _elementi2 = new T2[*orig._trenutno];
  300. *_trenutno = *orig._trenutno;
  301.  
  302. for (int i = 0; i < *_trenutno; i++)
  303. {
  304. _elementi1[i] = orig._elementi1[i];
  305. _elementi2[i] = orig._elementi2[i];
  306. }
  307. }
  308. return *this;
  309. }
  310.  
  311. bool AddElement(T1 elem1, T2 elem2)
  312. {
  313. T1 * temp1 = new T1[*_trenutno + 1];
  314. T2 * temp2 = new T2[*_trenutno + 1];
  315.  
  316. for (int i = 0; i < *_trenutno; i++) {
  317. temp1[i] = _elementi1[i];
  318. temp2[i] = _elementi2[i];
  319. }
  320.  
  321. delete[] _elementi1;
  322. delete[] _elementi2;
  323.  
  324. _elementi1 = temp1;
  325. _elementi2 = temp2;
  326.  
  327. _elementi1[*_trenutno] = elem1;
  328. _elementi2[*_trenutno] = elem2;
  329. (*_trenutno)++;
  330. return true;
  331. }
  332. ~Kolekcija()
  333. {
  334. delete[]_elementi1; _elementi1 = nullptr;
  335. delete[]_elementi2; _elementi2 = nullptr;
  336. delete _trenutno; _trenutno = nullptr;
  337. }
  338.  
  339. T1 * getElementi1Pok() { return _elementi1; }
  340. T2 * getElementi2Pok() { return _elementi2; }
  341. T1 & getElement1(int lokacija) { return _elementi1[lokacija]; }
  342. T2 & getElement2(int lokacija) { return _elementi2[lokacija]; }
  343. int getTrenutno() { return *_trenutno; }
  344.  
  345. friend ostream & operator<<(ostream & COUT, Kolekcija<T1, T2> & obj)
  346. {
  347. for (size_t i = 0; i < *obj._trenutno; i++)
  348. {
  349. COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
  350. }
  351. return COUT;
  352. }
  353. };
  354. class DatumVrijeme {
  355. int *_dan, *_mjesec, *_godina, *_sati, *_minuti;
  356. public:
  357. DatumVrijeme(int dan = 1, int mjesec = 1, int godina = 2000, int sati = 0, int minuti = 0) {
  358. _dan = new int(dan);
  359. _mjesec = new int(mjesec);
  360. _godina = new int(godina);
  361. _sati = new int(sati);
  362. _minuti = new int(minuti);
  363. }  
  364. ~DatumVrijeme() {
  365. delete _dan; _dan = nullptr;
  366. delete _mjesec; _mjesec = nullptr;
  367. delete _godina; _godina = nullptr;
  368. delete _sati; _sati = nullptr;
  369. delete _minuti; _minuti = nullptr;
  370. }
  371. friend ostream & operator<< (ostream & COUT, DatumVrijeme & obj) {
  372. COUT << *obj._dan << "." << *obj._mjesec << "." << *obj._godina << " " << *obj._sati << ":" << *obj._minuti << endl;
  373. return COUT;
  374. }
  375. };
  376. class Poruka {
  377. string _posiljalac;
  378. string _primalac;
  379. string _sadrzaj;
  380. DatumVrijeme _vrijeme;
  381. public:
  382. Poruka(string posiljalac, string primalac, string sadrzaj, DatumVrijeme vrijeme) :_vrijeme(vrijeme)
  383. {
  384. _posiljalac = posiljalac;
  385. _primalac = primalac;
  386. _sadrzaj = sadrzaj;
  387. }  
  388. friend ostream & operator<< (ostream & COUT, Poruka & obj) {
  389. COUT << "(" << obj._vrijeme << ") " << obj._posiljalac << " -> ";
  390. COUT << obj._sadrzaj;
  391. return COUT;
  392. }
  393. string getPrimalac() { return _primalac; }
  394. string getPosiljalac() { return _posiljalac; }
  395. string getSadrzaj() { return _sadrzaj; }
  396. };
  397. class Komunikacija {
  398. string _naslov;
  399. int _ocjena; //ocjena komunikacije 1 - 5 se automatski izracunava
  400. Kolekcija<Poruka, bool> _poruke;//bool se odnosi na podatak da li je poruka pobrisana tj. nece biti vidljiva u prikazu ukoliko se drugacije ne navede
  401. public:
  402. Komunikacija(string naslov) {
  403. _naslov = naslov;
  404. _ocjena = -1;
  405. }
  406. friend ostream & operator<< (ostream & COUT, Komunikacija & obj) {
  407. COUT << "(" << obj._ocjena << ") " << obj._nazivGrupre << " -> ";
  408. for (size_t i = 0; i < obj._poruke.size(); i++)
  409. {
  410. COUT << obj._poruke[i] << endl;
  411. }
  412. return COUT;
  413. }
  414. Kolekcija<Poruka, bool> * getPoruke() { return &_poruke; }
  415. int getOcjena() { return _ocjena; }
  416. string getNaslov() { return _naslov; }
  417. };
  418.  
  419. class Korisnik {
  420. string _korisnickoIme;
  421. char * _imePrezime;
  422. //char * - se odnosi na naziv predmeta ili tema gdje će se čuvati kompletna komunikacija sa nastavnim osobljem ili korisnikom na određenom predmetu/temi
  423. Kolekcija<char *, Komunikacija> _komunikacija;
  424. public:
  425. Korisnik(char * korisnickoIme, char * imePrezime)
  426. {
  427. int vel = strlen(imePrezime) + 1;
  428. _imePrezime = new char[vel];
  429. strcpy_s(_imePrezime, vel, imePrezime);
  430. _korisnickoIme = korisnickoIme;
  431. }
  432. Korisnik(Korisnik & original) :_komunikacija(original._komunikacija)
  433. {
  434. int vel = strlen(original._imePrezime) + 1;
  435. _imePrezime = new char[vel];
  436. strcpy_s(_imePrezime, vel, original._imePrezime);
  437. _korisnickoIme = original._korisnickoIme;
  438. }
  439.  
  440. ~Korisnik()
  441. {
  442. delete[] _imePrezime; _imePrezime = nullptr;
  443. }
  444. friend ostream & operator<< (ostream &COUT, Korisnik &obj)
  445. {
  446. COUT << obj._imePrezime << endl << obj._komunikacija << endl;
  447. return COUT;
  448. }
  449. Kolekcija<char*, Komunikacija> * GetKomunikacija() { return &_komunikacija; }
  450. string getKorisnickoIme() { return _korisnickoIme; }
  451. };
  452. void main()
  453. {
  454.  
  455. /****************************************************************************
  456. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  457. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ĆE BITI OZNACENO KAO "RE"
  458. 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEČILO GUBLJENJE URAĐENOG ZADATKA
  459. 4. PROGRAMSKI CODE SE TAKOĐER NALAZI U FAJLU CODE.TXT
  460. 5. 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.
  461. 6. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNAČENO.
  462. ****************************************************************************/
  463.  
  464.  
  465. /*riječi koje su zabranjene u komunikaciji*/
  466. nedozvoljeneRijeci.push_back("ubiti");
  467. nedozvoljeneRijeci.push_back("mrzim");
  468. nedozvoljeneRijeci.push_back("rat");
  469.  
  470. DatumVrijeme temp,
  471. datum19062017_1015(19, 6, 2017, 10, 15),
  472. datum19062017_1020(19, 6, 2017, 10, 20),
  473. datum19062017_1021(19, 6, 2017, 10, 21),
  474. datum19062017_1030(19, 6, 2017, 10, 30);
  475.  
  476. cout << datum19062017_1015.ToString(DDMMGGGG) << endl;//vraca string: 19.6.2017
  477. cout << datum19062017_1015.ToString(DDMMGGGGSSMM) << endl;//vraca string: 19.6.2017 10:15
  478.  
  479.  
  480. const int max = 3;
  481. Korisnik * korisnici[max];
  482. korisnici[0] = new Korisnik("jasmin", "Jasmin Azemovic");
  483. korisnici[1] = new Korisnik("adel", "Adel Handzic");
  484. korisnici[2] = new Korisnik("denis", "Denis Music");
  485.  
  486. /*
  487. sve poruke se cuvaju u komunikaciji posiljaoca i primaoca tako da u svakom momentu oba ucesnika u komunikaciji posjeduju kompletnu historiju poruka. poruke se grupisu na osnovu naslova, pa ce poruke pod naslovom "Sastanak" izmedju dva korisnika sadrzavati sve poruke koje su razmijenjene na tu temu
  488. u slucaju da posiljalac ili primalac ne postoje funkcija treba baciti izuzetak sa odgovarajucom porukom. takodjer, koristeci regex sve poruke koje sadrze neku od zabranjenih rijeci trebaju biti oznacene kao
  489. */
  490. PosaljiPoruku(korisnici, max, "Sastanak",
  491. korisnici[0]->getKorisnickoIme(), korisnici[1]->getKorisnickoIme(),
  492. "Danas imamo sastanak u 10h!", datum19062017_1015);
  493.  
  494. PosaljiPoruku(korisnici, max, "Sastanak",
  495. korisnici[1]->getKorisnickoIme(), korisnici[0]->getKorisnickoIme(),
  496. "Naravno, vidimo se u sali za sastanke!", datum19062017_1020);
  497.  
  498. PosaljiPoruku(korisnici, max, "Sastanak",
  499. korisnici[0]->getKorisnickoIme(), korisnici[1]->getKorisnickoIme(),
  500. "Sa sobom ponesi radni materijal!", datum19062017_1021);
  501.  
  502. /*ispisuje sve poruke koje je korisnik razmijenio pod naslovom definisanim parametrom. ispis komunikacije
  503. treba biti organizovan po datumu na nacin da se prvo prikaze datum, a nakon toga sve poruke koje su razmijenjene tog datuma.
  504. Na mjestima pobrisanih poruka prikazati tekst "PORUKA IZBRISANA"
  505. */
  506. korisnici[0]->PrikaziKomunikacijuPoNaslovu("Sastanak", SVE_PORUKE);
  507.  
  508. /*funkcija prikazuje sve poruke sa korisnikom cije korisnicko ime je definisano parametrom, te vraca ukupan broj (razmijenjenih poruka sa tim korisnikom)*/
  509. int ukupnoPoruka = korisnici[0]->PrikaziKomunikacijuSaKorisnikom("adel");
  510.  
  511. /*formira ocjenu na nivou komunikacije na nacin da izracunava prosjecno vrijeme odgovora drugog ucesnika izrazeno u minutama i to prema sljedecoj skali
  512. prosjek > 20 minuta = ocjena 1
  513. prosjek > 15 minuta = ocjena 2
  514. prosjek > 10 minuta = ocjena 3
  515. prosjek > 5 minuta = ocjena 4
  516. prosjek <=5 minuta = ocjena 5  
  517. */
  518. korisnici[0]->OcijeniKomunikaciju("Sastanak");
  519.  
  520. for (size_t i = 0; i < max; i++)
  521. {
  522. delete korisnici[i];
  523. korisnici[i] = nullptr;
  524. }
  525.  
  526. system("PAUSE");
  527. }
  528.  
  529.  
  530.  
  531.  
  532.  
  533.  
  534.  
  535.  
  536.  
  537.  
  538.  
  539.  
  540.  
  541.  
  542.  
  543.  
  544.  
  545.  
  546. #include<iostream>
  547. #include<string>
  548. #include<vector>
  549.  
  550. /****************************************************************************
  551. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  552. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ĆE BITI OZNACENO KAO "RE"
  553. 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEČILO GUBLJENJE URAĐENOG ZADATKA
  554. 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.
  555. 5. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNAČENO.
  556. ****************************************************************************/
  557.  
  558. using namespace std;
  559.  
  560. enum Oblast { SoftverskiInzinjering, KomunikacijskiSistemi, SigurnostInformacijskihSistema, InteligentniSistemi };
  561. const char* oblast_txt[] = { "Softverski inzinjering", "Komunikacijski sistemi", "Sigurnost informacijskih sistema", "Inteligentni sistemi" };
  562.  
  563. template<class T1, class T2, int max>
  564. class Kolekcija {
  565. T1 _elementi1[max];
  566. T2 _elementi2[max];
  567. int _trenutno;
  568. public:
  569. Kolekcija()
  570. {
  571. _trenutno = 0;
  572. }
  573.  
  574. void AddElement(const T1& elem1, const T2& elem2)
  575. {
  576. if (_trenutno == max)
  577. throw exception("Dostigli ste maksimalan broj elemenata u kolekciji!");
  578.  
  579. for (int i = 0; i < _trenutno; i++)
  580. {
  581. if (_elementi1[i] == elem1 || _elementi2[i] == elem2)
  582. throw exception("Nije moguce dodati duple elemente u kolekciju!");
  583. }
  584.  
  585. _elementi1[_trenutno] = elem1;
  586. _elementi2[_trenutno++] = elem2;
  587.  
  588. }
  589.  
  590. T1 * getElementi1Pok() { return _elementi1; }
  591. T2 * getElementi2Pok() { return _elementi2; }
  592. T1 & getElement1(int lokacija) { return _elementi1[lokacija]; }
  593. T2 & getElement2(int lokacija) { return _elementi2[lokacija]; }
  594. int getTrenutno() { return _trenutno; }
  595.  
  596. friend ostream & operator<<(ostream & COUT, Kolekcija<T1, T2, max> & obj)
  597. {
  598. for (size_t i = 0; i < obj._trenutno; i++)
  599. {
  600. COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
  601. }
  602. return COUT;
  603. }
  604. };
  605.  
  606. //Deklaracija klase Nastavnik omogucava njeno koristenje u klasi ZavrsniRad, a definicija je data naknadno
  607. class Nastavnik;
  608.  
  609. class ZavrsniRad
  610. {
  611. char* _nazivTeme;
  612. Oblast* _oblastTeme;
  613. string _datumPrijave; //Format: dd.MM.gggg
  614. //U vector pohraniti samo adresu objekta tipa Nastavnik, dakle bez alokacije nove memorije
  615. vector<Nastavnik*> _komisija;
  616. string _datumOdbrane; //Format: dd.MM.gggg (najranije 2 mjeseca od datuma prijave)
  617. int _ocjena;
  618. public:
  619. ZavrsniRad() :_nazivTeme(nullptr), _oblastTeme(nullptr), _datumPrijave("NEMA VRIJEDNOST"), _datumOdbrane("NEMA VRIJEDNOST"), _ocjena(5)
  620. { }
  621.  
  622. ZavrsniRad(string nazivTeme, Oblast oblastTeme, string datumPrijave) : _datumPrijave(datumPrijave), _oblastTeme(new Oblast(oblastTeme))
  623. {
  624. _nazivTeme = new char[nazivTeme.size() + 1];
  625. strcpy_s(_nazivTeme, nazivTeme.size() + 1, nazivTeme.c_str());
  626. }
  627.  
  628. ~ZavrsniRad()
  629. {
  630. delete[] _nazivTeme; _nazivTeme = nullptr;
  631. delete _oblastTeme; _oblastTeme = nullptr;
  632. }
  633.  
  634. char* GetNazivTeme()const { return _nazivTeme; }
  635. Oblast GetOblastTeme()const { return *_oblastTeme; }
  636. string GetDatumOdbrane() { return _datumOdbrane; }
  637. int GetOcjena() { return _ocjena; }
  638. vector<Nastavnik*>& GetKomisija() { return _komisija; };   
  639.  
  640. friend ostream& operator<<(ostream& COUT, ZavrsniRad& r)
  641. {
  642. COUT << "Tema rada: " << r._nazivTeme << endl;
  643. COUT << "Oblast teme: " << oblast_txt[*r._oblastTeme] << endl;
  644. COUT << "Datum prijave rada: " << r._datumPrijave << endl;
  645. //Podatke o nastavnicima nije moguce ispisati ovdje jer klasa jos nije definisana
  646. return COUT;
  647. }
  648. };
  649.  
  650. class Nastavnik
  651. {
  652. string _imePrezime;
  653. Oblast _oblastIzboraUZvanje;
  654. //Parametar string predstavlja broj indeksa studenta koji prijavljuje zavrsni rad kod odredjenog nastavnika
  655. Kolekcija<string, ZavrsniRad, 10> _teme;
  656.  
  657. public:
  658. Nastavnik(string imePrezime, Oblast oblastIzboraUZvanje) : _imePrezime(imePrezime), _oblastIzboraUZvanje(oblastIzboraUZvanje)
  659. {}
  660.  
  661. string GetImePrezime() { return _imePrezime; }
  662. Oblast GetOblast() { return _oblastIzboraUZvanje; }
  663. Kolekcija<string, ZavrsniRad, 10>& GetTeme() { return _teme; };
  664. };
  665. void main()
  666. {
  667. const int max = 4;
  668. Nastavnik* nastavnici[max];
  669.  
  670. nastavnici[0] = new Nastavnik("Denis Music", SoftverskiInzinjering);
  671. nastavnici[1] = new Nastavnik("Zanin Vejzovic", KomunikacijskiSistemi);
  672. nastavnici[2] = new Nastavnik("Jasmin Azemovic", SigurnostInformacijskihSistema);
  673. nastavnici[3] = new Nastavnik("Emina Junuz", SoftverskiInzinjering);
  674.  
  675. try
  676. {
  677. /*Funkcija DodajZavrsniRad ima zadatak da odredjenom nastavniku dodijeli mentorstvo na zavrsnom radu. Sprijeciti dodavanje zavrsnih radova sa istom temom vise puta. Nastavnik moze imati (mentorisati) samo radove iz oblasti za koju posjeduje izbor u zvanje.U slucaju da se nastavniku pokusa dodati rad koji nije iz njegove oblasti funkcija treba da baci izuzetak sa odgovarajucom porukom */
  678.  
  679. //indeks, naslov, oblast, datum prijave
  680. nastavnici[0]->DodajZavrsniRad("IB130011", "Multimedijalni informacijski sistem za visoko-obrazovnu ustanovu", SoftverskiInzinjering, "01.04.2017");
  681. nastavnici[0]->DodajZavrsniRad("IB120051", "Sistem za podršku rada kablovskog operatera", SoftverskiInzinjering, "03.03.2017");
  682.  
  683. nastavnici[1]->DodajZavrsniRad("IB140102", "Praktična analiza sigurnosti bežičnih računarskih mreža", KomunikacijskiSistemi, "22.08.2017");
  684.  
  685. nastavnici[2]->DodajZavrsniRad("IB140002", "Primjena teorije informacija u procesu generisanja kriptografskih ključeva", SigurnostInformacijskihSistema, "10.09.2017");
  686.  
  687. vector<Nastavnik*> komisija;//formira se komisija
  688. komisija.push_back(nastavnici[0]);
  689. komisija.push_back(nastavnici[2]);
  690. komisija.push_back(nastavnici[3]);
  691.  
  692. /*Funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva definisanje datuma odbrane i liste clanova komisije pred kojima ce student braniti zavrsni rad.    Odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio. Komisiju trebaju ciniti najmanje 2 nastavnika koji imaju izbor u zvanje u oblasti kojoj pripada tema rada. Datum odbrane ne smije biti manji od datuma prijave. U slucaju da bilo koji od navedenih uslova nije ispunjen funkcija treba da baci izuzetak*/
  693. nastavnici[0]->ZakaziOdbranuRada("IB130011", "25.09.2017", komisija);
  694. nastavnici[0]->ZakaziOdbranuRada("IB130111", "25.09.2017", komisija);//student sa brojem indeksa IB130111 jos uvijek nije prijavio rad
  695.  
  696. /*Studentu sa brojem indeksa IB130011 dodjeljuje ocjenu 8 na zavrsnom radu. Uslov za dodjelu ocjene je da student posjeduje definisan datum odbrane i listu clanova komisije. U zavisnosti od uspjesnosti izvrsenja, funkcija vraca true ili false*/
  697.  
  698. if ((*nastavnici[0])("IB130011", 8))
  699. cout << "Uspjesno ste ocijenili zavrsni rad!" << endl;
  700.  
  701. /*Ispisuje sve podatke o nastavniku i njegovim mentorstvima. Za clanove komisije je dovoljno ispisati samo ime i prezime.*/
  702. cout << *nastavnici[0] << endl;
  703.  
  704. /*Funkcija PronadjiNajStudenta ima zadatak da pronadje broj indeksa studenta koji je na zavrsnom radu ostvario najvecu ocjenu kod nastavnika koji posjeduje najvecu prosjecnu ocjenu na zavrsnim radovima. Ukoliko se kod nastavnika sa najvecom prosjecnom ocjenom pojavi vise studenata sa istom ocjenom, onda funkcija vraca broj indeksa prvog pronadjenog studenta. Svim studentima koji su odbranili rad kod nastavnika sa najvecom prosjecno ocjenom, u zasebnom thread.u, poslati email poruku (mail adresa: brojIndeksa@edu.fit.ba) sa sadrzajem da su svoj zavrsni rad uspjesno odbranili sa vecom ili manjom ocjenom od prosjecne. Ukoliko niti jedan od nastavnika ne posjeduje evidentirano mentorstvo na zavrsnom radu, funkcija vraca tekst: NIJE PRONADJEN*/
  705.  
  706. cout << "Najsupjesniji student: " << PronadjiNajStudenta(nastavnici, max) << endl;
  707.  
  708. //Baca izuzetak zbog neadekvatnog izbora u zvanje, odnosno oblasti
  709. nastavnici[2]->DodajZavrsniRad("IB150008", "Razvoj sistema autentifikacije na osnovu biometrije glasa", InteligentniSistemi, "15.05.2017");
  710. }
  711. catch (exception& ex)
  712. {
  713. cout << "GRESKA -> " << ex.what() << endl;
  714. }
  715.  
  716. for (int i = 0; i < max; i++)
  717. {
  718. delete nastavnici[i];
  719. nastavnici[i] = nullptr;
  720. }
  721. }
  722.  
  723.  
  724.  
  725.  
  726.  
  727.  
  728.  
  729.  
  730.  
  731.  
  732.  
  733.  
  734.  
  735.  
  736.  
  737.  
  738.  
  739.  
  740.  
  741.  
  742.  
  743. #include <iostream>
  744. using namespace std;
  745.  
  746.  
  747. /****************************************************************************
  748. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  749. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ĆE BITI OZNACENO KAO "RE"
  750. 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEČILO GUBLJENJE URAĐENOG ZADATKA
  751. 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.
  752. 5. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  753. 6. ZA POTREBE TESTIRANJA, UNUTAR MAIN FUNKCIJE MOZETE DODAVATI NOVE TESTNE PODATKE
  754. ****************************************************************************/
  755. //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
  756. #pragma warning(disable:4996)
  757.  
  758. char * crt = "\n----------------------------------------------------\n";
  759. class Datum {
  760. int * _dan, *_mjesec, *_godina;
  761. public:
  762. Datum(int d, int m, int g) {
  763. _dan = new int(d);
  764. _mjesec = new int(m);
  765. _godina = new int(g);
  766. }
  767. ~Datum() {
  768. delete _dan; _dan = nullptr;
  769. delete _mjesec; _mjesec = nullptr;
  770. delete _godina; _godina = nullptr;
  771. }
  772. friend ostream & operator<<(ostream & COUT, Datum obj) {
  773. COUT<< *obj._dan << "/" << *obj._mjesec << "/" << *obj._godina;
  774. return COUT;
  775. }  
  776. };
  777.  
  778. template<class T, int velicina>
  779. class FITArray {
  780. T _niz[velicina];
  781. int _trenutno;
  782. bool _dozvoliDupliciranje;
  783. public:
  784. //OSTALE FUNKCIJE CLANICE DEFINISATI VAN TEMPLATE KLASE
  785. FITArray(bool dozvoliDupliciranje = true) { _dozvoliDupliciranje = dozvoliDupliciranje; _trenutno = 0; }   
  786. int GetTrenutno() { return _trenutno; }
  787. T * GetNiz() { return _niz; }
  788. };
  789.  
  790. class PolozeniPredmet {
  791. char * _naziv;
  792. int _ocjena;
  793. Datum _datumPolaganja;
  794. public:
  795. ~PolozeniPredmet() { delete[] _naziv; _naziv = nullptr; }  
  796. friend ostream & operator<<(ostream & COUT, PolozeniPredmet & obj) {
  797. COUT << obj._naziv << "(" << obj._ocjena << ")" << obj._datumPolaganja << endl;
  798. return COUT;
  799. }  
  800. };
  801.  
  802. class Student {
  803. static int _indeksCounter; //sluzi za odredjivanje narednog broja indeksa koji ce biti dodijeljen studentu, pocevsi od 160000
  804. const int _indeks;
  805. char * _imePrezime;
  806. FITArray<PolozeniPredmet, 40> _polozeniPredmeti;   
  807. public:
  808. ~Student(){
  809. delete[] _imePrezime; _imePrezime = nullptr;
  810. }
  811. friend ostream & operator<<(ostream & COUT, Student & obj) {
  812. COUT << obj._indeks << " " << obj._imePrezime << endl << obj._polozeniPredmeti;
  813. return COUT;
  814. }  
  815. };
  816.  
  817. void main() {
  818. const int max = 20;
  819.  
  820. Datum jucer (20,11,2017), danas(21, 11, 2017), sutra(22,11,2017);
  821. cout << jucer << danas << sutra << endl;
  822. jucer = danas;
  823. cout << jucer << danas << sutra << endl;   
  824.  
  825. //parametar tipa bool odredjuje da li je u nizu dozvoljeno dupliciranje elemenata
  826. FITArray<int, max> nizIntegera (false);
  827.  
  828. for (size_t i = 0; i < max-1; i++)
  829. nizIntegera += i;//dodaje novog clana niza
  830.  
  831. if (!(nizIntegera += 6))//pokusavamo dodati dupli clan niza
  832. cout << "Element nije dodan u niz" << endl;
  833.  
  834. cout << crt << nizIntegera << crt; //ispisuje sve clanove niza
  835.  
  836. nizIntegera -= 9; //uklanja clan niza sa vrijednoscu 9
  837. nizIntegera -= 17;
  838.  
  839. FITArray<int, max> noviNizIntegera(nizIntegera);
  840.  
  841. cout << crt << noviNizIntegera << crt;
  842.  
  843. /*parametri odredjuju lokacije (indekse u nizu) elemenata OD - DO koje je potrebno vratiti. u slucaju da u nizu ne postoji trazeni broj elemenata funkcija treba da vrati sve element od lokacije OD pa do posljednje dostupnog elementa */
  844. cout << "Clanovi niza od lokacije 2 do lokacije 5 su -> " << noviNizIntegera(2, 5) << crt;
  845.  
  846. Student adel("Adel Handzic"), jasmin("Jasmin Azemovic");
  847.  
  848. PolozeniPredmet prII(jucer, "PRII", 8), prIII(sutra, "PRIII", 7);
  849.  
  850. adel.DodajPredmet(prII);
  851. adel.DodajPredmet(prIII);
  852. cout << adel << endl;
  853. //vraca prosjecnu ocjenu studenta
  854. cout << "Prosjecna ocjena -> "<< adel.GetProsjek() << crt;
  855.  
  856. jasmin = adel;
  857. cout << jasmin << endl;
  858. cout << "Prosjecna ocjena -> " << jasmin.GetProsjek() << crt;
  859. }
  860.  
  861.  
  862.  
  863.  
  864.  
  865.  
  866.  
  867.  
  868.  
  869.  
  870.  
  871.  
  872.  
  873.  
  874.  
  875.  
  876.  
  877.  
  878.  
  879. class Datum {
  880. int *_dan, *_mjesec, *_godina;
  881. public:
  882. Datum(int dan = 1, int mjesec = 1, int godina = 2000) {
  883. _dan = new int(dan);
  884. _mjesec = new int(mjesec);
  885. _godina = new int(godina);
  886. }
  887. Datum(const Datum &dat) {
  888. _dan = new int(*dat._dan);
  889. _mjesec = new int(*dat._mjesec);
  890. _godina = new int(*dat._godina);
  891. }
  892. ~Datum() {
  893. delete _dan; _dan = nullptr;
  894. delete _mjesec; _mjesec = nullptr;
  895. delete _godina; _godina = nullptr;
  896. }
  897. friend ostream &operator<<(ostream &COUT, const Datum &obj) {
  898. COUT << *obj._dan << " " << *obj._mjesec << " " << *obj._godina;
  899. return COUT;
  900. }
  901.  
  902. };
  903. class Izuzetak : public exception {
  904. string _funkcija;
  905. };
  906.  
  907. template <class T1, class T2>
  908. class Kolekcija {
  909. T1 * _elementi1;
  910. T2 * _elementi2;
  911. int _trenutnoElemenata;
  912. bool _omoguciDupliranjeElemenata;
  913. public:
  914. Kolekcija(bool omoguciDupliranjeElemenata = false) {
  915. _trenutnoElemenata = 0;
  916. _omoguciDupliranjeElemenata = omoguciDupliranjeElemenata;
  917. _elementi1 = nullptr;
  918. _elementi2 = nullptr;
  919. }
  920.  
  921. ~Kolekcija() {
  922. delete[]_elementi2; _elementi2 = nullptr;
  923. delete[]_elementi1; _elementi1 = nullptr;
  924. _trenutnoElemenata = 0;
  925. }
  926.  
  927. int GetTrenutno() const { return _trenutnoElemenata; }
  928. T1& GetElement1(int lokacija) const
  929. {
  930. if (lokacija < 0 || lokacija >= _trenutnoElemenata)
  931. throw Izuzetak("Nepostojeca lokacija", __FUNCTION__);
  932. return _elementi1[lokacija];
  933. }
  934.  
  935. T2& GetElement2(int lokacija) const
  936. {
  937. if (lokacija < 0 || lokacija >= _trenutnoElemenata)
  938. throw Izuzetak("Nepostojeca lokacija", __FUNCTION__);
  939. return _elementi2[lokacija];
  940. }
  941.  
  942. friend ostream &operator<<(ostream &COUT, const Kolekcija &obj) {
  943. for (size_t i = 0; i < obj.GetTrenutno(); i++)
  944. COUT << obj._elementi1[i] << " " << obj._elementi2[i] << endl;
  945. return COUT;
  946. }
  947. };
  948.  
  949. class Dogadjaj
  950. {
  951. Datum _datumOdrzavanja;
  952. 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)
  953.  
  954. char *_naziv;
  955. int _notificirajPrije; //oznacava broj dana prije samog dogadjaja kada ce krenuti notifikacija/podsjetnik
  956. bool _rekurzivnaNotifikacija; //ako je vrijednost true onda se korisnik notificira svaki dan do _datumaOdrzavanja dogadjaja, a pocevsi prije dogadjaja za _brojDanaZaNotifikaciju
  957.  
  958. public:
  959. Dogadjaj(Datum datumOdrzavanja, const char *naziv, int brojDana = 1,
  960. bool rekurzivnaNotifikacija = false) : _datumOdrzavanja(datumOdrzavanja)
  961. {
  962. _naziv = new char[strlen(naziv) + 1];
  963. strcpy_s(_naziv, strlen(naziv) + 1, naziv);
  964.  
  965. _notificirajPrije = brojDana;
  966. _rekurzivnaNotifikacija = rekurzivnaNotifikacija;
  967. _obaveze = nullptr;
  968. }
  969.  
  970. Dogadjaj(const Dogadjaj &obj) : _datumOdrzavanja(obj._datumOdrzavanja)
  971. {
  972. _naziv = new char[strlen(obj._naziv) + 1];
  973. strcpy_s(_naziv, strlen(obj._naziv) + 1, obj._naziv);
  974.  
  975. _notificirajPrije = obj._notificirajPrije;
  976. _rekurzivnaNotifikacija = obj._rekurzivnaNotifikacija;
  977. _obaveze = obj._obaveze;
  978. }
  979. ~Dogadjaj()
  980. {
  981. delete[] _naziv;
  982. _naziv = nullptr;
  983. delete _obaveze;
  984. _obaveze = nullptr;
  985. }
  986. char *GetNaziv() { return _naziv; }
  987. Kolekcija<string, bool> *GetObaveze() { return _obaveze; }
  988.  
  989. };
  990.  
  991. class Student
  992. {
  993. int _indeks;
  994. string _imePrezime;
  995. vector<Dogadjaj> _dogadjaji;
  996. public:
  997.  
  998. Student(int indeks, string imePrezime) : _indeks(indeks), _imePrezime(imePrezime) {}
  999.  
  1000. int GetIndeks() const { return _indeks; }
  1001.  
  1002. vector<Dogadjaj>& GetDogadjaji() { return _dogadjaji; }
  1003.  
  1004. friend ostream &operator<<(ostream &COUT, const Student &obj)
  1005. {
  1006. COUT << obj._imePrezime << " (" << obj._indeks << ")" << endl;
  1007. return COUT;
  1008. }
  1009. };
  1010.  
  1011. class DLWMSReminder
  1012. {
  1013. vector<Student> _reminiderList;
  1014. };
  1015.  
  1016. void main() {
  1017.  
  1018. /**************************************************************************
  1019. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  1020. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR CE BITI OZNACENO KAO "RE"
  1021. 3. SPASAVAJTE PROJEKAT KAKO BI SE SPRIJECILO GUBLJENJE URADJENOG ZADATKA
  1022. 4. PROGRAMSKI CODE SE TAKODJER NALAZI U FAJLU CODE_ParcijalniII.TXT
  1023. 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.
  1024. ****************************************************************************/
  1025.  
  1026. #pragma region Datum
  1027.  
  1028. Datum danas(28, 1, 2018), sutra(29, 1, 2018);
  1029. Datum datumIspitaPRIII(30, 1, 2018), datumIspitBPII(31, 1, 2018);
  1030. Datum prekosutra(danas);
  1031. prekosutra = danas;
  1032. cout << danas << endl
  1033. << sutra << endl
  1034. << prekosutra << crt;
  1035.  
  1036. #pragma endregion
  1037.  
  1038. #pragma region Kolekcija
  1039.  
  1040. /*
  1041. AddElement :: omogucava dodavanje novog elementa u kolekciju. Ukoliko je moguce, osigurati automatsko prosiranje kolekcije prilikom dodavanja svakog novog elementa, te onemoguciti ponavljanje elemenata
  1042. 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
  1043. */
  1044. const int brElemenata = 10;
  1045. Kolekcija<int, float> kolekcija1;
  1046. for (size_t i = 0; i < brElemenata; i++)
  1047. if (!kolekcija1.AddElement(i, i + (0.6 * i)))
  1048. cout << "Elementi " << i << " i " << i + (0.6 * i) << " nisu dodati u kolekciju" << endl;
  1049.  
  1050. cout << kolekcija1.GetElement1(0) << " " << kolekcija1.GetElement2(0) << endl;
  1051. cout << kolekcija1 << endl;
  1052.  
  1053. kolekcija1.RemoveElement(1);
  1054.  
  1055. Kolekcija<int, float> kolekcija2;
  1056. kolekcija2 = kolekcija1;
  1057. cout << kolekcija2 << crt;
  1058.  
  1059. if (kolekcija1.GetTrenutno() == kolekcija2.GetTrenutno())
  1060. cout << "ISTI BROJ ELEMENATA" << endl;
  1061.  
  1062. Kolekcija<int, float> kolekcija3(kolekcija2);
  1063. cout << kolekcija3 << crt;
  1064.  
  1065. #pragma endregion
  1066.  
  1067. #pragma region Dogadjaj
  1068.  
  1069. Dogadjaj ispitPRIII(datumIspitaPRIII, "Ispit iz PRIII", 5, true),
  1070. ispitBPII(datumIspitBPII, "Ispit iz BPII", 7, true);
  1071. /*po vlasitom izboru definisati listu zabranjenih rijeci koje ce onemoguciti dodavanje odredjene obaveze. Prilikom provjere koristiti regex*/
  1072. if (ispitPRIII.AddObavezu("Preraditi pdf materijale"))cout << "Obaveza dodana!" << endl;
  1073. //onemoguciti dupliranje obaveza
  1074. if (!ispitPRIII.AddObavezu("Preraditi pdf materijale"))cout << "Obaveza nije dodana!" << endl;
  1075. if (ispitPRIII.AddObavezu("Pregledati video materijale"))cout << "Obaveza dodana!" << endl;
  1076. if (ispitPRIII.AddObavezu("Preraditi ispitne zadatke"))cout << "Obaveza dodana!" << endl;
  1077. if (ispitPRIII.AddObavezu("Samostalno vjezbati"))cout << "Obaveza dodana!" << endl;
  1078.  
  1079. if (ispitBPII.AddObavezu("Preraditi knjigu SQL za 24 h"))cout << "Obaveza dodana!" << endl;
  1080. if (ispitBPII.AddObavezu("Pregledati video materijale"))cout << "Obaveza dodana!" << endl;
  1081. if (ispitBPII.AddObavezu("Napraviti bazu za konkretnu aplikaciju"))cout << "Obaveza dodana!" << endl;
  1082.  
  1083. Student jasmin(150051, "Jasmin Azemovic"), adel(160061, "Adel Handzic");
  1084.  
  1085. if (jasmin.AddDogadjaj(ispitPRIII) && jasmin.AddDogadjaj(ispitBPII))
  1086. cout << "Dogadjaj uspjesno dodan!" << endl;
  1087.  
  1088. if (adel.AddDogadjaj(ispitPRIII) && adel.AddDogadjaj(ispitBPII))
  1089. cout << "Dogadjaj uspjesno dodan!" << endl;
  1090. //onemoguciti dupliranje dogadjaja
  1091. if (!adel.AddDogadjaj(ispitPRIII))
  1092. cout << "Dogadjaj nije uspjesno dodan!" << endl;
  1093.  
  1094. DLWMSReminder reminder;
  1095.  
  1096. try
  1097. {
  1098. reminder.AddStudent(jasmin);
  1099. reminder.AddStudent(adel);
  1100. //u slucaju dupliranja studenata funkcija baca izuzetak tipa Izuzetak
  1101. reminder.AddStudent(jasmin);
  1102. }
  1103. catch (exception &err)
  1104. {
  1105. //ispisati sve informacije o nastalom izuzetku
  1106. }
  1107.  
  1108. //da bi bila oznacena kao zavrsena, obaveza mora postojati i mora biti oznacena kao nezavrsena (false)
  1109. if (reminder.OznaciObavezuKaoZavrsenu(150051, "Ispit iz PRIII", "Pregledati video materijale"))
  1110. cout << "Obaveza oznacena kao zavrsena" << endl;
  1111.  
  1112. /*metodi PosaljiNotifikacije se salje trenutni datum na osnovu cega ona pretrazuje sve studente koje treba podsjetiti/notoficirati o dogadjajima koji se priblizavaju.
  1113. Koristeci multithread-ing, svim studentima se salju notifikacije sa sljedecim sadrzajem:
  1114. -------------------------------------------------------------------------
  1115. Postovani Jasmin Azemovic,
  1116. Dogadjaj Ispit iz PRIII je zakazan za 3 dana, a do sada ste obavili 56% obaveza vezanih za ovaj dogadjaj. Neispunjene obaveze su:
  1117. 1.Preraditi ispitne zadatke
  1118. 2.Samostalno vjezbati
  1119. Predlazemo Vam da ispunite i ostale planirane obaveze.
  1120. FIT Reminder
  1121. -------------------------------------------------------------------------
  1122. 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)
  1123.  
  1124. */
  1125. int poslato = 0;
  1126. //funkcija vraca broj poslatih podsjetnika/notifikacija
  1127. poslato = reminder.PosaljiNotifikacije(danas);
  1128. cout << "Za " << danas << " poslato ukupno " << poslato << " podsjetnika!" << endl;
  1129. poslato = reminder.PosaljiNotifikacije(sutra);
  1130. cout << "Za " << sutra << " poslato ukupno " << poslato << " podsjetnika!" << endl;
  1131.  
  1132. #pragma endregion
  1133.  
  1134. system("pause");
  1135. }
  1136.  
  1137.  
  1138.  
  1139.  
  1140.  
  1141.  
  1142.  
  1143.  
  1144.  
  1145.  
  1146.  
  1147.  
  1148.  
  1149.  
  1150. #include <iostream>
  1151. using namespace std;
  1152.  
  1153. #pragma warning(disable:4996)
  1154. const char *crt = "\n-------------------------------------------\n";
  1155. enum eRazred { PRVI = 1, DRUGI, TRECI, CETVRTI };
  1156. const float minimalan_prosjek = 4.5;
  1157.  
  1158. char * AlocirajNizKaraktera(const char * sadrzaj) {
  1159. if (sadrzaj == nullptr)
  1160. return nullptr;
  1161. int vel = strlen(sadrzaj) + 1;
  1162. char * temp = new char[vel];
  1163. strcpy_s(temp, vel, sadrzaj);
  1164. return temp;
  1165. }
  1166.  
  1167. template<class T1, class T2>
  1168. class Kolekcija {
  1169. T1 * _elementi1;
  1170. T2 * _elementi2;
  1171. int * _trenutno;
  1172. public:
  1173. Kolekcija() {
  1174. _elementi1 = nullptr;
  1175. _elementi2 = nullptr;
  1176. _trenutno = new int(0);
  1177. }
  1178. ~Kolekcija(){
  1179. delete[]_elementi1; _elementi1 = nullptr;
  1180. delete[]_elementi2; _elementi2 = nullptr;
  1181. delete _trenutno; _trenutno = nullptr;
  1182. }
  1183. T1& getElement1(int lokacija) { return _elementi1[lokacija]; }
  1184. T2& getElement2(int lokacija) { return _elementi2[lokacija]; }
  1185. int getTrenutno() { return *_trenutno; }
  1186. friend ostream& operator<< (ostream &COUT, Kolekcija &obj) {
  1187. for (size_t i = 0; i < *obj._trenutno; i++)
  1188. COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
  1189. return COUT;
  1190. }
  1191. };
  1192.  
  1193. class DatumVrijeme {
  1194. int *_dan, *_mjesec, *_godina, *_sati, *_minuti;
  1195. public:
  1196. DatumVrijeme(int dan = 1, int mjesec = 1, int godina = 2000, int sati = 0, int minuti = 0) {
  1197. _dan = new int(dan);
  1198. _mjesec = new int(mjesec);
  1199. _godina = new int(godina);
  1200. _sati = new int(sati);
  1201. _minuti = new int(minuti);
  1202. }
  1203. ~DatumVrijeme() {
  1204. delete _dan; _dan = nullptr;
  1205. delete _mjesec; _mjesec = nullptr;
  1206. delete _godina; _godina = nullptr;
  1207. delete _sati; _sati = nullptr;
  1208. delete _minuti; _minuti = nullptr;
  1209. }
  1210. friend ostream& operator<< (ostream &COUT, DatumVrijeme &obj) {
  1211. COUT << *obj._dan << "." << *obj._mjesec << "." << *obj._godina << " " << *obj._sati << ":" << *obj._minuti << endl;
  1212. return COUT;
  1213. }
  1214. };
  1215.  
  1216. class Predmet {
  1217. char * _naziv;
  1218. int _ocjena;
  1219. string _napomena;
  1220. public:
  1221. Predmet(const char * naziv, int ocjena, string napomena = ""):_ocjena(ocjena), _napomena(napomena) {   
  1222. _naziv = AlocirajNizKaraktera(naziv);  
  1223. }
  1224. ~Predmet() {
  1225. delete[] _naziv; _naziv = nullptr;
  1226. }
  1227. friend ostream& operator<< (ostream &COUT, Predmet &obj) {
  1228. COUT << obj._naziv << " (" << obj._ocjena << ") " << obj._napomena << endl;
  1229. return COUT;
  1230. }
  1231. char * GetNaziv() { return _naziv; }
  1232. string GetNapomena() { return _napomena; }
  1233. void DodajNapomenu(string napomena) {
  1234. _napomena += " " + napomena;
  1235. }
  1236. };
  1237. struct Uspjeh {
  1238. eRazred _razred;
  1239. //datumvrijeme se odnosi na vrijeme evidentiranja polozenog predmeta
  1240. Kolekcija<Predmet*, DatumVrijeme> * _predmeti;
  1241. public:
  1242. Uspjeh(eRazred razred):_razred(razred), _predmeti(nullptr) {   
  1243. }
  1244. ~Uspjeh() {
  1245. delete[] _predmeti; _predmeti = nullptr;
  1246. }
  1247.  
  1248. Kolekcija<Predmet*, DatumVrijeme> * GetPredmeti() { return _predmeti; }
  1249.  
  1250. friend ostream& operator<< (ostream &COUT, const Uspjeh &obj) {
  1251. COUT << obj._razred << *obj._predmeti << endl;
  1252. return COUT;
  1253. }  
  1254. };
  1255.  
  1256. class Kandidat {
  1257. char * _imePrezime;
  1258. string _emailAdresa;
  1259. string _brojTelefona;
  1260. vector<Uspjeh *> _uspjeh;
  1261. public:
  1262. Kandidat(const char * imePrezime, string emailAdresa, string brojTelefona):_emailAdresa(emailAdresa), _brojTelefona(brojTelefona) {
  1263. _imePrezime = AlocirajNizKaraktera(imePrezime);
  1264. }
  1265. ~Kandidat() {
  1266. delete[] _imePrezime; _imePrezime = nullptr;
  1267. for (size_t i = 0; i < _uspjeh.size(); i++) {
  1268. delete _uspjeh[i];
  1269. _uspjeh[i] = nullptr;
  1270. }
  1271. }
  1272. friend ostream& operator<< (ostream &COUT, Kandidat &obj) {
  1273. COUT << obj._imePrezime << " " << obj._emailAdresa << " " << obj._brojTelefona << endl;
  1274. for (size_t i = 0; i < obj._uspjeh.size(); i++)
  1275. COUT << *obj._uspjeh[i] << endl;
  1276. return COUT;
  1277. }
  1278. vector<Uspjeh *> GetUspjeh() { return _uspjeh; }
  1279.  
  1280. };
  1281.  
  1282. void main() {
  1283. /****************************************************************************
  1284. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  1285. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ĆE BITI OZNACENO KAO "RE"
  1286. 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEČILO GUBLJENJE URAĐENOG ZADATKA
  1287. 4. PROGRAMSKI CODE SE TAKOĐER NALAZI U FAJLU CODE.TXT
  1288. 5. 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.
  1289. 6. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNAČENO.
  1290. ****************************************************************************/
  1291.  
  1292. DatumVrijeme temp,
  1293. datum19062018_1015(19, 6, 2018, 10, 15),
  1294. datum20062018_1115(20, 6, 2018, 11, 15),
  1295. datum30062018_1215(30, 6, 2018, 12, 15),
  1296. datum05072018_1231(5, 7, 2018, 12, 31),
  1297. datum20062018_1115_Copy(datum20062018_1115);
  1298. //funkcija ToCharArray vraca datum i vrijeme kao char *
  1299. cout << datum19062018_1015.ToCharArray() << endl;//treba ispisati: 19.6.2018 10:15
  1300. temp = datum05072018_1231;
  1301. cout << temp.ToCharArray() << endl;//treba ispisati: 5.7.2018 12:31
  1302. cout << datum20062018_1115_Copy.ToCharArray() << endl;//treba ispisati: 20.6.2018 11:15
  1303.  
  1304. const int kolekcijaTestSize = 10;
  1305. Kolekcija<int, int> kolekcija1;
  1306. for (size_t i = 0; i < kolekcijaTestSize; i++)
  1307. kolekcija1.AddElement(i + 1, i * i);
  1308. cout << kolekcija1 << endl;
  1309.  
  1310. Kolekcija<int, int> kolekcija2 = kolekcija1;
  1311. cout << kolekcija2 << crt;
  1312. Kolekcija<int, int> kolekcija3;
  1313. kolekcija3 = kolekcija1;
  1314. kolekcija3.SortOpadajuciByT2(); //od najvece prema najmanjoj vrijednosti
  1315. cout << kolekcija3 << crt;
  1316.  
  1317. //napomena se moze dodati i prilikom kreiranja objekta
  1318. Predmet Matematika("Matematika", 5, "Ucesce na takmicenju"),
  1319. Fizika("Fizika", 5),
  1320. Hemija("Hemija", 2),
  1321. Engleski("Engleski", 5);
  1322. Fizika.DodajNapomenu("Pohvala za ostvareni uspjeh"); // dodaje novu napomenu zadrzavajuci ranije dodane
  1323. cout << Matematika << endl;
  1324.  
  1325. Kandidat jasmin("Jasmin Azemovic", "jasmin@gmail.com", "033 281 172");
  1326. Kandidat adel("Adel Handzic", "adel@edu.fit.ba", "033 281 170");
  1327.  
  1328. /*
  1329. uspjeh (tokom srednjoskolskog obrazovanja) se dodaje za svaki predmet na nivou razreda.
  1330. tom prilikom onemoguciti:
  1331. - dodavanje vise od 6 predmeta za jedan razred
  1332. - dodavanje istoimenih predmeta na nivou jednog razreda,
  1333. - dodavanje vise predmeta u kratkom vremenskom periodu (na nivou jednog razreda, razmak izmedju dodavanja pojedinih predmeta mora biti najmanje minut).
  1334. razredi (predmeti ili uspjeh) ne moraju biti dodavani sortiranim redoslijedom (npr. prvo se moze dodati uspjeh za II
  1335. razred, pa onda za I razred i sl.). Funkcija vraca true ili false u zavisnosti od (ne)uspjesnost izvrsenja
  1336. */
  1337. if (jasmin.AddPredmet(DRUGI, Fizika, datum20062018_1115))
  1338. cout << "Predmet uspjesno dodan!" << crt;
  1339. if (jasmin.AddPredmet(DRUGI, Hemija, datum30062018_1215))
  1340. cout << "Predmet uspjesno dodan!" << crt;
  1341. if (jasmin.AddPredmet(PRVI, Engleski, datum19062018_1015))
  1342. cout << "Predmet uspjesno dodan!" << crt;
  1343. if (jasmin.AddPredmet(PRVI, Matematika, datum20062018_1115))
  1344. cout << "Predmet uspjesno dodan!" << crt;
  1345. //ne treba dodati Matematiku jer je vec dodana u prvom razredu
  1346. if (jasmin.AddPredmet(PRVI, Matematika, datum05072018_1231))
  1347. cout << "Predmet uspjesno dodan!" << crt;
  1348. //ne treba dodati Fiziku jer nije prosao minut od dodavanja posljednjeg predmeta
  1349. if (jasmin.AddPredmet(PRVI, Fizika, datum05072018_1231))
  1350. cout << "Predmet uspjesno dodan!" << crt;
  1351. /*pretpostavka je da na nivou jednog razreda kandidati imaju 6 predmeta.
  1352. upravo zbog toga, nakon evidentiranja 6 predmeta na nivou jednog razreda kandidatu se salje mail
  1353. sa porukom: "evidentirali ste uspjeh za X razred". ukoliko je prosjek na nivou tog razreda veci od minimalan_prosjek
  1354. kandidatu se salje SMS sa porukom: "svaka cast za uspjeh 4.X". slanje poruka i emailova implemenitrati koristeci
  1355. zasebne thread-ove.
  1356. */ 
  1357.  
  1358. Uspjeh * u = jasmin(PRVI);//vraca uspjeh kandidata ostvaren u prvom razredu
  1359. if (u != nullptr)
  1360. cout << *u << endl;
  1361.  
  1362.  
  1363. system("pause>0");
  1364. }
  1365.  
  1366.  
  1367.  
  1368.  
  1369.  
  1370.  
  1371.  
  1372.  
  1373.  
  1374.  
  1375. #include <iostream>
  1376. /****************************************************************************
  1377. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  1378. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR CE BITI OZNACENO KAO "RE"
  1379. 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJECILO GUBLJENJE URAĐENOG ZADATKA
  1380. 4. NAZIVI FUNKCIJA, TE BROJ I TIP PARAMETARA MORAJU BITI IDENTICNI ONIMA KOJI SU KORIŠTENI U TESTNOM CODE-U, OSIM U SLUCAJU DA POSTOJI ADEKVATAN RAZLOG ZA NJIHOVU MODIFIKACIJU. OSTALE, POMOCNE FUNKCIJE MOŽETE IMENOVATI I DODAVATI PO ŽELJI.
  1381. 5. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  1382. 6. ZA POTREBE TESTIRANJA, UNUTAR MAIN FUNKCIJE MOZETE DODAVATI NOVE TESTNE PODATKE
  1383. ****************************************************************************/
  1384. using namespace std;
  1385.  
  1386. const char * crt = "\n------------------------------------\n";
  1387.  
  1388. char * AlocirajNizKaraktera(const char * sadrzaj) {
  1389. if (sadrzaj == nullptr)
  1390. return nullptr;
  1391. int vel = strlen(sadrzaj) + 1;
  1392. char * temp = new char[vel];
  1393. strcpy_s(temp, vel, sadrzaj);
  1394. return temp;
  1395. }
  1396. class Datum {
  1397. int *_dan, *_mjesec, *_godina;
  1398. public:
  1399. Datum(int dan = 1, int mjesec = 1, int godina = 2000) {
  1400. _dan = new int(dan);
  1401. _mjesec = new int(mjesec);
  1402. _godina = new int(godina);
  1403. }
  1404. ~Datum() {
  1405. delete _dan; _dan = nullptr;
  1406. delete _mjesec; _mjesec = nullptr;
  1407. delete _godina; _godina = nullptr;
  1408. }
  1409. friend ostream& operator<< (ostream &COUT, const Datum &obj) {
  1410. COUT << *obj._dan << " " << *obj._mjesec << " " << *obj._godina;
  1411. return COUT;
  1412. }
  1413. };
  1414.  
  1415. template<class T>
  1416. class Kolekcija {
  1417. T * _niz;
  1418. int _trenutno;
  1419. public:
  1420. Kolekcija() : _trenutno(0), _niz(nullptr) {}
  1421. ~Kolekcija() { delete[] _niz; _niz = nullptr; _trenutno = 0; }
  1422. T * GetNiz() { return _niz; }
  1423. int GetTrenutno() { return _trenutno; }
  1424. //implementirati potrebne funkcije
  1425. };
  1426.  
  1427. class Usluga {
  1428. char* _naziv;
  1429. double _cijena;//cijena usluge je izrazena po danu koristenja
  1430. public:
  1431. Usluga() : _naziv(nullptr), _cijena(0) {}
  1432. Usluga(const char* naziv, double cijena) : _cijena(cijena) {
  1433. _naziv = AlocirajNizKaraktera(naziv);
  1434. }
  1435. ~Usluga() { delete[] _naziv; _naziv = nullptr; }
  1436. double GetCijena() { return _cijena; }
  1437. const char * GetNaziv() { return _naziv; }
  1438. friend ostream& operator<< (ostream &COUT, const Usluga &obj); 
  1439. };
  1440. ostream& operator<< (ostream &COUT, const Usluga &obj) {
  1441. COUT << obj._naziv << " -> \t\t" << obj._cijena << " KM" << endl;
  1442. return COUT;
  1443. }
  1444.  
  1445. class Rezervacija {
  1446. static int _rezervacijeIDBrojac;
  1447. const int _rezervacijaID; ///broj rezervacije krece od 160000
  1448. Datum _rezervacijaOD;
  1449. Datum _rezervacijaDO;
  1450. double _cijenaPoDanu; //cijena osnovnih usluga koja ne ukljucuje dodatne usluge
  1451. Kolekcija<Usluga> _dodatneUsluge; //dodatne usluge mogu biti: sauna, sportski tereni, kuglanje, masaza i sl.
  1452. public:
  1453. //implementirati potrebne funkcije
  1454.  
  1455. };
  1456.  
  1457. void main() {  
  1458. cout << crt <<"TRAJANJE ISPITA -> 90 minuta "<<crt;
  1459. Kolekcija<int> brojevi;
  1460. for (int i = 0; i < 15; i++)
  1461. brojevi.Add(i);
  1462. cout << brojevi << crt;
  1463.  
  1464. //u okviru klase Usluga implementirati MOVE konstruktor
  1465. Usluga Parking("Parking", 5), Dorucak("Dorucak", 10), Rucak("Rucak", 15), Veseraj("Veseraj", 10);
  1466.  
  1467. //rezervacijaOD, rezervacijaDO, cijenaPoDanu
  1468. Rezervacija rezervacija(Datum(25, 10, 2018), Datum(30, 10, 2018), 59.9);
  1469.  
  1470. //dodaje novu uslugu u rezervaciju. onemoguciti ponavljanje usluga
  1471. if (rezervacija += Parking)
  1472. cout << "Usluga uspjesno dodana!" << endl;
  1473. if (rezervacija += Dorucak)
  1474. cout << "Usluga uspjesno dodana!" << endl;
  1475. if (rezervacija += Rucak)
  1476. cout << "Usluga uspjesno dodana!" << endl;
  1477. if (rezervacija += Veseraj)
  1478. cout << "Usluga uspjesno dodana!" << endl;
  1479. if (!(rezervacija += Dorucak))
  1480. cout << "Usluga vec postoji!" << endl;
  1481.  
  1482. /*prikazuje racun formatiran na nacin prikazan na slici. prilikom izracunavanja iznosa koristiti cijene osnovnih i dodatnih usluga, kao i broj dana za koje je napravljena rezervacija (napomena: duzina trajanja rezervacije je maksimalno 30 dana)*/
  1483. rezervacija.PrintRacun();
  1484.  
  1485. //vraca pokazivac na uslugu sa proslijedjenim nazivom
  1486. Usluga * p = rezervacija["Dorucak"];
  1487. if (p != nullptr)
  1488. cout << *p << crt;
  1489.  
  1490. //vraca sve dodatne usluge koje imaju cijenu u opsegu vrijednosti parametara
  1491. Kolekcija<Usluga> uslugePoCijeni = rezervacija(8, 12);
  1492. for (size_t i = 0; i < uslugePoCijeni.GetTrenutno(); i++)
  1493. cout << uslugePoCijeni[i] << crt;  
  1494.  
  1495. cin.get();
  1496. }
  1497.  
  1498. /*
  1499. R.ID: 160000
  1500. OD: 25 10 2018
  1501. DO: 30 10 2018
  1502. DODATNE USLUGE:
  1503. Parking -> 5 KM
  1504. Dorucak -> 10 KM
  1505. Rucak -> 15 KM
  1506. Veseraj -> 10 KM
  1507. Osnovne usluge-> 299.5 KM
  1508. Dodatne usluge-> 200 KM
  1509. Ukupno -> 499.5 KM
  1510.  
  1511. */
  1512.  
  1513.  
  1514.  
  1515.  
  1516.  
  1517.  
  1518.  
  1519.  
  1520.  
  1521. using namespace std;
  1522.  
  1523. const char *crt = "\n-------------------------------------------\n";
  1524. enum GodinaStudija { PRVA = 1, DRUGA, TRECA};
  1525.  
  1526. char * Alociraj(const char * sadrzaj) {
  1527. if (sadrzaj == nullptr)return nullptr;
  1528. int vel = strlen(sadrzaj) + 1;
  1529. char * temp = new char[vel];
  1530. strcpy_s(temp, vel, sadrzaj);
  1531. return temp;
  1532. }
  1533.  
  1534. template<class T1, class T2>
  1535. class Dictionary {
  1536. T1 * _elementi1;
  1537. T2 * _elementi2;
  1538. int * _trenutno;
  1539. public:
  1540. Dictionary() {
  1541. _elementi1 = nullptr;
  1542. _elementi2 = nullptr;
  1543. _trenutno = new int(0);
  1544. }
  1545. ~Dictionary() {
  1546. delete[]_elementi1; _elementi1 = nullptr;
  1547. delete[]_elementi2; _elementi2 = nullptr;
  1548. delete _trenutno; _trenutno = nullptr;
  1549. }
  1550. T1& getElement1(int lokacija)const { return _elementi1[lokacija]; }
  1551. T2& getElement2(int lokacija)const { return _elementi2[lokacija]; }
  1552. int getTrenutno() { return *_trenutno; }
  1553. friend ostream& operator<< (ostream &COUT, const Dictionary &obj) {
  1554. for (size_t i = 0; i < *obj._trenutno; i++)
  1555. COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
  1556. return COUT;
  1557. }
  1558. };
  1559. class DatumVrijeme {
  1560. int *_dan, *_mjesec, *_godina, *_sati, *_minuti;
  1561. public:
  1562. DatumVrijeme(int dan = 1, int mjesec = 1, int godina = 2000, int sati = 0, int minuti = 0) {
  1563. _dan = new int(dan);
  1564. _mjesec = new int(mjesec);
  1565. _godina = new int(godina);
  1566. _sati = new int(sati);
  1567. _minuti = new int(minuti);
  1568. }
  1569. ~DatumVrijeme() {
  1570. delete _dan; _dan = nullptr;
  1571. delete _mjesec; _mjesec = nullptr;
  1572. delete _godina; _godina = nullptr;
  1573. delete _sati; _sati = nullptr;
  1574. delete _minuti; _minuti = nullptr;
  1575. }
  1576. friend ostream& operator<< (ostream &COUT, const DatumVrijeme &obj) {
  1577. COUT << *obj._dan << "." << *obj._mjesec << "." << *obj._godina << " " << *obj._sati << ":" << *obj._minuti << endl;
  1578. return COUT;
  1579. }  
  1580. };
  1581.  
  1582. class Predmet {
  1583. char * _naziv;
  1584. int _ocjena;
  1585. string _napomena;
  1586. public:
  1587. Predmet(const char * naziv = "", int ocjena = 0, string napomena = "") {
  1588. _naziv = Alociraj(naziv);
  1589. _ocjena = ocjena;
  1590. _napomena = napomena;
  1591. }
  1592. ~Predmet() {
  1593. delete[] _naziv; _naziv = nullptr;
  1594. }
  1595. friend ostream& operator<< (ostream &COUT, Predmet &obj) {
  1596. COUT << obj._naziv << " (" << obj._ocjena << ") " << obj._napomena << endl;
  1597. return COUT;
  1598. }
  1599. string GetNapomena() { return _napomena; }
  1600. char * GetNaziv() { return _naziv; }
  1601. int GetOcjena() { return _ocjena; }
  1602.  
  1603. void DodajNapomenu(string napomena) {
  1604. _napomena += " " + napomena;
  1605. }
  1606. };
  1607. class Uspjeh {
  1608. GodinaStudija * _godina;
  1609. //datumvrijeme se odnosi na vrijeme evidentiranja polozenog predmeta
  1610. Dictionary<Predmet, DatumVrijeme> _predmeti;
  1611. public:
  1612. Uspjeh(GodinaStudija godina) {
  1613. _godina = new GodinaStudija(godina);
  1614. }
  1615. ~Uspjeh() { delete _godina; _godina = nullptr; }
  1616.  
  1617. Dictionary<Predmet, DatumVrijeme> * GetPredmeti() { return &_predmeti; }
  1618. GodinaStudija * GetGodinaStudija() { return _godina; }
  1619. friend ostream& operator<< (ostream &COUT, const Uspjeh &obj) {
  1620. COUT << *obj._godina << " " << obj._predmeti << endl;
  1621. return COUT;
  1622. }  
  1623. };
  1624.  
  1625. class Student {
  1626. char * _imePrezime;
  1627. string _emailAdresa;
  1628. string _brojTelefona;
  1629. vector<Uspjeh> _uspjeh;
  1630. public:
  1631. Student(const char * imePrezime, string emailAdresa, string brojTelefona) {
  1632. _imePrezime = Alociraj(imePrezime);
  1633. _emailAdresa = emailAdresa;
  1634. _brojTelefona = brojTelefona;
  1635. }
  1636. ~Student() {
  1637. delete[] _imePrezime; _imePrezime = nullptr;
  1638. }
  1639. friend ostream& operator<< (ostream &COUT, Student &obj) {
  1640. COUT << obj._imePrezime << " " << obj._emailAdresa << " " << obj._brojTelefona << endl;
  1641. return COUT;
  1642. }
  1643. vector<Uspjeh> * GetUspjeh() { return &_uspjeh; }
  1644. string GetEmail() { return _emailAdresa; }
  1645. string GetBrojTelefona() { return _brojTelefona; }
  1646. char * GetImePrezime() { return _imePrezime; } 
  1647. };
  1648.  
  1649. void main() {
  1650. /****************************************************************************
  1651. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  1652. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ĆE BITI OZNACENO KAO "RE"
  1653. 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEČILO GUBLJENJE URAĐENOG ZADATKA
  1654. 4. PROGRAMSKI CODE SE TAKOĐER NALAZI U FAJLU CODE.TXT
  1655. 5. 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.
  1656. 6. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNAČENO.
  1657. ****************************************************************************/
  1658. cout << "NA KRAJU ISPITA, RAD PREDAJTE U ODGOVARAJUCI FOLDER NA FTP SERVERU (INTEGRALNI)!" << endl;
  1659. DatumVrijeme temp,
  1660. datum19062019_1015(19, 6, 2019, 10, 15),
  1661. datum20062019_1115(20, 6, 2019, 11, 15),
  1662. datum30062019_1215(30, 6, 2019, 12, 15),
  1663. datum05072019_1231(5, 7, 2019, 12, 31);
  1664. //funkcija ToCharArray vraca datum i vrijeme kao char *. konverziju izvrsiti koristeci stringstream objekat.
  1665. //voditi racuna o tome da se izmedju datuma i vremena nalazi samo jedan razmak, te da su vrijednosti dana i mjeseca iskazane kao dvije cifre
  1666. cout << datum19062019_1015.ToCharArray() << endl;//treba ispisati: 19/06/2019 10:15
  1667. temp = datum05072019_1231;
  1668. cout << temp.ToCharArray() << endl;//treba ispisati: 05/07/2019 12:31
  1669.  
  1670. const int DictionaryTestSize = 9;
  1671. Dictionary<int, int> Dictionary1;
  1672. for (size_t i = 0; i < DictionaryTestSize; i++)
  1673. Dictionary1.AddElement(i + 1, i*i);
  1674.  
  1675. try {
  1676. //vraca elemente kolekcije koji se nalaze na lokacijama definisanim vrijednostima parametara (npr. 2 - 7).
  1677. //funkcija baca izuzetak u slucaju da se zahtijeva lokacija koja ne postoji ili je vrijednost posljednje lokacije manja od pocetne
  1678. Dictionary<int, int> opseg = Dictionary1.getRange(2, 7);
  1679. cout << opseg << endl;
  1680. Dictionary1.getRange(7, 11);
  1681. }
  1682. catch (exception& err) {
  1683. cout << err.what() << endl;
  1684. }
  1685. cout << Dictionary1 << endl;
  1686.  
  1687. Dictionary<int, int> Dictionary2 = Dictionary1;
  1688. cout << Dictionary2 << crt;
  1689.  
  1690. Dictionary<int, int> Dictionary3;
  1691. Dictionary3 = Dictionary1;
  1692. cout << Dictionary3 << crt;
  1693.  
  1694. //napomena se moze dodati i prilikom kreiranja objekta
  1695. Predmet MAT("Matematika", 7, "Ucesce na takmicenju"),
  1696. UIT("Uvod u informacijske tehnologije", 9),
  1697. RM("Racunarske mreze", 8),
  1698. EN("Engleski jezik", 6);
  1699. UIT.DodajNapomenu("Pohvala za ostvareni uspjeh");
  1700. cout << MAT << endl;
  1701.  
  1702. /*
  1703. email adresa mora biti u formatu: text-text@ nakon cega slijedi neka od sljedecih domena: hotmail.com ili outlook.com ili fit.ba. Pod text se podrazumijeva bilo koje slovo, malo ili veliko.
  1704. u slucaju da email adresa nije validna, postaviti je na defaultnu: notSet@fit.ba
  1705. za provjeru koristiti regex
  1706. */
  1707. Student jasmin("Jasmin Azemovic", "jasmin.azemovic@hotmail.com", "033 281 172");
  1708. Student adel("Adel Handzic", "adel.handzic@fit.ba", "033 281 170");
  1709. Student emailNotValid("Ime Prezime", "korisnik@lazna.ba", "033 281 170");
  1710.  
  1711. /*
  1712. uspjeh se dodaje za svaki predmet na nivou godine studija.
  1713. tom prilikom onemoguciti:
  1714. - dodavanje istoimenih predmeta na nivou jedne godine,
  1715. - dodavanje vise predmeta u kratkom vremenskom periodu (na nivou jedne godine, razmak izmedju dodavanja pojedinih predmeta mora biti najmanje 1 sat).
  1716. godine (predmeti ili uspjeh) ne moraju biti dodavani sortiranim redoslijedom (npr. prvo se moze dodati uspjeh za drugu godinu, pa onda za prvu godinu i sl.).
  1717. Funkcija vraca true ili false u zavisnosti od (ne)uspjesnost izvrsenja
  1718. */
  1719. if (jasmin.AddPredmet(UIT, DRUGA, datum20062019_1115))
  1720. cout << "Predmet uspjesno dodan!" << crt;
  1721. if (jasmin.AddPredmet(RM, DRUGA, datum30062019_1215))
  1722. cout << "Predmet uspjesno dodan!" << crt;
  1723. if (jasmin.AddPredmet(EN, PRVA, datum19062019_1015))
  1724. cout << "Predmet uspjesno dodan!" << crt;
  1725. if (jasmin.AddPredmet(MAT, PRVA, datum20062019_1115))
  1726. cout << "Predmet uspjesno dodan!" << crt;
  1727. //ne treba dodati MAT jer je vec dodana u prvoj godini
  1728. if (jasmin.AddPredmet(MAT, PRVA, datum05072019_1231))
  1729. cout << "Predmet uspjesno dodan!" << crt;
  1730. //ne treba dodati UIT jer nije prosao 1 sat od dodavanja posljednjeg predmeta
  1731. if (jasmin.AddPredmet(UIT, PRVA, datum20062019_1115))
  1732. cout << "Predmet uspjesno dodan!" << crt;
  1733. /*nakon evidentiranja uspjeha na bilo kojem predmetu tj. prilikom uspjesno izvrsene funkcije AddPredmet, Studentu se salje email sa sadrzajem: 
  1734. FROM:info@fit.ba
  1735. TO: emailStudenta
  1736. Postovani ime i prezime, evidentirali ste uspjeh za X godinu studija.
  1737. Pozdrav.
  1738. FIT Team.
  1739.  
  1740. ukoliko je, nakon dodavanja predmeta, prosjek na nivou te godine veci od 8.0 Studentu se, pored email-a, salje i SMS sa sadrzajem: "Svaka cast za uspjeh X.X ostvaren u X godini studija".
  1741. slanje poruka i emailova implemenitrati koristeci zasebne thread-ove.
  1742. */
  1743. cout << "USPJEH ISPISATI KORISTEĆI OSTREAM_ITERATOR" << endl;
  1744. cout << jasmin << endl;
  1745. //vraca broj ponavljanja odredjene rijeci u napomenama, koristiti sregex_iterator
  1746. cout << "Rijec takmicenje se pojavljuje " << jasmin.BrojPonavljanjaRijeci("takmicenju") << " puta." << endl;
  1747.  
  1748. //vraca niz predmeta koji su evidentiranih u periodu izmedju vrijednosti proslijedjenih parametara
  1749. vector<Predmet> jasminUspjeh = jasmin(new DatumVrijeme(18, 06, 2019, 10, 15), new DatumVrijeme(21, 06, 2019, 10, 10));
  1750. for (Predmet u : jasminUspjeh)
  1751. cout << u << endl;
  1752.  
  1753. Uspjeh * uspjeh_I_godina = jasmin["PRVA"];//vraca uspjeh Studenta ostvaren u prvoj godini studija
  1754. if (uspjeh_I_godina != nullptr)
  1755. cout << *uspjeh_I_godina << endl;
  1756.  
  1757. cin.get();
  1758. system("pause>0");
  1759. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement