Advertisement
Guest User

Untitled

a guest
Jan 26th, 2015
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.20 KB | None | 0 0
  1. #include<iostream>
  2. #include<string>
  3. #include<vector>
  4. #include<algorithm>
  5. #include<iterator>
  6. #include <exception>
  7. using namespace std;
  8.  
  9. template<class T1, class T2, int max>
  10.  
  11. class Kolekcija{
  12.     T1 _elementi1[max];
  13.     T2 _elementi2[max];
  14.     int _trenutnoElemenata;
  15. public:
  16.     Kolekcija(){
  17.         _trenutnoElemenata = 0;
  18.     }
  19.     Kolekcija(Kolekcija& org)
  20.     {
  21.         _trenutnoElemenata = org._trenutnoElemenata;
  22.         for (int i = 0; i < _trenutnoElemenata; i++)
  23.         {
  24.             _elementi1[i] = org._elementi1[i];
  25.             _elementi2[i] = org._elementi2[i];
  26.  
  27.         }
  28.     }
  29.     //1. AddElement :: omogucava dodavanje novog elementa u kolekciju. Onemoguciti ponavljanje
  30.     // elemenata, te osigurati automatsko prosiranje kolekcije ukoliko broj elemenata dostigne
  31.     // trenutni maksimum
  32.  
  33.     bool AddElement(T1 &el1, T2 & el2)
  34.     {
  35.         for (int i = 0; i < _trenutnoElemenata; i++)
  36.         {
  37.             if (_elementi1[i] == el1 && _elementi2[i] == el2)
  38.                 return false;
  39.         }
  40.  
  41.         _elementi1[_trenutnoElemenata] = el1;
  42.         _elementi2[_trenutnoElemenata] = el2;
  43.         _trenutnoElemenata++;
  44.         return true;
  45.     }
  46.  
  47.  
  48.     //2. RemoveElement :: na osnovu parametara tipa T1 i T2 uklanja element iz kolekcije. Ukoliko je
  49.     // potrebno,prilikom uklanjanja elementa izvrsiti dealokaciju. Onemoguciti pojavljivanje
  50.     // neinicijaliziranih elemenata, te ocuvati redoslijed dodavanja elemenata
  51.     bool RemoveElement(T1 el1, T2 el2)
  52.     {
  53.         for (int i = 0; i < _trenutnoElemenata; i++)
  54.         {
  55.             if (_elementi1[i] == el1 && _elementi2[i] == el2)
  56.             {
  57.                 for (int j = i; j < _trenutnoElemenata - 1; j++)
  58.                 {
  59.                     _elementi1[j] = _elementi1[j + 1];
  60.                     _elementi2[j] = _elementi2[j + 1];
  61.                 }
  62.                 _trenutnoElemenata--;
  63.                 return true;
  64.             }
  65.         }
  66.         return false;
  67.     }
  68.  
  69.  
  70.     //3. PopFront :: uklanja prvi element iz kolekcije(iz oba niza). Ukoliko je kolekcija prazna
  71.     // funkcija vraca false, a u suprotnom funkcija vraca true
  72.     bool PopFront()
  73.     {
  74.         if (_trenutnoElemenata == 0)
  75.             return false;
  76.  
  77.         for (int i = 0; i < _trenutnoElemenata - 1; i++)
  78.         {
  79.             _elementi1[i] = _elementi1[i++];
  80.             _elementi2[1] = _elementi2[i + 1];
  81.         }
  82.         _trenutnoElemenata--;
  83.         return true;
  84.     }
  85.  
  86.     //4. operator -= :: uklanja sve elemnte iz kolekcije koji su identicni onima koje posjeduje
  87.     // drugi objekat tipa Kolekcija koji je primljen kao parametar. Funkcija vraca broj uklonjenih
  88.     // elemenata
  89.  
  90.     int operator -=(Kolekcija<T1, T2, max>& obj)
  91.     {
  92.         int brojac = 0;
  93.         for (int i = 0; i < _trenutnoElemenata - 1; i++)
  94.         {
  95.             if (RemoveElement(obj._elementi1[i], obj._elementi2[i]))
  96.                 brojac++;
  97.         }
  98.         _trenutnoElemenata--;
  99.         return brojac;
  100.  
  101.     }
  102.     int getTrenutno(){ return _trenutnoElemenata; }
  103.     T1 getel1(int i){ return _elementi1[i]; }
  104.     T2 getel2(int i){ return _elementi2[i]; }
  105.     int getmax(){ return max; }
  106.     friend ostream& operator<<<>(ostream& cout, Kolekcija<T1, T2, max> k)
  107.     {
  108.         for (int i = 0; i < k.getTrenutno(); i++)
  109.         {
  110.             cout << k.getel1(i) << endl;
  111.         }
  112.         return cout;
  113.     }
  114. };
  115. class Pregled{
  116.     char * _dijagnoza;
  117.     vector<string> _terapije;
  118. public:
  119.  
  120.     Pregled(char* dijagnoza = "###")
  121.     {
  122.         int size = strlen(dijagnoza) + 1;
  123.         _dijagnoza = new char[size];
  124.         strcpy_s(_dijagnoza, size, dijagnoza);
  125.     }
  126.  
  127.     ~Pregled()
  128.     {
  129.         delete[]_dijagnoza;
  130.         _dijagnoza = NULL;
  131.     }
  132.  
  133.     Pregled(const Pregled& org)
  134.     {
  135.         int size = strlen(org._dijagnoza) + 1;
  136.         _dijagnoza = new char[size];
  137.         strcpy_s(_dijagnoza, size, org._dijagnoza);
  138.         _terapije = org._terapije;
  139.     }
  140.     //1. Info :: ispisuje sve podatke o pregledu. Koristiti ostream_iterator. Prije ispisa
  141.     // sve terapije sortirati
  142.     void Info()
  143.     {
  144.         sort(_terapije.begin(), _terapije.end());
  145.         ostream_iterator<string> it(cout, "\n");
  146.         copy(_terapije.begin(), _terapije.end(), it);
  147.  
  148.     }
  149.  
  150.     //2. AddTerapija :: dodaje novu terapiju. Onemoguciti ponavljanje terapija. Koristiti iteratore
  151.     void AddTerapija(string terapija)
  152.     {
  153.         auto it = _terapije.begin();
  154.         while (it != _terapije.end())
  155.         {
  156.             if (*it == terapija)
  157.                 throw exception("Ista terapija");
  158.             it++;
  159.         }
  160.  
  161.         _terapije.push_back(terapija);
  162.     }
  163.  
  164.     //3. RemoveTerapija :: uklanja terapiju koja je primljena kao parametar. Koristiti iteratore
  165.     bool RemoveTerapija(string terapija)
  166.     {
  167.         bool a = false;
  168.         auto it = _terapije.begin();
  169.         while (it != _terapije.end())
  170.         {
  171.             if (*it == terapija)
  172.             {
  173.                 _terapije.erase(it);
  174.                 a = true;
  175.             }
  176.             it++;
  177.         }
  178.         if (a)
  179.             return true;
  180.     }
  181.  
  182.     char* getdijagnoza(){ return _dijagnoza; }
  183.     friend ostream& operator<<(ostream& cout, Pregled& p)
  184.     {
  185.         cout << "Dijagnoza: " << p._dijagnoza << endl;
  186.         p.Info();
  187.         return cout;
  188.     }
  189.     bool operator==(Pregled& a)
  190.     {
  191.         if (strcmp(_dijagnoza, a.getdijagnoza()) == 0)
  192.             return true;
  193.         else
  194.             return false;
  195.     }
  196. };
  197. class Pacijent{
  198. protected:
  199.     const int _pacijentID;
  200.     static int pacijentID;
  201.     char * _imePrezime;
  202.     //tip bool čuva podatak o tome da li je zakazan kontrolni pregled
  203.     //objekat tipa Pregled je za podatke o dijagnozi i terapijama
  204.     Kolekcija<Pregled *, bool, 20> * _preglediPacijenta;
  205. public:
  206.     Pacijent(char* ip) :_pacijentID(pacijentID++)
  207.     {
  208.  
  209.         int size = strlen(ip) + 1;
  210.         _imePrezime = new char[size];
  211.         strcpy_s(_imePrezime, size, ip);
  212.  
  213.     }
  214.  
  215.     ~Pacijent()
  216.     {
  217.         delete[]_imePrezime; _imePrezime = NULL;
  218.     }
  219.  
  220.     Pacijent(const Pacijent& org) :_pacijentID(org._pacijentID)
  221.     {
  222.         int size = strlen(org._imePrezime) + 1;
  223.         _imePrezime = new char[size];
  224.         strcpy_s(_imePrezime, size, org._imePrezime);
  225.  
  226.     }
  227.     //1. operator [] :: vraca Pregled kod koga je postavljena dijagnoza koja je proslijedjena kao
  228.     // parametar. Dakle, operatorska funkcija prima dijagnozu kao parametar
  229.     Pregled operator [](char* dijagnoza)
  230.     {
  231.         for (int i = 0; i <_preglediPacijenta->getTrenutno(); i++)
  232.         {
  233.             if (strcmp(_preglediPacijenta->getel1(i)->getdijagnoza(), dijagnoza) == 0)
  234.                 return *_preglediPacijenta->getel1(i);
  235.         }
  236.         throw exception("Nije pronadjena dijagnoza");
  237.     }
  238.  
  239.     //2. AddPregled :: dodaje podatke o novom pregledu pacijenta. Ukoliko je moguće, osigurati
  240.     // proširanje nize. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false.
  241.     bool AddPregled(Pregled& p, bool zakazan)
  242.     {
  243.         Pregled* temp = new Pregled(p);
  244.         if (_preglediPacijenta->getTrenutno() == _preglediPacijenta->getmax())
  245.             return false;
  246.         _preglediPacijenta->AddElement(temp, zakazan);
  247.         return true;
  248.  
  249.     }
  250.  
  251.     //3. RemovePregled :: na osnovu primljenog parametra (dijagnoze) uklanja sve podatke o pregledu.
  252.     // U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false
  253.     bool RemovePregled(char* dijagnoza)
  254.     {
  255.         for (int i = 0; i < _preglediPacijenta->getTrenutno(); i++)
  256.         {
  257.             if (strcmp(_preglediPacijenta->getel1(i)->getdijagnoza(), dijagnoza) == 0)
  258.             if (_preglediPacijenta->RemoveElement(_preglediPacijenta->getel1(i), _preglediPacijenta->getel2(i)))
  259.                 return true;
  260.         }
  261.         return false;
  262.     }
  263.  
  264.     //4. RemovePregledByTerapija :: na osnovu primljenog parametra (terapije) uklanja podatke o svim
  265.     // pregledima kod koji je propisana trazena terapija, ali pod uslovom da je tokom tog pregleda
  266.     // zakazan novi pregled. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false
  267.     bool RemovePregledByTerapija(string terapije)
  268.     {
  269.         bool provjer = false;
  270.         for (int i = 0; i < _preglediPacijenta->getTrenutno(); i++)
  271.         {
  272.             if (_preglediPacijenta->getel1(i)->RemoveTerapija(terapije))
  273.             {
  274.                 if (_preglediPacijenta->getel2(i) == true)
  275.                 {
  276.                     _preglediPacijenta->RemoveElement(_preglediPacijenta->getel1(i), _preglediPacijenta->getel2(i));
  277.                     provjer = true;
  278.                 }
  279.             }
  280.         }
  281.         if (provjer)
  282.             return true;
  283.     }
  284.     //5. operator<< :: ispisuje vrijednosti svih atributa klase
  285.     friend ostream &operator<<(ostream& cout, const Pacijent& p)
  286.     {
  287.         cout << "Ime i prezime: " << p._imePrezime << endl;
  288.         cout << "Pacijent ID: " << p._pacijentID << endl;
  289.         cout << p._preglediPacijenta << endl;
  290.         return cout;
  291.     }
  292.  
  293. };
  294.  
  295. int Pacijent::pacijentID = 100;
  296. void main(){
  297.  
  298.     Pregled p1("Upala pluca");
  299.     Pregled p2("Slomljena noga");
  300.     Pregled p3("Upala sinusa");
  301.     Pacijent a("Selma Camdzic");
  302.     p1.AddTerapija("piti caj");
  303.     p1.AddTerapija("tablete");
  304.     cout << p1;
  305.     a.AddPregled(p1, false);
  306.  
  307.     //izbjegavajte koristenje vlastitog imena i prezimena.
  308.     //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti na objektu tipa Pacijent
  309.     //ukratko pojasniti i demonstrirati koncepciju polimorfizma
  310. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement