Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<vector>
- #include<iterator>
- #include<string>
- #include<algorithm>
- using namespace std;
- int ID = 1000;
- template<class T1, class T2>
- class Kolekcija{
- protected:
- T1 * _elementi1;
- T2 * _elementi2;
- int * _max;
- int * _trenutnoElemenata;
- public:
- Kolekcija()
- {
- _max = new int; *_max = 5;
- _trenutnoElemenata = new int; *_trenutnoElemenata = 0;
- _elementi1 = new T1[*_max];
- _elementi2 = new T2[*_max];
- }
- ~Kolekcija()
- {
- delete[] _elementi1; _elementi1 = NULL;
- delete[] _elementi2; _elementi2 = NULL;
- delete _max; _max = NULL;
- delete _trenutnoElemenata; _trenutnoElemenata = NULL;
- }
- Kolekcija(Kolekcija <T1, T2> &obj)
- {
- _max = new int;
- *_max = *obj._max;
- _trenutnoElemenata = new int;
- *_trenutnoElemenata = *obj._trenutnoElemenata;
- for (int i = 0; i < *_trenutnoElemenata; i++)
- {
- _elementi1[i] = obj._elementi1[i];
- _elementi2[i] = obj._elementi2[i];
- }
- }
- //1. AddElement :: omogucava dodavanje novog elementa u kolekciju. Osigurati automatsko
- // prosiranje kolekcije ukoliko broj elemenata dostigne trenutni maksimum, te onemoguciti
- // ponavljanje elemenata. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false
- bool addElement(T1 obj1, T2 obj2)
- {
- if (ponovljeni(obj1, obj2))
- return false;
- if (*_trenutnoElemenata == *_max)
- prosiri();
- _elementi1[*_trenutnoElemenata] = obj1;
- _elementi2[*_trenutnoElemenata] = obj2;
- (*_trenutnoElemenata)++;
- return true;
- }
- bool ponovljeni(T1 a, T2 b)
- {
- for (int i = 0; i < *_trenutnoElemenata; i++)
- {
- if (_elementi1[i] == a && _elementi2[i] == b)
- return true;
- }
- return false;
- }
- void prosiri()
- {
- (*_max) += 5;
- T1 * temp1 = new T1[*_max];
- T2 * temp2 = new T2[*_max];
- for (int i = 0; i < *_trenutnoElemenata; i++)
- {
- temp1[i] = _elementi1[i];
- temp2[i] = _elementi2[i];
- }
- delete[] _elementi1;
- delete[] _elementi2;
- _elementi1 = temp1;
- _elementi2 = temp2;
- }
- //2. RemoveElement :: na osnovu parametra tipa T1 uklanja elemente iz kolekcije. Ukoliko je
- // potrebno,prilikom uklanjanja elementa izvrsiti dealokaciju. Onemoguciti pojavljivanje
- // neinicijaliziranih elemenata, te ocuvati redoslijed dodavanja elemenata. U zavisnosti od
- // uspjesnosti operacije, funkcija vraca true ili false
- bool removeElement(T1 obj)
- {
- bool test = false;
- for (int i = 0; i < *_trenutnoElemenata; i++)
- {
- if (_elementi1[i] == obj)
- {
- for (int j = i; j < (*_trenutnoElemenata) - 1; j++)
- {
- _elementi1[j] = _elementi1[j + 1];
- _elementi2[j] = _elementi2[j + 1];
- }
- test = true;
- (*_trenutnoElemenata)--;
- }
- }
- return test;
- }
- //3. operator -= :: uklanja sve elemnte iz kolekcije koji su identicni onima koje posjeduje
- // drugi objekat tipa Kolekcija koji je primljen kao parametar. Funkcija vraca broj uklonjenih elemenata
- int operator -= (Kolekcija<T1, T2> & obj)
- {
- int brojac = 0;
- for (int i = 0; i < *_trenutnoElemenata; i++)
- {
- for (int j = 0; j < *obj._trenutnoElemenata; j++)
- {
- if (_elementi1[i] == obj._elementi1[j] && _elementi2[i] == obj._elementi2[j])
- {
- removeElement(_elementi1[i]);
- brojac++;
- }
- }
- }
- return brojac;
- }
- T1 & getEl1(int lok) { return _elementi1[lok]; }
- T2 & getEl2(int lok) { return _elementi2[lok]; }
- int getTrenutno(){ return *_trenutnoElemenata; }
- };
- class Datum{
- protected:
- int _dan, _mjesec, _godina;
- public:
- Datum(int d = 1, int m = 1, int g = 2000)
- {
- _dan = d;
- _mjesec = m;
- _godina = g;
- }
- Datum(Datum &d)
- {
- _dan = d._dan;
- _mjesec = d._mjesec;
- _godina = d._godina;
- }
- bool operator ==(Datum d)
- {
- if (_dan == d._dan && _mjesec == d._mjesec && _godina == d._godina)
- return true;
- return false;
- }
- void Info()
- {
- cout << _dan << "/" << _mjesec << "/" << _godina << endl;
- }
- //1. potrebne funkcije
- };
- class Pregled{
- protected:
- vector<char *> _terapije;
- bool * _zakazanNoviTermin; //u slucaju da je pacijent narucen na kontrolni pregled
- Datum _datumPregleda;
- public:
- //1. potrebne funkcije
- Pregled(bool zakazan = false, int d=1, int m=1, int g=2000) :_datumPregleda(d, m, g)
- {
- _zakazanNoviTermin = new bool;
- *_zakazanNoviTermin = zakazan;
- }
- Pregled(Pregled & p)
- {
- _terapije = p._terapije;
- _zakazanNoviTermin = new bool;
- *_zakazanNoviTermin = *p._zakazanNoviTermin;
- _datumPregleda = p._datumPregleda;
- }
- //2. Info :: ispisuje sve podatke o pregledu. Koristiti ostream_iterator. Prije ispisa
- // sve terapije sortirati
- void Info()
- {
- sort(_terapije.begin(), _terapije.end());
- ostream_iterator <char*> out_iter (cout, "\n");
- cout << "Terapije:"<<endl;
- copy(_terapije.begin(), _terapije.end(), out_iter);
- cout << "Zakazan novi termin:";
- if (*_zakazanNoviTermin) cout << "Da" << endl;
- else cout << "Ne" << endl;
- cout << "Datum pregleda:";
- _datumPregleda.Info();
- }
- //3. AddTerapija :: dodaje novu terapiju. Onemoguciti ponavljanje terapija. Koristiti iteratore
- bool addTerapija(char * t)
- {
- vector<char*>::iterator it;
- for (it = _terapije.begin(); it != _terapije.end(); it++)
- {
- if (strcmp(*it, t) == NULL) return false;
- }
- _terapije.push_back(t);
- return true;
- }
- //4. RemoveTerapija :: uklanja sve terapije koje u sebi sadrze rijec primljenu kao parametar.
- // Koristiti iteratore
- void removeTerapija(char *t)
- {
- int brojac = 0;
- vector<char*>::iterator it;
- for (it = _terapije.begin(); it != _terapije.end(); it++)
- {
- if (strstr(*it, t) != NULL){ it=_terapije.erase(_terapije.begin() + brojac); }
- else brojac++;
- if (it == _terapije.end()) return;
- }
- }
- bool ifterapija(char *t)
- {
- for (int i = 0; i < _terapije.size(); i++)
- {
- if (strcmp(_terapije[i], t) == 0) return true;
- }
- return false;
- }
- bool operator ==(Pregled p)
- {
- if (_datumPregleda == p._datumPregleda && _terapije == p._terapije)
- return true;
- return false;
- }
- Datum getDatum(){ return _datumPregleda; }
- };
- class Pacijent{
- protected:
- const int _pacijentID;
- char *_imePrezime;
- //tip string je za podatke o postavljenoj dijagnozi (jedna dijagnoza moze imati vise terapija)
- //objekat tipa Pregled je za podatke o terapijama, te o zakazanom pregledu
- Kolekcija<string, Pregled> * _preglediPacijenta;
- public:
- Pacijent(char* ip = "<nepoznato>") :_pacijentID(++ID)
- {
- _imePrezime = new char[strlen(ip) +1 ];
- strcpy_s(_imePrezime, strlen(ip) + 1, ip);
- _preglediPacijenta = new Kolekcija<string, Pregled>();
- }
- Pacijent(Pacijent & p) :_pacijentID(++ID)
- {
- _imePrezime = new char[strlen(p._imePrezime) + 1];
- strcpy_s(_imePrezime, strlen(p._imePrezime) + 1, p._imePrezime);
- _preglediPacijenta = new Kolekcija<string, Pregled>();
- _preglediPacijenta = p._preglediPacijenta;
- }
- ~Pacijent()
- {
- delete[] _imePrezime; _imePrezime = NULL;
- delete _preglediPacijenta; _preglediPacijenta = NULL;
- }
- //1. operator [] :: vraca Pregled kod koga je postavljena dijagnoza koja je proslijedjena kao
- // parametar. Dakle, operatorska funkcija prima dijagnozu kao parametar
- Pregled operator [] (string d)
- {
- for (int i = 0; i < _preglediPacijenta->getTrenutno(); i++)
- {
- if (_preglediPacijenta->getEl1(i) == d)
- return _preglediPacijenta->getEl2(i);
- }
- }
- //2. AddPregled :: dodaje podatke o novom pregledu pacijenta. Nije dozvoljeno dodati dva
- // identicna pregleda. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false
- bool addPregled(string dijagnoza, Pregled p)
- {
- for (int i = 0; i < _preglediPacijenta->getTrenutno(); i++)
- {
- if (_preglediPacijenta->getEl2(i) == p) return false;
- }
- _preglediPacijenta->addElement(dijagnoza, p);
- return true;
- }
- //3. RemovePregledByDatum :: na osnovu primljenog parametra (tipa Datum) uklanja podatke o svim pregledima
- // koji su obavljeni odredjenog datuma. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili
- // false
- bool removePregledByDatum(Datum d)
- {
- bool test = false;
- for (int i = 0; i < _preglediPacijenta->getTrenutno(); i++)
- {
- if (_preglediPacijenta->getEl2(i).getDatum() == d){
- _preglediPacijenta->removeElement(_preglediPacijenta->getEl1(i));
- test = true;
- }
- }
- return test;
- }
- //4. RemovePregledByTerapija :: na osnovu primljenog parametra (terapije) uklanja podatke o svim
- // pregledima kod koji je propisana trazena terapija. U zavisnosti od uspjesnosti operacije,
- // funkcija vraca true ili false
- bool removePregledByTerapija(char *terp)
- {
- bool test = false;
- for (int i = 0; i < _preglediPacijenta->getTrenutno(); i++)
- {
- if (_preglediPacijenta->getEl2(i).ifterapija(terp))
- {
- _preglediPacijenta->removeElement(_preglediPacijenta->getEl1(i));
- test = true;
- }
- }
- return test;
- }
- //5. operator<< :: ispisuje vrijednosti svih atributa klase
- friend ostream & operator << (ostream &cout, Pacijent &p);
- };
- ostream & operator << (ostream &cout, Pacijent &p)
- {
- cout << ":::::PACIJENT:::::" << endl;
- cout << "ID:" << p._pacijentID << endl;
- cout << "Ime i prezime:" << p._imePrezime << endl;
- for (int i = 0; i < p._preglediPacijenta->getTrenutno(); i++)
- {
- cout << "Dijagnoza:" << p._preglediPacijenta->getEl1(i);
- cout << "Terapije:" << endl;
- p._preglediPacijenta->getEl2(i).Info();
- }
- return cout;
- }
- int main(){
- cout << ":::Provjera pregleda:::" << endl;
- Pregled pr1(true, 6, 6, 2014);
- pr1.addTerapija("Terapija1");
- pr1.addTerapija("Terapija2");
- pr1.addTerapija("Terapija3");
- pr1.Info();
- cout << "--------Remove terapija-------" << endl;
- pr1.removeTerapija("Terapija2");
- pr1.Info();
- cout << endl << endl;
- Pregled pr2(false, 5, 3, 2014);
- pr2.addTerapija("Terapija1");
- pr2.addTerapija("Terapija2");
- pr2.addTerapija("Terapija3");
- Pregled pr3(true, 1, 6, 2014);
- pr3.addTerapija("Terapija1");
- pr3.addTerapija("Terapija2");
- pr3.addTerapija("Terapija3");
- Pacijent P("Niko Nikic");
- P.addPregled("dijagnoza 1", pr1);
- P.addPregled("Dijagnoza 2", pr2);
- P.addPregled("Dijagnoza 3", pr3);
- cout << P << endl;
- //izbjegavajte koristenje vlastitog imena i prezimena.
- //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti na objektu tipa Pacijent
- system("pause>0");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement