Advertisement
EnsarMeskovic

[PR III] VizePoslovneTuristickeAplikantiStatusiThreadRegEx

Mar 23rd, 2017
581
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 22.65 KB | None | 0 0
  1. #include <iostream>
  2. #include <thread>
  3. #include <mutex>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <string>
  7. #include <regex>
  8. #include <exception>
  9. using namespace std;
  10. mutex strazar;
  11. char *crt = "\n-----------------------------------------------\n";
  12.  
  13. enum Status { ZAHTJEV_ZAPRIMLJEN, ODUSTAO, ODBIJENA, IZDATA, ISTEKLA, PONISTENA };
  14. char *_statusVize[]{ "ZAHTJEV_ZAPRIMLJEN", "ODUSTAO", "ODBIJENA", "IZDATA", "ISTEKLA", "PONISTENA" };
  15. enum Sortiranje { RASTUCI, OPADAJUCI };
  16. char *_vrstaSortiranja[]{ "RASTUCI", "OPADAJUCI" };
  17. enum Drzava { SAD, AUSTRALIJA, ENGLESKA };
  18. char *_ispisDrzave[]{ "SAD", "AUSTRALIJA", "ENGLESKA" };
  19.  
  20. bool PrestupnaGodina(int godina) {
  21.     return ((godina % 400 == 0 || godina % 100 != 0) && godina % 4 == 0);
  22. }
  23.  
  24. class Datum {
  25.     int *_dan, *_mjesec, *_godina;
  26. public:
  27.     Datum(int dan = 1, int mjesec = 1, int godina = 2000) {
  28.         _dan = new int(dan);
  29.         _mjesec = new int(mjesec);
  30.         _godina = new int(godina);
  31.     }
  32.     ~Datum() {
  33.         delete _dan; _dan = nullptr;
  34.         delete _mjesec; _mjesec = nullptr;
  35.         delete _godina; _godina = nullptr;
  36.     }
  37.     Datum(const Datum &obj) {
  38.         _dan = new int(*obj._dan);
  39.         _mjesec = new int(*obj._mjesec);
  40.         _godina = new int(*obj._godina);
  41.     }
  42.     Datum & operator = (const Datum &obj) {
  43.         if (this != &obj) {
  44.             delete _dan; delete _mjesec; delete _godina;
  45.             _dan = new int(*obj._dan);
  46.             _mjesec = new int(*obj._mjesec);
  47.             _godina = new int(*obj._godina);
  48.         } return *this;
  49.     }
  50.     int sumaDana() {
  51.         int brDana[]{ 31,28 + PrestupnaGodina(*_godina), 31,30,31,30,31,31,30,31,30,31 }, suma = *_dan;
  52.  
  53.         for (int i = 1950; i < *_godina; i++)
  54.             suma += PrestupnaGodina(i) ? 366 : 365;
  55.  
  56.         for (int i = 1; i < *_mjesec; i++)
  57.             suma += brDana[i - 1];
  58.  
  59.         return suma;
  60.     }
  61.     Datum & operator ++ () {
  62.         int brDana[]{ 31,28 + PrestupnaGodina(*_godina), 31,30,31,30,31,31,30,31,30,31 };
  63.  
  64.         *_dan = (*_dan % brDana[*_mjesec - 1]) + 1;
  65.         *_mjesec = (*_dan == 1) ? *_mjesec + 1 == 13 ? 1 : *_mjesec + 1 : *_mjesec;
  66.         *_godina = (*_mjesec == 1 && *_dan == 1) ? *_godina + 1 : *_godina;
  67.  
  68.         return *this;
  69.     }
  70.     int GodineStarosti(int dan = 26, int mjesec = 6, int godina = 2017) {
  71.         int godineStarosti = godina - *_godina;
  72.         godineStarosti = (*_mjesec > mjesec) ? godineStarosti - 1 : *_mjesec == mjesec ? *_dan < dan ? godineStarosti - 1 : godineStarosti : godineStarosti;
  73.         return godineStarosti;
  74.     }
  75.     friend ostream& operator<< (ostream &COUT, const Datum &obj);
  76.     friend bool operator == (const Datum &d1, const Datum &d2);
  77.     friend bool operator < (const Datum &d1, const Datum &d2);
  78.     friend bool operator > (const Datum &d1, const Datum &d2);
  79.     friend bool operator <= (const Datum &d1, const Datum &d2);
  80.     friend bool operator >= (const Datum &d1, const Datum &d2);
  81. };
  82. ostream& operator<< (ostream &COUT, const Datum &obj) {
  83.     COUT << *obj._dan << "." << *obj._mjesec << "." << *obj._godina;
  84.     return COUT;
  85. }
  86. bool operator == (const Datum &d1, const Datum &d2) {
  87.     return *d1._godina == *d2._godina && *d1._mjesec == *d2._mjesec && *d1._dan == *d2._dan;
  88. }
  89. bool operator < (const Datum &d1, const Datum &d2) {
  90.     if (*d1._godina < *d2._godina)
  91.         return true;
  92.     if (*d1._godina == *d2._godina) {
  93.         if (*d1._mjesec < *d2._mjesec)
  94.             return true;
  95.         if (*d1._mjesec == *d2._mjesec) {
  96.             if (*d1._dan < *d2._dan)
  97.                 return true;
  98.         }
  99.     } return false;
  100. }
  101. bool operator > (const Datum &d1, const Datum &d2) {
  102.     return !(d1 < d2) && !(d1 == d2);
  103. }
  104. bool operator <= (const Datum &d1, const Datum &d2) {
  105.     return d1 < d2 || d1 == d2;
  106. }
  107. bool operator >= (const Datum &d1, const Datum &d2) {
  108.     return d1 > d2 || d1 == d2;
  109. }
  110.  
  111. template<class T1>
  112. void SWAP(T1 &e1, T1 &e2) {
  113.     T1 temp = e1;
  114.     e1 = e2;
  115.     e2 = temp;
  116. }
  117.  
  118. template<class T1, class T2, int max>
  119. class FITKolekcija {
  120.     T1 * _elementi1[max];
  121.     T2 * _elementi2[max];
  122.     int _trenutno;
  123. public:
  124.     FITKolekcija() {
  125.         for (size_t i = 0; i < max; i++) {
  126.             _elementi1[i] = nullptr;
  127.             _elementi2[i] = nullptr;
  128.         }
  129.         _trenutno = 0;
  130.     }
  131.     ~FITKolekcija() {
  132.         for (size_t i = 0; i < _trenutno; i++) {
  133.             delete _elementi1[i]; _elementi1[i] = nullptr;
  134.             delete _elementi2[i]; _elementi2[i] = nullptr;
  135.         }
  136.     }
  137.     FITKolekcija(const FITKolekcija &obj) {
  138.         for (int i = 0; i < max; i++) {
  139.             if (i < obj._trenutno) {
  140.                 _elementi1[i] = new T1(*obj._elementi1[i]);
  141.                 _elementi2[i] = new T2(*obj._elementi2[i]);
  142.             }
  143.             else {
  144.                 _elementi1[i] = nullptr;
  145.                 _elementi2[i] = nullptr;
  146.             }
  147.         }
  148.     }
  149.     FITKolekcija & operator = (const FITKolekcija &obj) {
  150.         if (this != &obj) {
  151.             for (int i = 0; i < _trenutno; i++) {
  152.                 delete _elementi1[i];
  153.                 delete _elementi2[i];
  154.             }
  155.             for (int i = 0; i < max; i++) {
  156.                 if (i < obj._trenutno) {
  157.                     _elementi1[i] = new T1(*obj._elementi1[i]);
  158.                     _elementi2[i] = new T2(*obj._elementi2[i]);
  159.                 }
  160.                 else {
  161.                     _elementi1[i] = nullptr;
  162.                     _elementi2[i] = nullptr;
  163.                 }
  164.             }
  165.         } return *this;
  166.     }
  167.     void Dodaj(T1 e1, T2 e2) {
  168.         if (_trenutno == max) throw exception("Prekoracenje opsega niza!");
  169.         _elementi1[_trenutno] = new T1(e1);
  170.         _elementi2[_trenutno++] = new T2(e2);
  171.     }
  172.     void Sortiraj(Sortiranje tip) {
  173.         if (tip == OPADAJUCI) {
  174.             bool promjena = true; int j = 0;
  175.             while (promjena) {
  176.                 promjena = false;
  177.                 j++;
  178.                 for (int i = 0; i < _trenutno - j; i++) {
  179.                     if (*_elementi1[i] < *_elementi1[i + 1]) {
  180.                         SWAP(_elementi1[i], _elementi1[i + 1]);
  181.                         SWAP(_elementi2[i], _elementi2[i + 1]);
  182.                         promjena = true;
  183.                     }
  184.                 }
  185.             }
  186.         }
  187.         else {
  188.             bool promjena = true; int j = 0;
  189.             while (promjena) {
  190.                 promjena = false;
  191.                 j++;
  192.                 for (int i = 0; i < _trenutno - j; i++) {
  193.                     if (*_elementi1[i] > *_elementi1[i + 1]) {
  194.                         SWAP(_elementi1[i], _elementi1[i + 1]);
  195.                         SWAP(_elementi2[i], _elementi2[i + 1]);
  196.                         promjena = true;
  197.                     }
  198.                 }
  199.             }
  200.         }
  201.     }
  202.     T1 ** GetT1() { return _elementi1; }
  203.     T2 ** GetT2() { return _elementi2; }
  204.     int GetTrenutno() { return _trenutno; }
  205.  
  206.     friend ostream& operator<< <> (ostream &COUT, FITKolekcija<T1, T2, max> &obj);
  207. };
  208. template<class T1, class T2, int max>
  209. ostream& operator<< (ostream &COUT, FITKolekcija<T1, T2, max> &obj) {
  210.     for (size_t i = 0; i < obj._trenutno; i++)
  211.         COUT << *obj._elementi1[i] << " " << *obj._elementi2[i] << endl;
  212.     return COUT;
  213. }
  214.  
  215. class Viza {
  216. protected:
  217.     Drzava _drzava;
  218.     Datum _vazenjeOD;
  219.     Datum _vazenjeDO;
  220.     char * _napomena;
  221.     // string se odnosi na razlog promjene statusa, a moguće je samo 10 izmjena statusa
  222.     FITKolekcija<Status, string, 10> _statusi;
  223. public:
  224.     Viza(Drzava drzava, Datum _OD, Datum _DO, char * napomena = nullptr) :_vazenjeDO(_DO), _vazenjeOD(_OD)
  225.     {
  226.         if (napomena != nullptr) {
  227.             _napomena = new char[strlen(napomena) + 1];
  228.             strcpy_s(_napomena, strlen(napomena) + 1, napomena);
  229.         }
  230.         else
  231.             _napomena = nullptr;
  232.         _drzava = drzava;
  233.     }
  234.     ~Viza() { delete[] _napomena; _napomena = nullptr; }
  235.     Viza(const Viza &obj) : _vazenjeDO(obj._vazenjeDO), _vazenjeOD(obj._vazenjeOD) {
  236.         if (obj._napomena != nullptr) {
  237.             _napomena = new char[strlen(obj._napomena) + 1];
  238.             strcpy_s(_napomena, strlen(obj._napomena) + 1, obj._napomena);
  239.         }
  240.         else
  241.             _napomena = nullptr;
  242.         _drzava = obj._drzava;
  243.     }
  244.     Viza & operator = (const Viza &obj) {
  245.         if (this != &obj) {
  246.             delete[]_napomena;
  247.             if (obj._napomena != nullptr) {
  248.                 _napomena = new char[strlen(obj._napomena) + 1];
  249.                 strcpy_s(_napomena, strlen(obj._napomena) + 1, obj._napomena);
  250.             }
  251.             else
  252.                 _napomena = nullptr;
  253.             _vazenjeDO = obj._vazenjeDO;
  254.             _vazenjeOD = obj._vazenjeOD;
  255.             _drzava = obj._drzava;
  256.         } return *this;
  257.     }
  258.     Datum GetVazenjeOD() { return _vazenjeOD; }
  259.     Datum GetVazenjeDO() { return _vazenjeDO; }
  260.     char * GetNapomena() { return (_napomena == nullptr ? "" : _napomena); }
  261.     Drzava GetDrzava() { return _drzava; }
  262.     FITKolekcija<Status, string, 10> & GetStatuse() { return _statusi; }
  263.     virtual void Info() = 0;
  264.     friend bool operator == (Viza &prva, Viza &druga);
  265.     friend ostream & operator << (ostream &COUT, Viza &viza);
  266. };
  267. bool operator == (Viza &prva, Viza &druga) {
  268.     return prva._drzava == druga._drzava && prva._vazenjeOD == druga._vazenjeOD && prva._vazenjeDO == druga._vazenjeDO && prva._napomena == druga._napomena;
  269. }
  270. class PoslovnaViza :public Viza {
  271.     string _kompanija; //naziv kompanije koja potvrđuje da posluje sa aplikantom
  272. public:
  273.     //PoslovnaViza poslovna(SAD, dat15022017, dat18082017, "Microsoft");
  274.     PoslovnaViza(Drzava drzava, Datum _OD, Datum _DO, string kompanija, char * napomena = nullptr) : Viza(drzava, _OD, _DO, napomena) {
  275.         _kompanija = kompanija;
  276.     }
  277.     ~PoslovnaViza() {};
  278.     PoslovnaViza(const PoslovnaViza &obj) : Viza(obj) {
  279.         _kompanija = obj._kompanija;
  280.     }
  281.     PoslovnaViza & operator = (const PoslovnaViza &obj) {
  282.         if (this != &obj) {
  283.             delete[]_napomena;
  284.             if (obj._napomena != nullptr) {
  285.                 _napomena = new char[strlen(obj._napomena) + 1];
  286.                 strcpy_s(_napomena, strlen(obj._napomena) + 1, obj._napomena);
  287.             }
  288.             else
  289.                 _napomena = nullptr;
  290.             _vazenjeDO = obj._vazenjeDO;
  291.             _vazenjeOD = obj._vazenjeOD;
  292.             _drzava = obj._drzava;
  293.             _kompanija = obj._kompanija;
  294.         } return *this;
  295.     }
  296.     virtual void Info() {
  297.         cout << "Poslovna Viza" << endl;
  298.     }
  299.     friend ostream & operator << (ostream & COUT, PoslovnaViza & obj);
  300. };
  301. ostream & operator << (ostream & COUT, PoslovnaViza & obj) {
  302.     COUT << _ispisDrzave[obj._drzava] << " " << obj._vazenjeOD << " " << obj._vazenjeDO << " " << obj._kompanija << endl;
  303.     COUT << ((obj._napomena != nullptr) ? obj._napomena : "") << endl;
  304.     COUT << "STATUSI -> " << obj._statusi << endl;
  305.     return COUT;
  306. }
  307.  
  308. class TuristickaViza : public Viza {
  309.     string _adresa; //adresa hotele ili drugog smještaja na kojoj će aplikant boraviti
  310. public:
  311.     //TuristickaViza turisticka(ENGLESKA, dat18082017, dat11122017, "Whitehall Pl, London SW1A 2BD, UK");
  312.     TuristickaViza(Drzava drzava, Datum _OD, Datum _DO, string adresa, char * napomena = nullptr) : Viza(drzava, _OD, _DO, napomena) {
  313.         _adresa = adresa;
  314.     }
  315.     ~TuristickaViza() {};
  316.     TuristickaViza(const TuristickaViza &obj) : Viza(obj) {
  317.         _adresa = obj._adresa;
  318.     }
  319.     TuristickaViza & operator = (const TuristickaViza &obj) {
  320.         if (this != &obj) {
  321.             delete[]_napomena;
  322.             if (obj._napomena != nullptr) {
  323.                 _napomena = new char[strlen(obj._napomena) + 1];
  324.                 strcpy_s(_napomena, strlen(obj._napomena) + 1, obj._napomena);
  325.             }
  326.             else
  327.                 _napomena = nullptr;
  328.             _vazenjeDO = obj._vazenjeDO;
  329.             _vazenjeOD = obj._vazenjeOD;
  330.             _drzava = obj._drzava;
  331.             _adresa = obj._adresa;
  332.         } return *this;
  333.     }
  334.     virtual void Info() {
  335.         cout << "Turisticka Viza" << endl;
  336.     }
  337.     friend ostream & operator << (ostream & COUT, TuristickaViza & obj);
  338. };
  339. ostream & operator << (ostream & COUT, TuristickaViza & obj) {
  340.     COUT << _ispisDrzave[obj._drzava] << " " << obj._vazenjeOD << " " << obj._vazenjeDO << " " << obj._adresa << endl;
  341.     COUT << ((obj._napomena != nullptr) ? obj._napomena : "") << endl;
  342.     COUT << "STATUSI -> " << obj._statusi << endl;
  343.     return COUT;
  344. }
  345. void Print(Viza *viza) {
  346.     strazar.lock();
  347.     cout << *viza << endl;
  348.     this_thread::sleep_for(chrono::seconds(1));
  349.     strazar.unlock();
  350. }
  351. class Aplikant {
  352.     char * _imePrezime;
  353.     Datum * _datumRodjenja;
  354.     char * _brojPasosa;
  355.     vector<Viza *> _vize;
  356. public:
  357.     //Aplikant jasmin("Jasmin Azemovic", Datum(15, 5, 1979), "BS6985645");
  358.     Aplikant(char * imePrezime, Datum datumRodjenja, char * brPasosa) {
  359.         int vel = strlen(imePrezime) + 1;
  360.         _imePrezime = new char[vel];
  361.         strcpy_s(_imePrezime, vel, imePrezime);
  362.         vel = strlen(brPasosa) + 1;
  363.         _brojPasosa = new char[vel];
  364.         strcpy_s(_brojPasosa, vel, brPasosa);
  365.         _datumRodjenja = new Datum(datumRodjenja);
  366.     }
  367.     ~Aplikant() {
  368.         delete[]_imePrezime; _imePrezime = nullptr;
  369.         delete[]_brojPasosa; _brojPasosa = nullptr;
  370.         delete _datumRodjenja; _datumRodjenja = nullptr;
  371.         for (size_t i = 0; i < _vize.size(); i++)
  372.         {
  373.             delete _vize[i]; _vize[i] = nullptr;
  374.         }
  375.     }
  376.     Aplikant(const Aplikant &obj) {
  377.         int vel = strlen(obj._imePrezime) + 1;
  378.         _imePrezime = new char[vel];
  379.         strcpy_s(_imePrezime, vel, obj._imePrezime);
  380.         vel = strlen(obj._brojPasosa) + 1;
  381.         _brojPasosa = new char[vel];
  382.         strcpy_s(_brojPasosa, vel, obj._brojPasosa);
  383.         _datumRodjenja = new Datum(*obj._datumRodjenja);
  384.         _vize = obj._vize;
  385.     }
  386.     Aplikant & operator = (Aplikant &obj) {
  387.         if (this != &obj) {
  388.             delete[]_imePrezime;
  389.             delete[]_brojPasosa;
  390.             delete _datumRodjenja;
  391.             for (size_t i = 0; i < _vize.size(); i++)
  392.             {
  393.                 delete _vize[i]; _vize[i] = nullptr;
  394.             }
  395.             int vel = strlen(obj._imePrezime) + 1;
  396.             _imePrezime = new char[vel];
  397.             strcpy_s(_imePrezime, vel, obj._imePrezime);
  398.             vel = strlen(obj._brojPasosa) + 1;
  399.             _brojPasosa = new char[vel];
  400.             strcpy_s(_brojPasosa, vel, obj._brojPasosa);
  401.             _datumRodjenja = new Datum(*obj._datumRodjenja);
  402.             _vize = obj._vize;
  403.         } return *this;
  404.     }
  405.  
  406.     /*
  407.     //DodajVizu(&poslovna)
  408.     NOVA VIZA SE NE MOŽE DODATI UKOLIKO:
  409.     -   JE APLIKANT MLAĐI OD 10 GODINA
  410.     -   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.
  411.     -   JE NEKA OD RANIJIH VIZA PONIŠTENA (OVO SE ODNOSI SAMO NA VIZE ZA DRŽAVU: SAD)
  412.     //char * _imePrezime;
  413.     //Datum * _datumRodjenja;
  414.     //char * _brojPasosa;
  415.     //vector<Viza *> _vize;
  416.     */
  417.     bool DodajVizu(Viza *viza) {
  418.         if (_datumRodjenja->GodineStarosti() < 10)
  419.             return false;
  420.  
  421.         for (int i = 0; i < _vize.size(); i++) {
  422.             for (int j = 0; j < _vize[i]->GetStatuse().GetTrenutno(); j++) {
  423.                 if (*_vize[i]->GetStatuse().GetT1()[j] == PONISTENA && _vize[i]->GetDrzava() == SAD)
  424.                     return false;
  425.                 if (viza->GetDrzava() == _vize[i]->GetDrzava() && ((viza->GetVazenjeOD() >= _vize[i]->GetVazenjeOD() && _vize[i]->GetVazenjeDO() >= viza->GetVazenjeOD()) || (viza->GetVazenjeDO() <= _vize[i]->GetVazenjeDO() && viza->GetVazenjeDO() >= _vize[i]->GetVazenjeOD()) && (*_vize[i]->GetStatuse().GetT1()[j] == IZDATA || *_vize[i]->GetStatuse().GetT1()[j] == PONISTENA || *_vize[i]->GetStatuse().GetT1()[j] == ISTEKLA)))
  426.                     return false;
  427.             }
  428.         }
  429.  
  430.         PoslovnaViza *pokPoslovna = dynamic_cast<PoslovnaViza*>(viza);
  431.         if (pokPoslovna != nullptr)
  432.             _vize.push_back(new PoslovnaViza(*pokPoslovna));
  433.         else {
  434.             TuristickaViza *pokTuristicka = dynamic_cast<TuristickaViza*>(viza);
  435.             if (pokTuristicka != nullptr)
  436.                 _vize.push_back(new TuristickaViza(*pokTuristicka));
  437.         }
  438.         return true;
  439.     }
  440.     /*
  441.     //DodajStatus(&poslovna, PONISTENA, "predstavnicima kompanije Microsoft nemaju informaciju o posjeti navedenog aplikanta")
  442.     STATUSI SE MOGU DODAVATI SAMO U REDOSLIJEDU U KOJEM SE NALAZE U ENUMERACIJI NPR.
  443.     -   NIJE MOGUĆE ODBITI VIZU AKO PRETHODNO NIJE IMALA STATUS DA JE ZAHTJEV_ZAPRIMLJEN;
  444.     -   NIJE MOGUĆE PONIŠTITI VIZU KOJA PRETHODNO NIJE IZDATA
  445.     //char * _imePrezime;
  446.     //Datum * _datumRodjenja;
  447.     //char * _brojPasosa;
  448.     //vector<Viza *> _vize;
  449.     */
  450.     bool DodajStatus(Viza *viza, Status status, char * komentar = "") {
  451.         for (int i = 0; i < _vize.size(); i++) {
  452.             if (*_vize[i] == *viza) {
  453.                 bool izdata = false, zahtjev = false;
  454.                 for (int j = 0; j < _vize[i]->GetStatuse().GetTrenutno(); j++) {
  455.                     if (*_vize[i]->GetStatuse().GetT1()[j] == ZAHTJEV_ZAPRIMLJEN)
  456.                         zahtjev = true;
  457.                     if (*_vize[i]->GetStatuse().GetT1()[j] == IZDATA)
  458.                         izdata = true;
  459.                 }
  460.  
  461.                 if ((!izdata && status == PONISTENA) || (!zahtjev && status == ODBIJENA))
  462.                     return false;
  463.  
  464.                 _vize[i]->GetStatuse().Dodaj(status, komentar);
  465.                 return true;
  466.             }
  467.         }
  468.         return false;
  469.     }
  470.     //U ZASEBNOJ NITI URADITI PRINTANJE VIZE...KORISTITI METODU SLEEP_FOR
  471.     //PrintajVizu(&turisticka)
  472.     void PrintajVizu(Viza *viza) {
  473.         thread printThread(Print, ref(viza));
  474.         printThread.join();
  475.     }
  476.     //VRAĆA PODATKE O SVIM VIZAMA KOJE SU IZDATE ZA ODREĐENU DRŽAVU, A KOJE SU IMALE ODREĐENI STATUS
  477.     //vector<Viza *> jasminVize = jasmin.GetVizeByDrzava(SAD, PONISTENA);
  478.     vector<Viza *> GetVizeByDrzava(Drzava drzava, Status status) {
  479.         vector<Viza *> _lista;
  480.         for (int i = 0; i < _vize.size(); i++) {
  481.             if (_vize[i]->GetDrzava() == drzava) {
  482.                 for (int j = 0; j < _vize[i]->GetStatuse().GetTrenutno(); j++) {
  483.                     if (*_vize[i]->GetStatuse().GetT1()[j] == status) {
  484.                         PoslovnaViza *pokPoslovna = dynamic_cast<PoslovnaViza*>(_vize[i]);
  485.                         if (pokPoslovna != nullptr)
  486.                             _lista.push_back(new PoslovnaViza(*pokPoslovna));
  487.                         else {
  488.                             TuristickaViza *pokTuristicka = dynamic_cast<TuristickaViza*>(_vize[i]);
  489.                             if (pokTuristicka != nullptr)
  490.                                 _lista.push_back(new TuristickaViza(*pokTuristicka));
  491.                         }
  492.                     }
  493.                 }
  494.             }
  495.         }
  496.         return _lista;
  497.     }
  498.     //UNUTAR NAPOMENE MIJENJA SADRŽAJ "nemaju informaciju" SA "su upoznti sa" - KORISTITI REGEX
  499.     //jasmin.ZamijeniRijec("nemaju informaciju", "su upoznti sa");
  500.     void ZamijeniRijec(string rijec, string zamjena) {
  501.         regex reg("\\s");
  502.         rijec = regex_replace(rijec, reg, "\\s");
  503.         for (int i = 0; i < _vize.size(); i++) {
  504.             for (int j = 0; j < _vize[i]->GetStatuse().GetTrenutno(); j++) {
  505.                 regex rege(rijec);
  506.                 string status = *_vize[i]->GetStatuse().GetT2()[j];
  507.                 status = regex_replace(status, rege, zamjena);
  508.                 cout << status << endl;
  509.             }
  510.         }
  511.     }
  512.     friend ostream & operator << (ostream & COUT, Aplikant & obj);
  513.     vector<Viza * > GetVize() { return _vize; }
  514. };
  515. ostream & operator << (ostream & COUT, Aplikant & obj) {
  516.     COUT << obj._imePrezime << " " << *obj._datumRodjenja << " " << obj._brojPasosa << endl;
  517.     COUT << "VIZE -> " << endl;
  518.     for (size_t i = 0; i < obj._vize.size(); i++)
  519.         COUT << *obj._vize[i] << endl;
  520.     return COUT;
  521. }
  522. ostream & operator << (ostream &COUT, Viza &viza) {
  523.     PoslovnaViza *pokP = dynamic_cast<PoslovnaViza*>(&viza);
  524.     if (pokP != nullptr) {
  525.         COUT << *pokP;
  526.     }
  527.     else {
  528.         TuristickaViza *pokT = dynamic_cast<TuristickaViza*>(&viza);
  529.         if (pokT != nullptr) {
  530.             COUT << *pokT;
  531.         }
  532.     }
  533.     return COUT;
  534. }
  535. void main() {
  536.  
  537.     /****************************************************************************
  538.     1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  539.     2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ĆE BITI OZNACENO KAO "RE"
  540.     3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEČILO GUBLJENJE URAĐENOG ZADATKA
  541.     4. PROGRAMSKI CODE SE TAKOĐER NALAZI U FAJLU CODE.TXT
  542.     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.
  543.     6. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNAČENO.
  544.     ****************************************************************************/
  545.  
  546.     Datum danas(15, 2, 2017);
  547.     Datum sutra(++danas); // inkrementiranjem se uvecava dan za 1
  548.     Datum prekosutra;
  549.     Datum dat15022017(15, 2, 2017), dat18082017(18, 8, 2017), dat11052018(11, 5, 2018), dat11122017(11, 12, 2017);
  550.  
  551.     prekosutra = ++danas;
  552.     if (prekosutra == danas)
  553.         cout << "Datumi su jednaki" << endl;
  554.     cout << danas << endl << sutra << endl << prekosutra << crt;
  555.  
  556.     int v6 = 6, v13 = 13, v32 = 32, v63 = 63, v98 = 98, v109 = 109, v196 = 196;
  557.  
  558.     FITKolekcija<int, int, 7> brojevi;
  559.     brojevi.Dodaj(v196, v6);
  560.     brojevi.Dodaj(v13, v32);
  561.     brojevi.Dodaj(v98, v196);
  562.     brojevi.Dodaj(v63, v13);
  563.     brojevi.Dodaj(v98, v196);
  564.     brojevi.Dodaj(v196, v6);
  565.     brojevi.Dodaj(v63, v32);
  566.  
  567.     cout << brojevi << crt;
  568.     //NA KOJI NAČIN ĆE SE VRŠITI SORTIRANJE PRVENSTVENO ZAVISI OD VRIJEDNOSTI PARAMETRA, A VRŠI SE NA OSNOVU VRIJEDNOSTI TIPA T1
  569.     brojevi.Sortiraj(RASTUCI);
  570.     cout << brojevi << crt;
  571.     brojevi.Sortiraj(OPADAJUCI);
  572.     cout << brojevi << crt;
  573.  
  574.     try
  575.     {
  576.         //U SLUČAJU PREKORAČENJA DEFINISANE VELIČINE KOLEKCIJE, POTREBNO JE BACITI IZUZETAK
  577.         brojevi.Dodaj(v13, v196);
  578.     }
  579.     catch (exception & err)
  580.     {
  581.         cout << "Error -> " << err.what() << endl;
  582.     }
  583.  
  584.     Aplikant jasmin("Jasmin Azemovic", Datum(15, 5, 1979), "BS6985645");
  585.     PoslovnaViza poslovna1(SAD, dat15022017, dat18082017, "Microsoft");
  586.     PoslovnaViza poslovna2(SAD, dat18082017, dat11052018, "Vaynermedia");
  587.     PoslovnaViza poslovna3(AUSTRALIJA, dat11122017, dat11052018, "Apple");
  588.     TuristickaViza turisticka1(ENGLESKA, dat18082017, dat11122017, "Whitehall Pl, London SW1A 2BD, UK");
  589.     TuristickaViza turisticka2(ENGLESKA, dat15022017, dat11122017, "Adresa, UK");
  590.     TuristickaViza turisticka3(SAD, dat11122017, dat11052018, "Adresa, SAD");
  591.  
  592.     if (jasmin.DodajVizu(&poslovna1))
  593.         cout << "Podaci o vizi uspješno zaprimljeni" << endl;
  594.     if (jasmin.DodajVizu(&poslovna2))
  595.         cout << "Podaci o vizi uspješno zaprimljeni" << endl;
  596.     if (jasmin.DodajVizu(&poslovna3))
  597.         cout << "Podaci o vizi uspješno zaprimljeni" << endl;
  598.     if (jasmin.DodajVizu(&turisticka1))
  599.         cout << "Podaci o vizi uspješno zaprimljeni" << endl;
  600.     if (jasmin.DodajVizu(&turisticka2))
  601.         cout << "Podaci o vizi uspješno zaprimljeni" << endl;
  602.     if (jasmin.DodajVizu(&turisticka3))
  603.         cout << "Podaci o vizi uspješno zaprimljeni" << endl;
  604.  
  605.     if (jasmin.DodajStatus(&poslovna1, ZAHTJEV_ZAPRIMLJEN, "provjeriti navode sa predstavnicima kompanije Microsoft"))
  606.         cout << "Status vize uspijesno promijenjen" << endl;
  607.     else
  608.         cout << "Aplikant " << jasmin << " ne posjeduje evidentiranu trazenu vizu ili status vize nema odgovarajucu vrijednost" << endl;
  609.  
  610.     if (jasmin.DodajStatus(&poslovna1, PONISTENA, "predstavnicima kompanije Microsoft nemaju informaciju o posjeti navedenog aplikanta"))
  611.         cout << "Status vize uspijesno promijenjen" << endl;
  612.     else
  613.         cout << "Aplikant " << jasmin << " ne posjeduje evidentiranu trazenu vizu ili status vize nema odgovarajucu vrijednost" << endl;
  614.  
  615.     if (jasmin.DodajStatus(&poslovna1, ODBIJENA, "predstavnicima kompanije Microsoft nemaju informaciju o posjeti navedenog aplikanta"))
  616.         cout << "Status vize uspijesno promijenjen" << endl;
  617.     else
  618.         cout << "Aplikant " << jasmin << " ne posjeduje evidentiranu trazenu vizu ili status vize nema odgovarajucu vrijednost" << endl;
  619.  
  620.     if (jasmin.DodajStatus(&turisticka1, ZAHTJEV_ZAPRIMLJEN))
  621.         cout << "Status vize uspijesno promijenjen" << endl;
  622.     else
  623.         cout << "Aplikant " << jasmin << " ne posjeduje evidentiranu trazenu vizu ili status vize nema odgovarajucu vrijednost" << endl;
  624.  
  625.     if (jasmin.DodajStatus(&turisticka1, IZDATA)) {
  626.         cout << "Status vize uspijesno promijenjen" << endl;
  627.         //U ZASEBNOJ NITI URADITI PRINTANJE VIZE...KORISTITI METODU SLEEP_FOR
  628.         jasmin.PrintajVizu(&turisticka1);
  629.     }
  630.     else
  631.         cout << "Aplikant " << jasmin << " ne posjeduje evidentiranu trazenu vizu ili status vize nema odgovarajucu vrijednost" << endl;
  632.     //VRAĆA PODATKE O SVIM VIZAMA KOJE SU IZDATE ZA ODREĐENU DRŽAVU, A KOJE SU IMALE ODREĐENI STATUS
  633.     vector<Viza *> jasminVize = jasmin.GetVizeByDrzava(SAD, ZAHTJEV_ZAPRIMLJEN);
  634.  
  635.     //UNUTAR NAPOMENE MIJENJA SADRŽAJ "nemaju informaciju" SA "su upoznti sa" - KORISTITI REGEX
  636.     jasmin.ZamijeniRijec("nemaju informaciju", "su upoznti sa"); //Ne postoji slicna napomena, pa sam radio na statusima (gdje postoji slican tekst...)
  637.     system("pause>0");
  638. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement