Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- using namespace std;
- const char *crt = "\n-----------------------------------------------\n";
- enum Status { ZAHTJEV_ZAPRIMLJEN, ODUSTAO, ODBIJENA, IZDATA, ISTEKLA, PONISTENA };
- int PotrebniStatus[] = { -1, ZAHTJEV_ZAPRIMLJEN, ZAHTJEV_ZAPRIMLJEN, ZAHTJEV_ZAPRIMLJEN, IZDATA, IZDATA };
- const char* StatusString[] = { "ZAHTJEV ZAPRIMLJEN", "ODUSTAO", "ODBIJENA", "IZDATA", "ISTEKLA", "PONISTENA" };
- enum Sortiranje { RASTUCI, OPADAJUCI };
- enum Drzava { SAD, AUSTRALIJA, ENGLESKA, UNDEFINED };
- const char* DrzaveString[] = { "SAD", "AUSTRALIJA", "ENGLESKA", "UNDEFINED" };
- enum Vrsta { POSLOVNA, TURISTICKA };
- //char* AlocirajNizKaraktera(const char *s) {
- // char *noviString = new char[strlen(s) + 1];
- // strcpy_s(noviString, strlen(s) + 1, s);
- // return noviString;
- //}
- char* AlocirajNizKaraktera(const char *s) {
- char *noviString = nullptr;
- if (s != nullptr) {
- noviString = new char[strlen(s) + 1];
- strcpy_s(noviString, strlen(s) + 1, s);
- }
- return noviString;
- }
- 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);
- }
- //konstruktor kopije
- Datum(const Datum &d) {
- _dan = new int(*d._dan);
- _mjesec = new int(*d._mjesec);
- _godina = new int(*d._godina);
- }
- //move konstruktor
- Datum(Datum &&d) {
- _dan = d._dan;
- _mjesec = d._mjesec;
- _godina = d._godina;
- }
- //operator=
- Datum & operator= (const Datum &d) {
- if (this != &d) {
- *_dan = *d._dan;
- *_mjesec = *d._mjesec;
- *_godina = *d._godina;
- }
- return *this;
- }
- friend bool operator==(const Datum &left, const Datum &right) {
- if (*right._dan != *left._dan) return false;
- if (*right._mjesec != *left._mjesec) return false;
- if (*right._godina != *left._godina) return false;
- return true;
- }
- int GetBrojDana() const { return *_godina * 10000 + *_mjesec * 100 + *_dan; }
- bool PrestupnaGodina() {
- return ((*_godina % 4 == 0 && *_godina % 100 != 0) || (*_godina % 400 == 0));
- }
- Datum& operator++() {
- int mjeseci[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
- mjeseci[1] += PrestupnaGodina();
- (*_dan)++;
- if (*_dan == mjeseci[*_mjesec - 1] + 1) { *_dan = 1; (*_mjesec)++; } //prelazak u novi mjesec
- if (*_mjesec == 13) { (*_godina)++; *_mjesec = 1; } //prelazak u novu godinu
- return *this;
- }
- //Datum& operator++(int) {
- // Datum temp(*this);
- // ++(*this);
- // return temp;
- //}
- ~Datum() {
- delete _dan; _dan = nullptr;
- delete _mjesec; _mjesec = nullptr;
- delete _godina; _godina = nullptr;
- }
- friend ostream& operator<< (ostream &COUT, const Datum &obj) {
- COUT << *obj._dan << "." << *obj._mjesec << "." << *obj._godina;
- return COUT;
- }
- };
- template<class T>
- class FITKolekcija {
- T * _elementi;
- int _trenutno;
- public:
- FITKolekcija() {
- _elementi = nullptr;
- _trenutno = 0;
- }
- //konstruktor kopije
- FITKolekcija(const FITKolekcija &temp) {
- _elementi = new T[temp._trenutno];
- for (size_t i = 0; i < temp._trenutno; i++)
- {
- _elementi[i] = temp._elementi[i];// operator=
- }
- _trenutno = temp._trenutno;
- }
- //move konstruktor
- //operator=
- FITKolekcija & operator=(const FITKolekcija &temp) {
- if (this != &temp) {
- if (_elementi != nullptr)
- delete[]_elementi;
- _elementi = new T[temp._trenutno];
- for (size_t i = 0; i < temp._trenutno; i++)
- {
- _elementi[i] = temp._elementi[i];// operator=
- }
- _trenutno = temp._trenutno;
- }
- return *this;
- }
- //Dodaj
- void Dodaj(T &element) {
- T * temp = new T[_trenutno + 1];
- for (size_t i = 0; i < _trenutno; i++)
- {
- temp[i] = _elementi[i];
- }
- if (_elementi != nullptr)
- delete[]_elementi;
- _elementi = temp;
- _elementi[_trenutno++] = element;
- }
- //dodatni operatori i funkcije po potrebi
- T & operator[] (int lokacija) {
- return _elementi[lokacija];
- }
- ~FITKolekcija() {
- delete[] _elementi; _elementi = nullptr;
- }
- T * GetT() { return _elementi; }
- int GetTrenutno() const { return _trenutno; }
- T GetLast() { return _elementi[_trenutno - 1]; }
- friend ostream& operator<< (ostream &COUT, FITKolekcija &obj) {
- for (size_t i = 0; i < obj._trenutno; i++)
- COUT << obj._elementi[i] << endl;
- return COUT;
- }
- };
- class Viza {
- protected:
- Drzava _drzava;
- Datum _vazenjeOD;
- Datum _vazenjeDO;
- char * _napomena;
- // kolekcija promijena statusa vize
- FITKolekcija<Status> _statusi;
- public:
- Viza() : _napomena(nullptr), _drzava(UNDEFINED) {}
- //modifikovana deafult napomena
- Viza(Drzava drzava, Datum _OD, Datum _DO, const 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;
- } //
- //konstruktor kopije
- Viza(const Viza &obj) {
- _vazenjeOD = obj._vazenjeOD;
- _vazenjeDO = obj._vazenjeDO;
- _drzava = obj._drzava;
- _napomena = AlocirajNizKaraktera(obj._napomena);
- }
- //move konstruktor
- //operator=
- Viza & operator= (const Viza &obj) {
- if (this != &obj) {
- _vazenjeOD = obj._vazenjeOD;
- _vazenjeDO = obj._vazenjeDO;
- _drzava = obj._drzava;
- if (_napomena != nullptr) {
- delete[]_napomena;
- _napomena = AlocirajNizKaraktera(obj._napomena);
- }
- }
- return *this;
- }
- //operator<<
- friend ostream& operator<< (ostream &cout, const Viza &obj) {
- cout << "Drzava : " << obj._drzava << endl;
- cout << "Vazi od : " << obj._vazenjeOD << ", do : " << obj._vazenjeDO << endl;
- if (obj._napomena != nullptr)
- cout << "Napomena : " << obj._napomena;
- return cout;
- }
- //DodajStatus
- bool DodajStatus(Status &status) {
- //STATUSI SE MOGU DODAVATI SAMO U REDOSLIJEDU U KOJEM SE NALAZE U ENUMERACIJI NPR.
- //- NIJE MOGUCE ODBITI VIZU AKO PRETHODNO NIJE IMALA STATUS DA JE ZAHTJEV_ZAPRIMLJEN
- //- NIJE MOGUCE PONIŠTITI VIZU KOJA PRETHODNO NIJE IZDATA
- if (status == ZAHTJEV_ZAPRIMLJEN) {
- _statusi.Dodaj(status);
- return true;
- }
- for (size_t i = _statusi.GetTrenutno(); i < 5; i++)
- {
- if (_statusi.GetT()[i] == status)
- return false;
- }
- _statusi.Dodaj(status);
- return true;
- }
- friend bool operator==(const Viza &left, const Viza &right) {
- //dvije vize su iste ako vrijede za istu drzavu i ako imaju isti vijek trajanja
- if (left._drzava != right._drzava) return false;
- if (!(left._vazenjeOD == right._vazenjeOD)) return false;
- if (!(left._vazenjeDO == right._vazenjeDO)) return false;
- return true;
- }
- ~Viza() { delete[] _napomena; _napomena = nullptr; }
- Drzava GetDrzava() { return _drzava; }
- Datum GetVazenjeOD() { return _vazenjeOD; }
- Datum GetVazenjeDO() { return _vazenjeDO; }
- char * GetNapomena() { return _napomena; }
- Status GetZadnjiStatus() { return _statusi.GetLast(); }
- const FITKolekcija<Status>& GetStatuse() const { return _statusi; }
- };
- class PoslovnaViza :public Viza {
- char* _kompanija; //naziv kompanije koja potvrduje da posluje sa aplikantom
- public:
- //core lekcije
- PoslovnaViza() :Viza() {
- _kompanija = nullptr;
- }
- PoslovnaViza(Drzava drzava, Datum _OD, Datum _DO, const char *kompanija) :Viza(drzava, _OD, _DO) {
- _kompanija = AlocirajNizKaraktera(kompanija);
- }
- PoslovnaViza(const PoslovnaViza &pv) :Viza(pv) {
- _kompanija = AlocirajNizKaraktera(pv._kompanija);
- }
- PoslovnaViza & operator= (PoslovnaViza& obj) {
- if (this != &obj) {
- Viza::operator= (obj);
- if (obj._kompanija != nullptr)
- {
- delete[] _kompanija;
- _kompanija = nullptr;
- _kompanija = AlocirajNizKaraktera(obj._kompanija);
- }
- }
- return *this;
- }
- friend ostream& operator<< (ostream &cout, const PoslovnaViza &obj)
- {
- cout << Viza(obj);
- if (obj._kompanija != nullptr)
- cout << "Kompanija : " << obj._kompanija << endl;
- else
- cout << "Kompanija je nullptr" << endl;
- return cout;
- }
- };
- class TuristickaViza:public Viza {
- char* _adresa; //adresa hotele ili drugog smještaja na kojoj ce aplikant boraviti
- public:
- //core lekcije
- TuristickaViza() :Viza() {
- _adresa = nullptr;
- }
- TuristickaViza(Drzava drzava, Datum _OD, Datum _DO, const char *adresa):Viza(drzava,_OD,_DO) {
- _adresa = AlocirajNizKaraktera(adresa);
- }
- TuristickaViza(const TuristickaViza &temp):Viza(temp){
- _adresa = AlocirajNizKaraktera(temp._adresa);
- }
- TuristickaViza & operator= (TuristickaViza& temp) {
- if (this != &temp) {
- Viza :: operator=(temp);
- if (temp._adresa != nullptr) {
- delete[]_adresa;
- _adresa = AlocirajNizKaraktera(temp._adresa);
- }
- }
- return *this;
- }
- friend ostream & operator<< (ostream &cout, const TuristickaViza &obj) {
- cout << (Viza)obj << endl;
- if(obj._adresa != nullptr)
- cout << "Adresa : " << obj._adresa;
- return cout;
- }
- };
- class Aplikant {
- char * _imePrezime;
- Datum * _datumRodjenja;
- char * _brojPasosa;
- FITKolekcija<PoslovnaViza> _poslovneVize;
- FITKolekcija<TuristickaViza> _turistickeVize;
- public:
- Aplikant(const char * imePrezime, Datum datumRodjenja, const char * brojPasosa) : _datumRodjenja(new Datum(datumRodjenja)) {
- _imePrezime = AlocirajNizKaraktera(imePrezime);
- _brojPasosa = AlocirajNizKaraktera(brojPasosa);
- }
- //konstruktor kopije
- Aplikant(const Aplikant &temp):_datumRodjenja(temp._datumRodjenja) {
- _imePrezime = AlocirajNizKaraktera(temp._imePrezime);
- _brojPasosa = AlocirajNizKaraktera(temp._brojPasosa);
- _poslovneVize = temp._poslovneVize;
- _turistickeVize = temp._turistickeVize;
- }
- //move konstruktor
- //operator=
- Aplikant & operator= (Aplikant &obj) {
- if (this != &obj) {
- if (obj._imePrezime != nullptr) {
- delete[] _imePrezime;
- _imePrezime = AlocirajNizKaraktera(obj._imePrezime);
- }
- if (obj._brojPasosa != nullptr) {
- delete[] _brojPasosa;
- _brojPasosa = AlocirajNizKaraktera(obj._brojPasosa);
- }
- _datumRodjenja = obj._datumRodjenja;
- _poslovneVize = obj._poslovneVize;
- _turistickeVize = obj._turistickeVize;
- }
- return *this;
- }
- //DodajVizu za poslovnu vizu
- /*
- NOVA VIZA SE NE MOŽE DODATI UKOLIKO:
- - U TOM PERIODU (ODNOSI SE NA PERIOD VIZE OD - DO) NE POSTOJI VAŽECA (POJAM VAŽECA 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)
- */
- bool DodajVizu(PoslovnaViza &v) {
- for (int i = 0; i < _poslovneVize.GetTrenutno(); i++)
- {
- if (_poslovneVize[i].GetZadnjiStatus() == PONISTENA && _poslovneVize[i].GetDrzava() == SAD)
- return false;
- }
- //for (size_t i = _poslovneVize[i].GetVazenjeOD().GetBrojDana(); i < _poslovneVize[i].GetVazenjeOD().GetBrojDana(); i++)
- //{
- // if(_poslovneVize[i].GetStatuse())
- //}
- _poslovneVize.Dodaj(v);
- return true;
- }
- //DodajVizu za turisticku vizu
- bool DodajVizu(TuristickaViza &v) {
- for (int i = 0; i < _turistickeVize.GetTrenutno(); i++)
- {
- if (_turistickeVize[i].GetZadnjiStatus() == PONISTENA && _turistickeVize[i].GetDrzava() == SAD)
- return false;
- }
- //for (size_t i = _poslovneVize[i].GetVazenjeOD().GetBrojDana(); i < _poslovneVize[i].GetVazenjeOD().GetBrojDana(); i++)
- //{
- // if(_poslovneVize[i].GetStatuse())
- //}
- _turistickeVize.Dodaj(v);
- return true;
- }
- //DodajStatus za poslovnu vizu
- //STATUSI SE MOGU DODAVATI SAMO U REDOSLIJEDU U KOJEM SE NALAZE U ENUMERACIJI NPR.
- //- NIJE MOGUCE ODBITI VIZU AKO PRETHODNO NIJE IMALA STATUS DA JE ZAHTJEV_ZAPRIMLJEN
- //- NIJE MOGUCE PONIŠTITI VIZU KOJA PRETHODNO NIJE IZDATA
- bool DodajStatus(TuristickaViza &v, Status s) {
- if (v.DodajStatus(s))
- return true;
- return false;
- }
- //DodajStatus za turisticku vizu
- bool DodajStatus(PoslovnaViza &v, Status s) {
- if (v.DodajStatus(s))
- return true;
- return false;
- }
- //operator()
- void operator() (PoslovnaViza &v) {
- cout << v;
- }
- void operator() (TuristickaViza &v) {
- cout << v;
- }
- //operator<<
- friend ostream & operator<< (ostream &cout, const Aplikant &ap) {
- cout << "Ime i prezime -> " << ap._imePrezime << endl;
- cout << "Datum rodjenja -> " << *ap._datumRodjenja << endl;
- cout << "Broj pasosa -> " << *ap._brojPasosa << endl;
- cout << "Poslovne vize -> " << ap._poslovneVize.GetTrenutno() << endl;
- cout << "Turisticke vize -> " << ap._turistickeVize.GetTrenutno() << endl;
- return cout;
- }
- ~Aplikant() {
- delete[]_imePrezime; _imePrezime = nullptr;
- delete[]_brojPasosa; _brojPasosa = nullptr;
- delete _datumRodjenja; _datumRodjenja = nullptr;
- }
- FITKolekcija<PoslovnaViza> GetPoslovneVize() { return _poslovneVize; }
- FITKolekcija<TuristickaViza> GetTuristickeVize() { return _turistickeVize; }
- };
- int main() {
- /****************************************************************************
- 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
- 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR CE BITI OZNACENO KAO "RE"
- 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJECILO GUBLJENJE URAÐENOG ZADATKA
- 4. PROGRAMSKI CODE SE TAKOÐER NALAZI U FAJLU CODE.TXT
- 5. 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.
- 6. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNACENO.
- ****************************************************************************/
- 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> brojevi;
- brojevi.Dodaj(v196);
- brojevi.Dodaj(v13);
- brojevi.Dodaj(v98);
- brojevi.Dodaj(v63);
- brojevi.Dodaj(v98);
- brojevi.Dodaj(v196);
- Aplikant jasmin("Jasmin Azemovic", Datum(15, 5, 1979), "BS6985645");
- PoslovnaViza poslovna(SAD, dat15022017, dat18082017, "Microsoft");
- /*
- NOVA VIZA SE NE MOŽE DODATI UKOLIKO:
- - U TOM PERIODU (ODNOSI SE NA PERIOD VIZE OD - DO) NE POSTOJI VAŽECA (POJAM VAŽECA 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 uspjesno zaprimljeni!" << endl;
- //STATUSI SE MOGU DODAVATI SAMO U REDOSLIJEDU U KOJEM SE NALAZE U ENUMERACIJI NPR.
- //- NIJE MOGUCE ODBITI VIZU AKO PRETHODNO NIJE IMALA STATUS DA JE ZAHTJEV_ZAPRIMLJEN
- //- NIJE MOGUCE PONIŠTITI VIZU KOJA PRETHODNO NIJE IZDATA
- if (jasmin.DodajStatus(poslovna, ZAHTJEV_ZAPRIMLJEN))
- cout << "Status vize uspjesno promyijenjen!" << endl;
- else
- cout << "Aplikant \n" << jasmin << "NE POSJEDUJE evidentiranu trazenu vizu ili status vize nema odgovarajucu vrijednost" << endl;
- if (jasmin.DodajStatus(poslovna, PONISTENA))
- cout << "Status vize uspjesno promijenjen!" << endl;
- else
- cout << "Aplikant \n" << 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.DodajVizu(turisticka))
- cout << "Podaci o vizi uspjesno zaprimljeni!" << endl;
- if (jasmin.DodajStatus(turisticka, ZAHTJEV_ZAPRIMLJEN))
- cout << "Status vize uspjesno 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 uspjesno promijenjen!" << endl;
- jasmin(turisticka);//ispisuje podatke o trazenoj vizi
- }
- else
- cout << "Aplikant " << jasmin << "NE POSJEDUJE evidentiranu trazenu vizu ili status vize nema odgovarajucu vrijednost" << endl;
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement