Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<string>
- #include<iterator>
- #include<vector>
- #include<exception>
- using namespace std;
- const char *crt = "\n-----------------------------------------------\n";
- enum Status { ZAHTJEV_ZAPRIMLJEN, ODUSTAO, ODBIJENA, IZDATA, ISTEKLA, PONISTENA };
- enum Sortiranje { RASTUCI, OPADAJUCI };
- enum Drzava { SAD, AUSTRALIJA, ENGLESKA };
- class Datum {
- int *_dan, *_mjesec, *_godina;
- public:
- Datum(int dan = 1, int mjesec = 1, int godina = 2000) {
- _dan = new int(dan);
- _mjesec = new int(mjesec);
- _godina = new int(godina);
- }
- bool operator<(const Datum & d)
- {
- if (d._dan < _dan)
- return false;
- else if (d._mjesec < _mjesec)
- return false;
- else if (d._dan < _dan)
- return false;
- }
- bool operator>(const Datum & d)
- {
- if (d._dan > _dan)
- return false;
- else if (d._mjesec > _mjesec)
- return false;
- else if (d._dan > _dan)
- return false;
- }
- bool Mladji(int godina=2018)
- {
- int god = godina - *_godina;
- if (god > 10)
- return true;
- else
- return false;
- }
- Datum(const Datum & d)
- {
- _dan = new int(*d._dan);
- _mjesec = new int(*d._mjesec);
- _godina = new int(*d._godina);
- }
- Datum & operator =(const Datum &d)
- {
- if (this != &d)
- {
- delete _dan; delete _mjesec; delete _godina;
- _dan = _mjesec = _godina = nullptr;
- _dan = new int(*d._dan);
- _mjesec = new int(*d._mjesec);
- _godina = new int(*d._godina);
- }
- return *this;
- }
- bool operator==(const Datum & d)
- {
- return *_dan == *d._dan && *_mjesec == *d._mjesec && *_godina == *d._godina;
- }
- Datum & operator++()
- {
- (*_dan)++;
- return *this;
- }
- ~Datum() {
- delete _dan; _dan = nullptr;
- delete _mjesec; _mjesec = nullptr;
- delete _godina; _godina = nullptr;
- }
- friend ostream& operator<< (ostream &COUT, Datum &obj) {
- COUT << *obj._dan << "." << *obj._mjesec << "." << *obj._godina;
- return COUT;
- }
- };
- template<class T1, class T2, int max>
- class FITKolekcija {
- T1 * _elementi1[max];
- T2 * _elementi2[max];
- int _trenutno;
- public:
- FITKolekcija() {
- for (size_t i = 0; i < max; i++) {
- _elementi1[i] = nullptr;
- _elementi2[i] = nullptr;
- }
- _trenutno = 0;
- }
- FITKolekcija(const FITKolekcija & k)
- {
- for (int i = 0; i < k._trenutno; i++)
- {
- _elementi1[i] = new T1(*k._elementi1[i]);
- _elementi2[i] = new T2(*k._elementi2[i]);
- }
- _trenutno = k._trenutno;
- }
- FITKolekcija & operator=(const FITKolekcija & k)
- {
- if (this != &k)
- {
- delete[]_elementi1; delete[]_elementi2;
- _elementi1 = nullptr; _elementi2 = nullptr;
- for (int i = 0; i < k._trenutno; i++)
- {
- _elementi1[i] = new T1(*k._elementi1[i]);
- _elementi2[i] = new T2(*k._elementi2[i]);
- }
- _trenutno = k._trenutno;
- }
- return *this;
- }
- void Dodaj(T1 e1, T2 e2)
- {
- if (_trenutno >= max)
- throw exception("Prekoracen opseg niza.");
- _elementi1[_trenutno] = new T1(e1);
- _elementi2[_trenutno] = new T2(e2);
- _trenutno++;
- }
- void Sortiraj(Sortiranje tip)
- {
- for (int i = 0; i < _trenutno; i++)
- {
- for (int j = 0; j < _trenutno-1; j++)
- {
- T1 temp1 = *_elementi1[j];
- T2 temp2 = *_elementi2[j];
- if (tip == RASTUCI)
- {
- if (*_elementi1[j] > *_elementi1[j + 1])
- {
- *_elementi1[j] = *_elementi1[j + 1];
- *_elementi1[j + 1] = temp1;
- *_elementi2[j] = *_elementi2[j + 1];
- *_elementi2[j + 1] = temp2;
- }
- }
- else
- {
- if (*_elementi1[j] < *_elementi1[j + 1])
- {
- *_elementi1[j] = *_elementi1[j + 1];
- *_elementi1[j + 1] = temp1;
- *_elementi2[j] = *_elementi2[j + 1];
- *_elementi2[j + 1] = temp2;
- }
- }
- }
- }
- }
- ~FITKolekcija() {
- for (size_t i = 0; i < max; i++) {
- delete _elementi1[i]; _elementi1[i] = nullptr;
- delete _elementi2[i]; _elementi2[i] = nullptr;
- }
- }
- T1 ** GetT1() { return _elementi1; }
- T2 ** GetT2() { return _elementi2; }
- int GetTrenutno() { return _trenutno; }
- friend ostream& operator<< (ostream &COUT, FITKolekcija &obj) {
- for (size_t i = 0; i < obj._trenutno; i++)
- COUT << *obj._elementi1[i] << " " << *obj._elementi2[i] << endl;
- return COUT;
- }
- };
- class Viza {
- protected:
- Drzava _drzava;
- Datum _vazenjeOD;
- Datum _vazenjeDO;
- char * _napomena;
- // string se odnosi na razlog promjene statusa, a moguće je samo 10 izmjena statusa
- FITKolekcija<Status, string, 10> _statusi;
- public:
- Viza(Drzava drzava, Datum _OD, Datum _DO, char * napomena = nullptr) :_vazenjeDO(_DO), _vazenjeOD(_OD)
- {
- if (napomena != nullptr) {
- _napomena = new char[strlen(napomena) + 1];
- strcpy_s(_napomena, strlen(napomena) + 1, napomena);
- }
- else
- _napomena = nullptr;
- _drzava = drzava;
- }
- bool operator==(const Viza & v)
- {
- return _drzava == v._drzava && _vazenjeOD == v._vazenjeOD && _vazenjeDO == v._vazenjeDO;
- }
- ~Viza() { delete[] _napomena; _napomena = nullptr; }
- Datum GetVazenjeOD() { return _vazenjeOD; }
- Datum GetVazenjeDO() { return _vazenjeDO; }
- char * GetNapomena() { return _napomena; }
- Drzava GetDrzava()
- {
- return _drzava;
- }
- FITKolekcija<Status, string, 10> & GetStatuse() { return _statusi; }
- virtual void Info() = 0;
- };
- class PoslovnaViza :public Viza {
- string _kompanija; //naziv kompanije koja potvrđuje da posluje sa aplikantom
- public:
- PoslovnaViza(Drzava drzava, Datum _OD, Datum _DO, string kompanija, char * napomena = nullptr) : Viza(drzava, _OD, _DO, napomena) {
- _kompanija = kompanija;
- }
- friend ostream & operator << (ostream & COUT, PoslovnaViza & obj) {
- COUT << obj._drzava << " " << obj._vazenjeOD << " " << obj._vazenjeDO << " " << obj._kompanija << endl;
- COUT << ((obj._napomena != nullptr) ? obj._napomena : "") << endl;
- COUT << "STATUSI -> " << obj._statusi << endl;
- return COUT;
- }
- void Info()
- {
- cout << *this;
- }
- };
- class TuristickaViza : public Viza {
- string _adresa; //adresa hotele ili drugog smještaja na kojoj će aplikant boraviti
- public:
- TuristickaViza(Drzava drzava, Datum _OD, Datum _DO, string adresa, char * napomena = nullptr) : Viza(drzava, _OD, _DO, napomena) {
- _adresa = adresa;
- }
- friend ostream & operator << (ostream & COUT, TuristickaViza & obj) {
- COUT << obj._drzava << " " << obj._vazenjeOD << " " << obj._vazenjeDO << " " << obj._adresa << endl;
- COUT << ((obj._napomena != nullptr) ? obj._napomena : "") << endl;
- COUT << "STATUSI -> " << obj._statusi << endl;
- return COUT;
- }
- void Info() {
- cout << *this;
- }
- };
- class Aplikant {
- char * _imePrezime;
- Datum * _datumRodjenja;
- char * _brojPasosa;
- vector<Viza *> _vize;
- public:
- Aplikant(const char * imePrezime, Datum datumRodjenja, const char * brPasosa) {
- int vel = strlen(imePrezime) + 1;
- _imePrezime = new char[vel];
- strcpy_s(_imePrezime, vel, imePrezime);
- vel = strlen(brPasosa) + 1;
- _brojPasosa = new char[vel];
- strcpy_s(_brojPasosa, vel, brPasosa);
- _datumRodjenja = new Datum(datumRodjenja);
- }
- Aplikant(const Aplikant & a)
- {
- _imePrezime = new char[strlen(a._imePrezime) + 1];
- strcpy_s(_imePrezime, strlen(a._imePrezime) + 1, a._imePrezime);
- _brojPasosa = new char[strlen(a._brojPasosa) + 1];
- strcpy_s(_brojPasosa, strlen(a._brojPasosa) + 1, a._brojPasosa);
- _datumRodjenja = new Datum(*a._datumRodjenja);
- }
- Aplikant & operator=(const Aplikant & a)
- {
- if (this != &a)
- {
- delete[]_imePrezime; _imePrezime = nullptr;
- delete[]_brojPasosa; _brojPasosa = nullptr;
- delete _datumRodjenja; _datumRodjenja = nullptr;
- for (size_t i = 0; i < _vize.size(); i++)
- {
- delete _vize[i]; _vize[i] = nullptr;
- }
- _imePrezime = new char[strlen(a._imePrezime) + 1];
- strcpy_s(_imePrezime, strlen(a._imePrezime) + 1, a._imePrezime);
- _brojPasosa = new char[strlen(a._brojPasosa) + 1];
- strcpy_s(_brojPasosa, strlen(a._brojPasosa) + 1, a._brojPasosa);
- _datumRodjenja = new Datum(*a._datumRodjenja);
- }
- return *this;
- }
- bool DodajVizu(Viza * v)
- {
- if (!_datumRodjenja->Mladji(10))
- return false;
- for (int i = 0; i < _vize.size(); i++)
- {
- if (v->GetVazenjeOD() > _vize[i]->GetVazenjeOD() && v->GetVazenjeOD() < _vize[i]->GetVazenjeDO() && v->GetDrzava()==_vize[i]->GetDrzava())
- {
- for (int j = 0; j < v->GetStatuse().GetTrenutno(); j++)
- {
- if (*_vize[i]->GetStatuse().GetT1()[j] == Status::IZDATA)
- return false;
- }
- }
- if (v->GetDrzava() == SAD && _vize[i]->GetDrzava() == SAD)
- {
- for (int j = 0; j < v->GetStatuse().GetTrenutno(); j++)
- {
- if (*_vize[i]->GetStatuse().GetT1()[j] == Status::PONISTENA)
- return false;
- }
- }
- }
- if (dynamic_cast<PoslovnaViza*>(v) != nullptr) {
- _vize.push_back(new PoslovnaViza(*dynamic_cast<PoslovnaViza*>(v)));
- }
- else if (dynamic_cast<TuristickaViza*>(v) != nullptr) {
- _vize.push_back(new TuristickaViza(*dynamic_cast<TuristickaViza*>(v)));
- }
- return true;
- }
- //STATUSI SE MOGU DODAVATI SAMO U REDOSLIJEDU U KOJEM SE NALAZE U ENUMERACIJI NPR.
- //- NIJE MOGUĆE ODBITI VIZU AKO PRETHODNO NIJE IMALA STATUS DA JE ZAHTJEV_ZAPRIMLJEN;
- //- NIJE MOGUĆE PONIŠTITI VIZU KOJA PRETHODNO NIJE IZDATA
- bool DodajStatus(Viza * v, Status status, string poruka =" ")
- {
- for (int i = 0; i < _vize.size(); i++)
- {
- if (*_vize[i] == *v)
- {
- bool zahtjevZaprimljen = false;
- bool izdata = false;
- for (int j = 0; j < v->GetStatuse().GetTrenutno(); j++)
- {
- if (*_vize[j]->GetStatuse().GetT1()[j] == Status::ZAHTJEV_ZAPRIMLJEN)
- zahtjevZaprimljen = true;
- if (*_vize[j]->GetStatuse().GetT1()[j] == Status::IZDATA)
- izdata = true;
- }
- if (status == Status::ZAHTJEV_ZAPRIMLJEN)
- {
- _vize[i]->GetStatuse().Dodaj(status, poruka);
- return true;
- }
- else if ((status == Status::ODUSTAO || status == Status::ODBIJENA || status == Status::IZDATA) && zahtjevZaprimljen)
- {
- _vize[i]->GetStatuse().Dodaj(status, poruka);
- return true;
- }
- else if ((status == Status::PONISTENA || status == Status::ISTEKLA) && izdata)
- {
- _vize[i]->GetStatuse().Dodaj(status, poruka);
- return true;
- }
- }
- }
- return false;
- }
- ~Aplikant() {
- delete[]_imePrezime; _imePrezime = nullptr;
- delete[]_brojPasosa; _brojPasosa = nullptr;
- delete _datumRodjenja; _datumRodjenja = nullptr;
- for (size_t i = 0; i < _vize.size(); i++)
- {
- delete _vize[i]; _vize[i] = nullptr;
- }
- }
- friend ostream & operator << (ostream & COUT, Aplikant & obj) {
- COUT << obj._imePrezime << " " << obj._datumRodjenja << " " << obj._brojPasosa << endl;
- COUT << "VIZE -> " << endl;
- for (size_t i = 0; i < obj._vize.size(); i++)
- COUT << obj._vize[i] << endl;
- return COUT;
- }
- vector<Viza * > GetVize() { return _vize; }
- };
- void main() {
- Datum danas(15, 2, 2017);
- Datum sutra(++danas); // inkrementiranjem se uvecava dan za 1
- Datum prekosutra;
- Datum dat15022017(15, 2, 2017), dat18082017(18, 8, 2017), dat11052018(11, 5, 2018), dat11122017(11, 12, 2017);
- prekosutra = danas;
- if (prekosutra == danas)
- cout << "Datumi su jednaki" << endl;
- cout << danas << endl << sutra << endl << prekosutra << crt;
- int v6 = 6, v13 = 13, v32 = 32, v63 = 63, v98 = 98, v109 = 109, v196 = 196;
- FITKolekcija<int, int, 7> brojevi;
- brojevi.Dodaj(v196, v6);
- brojevi.Dodaj(v13, v32);
- brojevi.Dodaj(v98, v196);
- brojevi.Dodaj(v63, v13);
- brojevi.Dodaj(v98, v196);
- brojevi.Dodaj(v196, v6);
- cout << brojevi << crt;
- //NA KOJI NAČIN ĆE SE VRŠITI SORTIRANJE PRVENSTVENO ZAVISI OD VRIJEDNOSTI PARAMETRA, A VRŠI SE NA OSNOVU VRIJEDNOSTI TIPA T1
- brojevi.Sortiraj(RASTUCI);
- cout << brojevi << crt;
- brojevi.Sortiraj(OPADAJUCI);
- cout << brojevi << crt;
- try
- {
- //U SLUČAJU PREKORAČENJA DEFINISANE VELIČINE KOLEKCIJE, POTREBNO JE BACITI IZUZETAK
- brojevi.Dodaj(v13, v196);
- }
- catch (exception & err)
- {
- cout << "Error -> " << err.what() << endl;
- }
- Aplikant jasmin("Jasmin Azemovic", Datum(15, 5, 1979), "BS6985645");
- PoslovnaViza poslovna(SAD, dat15022017, dat18082017, "Microsoft");
- /*
- NOVA VIZA SE NE MOŽE DODATI UKOLIKO:
- - JE APLIKANT MLAĐI OD 10 GODINA
- - 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.
- - JE NEKA OD RANIJIH VIZA PONIŠTENA (OVO SE ODNOSI SAMO NA VIZE ZA DRŽAVU: SAD)
- */
- if (jasmin.DodajVizu(&poslovna))
- cout << "Podaci o vizi uspješno zaprimljeni" << endl;
- /*
- //STATUSI SE MOGU DODAVATI SAMO U REDOSLIJEDU U KOJEM SE NALAZE U ENUMERACIJI NPR.
- //- NIJE MOGUĆE ODBITI VIZU AKO PRETHODNO NIJE IMALA STATUS DA JE ZAHTJEV_ZAPRIMLJEN;
- //- NIJE MOGUĆE PONIŠTITI VIZU KOJA PRETHODNO NIJE IZDATA
- */
- if (jasmin.DodajStatus(&poslovna, ZAHTJEV_ZAPRIMLJEN, "provjeriti navode sa predstavnicima kompanije Microsoft"))
- cout << "Status vize uspijesno promijenjen" << endl;
- else
- cout << "Aplikant " << jasmin << " ne posjeduje evidentiranu trazenu vizu ili status vize nema odgovarajucu vrijednost" << endl;
- if (jasmin.DodajStatus(&poslovna, PONISTENA, "predstavnicima kompanije Microsoft nemaju informaciju o posjeti navedenog aplikanta"))
- cout << "Status vize uspijesno promijenjen" << endl;
- else
- cout << "Aplikant " << jasmin << " ne posjeduje evidentiranu trazenu vizu ili status vize nema odgovarajucu vrijednost" << endl;
- TuristickaViza turisticka(ENGLESKA, dat18082017, dat11122017, "Whitehall Pl, London SW1A 2BD, UK");
- if (jasmin.DodajStatus(&turisticka, ZAHTJEV_ZAPRIMLJEN))
- cout << "Status vize uspijesno promijenjen" << endl;
- else
- cout << "Aplikant " << jasmin << " ne posjeduje evidentiranu trazenu vizu ili status vize nema odgovarajucu vrijednost" << endl;
- if (jasmin.DodajStatus(&turisticka, IZDATA)) {
- cout << "Status vize uspijesno promijenjen" << endl;
- }
- // //U ZASEBNOJ NITI URADITI PRINTANJE VIZE...KORISTITI METODU SLEEP_FOR
- // jasmin.PrintajVizu(&turisticka);
- //else
- // cout << "Aplikant " << jasmin << " ne posjeduje evidentiranu trazenu vizu ili status vize nema odgovarajucu vrijednost" << endl;
- ////VRAĆA PODATKE O SVIM VIZAMA KOJE SU IZDATE ZA ODREĐENU DRŽAVU, A KOJE SU IMALE ODREĐENI STATUS
- //vector<Viza *> jasminVize = jasmin.GetVizeByDrzava(SAD, PONISTENA);
- ////UNUTAR NAPOMENE MIJENJA SADRŽAJ "nemaju informaciju" SA "su upoznti sa" - KORISTITI REGEX
- //jasmin.ZamijeniRijec("nemaju informaciju", "su upoznti sa");
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement