Advertisement
Guest User

ispitni :)

a guest
Sep 2nd, 2014
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.14 KB | None | 0 0
  1. #include<iostream>
  2. #include<vector>
  3. #include<iterator>
  4. #include<string>
  5. #include<algorithm>
  6. using namespace std;
  7. int ID = 1000;
  8. template<class T1, class T2>
  9. class Kolekcija{
  10. protected:
  11.     T1 * _elementi1;
  12.     T2 * _elementi2;
  13.     int * _max;
  14.     int * _trenutnoElemenata;
  15. public:
  16.     Kolekcija()
  17.     {
  18.         _max = new int; *_max = 5;
  19.         _trenutnoElemenata = new int; *_trenutnoElemenata = 0;
  20.         _elementi1 = new T1[*_max];
  21.         _elementi2 = new T2[*_max];
  22.     }
  23.     ~Kolekcija()
  24.     {
  25.         delete[] _elementi1; _elementi1 = NULL;
  26.         delete[] _elementi2; _elementi2 = NULL;
  27.         delete _max; _max = NULL;
  28.         delete _trenutnoElemenata; _trenutnoElemenata = NULL;
  29.     }
  30.     Kolekcija(Kolekcija <T1, T2> &obj)
  31.     {
  32.         _max = new int;
  33.         *_max = *obj._max;
  34.         _trenutnoElemenata = new int;
  35.         *_trenutnoElemenata = *obj._trenutnoElemenata;
  36.         for (int i = 0; i < *_trenutnoElemenata; i++)
  37.         {
  38.             _elementi1[i] = obj._elementi1[i];
  39.             _elementi2[i] = obj._elementi2[i];
  40.         }
  41.     }
  42.     //1. AddElement :: omogucava dodavanje novog elementa u kolekciju. Osigurati automatsko
  43.     // prosiranje kolekcije ukoliko broj elemenata dostigne trenutni maksimum, te onemoguciti
  44.     // ponavljanje elemenata. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false
  45.     bool addElement(T1 obj1, T2 obj2)
  46.     {
  47.         if (ponovljeni(obj1, obj2))
  48.             return false;
  49.         if (*_trenutnoElemenata == *_max)
  50.             prosiri();
  51.         _elementi1[*_trenutnoElemenata] = obj1;
  52.         _elementi2[*_trenutnoElemenata] = obj2;
  53.         (*_trenutnoElemenata)++;
  54.             return true;
  55.     }
  56.     bool ponovljeni(T1 a, T2 b)
  57.     {
  58.         for (int i = 0; i < *_trenutnoElemenata; i++)
  59.         {
  60.             if (_elementi1[i] == a && _elementi2[i] == b)
  61.                 return true;
  62.         }
  63.         return false;
  64.     }
  65.     void prosiri()
  66.     {
  67.         (*_max) += 5;
  68.         T1 * temp1 = new T1[*_max];
  69.         T2 * temp2 = new T2[*_max];
  70.         for (int i = 0; i < *_trenutnoElemenata; i++)
  71.         {
  72.             temp1[i] = _elementi1[i];
  73.             temp2[i] = _elementi2[i];
  74.         }
  75.         delete[] _elementi1;
  76.         delete[] _elementi2;
  77.         _elementi1 = temp1;
  78.         _elementi2 = temp2;
  79.     }
  80.     //2. RemoveElement :: na osnovu parametra tipa T1 uklanja elemente iz kolekcije. Ukoliko je
  81.     // potrebno,prilikom uklanjanja elementa izvrsiti dealokaciju. Onemoguciti pojavljivanje
  82.     // neinicijaliziranih elemenata, te ocuvati redoslijed dodavanja elemenata. U zavisnosti od
  83.     // uspjesnosti operacije, funkcija vraca true ili false
  84.     bool removeElement(T1 obj)
  85.     {
  86.         bool test = false;
  87.         for (int i = 0; i < *_trenutnoElemenata; i++)
  88.         {
  89.             if (_elementi1[i] == obj)
  90.             {
  91.                 for (int j = i; j < (*_trenutnoElemenata) - 1; j++)
  92.                 {
  93.                     _elementi1[j] = _elementi1[j + 1];
  94.                     _elementi2[j] = _elementi2[j + 1];
  95.                 }
  96.                 test = true;
  97.                 (*_trenutnoElemenata)--;
  98.             }
  99.         }
  100.         return test;
  101.     }
  102.     //3. operator -= :: uklanja sve elemnte iz kolekcije koji su identicni onima koje posjeduje
  103.     // drugi objekat tipa Kolekcija koji je primljen kao parametar. Funkcija vraca broj uklonjenih elemenata
  104.     int operator -= (Kolekcija<T1, T2> & obj)
  105.     {
  106.         int brojac = 0;
  107.         for (int i = 0; i < *_trenutnoElemenata; i++)
  108.         {
  109.             for (int j = 0; j < *obj._trenutnoElemenata; j++)
  110.             {
  111.                 if (_elementi1[i] == obj._elementi1[j] && _elementi2[i] == obj._elementi2[j])
  112.                 {
  113.                     removeElement(_elementi1[i]);
  114.                     brojac++;
  115.                 }
  116.             }
  117.         }
  118.         return brojac;
  119.     }
  120.     T1 & getEl1(int lok) { return _elementi1[lok]; }
  121.     T2 & getEl2(int lok) { return _elementi2[lok]; }
  122.     int getTrenutno(){ return *_trenutnoElemenata; }
  123.  
  124. };
  125. class Datum{
  126. protected:
  127.     int _dan, _mjesec, _godina;
  128. public:
  129.     Datum(int d = 1, int m = 1, int g = 2000)
  130.     {
  131.         _dan = d;
  132.         _mjesec = m;
  133.         _godina = g;
  134.     }
  135.     Datum(Datum &d)
  136.     {
  137.         _dan = d._dan;
  138.         _mjesec = d._mjesec;
  139.         _godina = d._godina;
  140.     }
  141.     bool operator ==(Datum d)
  142.     {
  143.         if (_dan == d._dan && _mjesec == d._mjesec && _godina == d._godina)
  144.             return true;
  145.         return false;
  146.     }
  147.     void Info()
  148.     {
  149.         cout << _dan << "/" << _mjesec << "/" << _godina << endl;
  150.     }
  151.     //1. potrebne funkcije
  152. };
  153. class Pregled{
  154. protected:
  155.     vector<char *> _terapije;
  156.     bool * _zakazanNoviTermin; //u slucaju da je pacijent narucen na kontrolni pregled
  157.     Datum _datumPregleda;
  158. public:
  159.     //1. potrebne funkcije
  160.     Pregled(bool zakazan = false, int d=1, int m=1, int g=2000) :_datumPregleda(d, m, g)
  161.     {
  162.         _zakazanNoviTermin = new bool;
  163.         *_zakazanNoviTermin = zakazan;
  164.     }
  165.     Pregled(Pregled & p)
  166.     {
  167.         _terapije = p._terapije;
  168.         _zakazanNoviTermin = new bool;
  169.         *_zakazanNoviTermin = *p._zakazanNoviTermin;
  170.         _datumPregleda = p._datumPregleda;
  171.     }
  172.     //2. Info :: ispisuje sve podatke o pregledu. Koristiti ostream_iterator. Prije ispisa
  173.     // sve terapije sortirati
  174.     void Info()
  175.     {
  176.         sort(_terapije.begin(), _terapije.end());
  177.         ostream_iterator <char*> out_iter (cout, "\n");
  178.         cout << "Terapije:"<<endl;
  179.         copy(_terapije.begin(), _terapije.end(), out_iter);
  180.         cout << "Zakazan novi termin:";
  181.         if (*_zakazanNoviTermin) cout << "Da" << endl;
  182.         else cout << "Ne" << endl;
  183.         cout << "Datum pregleda:";
  184.         _datumPregleda.Info();
  185.     }
  186.     //3. AddTerapija :: dodaje novu terapiju. Onemoguciti ponavljanje terapija. Koristiti iteratore
  187.     bool addTerapija(char * t)
  188.     {
  189.         vector<char*>::iterator it;
  190.         for (it = _terapije.begin(); it != _terapije.end(); it++)
  191.         {
  192.             if (strcmp(*it, t) == NULL) return false;
  193.         }
  194.         _terapije.push_back(t);
  195.         return true;
  196.     }
  197.     //4. RemoveTerapija :: uklanja sve terapije koje u sebi sadrze rijec primljenu kao parametar.
  198.     // Koristiti iteratore
  199.     void removeTerapija(char *t)
  200.     {  
  201.        
  202.         int brojac = 0;
  203.         vector<char*>::iterator it;
  204.         for (it = _terapije.begin(); it != _terapije.end(); it++)
  205.         {
  206.             if (strstr(*it, t) != NULL){ it=_terapije.erase(_terapije.begin() + brojac);  }
  207.             else brojac++;
  208.             if (it == _terapije.end()) return;
  209.         }
  210.     }
  211.     bool ifterapija(char *t)
  212.     {
  213.         for (int i = 0; i < _terapije.size(); i++)
  214.         {
  215.             if (strcmp(_terapije[i], t) == 0) return true;
  216.         }
  217.         return false;
  218.     }
  219.     bool operator ==(Pregled p)
  220.     {
  221.         if (_datumPregleda == p._datumPregleda && _terapije == p._terapije)
  222.             return true;
  223.         return false;
  224.     }
  225.     Datum getDatum(){ return _datumPregleda; }
  226. };
  227. class Pacijent{
  228. protected:
  229.     const int _pacijentID;
  230.     char *_imePrezime;
  231.     //tip string je za podatke o postavljenoj dijagnozi (jedna dijagnoza moze imati vise terapija)
  232.     //objekat tipa Pregled je za podatke o terapijama, te o zakazanom pregledu
  233.     Kolekcija<string, Pregled> * _preglediPacijenta;
  234. public:
  235.     Pacijent(char* ip = "<nepoznato>") :_pacijentID(++ID)
  236.     {
  237.         _imePrezime = new char[strlen(ip) +1 ];
  238.         strcpy_s(_imePrezime, strlen(ip) + 1, ip);
  239.         _preglediPacijenta = new Kolekcija<string, Pregled>();
  240.     }
  241.     Pacijent(Pacijent & p) :_pacijentID(++ID)
  242.     {
  243.         _imePrezime = new char[strlen(p._imePrezime) + 1];
  244.         strcpy_s(_imePrezime, strlen(p._imePrezime) + 1, p._imePrezime);
  245.         _preglediPacijenta = new Kolekcija<string, Pregled>();
  246.         _preglediPacijenta = p._preglediPacijenta;
  247.     }
  248.     ~Pacijent()
  249.     {
  250.         delete[] _imePrezime; _imePrezime = NULL;
  251.         delete _preglediPacijenta; _preglediPacijenta = NULL;
  252.     }
  253.     //1. operator [] :: vraca Pregled kod koga je postavljena dijagnoza koja je proslijedjena kao
  254.     // parametar. Dakle, operatorska funkcija prima dijagnozu kao parametar
  255.     Pregled operator [] (string d)
  256.     {
  257.         for (int i = 0; i < _preglediPacijenta->getTrenutno(); i++)
  258.         {
  259.             if (_preglediPacijenta->getEl1(i) == d)
  260.                 return _preglediPacijenta->getEl2(i);
  261.         }
  262.     }
  263.     //2. AddPregled :: dodaje podatke o novom pregledu pacijenta. Nije dozvoljeno dodati dva
  264.     // identicna pregleda. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false
  265.     bool addPregled(string dijagnoza, Pregled p)
  266.     {
  267.         for (int i = 0; i < _preglediPacijenta->getTrenutno(); i++)
  268.         {
  269.             if (_preglediPacijenta->getEl2(i) == p) return false;
  270.         }
  271.         _preglediPacijenta->addElement(dijagnoza, p);
  272.         return true;
  273.     }
  274.     //3. RemovePregledByDatum :: na osnovu primljenog parametra (tipa Datum) uklanja podatke o svim pregledima
  275.     // koji su obavljeni odredjenog datuma. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili
  276.     // false
  277.     bool removePregledByDatum(Datum d)
  278.     {
  279.         bool test = false;
  280.         for (int i = 0; i < _preglediPacijenta->getTrenutno(); i++)
  281.         {
  282.             if (_preglediPacijenta->getEl2(i).getDatum() == d){
  283.                 _preglediPacijenta->removeElement(_preglediPacijenta->getEl1(i));
  284.                 test = true;
  285.             }
  286.         }
  287.             return test;
  288.     }
  289.     //4. RemovePregledByTerapija :: na osnovu primljenog parametra (terapije) uklanja podatke o svim
  290.     // pregledima kod koji je propisana trazena terapija. U zavisnosti od uspjesnosti operacije,
  291.     // funkcija vraca true ili false
  292.     bool removePregledByTerapija(char *terp)
  293.     {
  294.         bool test = false;
  295.         for (int i = 0; i < _preglediPacijenta->getTrenutno(); i++)
  296.         {
  297.             if (_preglediPacijenta->getEl2(i).ifterapija(terp))
  298.             {
  299.                 _preglediPacijenta->removeElement(_preglediPacijenta->getEl1(i));
  300.                 test = true;
  301.             }
  302.         }
  303.         return test;
  304.     }
  305.     //5. operator<< :: ispisuje vrijednosti svih atributa klase
  306.     friend ostream & operator << (ostream &cout, Pacijent &p);
  307. };
  308. ostream & operator << (ostream &cout, Pacijent &p)
  309. {
  310.     cout << ":::::PACIJENT:::::" << endl;
  311.     cout << "ID:" << p._pacijentID << endl;
  312.     cout << "Ime i prezime:" << p._imePrezime << endl;
  313.     for (int i = 0; i < p._preglediPacijenta->getTrenutno(); i++)
  314.     {
  315.         cout << "Dijagnoza:" << p._preglediPacijenta->getEl1(i);
  316.         cout << "Terapije:" << endl;
  317.         p._preglediPacijenta->getEl2(i).Info();
  318.     }
  319.     return cout;
  320. }
  321. int main(){
  322.     cout << ":::Provjera pregleda:::" << endl;
  323.     Pregled pr1(true, 6, 6, 2014);
  324.     pr1.addTerapija("Terapija1");
  325.     pr1.addTerapija("Terapija2");
  326.     pr1.addTerapija("Terapija3");
  327.     pr1.Info();
  328.     cout << "--------Remove terapija-------" << endl;
  329.     pr1.removeTerapija("Terapija2");
  330.     pr1.Info();
  331.     cout << endl << endl;
  332.     Pregled pr2(false, 5, 3, 2014);
  333.     pr2.addTerapija("Terapija1");
  334.     pr2.addTerapija("Terapija2");
  335.     pr2.addTerapija("Terapija3");
  336.     Pregled pr3(true, 1, 6, 2014);
  337.     pr3.addTerapija("Terapija1");
  338.     pr3.addTerapija("Terapija2");
  339.     pr3.addTerapija("Terapija3");
  340.  
  341.     Pacijent P("Niko Nikic");
  342.     P.addPregled("dijagnoza 1", pr1);
  343.     P.addPregled("Dijagnoza 2", pr2);
  344.     P.addPregled("Dijagnoza 3", pr3);
  345.     cout << P << endl;
  346.     //izbjegavajte koristenje vlastitog imena i prezimena.
  347.     //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti na objektu tipa Pacijent
  348.     system("pause>0");
  349.     return 0;
  350. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement