Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<vector>
- #include<string>
- #include<algorithm>
- using namespace std;
- template<class T1,class T2,int max>
- class Kolekcija{
- T1 _elementi1[max];
- T2 _elementi2[max];
- int _trenutnoElemenata;
- public:
- Kolekcija(){
- _trenutnoElemenata = 0;
- }
- //1. AddElement :: omogucava dodavanje novog elementa u kolekciju. Onemoguciti ponavljanje
- // elemenata, te osigurati automatsko prosiranje kolekcije ukoliko broj elemenata dostigne
- // trenutni maksimum
- void AddElement(T1& e1, T2& e2){
- // Prosirenje kolekcije nije moguce, zbog toga sto se radi o statickom nizu
- if(_trenutnoElemenata == max)
- throw exception("Niz je isupnjen do kraja");
- for (int i = 0; i < _trenutnoElemenata; i++){
- if(e1 == _elementi1[i] && e2 == _elementi2[i])
- throw exception("Dupliranje elemenata");
- }
- _elementi1[_trenutnoElemenata] = e1;
- _elementi2[_trenutnoElemenata] = e2;
- _trenutnoElemenata++;
- }
- //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& e1, T2& e2){
- for (int i = 0; i < _trenutnoElemenata; i++){
- if(_elementi1[i] == e1 && _elementi2[i] == e2){
- 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;
- return (RemoveElement(_elementi1[0], _elementi2[0]));
- }
- //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& obj){
- int brojElemenata = 0;
- for (int i = 0; i < obj._trenutnoElemenata; i++){
- if(RemoveElement(obj._elementi1[i], obj._elementi2[i]))
- brojElemenata++;
- }
- return brojElemenata;
- }
- T1& getElement1(int indeks){
- return _elementi1[indeks];
- }
- T2& getElement2(int indeks){
- return _elementi2[indeks];
- }
- int getSize(){
- return _trenutnoElemenata;
- }
- friend ostream& operator<< <>(ostream&, Kolekcija<T1,T2,max>&);
- };
- template<class T1,class T2,int max>
- ostream& operator<<(ostream& COUT, Kolekcija<T1,T2,max>& obj){
- for (int i = 0; i < obj._trenutnoElemenata; i++){
- COUT << obj._elementi1[i] << " - " << obj._elementi2[i] << endl;
- }
- return COUT;
- }
- class Pregled{
- char * _dijagnoza;
- vector<string> _terapije;
- public:
- Pregled(char* dijagnoza){
- int vel = strlen(dijagnoza) + 1;
- _dijagnoza = new char[vel];
- strcpy_s(_dijagnoza,vel,dijagnoza);
- }
- Pregled(const Pregled& obj){
- int vel = strlen(obj._dijagnoza) + 1;
- _dijagnoza = new char[vel];
- strcpy_s(_dijagnoza,vel,obj._dijagnoza);
- _terapije = obj._terapije;
- }
- ~Pregled(){
- delete[] _dijagnoza;
- _dijagnoza = nullptr;
- }
- void operator=(const Pregled& obj){
- delete[] _dijagnoza;
- int vel = strlen(obj._dijagnoza);
- _dijagnoza = new char[vel];
- strcpy_s(_dijagnoza,vel,obj._dijagnoza);
- _terapije = obj._terapije;
- }
- //1. Info :: ispisuje sve podatke o pregledu. Koristiti ostream_iterator. Prije ispisa
- // sve terapije sortirati
- void Info(){
- cout << "Dijagnoza: " << _dijagnoza << endl;
- cout << "Terapije: " << endl;
- ostream_iterator<string> ispis(cout, "\n");
- copy(_terapije.begin(), _terapije.end(), ispis);
- }
- //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("Ova terapija vec postoji");
- it++;
- }
- _terapije.push_back(terapija);
- }
- //3. RemoveTerapija :: uklanja terapiju koja je primljena kao parametar. Koristiti iteratore
- void RemoveTerapija(string terapija){
- auto it = _terapije.begin();
- while(it != _terapije.end()){
- if(*it == terapija){
- _terapije.erase(it);
- return;
- }
- it++;
- }
- }
- char* getDijagnoza(){
- return _dijagnoza;
- }
- bool DaLiPostojiTrazenaTerapija(string terapija){
- auto it = _terapije.begin();
- while(it != _terapije.end()){
- if(*it == terapija)
- return true;
- it++;
- }
- it++;
- return false;
- }
- friend ostream& operator<<(ostream&, Pregled&);
- };
- ostream& operator<<(ostream& COUT, Pregled& obj){
- cout << "Dijagnoza: " << obj._dijagnoza << endl;
- cout << "Terapije: " << endl;
- ostream_iterator<string> ispis(cout, "\n");
- sort(obj._terapije.begin(), obj._terapije.end());
- copy(obj._terapije.begin(), obj._terapije.end(), ispis);
- return COUT;
- }
- int pacijentID = 1;
- class Pacijent{
- protected:
- const 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* imePrezime) : _pacijentID(pacijentID++){
- int vel = strlen(imePrezime) + 1;
- _imePrezime = new char[vel];
- strcpy_s(_imePrezime,vel,imePrezime);
- _preglediPacijenta = new Kolekcija<Pregled*, bool, 20>;
- }
- Pacijent(const Pacijent& obj) : _pacijentID(pacijentID++){
- int vel = strlen(obj._imePrezime) + 1;
- _imePrezime = new char[vel];
- strcpy_s(_imePrezime,vel,obj._imePrezime);
- _preglediPacijenta = new Kolekcija<Pregled*, bool, 20>(*obj._preglediPacijenta);
- }
- ~Pacijent(){
- delete[] _imePrezime;
- _imePrezime = nullptr;
- for (int i = 0; i < _preglediPacijenta->getSize(); i++){
- delete _preglediPacijenta->getElement1(i);
- }
- delete _preglediPacijenta;
- _preglediPacijenta = nullptr;
- }
- //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->getSize(); i++){
- if(strcmp(dijagnoza, _preglediPacijenta->getElement1(i)->getDijagnoza()) == 0)
- return *_preglediPacijenta->getElement1(i);
- }
- return Pregled("x");
- }
- //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& obj){
- bool kontrolni = false;
- Pregled* pregled = new Pregled(obj);
- try{
- _preglediPacijenta->AddElement(pregled,kontrolni);
- }
- catch(exception e){
- cout << "Greska: " << e.what() << endl;
- return false;
- }
- 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->getSize(); i++){
- if(strcmp(_preglediPacijenta->getElement1(i)->getDijagnoza(), dijagnoza) == 0)
- if(_preglediPacijenta->RemoveElement(_preglediPacijenta->getElement1(i),
- _preglediPacijenta->getElement2(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 terapija){
- for (int i = 0; i < _preglediPacijenta->getSize(); i++){
- if(_preglediPacijenta->getElement1(i)->DaLiPostojiTrazenaTerapija(terapija)){
- _preglediPacijenta->RemoveElement(_preglediPacijenta->getElement1(i), _preglediPacijenta->getElement2(i));
- i--;
- }
- }
- return true;
- }
- //5. operator<< :: ispisuje vrijednosti svih atributa klase
- friend ostream& operator<<(ostream&, Pacijent&);
- };
- ostream& operator<<(ostream& COUT, Pacijent& obj){
- COUT << "Ime i prezime: " << obj._imePrezime << endl;
- COUT << "\n \t#### PREGLEDI #####\n"<<endl;
- for (int i = 0; i < obj._preglediPacijenta->getSize(); i++){
- cout <<"Kontrolni pregled: ";
- if(obj._preglediPacijenta->getElement2(i))
- cout << "Da" << endl;
- else
- cout << "Ne" << endl;
- COUT << *obj._preglediPacijenta->getElement1(i) << endl;
- COUT << "-------------------------------------------------\n";
- }
- return COUT;
- }
- void main(){
- //izbjegavajte koristenje vlastitog imena i prezimena.
- //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti na objektu tipa Pacijent
- //ukratko pojasniti i demonstrirati koncepciju polimorfizma
- Pregled p1("Dijagnoza broj jedan");
- Pregled p2("Dijagnoza broj dva");
- Pregled p3("Dijagnoza broj 3");
- p3.AddTerapija("Neka terapija");
- p3.AddTerapija("Terapija 2");
- p2.AddTerapija("Terapija 3");
- p2.AddTerapija("Terapija 2");
- p2.AddTerapija("Terapija 1");
- p2.AddTerapija("Terapija broj 1");
- try{
- p1.AddTerapija("Terapija 1");
- p1.AddTerapija("Terapija 2");
- p1.AddTerapija("Terapija 3");
- }
- catch(exception e){
- cout << "Greska: " << e.what() << endl;
- }
- p1.RemoveTerapija("Terapija 2");
- Pacijent pa1("Almin Latovic");
- pa1.AddPregled(p1);
- pa1.AddPregled(p2);
- pa1.AddPregled(p3);
- //pa1.RemovePregled("Dijagnoza broj dva");
- pa1.RemovePregledByTerapija("Terapija 1");
- cout << pa1 << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement