Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<string>
- #include<vector>
- #include<algorithm>
- #include<iterator>
- #include <exception>
- using namespace std;
- template<class T1, class T2, int max>
- class Kolekcija{
- T1 _elementi1[max];
- T2 _elementi2[max];
- int _trenutnoElemenata;
- public:
- Kolekcija(){
- _trenutnoElemenata = 0;
- }
- Kolekcija(Kolekcija& org)
- {
- _trenutnoElemenata = org._trenutnoElemenata;
- for (int i = 0; i < _trenutnoElemenata; i++)
- {
- _elementi1[i] = org._elementi1[i];
- _elementi2[i] = org._elementi2[i];
- }
- }
- //1. AddElement :: omogucava dodavanje novog elementa u kolekciju. Onemoguciti ponavljanje
- // elemenata, te osigurati automatsko prosiranje kolekcije ukoliko broj elemenata dostigne
- // trenutni maksimum
- bool AddElement(T1 &el1, T2 & el2)
- {
- for (int i = 0; i < _trenutnoElemenata; i++)
- {
- if (_elementi1[i] == el1 && _elementi2[i] == el2)
- return false;
- }
- _elementi1[_trenutnoElemenata] = el1;
- _elementi2[_trenutnoElemenata] = el2;
- _trenutnoElemenata++;
- return true;
- }
- //2. RemoveElement :: na osnovu parametara tipa T1 i T2 uklanja element iz kolekcije. Ukoliko je
- // potrebno,prilikom uklanjanja elementa izvrsiti dealokaciju. Onemoguciti pojavljivanje
- // neinicijaliziranih elemenata, te ocuvati redoslijed dodavanja elemenata
- bool RemoveElement(T1 el1, T2 el2)
- {
- for (int i = 0; i < _trenutnoElemenata; i++)
- {
- if (_elementi1[i] == el1 && _elementi2[i] == el2)
- {
- for (int j = i; j < _trenutnoElemenata - 1; j++)
- {
- _elementi1[j] = _elementi1[j + 1];
- _elementi2[j] = _elementi2[j + 1];
- }
- _trenutnoElemenata--;
- return true;
- }
- }
- return false;
- }
- //3. PopFront :: uklanja prvi element iz kolekcije(iz oba niza). Ukoliko je kolekcija prazna
- // funkcija vraca false, a u suprotnom funkcija vraca true
- bool PopFront()
- {
- if (_trenutnoElemenata == 0)
- return false;
- for (int i = 0; i < _trenutnoElemenata - 1; i++)
- {
- _elementi1[i] = _elementi1[i++];
- _elementi2[1] = _elementi2[i + 1];
- }
- _trenutnoElemenata--;
- return true;
- }
- //4. 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, max>& obj)
- {
- int brojac = 0;
- for (int i = 0; i < _trenutnoElemenata - 1; i++)
- {
- if (RemoveElement(obj._elementi1[i], obj._elementi2[i]))
- brojac++;
- }
- _trenutnoElemenata--;
- return brojac;
- }
- int getTrenutno(){ return _trenutnoElemenata; }
- T1 getel1(int i){ return _elementi1[i]; }
- T2 getel2(int i){ return _elementi2[i]; }
- int getmax(){ return max; }
- friend ostream& operator<<<>(ostream& cout, Kolekcija<T1, T2, max> k)
- {
- for (int i = 0; i < k.getTrenutno(); i++)
- {
- cout << k.getel1(i) << endl;
- }
- return cout;
- }
- };
- class Pregled{
- char * _dijagnoza;
- vector<string> _terapije;
- public:
- Pregled(char* dijagnoza = "###")
- {
- int size = strlen(dijagnoza) + 1;
- _dijagnoza = new char[size];
- strcpy_s(_dijagnoza, size, dijagnoza);
- }
- ~Pregled()
- {
- delete[]_dijagnoza;
- _dijagnoza = NULL;
- }
- Pregled(const Pregled& org)
- {
- int size = strlen(org._dijagnoza) + 1;
- _dijagnoza = new char[size];
- strcpy_s(_dijagnoza, size, org._dijagnoza);
- _terapije = org._terapije;
- }
- //1. Info :: ispisuje sve podatke o pregledu. Koristiti ostream_iterator. Prije ispisa
- // sve terapije sortirati
- void Info()
- {
- sort(_terapije.begin(), _terapije.end());
- ostream_iterator<string> it(cout, "\n");
- copy(_terapije.begin(), _terapije.end(), it);
- }
- //2. AddTerapija :: dodaje novu terapiju. Onemoguciti ponavljanje terapija. Koristiti iteratore
- void AddTerapija(string terapija)
- {
- auto it = _terapije.begin();
- while (it != _terapije.end())
- {
- if (*it == terapija)
- throw exception("Ista terapija");
- it++;
- }
- _terapije.push_back(terapija);
- }
- //3. RemoveTerapija :: uklanja terapiju koja je primljena kao parametar. Koristiti iteratore
- bool RemoveTerapija(string terapija)
- {
- bool a = false;
- auto it = _terapije.begin();
- while (it != _terapije.end())
- {
- if (*it == terapija)
- {
- _terapije.erase(it);
- a = true;
- }
- it++;
- }
- if (a)
- return true;
- }
- char* getdijagnoza(){ return _dijagnoza; }
- friend ostream& operator<<(ostream& cout, Pregled& p)
- {
- cout << "Dijagnoza: " << p._dijagnoza << endl;
- p.Info();
- return cout;
- }
- bool operator==(Pregled& a)
- {
- if (strcmp(_dijagnoza, a.getdijagnoza()) == 0)
- return true;
- else
- return false;
- }
- };
- class Pacijent{
- protected:
- const int _pacijentID;
- static int pacijentID;
- char * _imePrezime;
- //tip bool čuva podatak o tome da li je zakazan kontrolni pregled
- //objekat tipa Pregled je za podatke o dijagnozi i terapijama
- Kolekcija<Pregled *, bool, 20> * _preglediPacijenta;
- public:
- Pacijent(char* ip) :_pacijentID(pacijentID++)
- {
- int size = strlen(ip) + 1;
- _imePrezime = new char[size];
- strcpy_s(_imePrezime, size, ip);
- }
- ~Pacijent()
- {
- delete[]_imePrezime; _imePrezime = NULL;
- }
- Pacijent(const Pacijent& org) :_pacijentID(org._pacijentID)
- {
- int size = strlen(org._imePrezime) + 1;
- _imePrezime = new char[size];
- strcpy_s(_imePrezime, size, org._imePrezime);
- }
- //1. operator [] :: vraca Pregled kod koga je postavljena dijagnoza koja je proslijedjena kao
- // parametar. Dakle, operatorska funkcija prima dijagnozu kao parametar
- Pregled operator [](char* dijagnoza)
- {
- for (int i = 0; i <_preglediPacijenta->getTrenutno(); i++)
- {
- if (strcmp(_preglediPacijenta->getel1(i)->getdijagnoza(), dijagnoza) == 0)
- return *_preglediPacijenta->getel1(i);
- }
- throw exception("Nije pronadjena dijagnoza");
- }
- //2. AddPregled :: dodaje podatke o novom pregledu pacijenta. Ukoliko je moguće, osigurati
- // proširanje nize. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false.
- bool AddPregled(Pregled& p, bool zakazan)
- {
- Pregled* temp = new Pregled(p);
- if (_preglediPacijenta->getTrenutno() == _preglediPacijenta->getmax())
- return false;
- _preglediPacijenta->AddElement(temp, zakazan);
- return true;
- }
- //3. RemovePregled :: na osnovu primljenog parametra (dijagnoze) uklanja sve podatke o pregledu.
- // U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false
- bool RemovePregled(char* dijagnoza)
- {
- for (int i = 0; i < _preglediPacijenta->getTrenutno(); i++)
- {
- if (strcmp(_preglediPacijenta->getel1(i)->getdijagnoza(), dijagnoza) == 0)
- if (_preglediPacijenta->RemoveElement(_preglediPacijenta->getel1(i), _preglediPacijenta->getel2(i)))
- return true;
- }
- return false;
- }
- //4. RemovePregledByTerapija :: na osnovu primljenog parametra (terapije) uklanja podatke o svim
- // pregledima kod koji je propisana trazena terapija, ali pod uslovom da je tokom tog pregleda
- // zakazan novi pregled. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false
- bool RemovePregledByTerapija(string terapije)
- {
- bool provjer = false;
- for (int i = 0; i < _preglediPacijenta->getTrenutno(); i++)
- {
- if (_preglediPacijenta->getel1(i)->RemoveTerapija(terapije))
- {
- if (_preglediPacijenta->getel2(i) == true)
- {
- _preglediPacijenta->RemoveElement(_preglediPacijenta->getel1(i), _preglediPacijenta->getel2(i));
- provjer = true;
- }
- }
- }
- if (provjer)
- return true;
- }
- //5. operator<< :: ispisuje vrijednosti svih atributa klase
- friend ostream &operator<<(ostream& cout, const Pacijent& p)
- {
- cout << "Ime i prezime: " << p._imePrezime << endl;
- cout << "Pacijent ID: " << p._pacijentID << endl;
- cout << p._preglediPacijenta << endl;
- return cout;
- }
- };
- int Pacijent::pacijentID = 100;
- void main(){
- Pregled p1("Upala pluca");
- Pregled p2("Slomljena noga");
- Pregled p3("Upala sinusa");
- Pacijent a("Selma Camdzic");
- p1.AddTerapija("piti caj");
- p1.AddTerapija("tablete");
- cout << p1;
- a.AddPregled(p1, false);
- //izbjegavajte koristenje vlastitog imena i prezimena.
- //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti na objektu tipa Pacijent
- //ukratko pojasniti i demonstrirati koncepciju polimorfizma
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement