Advertisement
Guest User

vize

a guest
Dec 10th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.34 KB | None | 0 0
  1. #include<iostream>
  2. #include<string>
  3. #include<iterator>
  4. #include<vector>
  5. #include<exception>
  6.  
  7. using namespace std;
  8. const char *crt = "\n-----------------------------------------------\n";
  9.  
  10. enum Status { ZAHTJEV_ZAPRIMLJEN, ODUSTAO, ODBIJENA, IZDATA, ISTEKLA, PONISTENA };
  11. enum Sortiranje { RASTUCI, OPADAJUCI };
  12. enum Drzava { SAD, AUSTRALIJA, ENGLESKA };
  13.  
  14. class Datum {
  15. int *_dan, *_mjesec, *_godina;
  16. public:
  17. Datum(int dan = 1, int mjesec = 1, int godina = 2000) {
  18. _dan = new int(dan);
  19. _mjesec = new int(mjesec);
  20. _godina = new int(godina);
  21. }
  22.  
  23. bool operator<(const Datum & d)
  24. {
  25. if (d._dan < _dan)
  26. return false;
  27. else if (d._mjesec < _mjesec)
  28. return false;
  29. else if (d._dan < _dan)
  30. return false;
  31. }
  32.  
  33. bool operator>(const Datum & d)
  34. {
  35. if (d._dan > _dan)
  36. return false;
  37. else if (d._mjesec > _mjesec)
  38. return false;
  39. else if (d._dan > _dan)
  40. return false;
  41. }
  42.  
  43. bool Mladji(int godina=2018)
  44. {
  45. int god = godina - *_godina;
  46. if (god > 10)
  47. return true;
  48. else
  49. return false;
  50. }
  51.  
  52. Datum(const Datum & d)
  53. {
  54. _dan = new int(*d._dan);
  55. _mjesec = new int(*d._mjesec);
  56. _godina = new int(*d._godina);
  57. }
  58.  
  59. Datum & operator =(const Datum &d)
  60. {
  61. if (this != &d)
  62. {
  63. delete _dan; delete _mjesec; delete _godina;
  64. _dan = _mjesec = _godina = nullptr;
  65. _dan = new int(*d._dan);
  66. _mjesec = new int(*d._mjesec);
  67. _godina = new int(*d._godina);
  68. }
  69. return *this;
  70. }
  71.  
  72. bool operator==(const Datum & d)
  73. {
  74. return *_dan == *d._dan && *_mjesec == *d._mjesec && *_godina == *d._godina;
  75. }
  76.  
  77. Datum & operator++()
  78. {
  79. (*_dan)++;
  80.  
  81. return *this;
  82. }
  83.  
  84. ~Datum() {
  85. delete _dan; _dan = nullptr;
  86. delete _mjesec; _mjesec = nullptr;
  87. delete _godina; _godina = nullptr;
  88. }
  89. friend ostream& operator<< (ostream &COUT, Datum &obj) {
  90. COUT << *obj._dan << "." << *obj._mjesec << "." << *obj._godina;
  91. return COUT;
  92. }
  93. };
  94.  
  95. template<class T1, class T2, int max>
  96. class FITKolekcija {
  97. T1 * _elementi1[max];
  98. T2 * _elementi2[max];
  99. int _trenutno;
  100. public:
  101. FITKolekcija() {
  102. for (size_t i = 0; i < max; i++) {
  103. _elementi1[i] = nullptr;
  104. _elementi2[i] = nullptr;
  105. }
  106. _trenutno = 0;
  107. }
  108.  
  109. FITKolekcija(const FITKolekcija & k)
  110. {
  111. for (int i = 0; i < k._trenutno; i++)
  112. {
  113. _elementi1[i] = new T1(*k._elementi1[i]);
  114. _elementi2[i] = new T2(*k._elementi2[i]);
  115. }
  116. _trenutno = k._trenutno;
  117. }
  118.  
  119. FITKolekcija & operator=(const FITKolekcija & k)
  120. {
  121. if (this != &k)
  122. {
  123. delete[]_elementi1; delete[]_elementi2;
  124. _elementi1 = nullptr; _elementi2 = nullptr;
  125. for (int i = 0; i < k._trenutno; i++)
  126. {
  127. _elementi1[i] = new T1(*k._elementi1[i]);
  128. _elementi2[i] = new T2(*k._elementi2[i]);
  129. }
  130. _trenutno = k._trenutno;
  131. }
  132. return *this;
  133. }
  134.  
  135. void Dodaj(T1 e1, T2 e2)
  136. {
  137. if (_trenutno >= max)
  138. throw exception("Prekoracen opseg niza.");
  139. _elementi1[_trenutno] = new T1(e1);
  140. _elementi2[_trenutno] = new T2(e2);
  141. _trenutno++;
  142. }
  143.  
  144. void Sortiraj(Sortiranje tip)
  145. {
  146. for (int i = 0; i < _trenutno; i++)
  147. {
  148. for (int j = 0; j < _trenutno-1; j++)
  149. {
  150. T1 temp1 = *_elementi1[j];
  151. T2 temp2 = *_elementi2[j];
  152. if (tip == RASTUCI)
  153. {
  154. if (*_elementi1[j] > *_elementi1[j + 1])
  155. {
  156. *_elementi1[j] = *_elementi1[j + 1];
  157. *_elementi1[j + 1] = temp1;
  158. *_elementi2[j] = *_elementi2[j + 1];
  159. *_elementi2[j + 1] = temp2;
  160. }
  161. }
  162. else
  163. {
  164. if (*_elementi1[j] < *_elementi1[j + 1])
  165. {
  166. *_elementi1[j] = *_elementi1[j + 1];
  167. *_elementi1[j + 1] = temp1;
  168. *_elementi2[j] = *_elementi2[j + 1];
  169. *_elementi2[j + 1] = temp2;
  170. }
  171. }
  172. }
  173. }
  174. }
  175.  
  176. ~FITKolekcija() {
  177. for (size_t i = 0; i < max; i++) {
  178. delete _elementi1[i]; _elementi1[i] = nullptr;
  179. delete _elementi2[i]; _elementi2[i] = nullptr;
  180. }
  181. }
  182. T1 ** GetT1() { return _elementi1; }
  183. T2 ** GetT2() { return _elementi2; }
  184. int GetTrenutno() { return _trenutno; }
  185.  
  186. friend ostream& operator<< (ostream &COUT, FITKolekcija &obj) {
  187. for (size_t i = 0; i < obj._trenutno; i++)
  188. COUT << *obj._elementi1[i] << " " << *obj._elementi2[i] << endl;
  189. return COUT;
  190. }
  191. };
  192.  
  193. class Viza {
  194. protected:
  195. Drzava _drzava;
  196. Datum _vazenjeOD;
  197. Datum _vazenjeDO;
  198. char * _napomena;
  199. // string se odnosi na razlog promjene statusa, a moguće je samo 10 izmjena statusa
  200. FITKolekcija<Status, string, 10> _statusi;
  201. public:
  202. Viza(Drzava drzava, Datum _OD, Datum _DO, char * napomena = nullptr) :_vazenjeDO(_DO), _vazenjeOD(_OD)
  203. {
  204. if (napomena != nullptr) {
  205. _napomena = new char[strlen(napomena) + 1];
  206. strcpy_s(_napomena, strlen(napomena) + 1, napomena);
  207. }
  208. else
  209. _napomena = nullptr;
  210. _drzava = drzava;
  211. }
  212.  
  213. bool operator==(const Viza & v)
  214. {
  215. return _drzava == v._drzava && _vazenjeOD == v._vazenjeOD && _vazenjeDO == v._vazenjeDO;
  216. }
  217.  
  218. ~Viza() { delete[] _napomena; _napomena = nullptr; }
  219. Datum GetVazenjeOD() { return _vazenjeOD; }
  220. Datum GetVazenjeDO() { return _vazenjeDO; }
  221. char * GetNapomena() { return _napomena; }
  222. Drzava GetDrzava()
  223. {
  224. return _drzava;
  225. }
  226. FITKolekcija<Status, string, 10> & GetStatuse() { return _statusi; }
  227. virtual void Info() = 0;
  228. };
  229.  
  230. class PoslovnaViza :public Viza {
  231. string _kompanija; //naziv kompanije koja potvrđuje da posluje sa aplikantom
  232. public:
  233. PoslovnaViza(Drzava drzava, Datum _OD, Datum _DO, string kompanija, char * napomena = nullptr) : Viza(drzava, _OD, _DO, napomena) {
  234. _kompanija = kompanija;
  235. }
  236. friend ostream & operator << (ostream & COUT, PoslovnaViza & obj) {
  237. COUT << obj._drzava << " " << obj._vazenjeOD << " " << obj._vazenjeDO << " " << obj._kompanija << endl;
  238. COUT << ((obj._napomena != nullptr) ? obj._napomena : "") << endl;
  239. COUT << "STATUSI -> " << obj._statusi << endl;
  240. return COUT;
  241.  
  242. }
  243.  
  244. void Info()
  245. {
  246. cout << *this;
  247. }
  248.  
  249. };
  250.  
  251. class TuristickaViza : public Viza {
  252. string _adresa; //adresa hotele ili drugog smještaja na kojoj će aplikant boraviti
  253. public:
  254. TuristickaViza(Drzava drzava, Datum _OD, Datum _DO, string adresa, char * napomena = nullptr) : Viza(drzava, _OD, _DO, napomena) {
  255. _adresa = adresa;
  256. }
  257. friend ostream & operator << (ostream & COUT, TuristickaViza & obj) {
  258. COUT << obj._drzava << " " << obj._vazenjeOD << " " << obj._vazenjeDO << " " << obj._adresa << endl;
  259. COUT << ((obj._napomena != nullptr) ? obj._napomena : "") << endl;
  260. COUT << "STATUSI -> " << obj._statusi << endl;
  261. return COUT;
  262.  
  263. }
  264.  
  265. void Info() {
  266. cout << *this;
  267. }
  268. };
  269.  
  270. class Aplikant {
  271. char * _imePrezime;
  272. Datum * _datumRodjenja;
  273. char * _brojPasosa;
  274. vector<Viza *> _vize;
  275. public:
  276. Aplikant(const char * imePrezime, Datum datumRodjenja, const char * brPasosa) {
  277. int vel = strlen(imePrezime) + 1;
  278. _imePrezime = new char[vel];
  279. strcpy_s(_imePrezime, vel, imePrezime);
  280. vel = strlen(brPasosa) + 1;
  281. _brojPasosa = new char[vel];
  282. strcpy_s(_brojPasosa, vel, brPasosa);
  283. _datumRodjenja = new Datum(datumRodjenja);
  284. }
  285.  
  286. Aplikant(const Aplikant & a)
  287. {
  288. _imePrezime = new char[strlen(a._imePrezime) + 1];
  289. strcpy_s(_imePrezime, strlen(a._imePrezime) + 1, a._imePrezime);
  290. _brojPasosa = new char[strlen(a._brojPasosa) + 1];
  291. strcpy_s(_brojPasosa, strlen(a._brojPasosa) + 1, a._brojPasosa);
  292. _datumRodjenja = new Datum(*a._datumRodjenja);
  293. }
  294.  
  295. Aplikant & operator=(const Aplikant & a)
  296. {
  297. if (this != &a)
  298. {
  299. delete[]_imePrezime; _imePrezime = nullptr;
  300. delete[]_brojPasosa; _brojPasosa = nullptr;
  301. delete _datumRodjenja; _datumRodjenja = nullptr;
  302. for (size_t i = 0; i < _vize.size(); i++)
  303. {
  304. delete _vize[i]; _vize[i] = nullptr;
  305. }
  306.  
  307. _imePrezime = new char[strlen(a._imePrezime) + 1];
  308. strcpy_s(_imePrezime, strlen(a._imePrezime) + 1, a._imePrezime);
  309. _brojPasosa = new char[strlen(a._brojPasosa) + 1];
  310. strcpy_s(_brojPasosa, strlen(a._brojPasosa) + 1, a._brojPasosa);
  311. _datumRodjenja = new Datum(*a._datumRodjenja);
  312. }
  313. return *this;
  314. }
  315.  
  316. bool DodajVizu(Viza * v)
  317. {
  318. if (!_datumRodjenja->Mladji(10))
  319. return false;
  320. for (int i = 0; i < _vize.size(); i++)
  321. {
  322. if (v->GetVazenjeOD() > _vize[i]->GetVazenjeOD() && v->GetVazenjeOD() < _vize[i]->GetVazenjeDO() && v->GetDrzava()==_vize[i]->GetDrzava())
  323. {
  324. for (int j = 0; j < v->GetStatuse().GetTrenutno(); j++)
  325. {
  326. if (*_vize[i]->GetStatuse().GetT1()[j] == Status::IZDATA)
  327. return false;
  328. }
  329. }
  330.  
  331. if (v->GetDrzava() == SAD && _vize[i]->GetDrzava() == SAD)
  332. {
  333. for (int j = 0; j < v->GetStatuse().GetTrenutno(); j++)
  334. {
  335. if (*_vize[i]->GetStatuse().GetT1()[j] == Status::PONISTENA)
  336. return false;
  337. }
  338. }
  339. }
  340. if (dynamic_cast<PoslovnaViza*>(v) != nullptr) {
  341. _vize.push_back(new PoslovnaViza(*dynamic_cast<PoslovnaViza*>(v)));
  342. }
  343. else if (dynamic_cast<TuristickaViza*>(v) != nullptr) {
  344. _vize.push_back(new TuristickaViza(*dynamic_cast<TuristickaViza*>(v)));
  345. }
  346. return true;
  347. }
  348.  
  349. //STATUSI SE MOGU DODAVATI SAMO U REDOSLIJEDU U KOJEM SE NALAZE U ENUMERACIJI NPR.
  350. //- NIJE MOGUĆE ODBITI VIZU AKO PRETHODNO NIJE IMALA STATUS DA JE ZAHTJEV_ZAPRIMLJEN;
  351. //- NIJE MOGUĆE PONIŠTITI VIZU KOJA PRETHODNO NIJE IZDATA
  352.  
  353. bool DodajStatus(Viza * v, Status status, string poruka =" ")
  354. {
  355. for (int i = 0; i < _vize.size(); i++)
  356. {
  357. if (*_vize[i] == *v)
  358. {
  359. bool zahtjevZaprimljen = false;
  360. bool izdata = false;
  361. for (int j = 0; j < v->GetStatuse().GetTrenutno(); j++)
  362. {
  363. if (*_vize[j]->GetStatuse().GetT1()[j] == Status::ZAHTJEV_ZAPRIMLJEN)
  364. zahtjevZaprimljen = true;
  365. if (*_vize[j]->GetStatuse().GetT1()[j] == Status::IZDATA)
  366. izdata = true;
  367. }
  368. if (status == Status::ZAHTJEV_ZAPRIMLJEN)
  369. {
  370. _vize[i]->GetStatuse().Dodaj(status, poruka);
  371. return true;
  372. }
  373. else if ((status == Status::ODUSTAO || status == Status::ODBIJENA || status == Status::IZDATA) && zahtjevZaprimljen)
  374. {
  375. _vize[i]->GetStatuse().Dodaj(status, poruka);
  376. return true;
  377. }
  378. else if ((status == Status::PONISTENA || status == Status::ISTEKLA) && izdata)
  379. {
  380. _vize[i]->GetStatuse().Dodaj(status, poruka);
  381. return true;
  382. }
  383. }
  384.  
  385. }
  386. return false;
  387. }
  388.  
  389. ~Aplikant() {
  390. delete[]_imePrezime; _imePrezime = nullptr;
  391. delete[]_brojPasosa; _brojPasosa = nullptr;
  392. delete _datumRodjenja; _datumRodjenja = nullptr;
  393. for (size_t i = 0; i < _vize.size(); i++)
  394. {
  395. delete _vize[i]; _vize[i] = nullptr;
  396. }
  397. }
  398.  
  399. friend ostream & operator << (ostream & COUT, Aplikant & obj) {
  400. COUT << obj._imePrezime << " " << obj._datumRodjenja << " " << obj._brojPasosa << endl;
  401. COUT << "VIZE -> " << endl;
  402. for (size_t i = 0; i < obj._vize.size(); i++)
  403. COUT << obj._vize[i] << endl;
  404. return COUT;
  405. }
  406.  
  407. vector<Viza * > GetVize() { return _vize; }
  408. };
  409.  
  410. void main() {
  411.  
  412. Datum danas(15, 2, 2017);
  413. Datum sutra(++danas); // inkrementiranjem se uvecava dan za 1
  414. Datum prekosutra;
  415. Datum dat15022017(15, 2, 2017), dat18082017(18, 8, 2017), dat11052018(11, 5, 2018), dat11122017(11, 12, 2017);
  416.  
  417.  
  418. prekosutra = danas;
  419. if (prekosutra == danas)
  420. cout << "Datumi su jednaki" << endl;
  421. cout << danas << endl << sutra << endl << prekosutra << crt;
  422.  
  423. int v6 = 6, v13 = 13, v32 = 32, v63 = 63, v98 = 98, v109 = 109, v196 = 196;
  424.  
  425. FITKolekcija<int, int, 7> brojevi;
  426. brojevi.Dodaj(v196, v6);
  427. brojevi.Dodaj(v13, v32);
  428. brojevi.Dodaj(v98, v196);
  429. brojevi.Dodaj(v63, v13);
  430. brojevi.Dodaj(v98, v196);
  431. brojevi.Dodaj(v196, v6);
  432.  
  433. cout << brojevi << crt;
  434. //NA KOJI NAČIN ĆE SE VRŠITI SORTIRANJE PRVENSTVENO ZAVISI OD VRIJEDNOSTI PARAMETRA, A VRŠI SE NA OSNOVU VRIJEDNOSTI TIPA T1
  435. brojevi.Sortiraj(RASTUCI);
  436. cout << brojevi << crt;
  437. brojevi.Sortiraj(OPADAJUCI);
  438. cout << brojevi << crt;
  439.  
  440. try
  441. {
  442. //U SLUČAJU PREKORAČENJA DEFINISANE VELIČINE KOLEKCIJE, POTREBNO JE BACITI IZUZETAK
  443. brojevi.Dodaj(v13, v196);
  444. }
  445. catch (exception & err)
  446. {
  447. cout << "Error -> " << err.what() << endl;
  448. }
  449.  
  450. Aplikant jasmin("Jasmin Azemovic", Datum(15, 5, 1979), "BS6985645");
  451. PoslovnaViza poslovna(SAD, dat15022017, dat18082017, "Microsoft");
  452.  
  453. /*
  454. NOVA VIZA SE NE MOŽE DODATI UKOLIKO:
  455. - JE APLIKANT MLAĐI OD 10 GODINA
  456. - 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.
  457. DA VIZA NIJE PONIŠTENA ILI ISTEKLA) VIZA ZA TU DRŽAVU, BEZ OBZIRA NA NJENU VRSTU.
  458. - JE NEKA OD RANIJIH VIZA PONIŠTENA (OVO SE ODNOSI SAMO NA VIZE ZA DRŽAVU: SAD)
  459. */
  460. if (jasmin.DodajVizu(&poslovna))
  461. cout << "Podaci o vizi uspješno zaprimljeni" << endl;
  462. /*
  463. //STATUSI SE MOGU DODAVATI SAMO U REDOSLIJEDU U KOJEM SE NALAZE U ENUMERACIJI NPR.
  464. //- NIJE MOGUĆE ODBITI VIZU AKO PRETHODNO NIJE IMALA STATUS DA JE ZAHTJEV_ZAPRIMLJEN;
  465. //- NIJE MOGUĆE PONIŠTITI VIZU KOJA PRETHODNO NIJE IZDATA
  466. */
  467. if (jasmin.DodajStatus(&poslovna, ZAHTJEV_ZAPRIMLJEN, "provjeriti navode sa predstavnicima kompanije Microsoft"))
  468. cout << "Status vize uspijesno promijenjen" << endl;
  469. else
  470. cout << "Aplikant " << jasmin << " ne posjeduje evidentiranu trazenu vizu ili status vize nema odgovarajucu vrijednost" << endl;
  471.  
  472.  
  473. if (jasmin.DodajStatus(&poslovna, PONISTENA, "predstavnicima kompanije Microsoft nemaju informaciju o posjeti navedenog aplikanta"))
  474. cout << "Status vize uspijesno promijenjen" << endl;
  475. else
  476. cout << "Aplikant " << jasmin << " ne posjeduje evidentiranu trazenu vizu ili status vize nema odgovarajucu vrijednost" << endl;
  477.  
  478. TuristickaViza turisticka(ENGLESKA, dat18082017, dat11122017, "Whitehall Pl, London SW1A 2BD, UK");
  479.  
  480. if (jasmin.DodajStatus(&turisticka, ZAHTJEV_ZAPRIMLJEN))
  481. cout << "Status vize uspijesno promijenjen" << endl;
  482. else
  483. cout << "Aplikant " << jasmin << " ne posjeduje evidentiranu trazenu vizu ili status vize nema odgovarajucu vrijednost" << endl;
  484.  
  485. if (jasmin.DodajStatus(&turisticka, IZDATA)) {
  486. cout << "Status vize uspijesno promijenjen" << endl;
  487. }
  488. // //U ZASEBNOJ NITI URADITI PRINTANJE VIZE...KORISTITI METODU SLEEP_FOR
  489. // jasmin.PrintajVizu(&turisticka);
  490.  
  491. //else
  492. // cout << "Aplikant " << jasmin << " ne posjeduje evidentiranu trazenu vizu ili status vize nema odgovarajucu vrijednost" << endl;
  493. ////VRAĆA PODATKE O SVIM VIZAMA KOJE SU IZDATE ZA ODREĐENU DRŽAVU, A KOJE SU IMALE ODREĐENI STATUS
  494. //vector<Viza *> jasminVize = jasmin.GetVizeByDrzava(SAD, PONISTENA);
  495.  
  496. ////UNUTAR NAPOMENE MIJENJA SADRŽAJ "nemaju informaciju" SA "su upoznti sa" - KORISTITI REGEX
  497. //jasmin.ZamijeniRijec("nemaju informaciju", "su upoznti sa");
  498.  
  499. system("pause");
  500. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement