Advertisement
neogz

pr2 pacijenti

Feb 11th, 2015
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.77 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. char crt[] = { "----------------------------------------------\n" };
  8.  
  9. template<class T1, class T2>
  10. class Kolekcija{
  11.     T1 * _elementi1;
  12.     T2 * _elementi2;
  13.     int _trenutnoElemenata;
  14. public:
  15.     Kolekcija(){
  16.         _elementi1 = nullptr;
  17.         _elementi2 = nullptr;
  18.         _trenutnoElemenata = 0;
  19.     }
  20.     Kolekcija(const Kolekcija & obj){
  21.         _trenutnoElemenata = obj._trenutnoElemenata;
  22.         _elementi1 = new T1 [_trenutnoElemenata];
  23.         _elementi2 = new T2 [_trenutnoElemenata];
  24.         for (int i = 0; i < _trenutnoElemenata; i++){
  25.             _elementi1[i] = obj._elementi1[i];
  26.             _elementi2[i] = obj._elementi2[i];
  27.         }
  28.     }
  29.     ~Kolekcija(){
  30.         delete[]_elementi1;
  31.         delete[]_elementi2;
  32.         _elementi1 = nullptr;
  33.         _elementi2 = nullptr;
  34.     }
  35.     //////////////////////////////////// << =
  36.     bool addElement(const T1 e1, const T2 e2){
  37.         // sprijeciti ponavljanje
  38.         for (int i = 0; i < _trenutnoElemenata; i++)
  39.             if (_elementi1[i] == e1 && _elementi2[i] == e2)
  40.                 return false;
  41.         // dodati
  42.         T1 * temp1 = new T1 [_trenutnoElemenata + 1];
  43.         T2 * temp2 = new T2 [_trenutnoElemenata + 1];
  44.         for (int i = 0; i < _trenutnoElemenata; i++){
  45.             temp1[i] = _elementi1[i];
  46.             temp2[i] = _elementi2[i];
  47.         }
  48.         delete[]_elementi1;
  49.         delete[]_elementi2;
  50.  
  51.         _elementi1 = temp1;
  52.         _elementi2 = temp2;
  53.  
  54.         _elementi1[_trenutnoElemenata] = e1;
  55.         _elementi2[_trenutnoElemenata] = e2;
  56.  
  57.         _trenutnoElemenata++;
  58.  
  59.        
  60.     }
  61.     bool removeElement( T1 element){
  62.         for (int i = 0; i < _trenutnoElemenata; i++){
  63.             if (_elementi1[i] == element){
  64.                 T1 * temp1 = new T1 [_trenutnoElemenata - 1];
  65.                 T2 * temp2 = new T2 [_trenutnoElemenata - 1];
  66.                 for (int j = 0; j < i; j++){
  67.                     temp1[j] = _elementi1[j];
  68.                     temp2[j] = _elementi2[j];
  69.                 }
  70.                 for (int j = i; j < _trenutnoElemenata-1; j++){
  71.                     temp1[j] = _elementi1[j+1];
  72.                     temp2[j] = _elementi2[j+1];
  73.                 }
  74.                 delete[]_elementi1;
  75.                 delete[]_elementi2;
  76.  
  77.                 _elementi1 = temp1;
  78.                 _elementi2 = temp2;
  79.                
  80.                 _trenutnoElemenata--;
  81.                 return true;
  82.             }
  83.         }
  84.         return false;
  85.     }
  86.     bool removeElementPozicija(int pozicija){
  87.         for (int i = 0; i < _trenutnoElemenata; i++){
  88.             if (i == pozicija){
  89.                 T1 * temp1 = new T1[_trenutnoElemenata - 1];
  90.                 T2 * temp2 = new T2[_trenutnoElemenata - 1];
  91.                 for (int j = 0; j < i; j++){
  92.                     temp1[j] = _elementi1[j];
  93.                     temp2[j] = _elementi2[j];
  94.                 }
  95.                 for (int j = i; j < _trenutnoElemenata; j++){
  96.                     temp1[j] = _elementi1[j + 1];
  97.                     temp2[j] = _elementi2[j + 1];
  98.                 }
  99.                 delete[]_elementi1;
  100.                 delete[]_elementi2;
  101.  
  102.                 _elementi1 = temp1;
  103.                 _elementi2 = temp2;
  104.  
  105.                 _trenutnoElemenata--;
  106.                 return true;
  107.             }
  108.         }
  109.         return false;
  110.     }
  111.     Kolekcija operator -(const Kolekcija & obj){
  112.         //3. operator- :: vraca objekat tipa Kolekcija koji u sebi sadrzi elemente zajednicke za objekat koji je
  113.         // pozvao funkciju i objekat koji je proslijedjen kao parametar (takodjer tipa Kolekcija).
  114.         Kolekcija<T1, T2> temp;
  115.         for (int i = 0; i < _trenutnoElemenata; i++)
  116.             if (_elementi1[i] == obj._elementi1[i] && _elementi2[i] == obj._elementi2[i])
  117.                 temp.addElement(_elementi1[i], _elementi2[i]);
  118.            
  119.         return temp;
  120.     }
  121.     /////////////////////////////////////
  122.     Kolekcija & operator = (const Kolekcija & obj){
  123.         delete[]_elementi1;
  124.         delete[]_elementi2;
  125.         _trenutnoElemenata = 0;
  126.  
  127.         _elementi1 = new T1[obj._trenutnoElemenata];
  128.         _elementi2 = new T2[obj._trenutnoElemenata];
  129.         for (int i = 0; i < obj._tenutnoElemenata; i++){
  130.             _elementi1[i] = obj._elementi1[i];
  131.             _elementi2[i] = obj._elementi2[i];
  132.         }
  133.         _trenutnoElemenata = obj._trenutnoElemenata;
  134.     }
  135.     friend ostream & operator << <>(ostream & cout, const Kolekcija<T1,T2> & obj);
  136.     int getTrenutno()const{
  137.         return _trenutnoElemenata;
  138.     }
  139.     T1 & getElement1(int id)const{
  140.         return _elementi1[id];
  141.         // treba obratiti paznju je li id u opsegu i exception ?
  142.     }
  143.     T2 & getElement2(int id)const{
  144.         return _elementi2[id];     
  145.     }
  146. };
  147. class Datum{
  148.     int *_dan, *_mjesec, *_godina;
  149. public:
  150.     Datum(int dan= 1, int mjesec= 1, int godina= 1900){
  151.         _dan    = new int (dan);
  152.         _mjesec = new int (mjesec);
  153.         _godina = new int (godina);
  154.     }
  155.     Datum(const Datum & obj){
  156.         _dan    = new int(*obj._dan);
  157.         _mjesec = new int(*obj._mjesec);
  158.         _godina = new int(*obj._godina);
  159.     }
  160.     ~Datum(){
  161.         delete _dan;
  162.         delete _mjesec;
  163.         delete _godina;
  164.         _dan = nullptr;
  165.         _mjesec = nullptr;
  166.         _godina = nullptr;
  167.     }
  168.     //     =        ==          <<
  169.     Datum & operator =(const Datum & obj){
  170.         if (this != &obj){
  171.             delete _dan;
  172.             delete _mjesec;
  173.             delete _godina;
  174.             _dan = new int(*obj._dan);
  175.             _mjesec = new int(*obj._mjesec);
  176.             _godina = new int(*obj._godina);
  177.         }
  178.         return *this;
  179.     }
  180.     bool operator == (const Datum & obj){
  181.         if (*_dan == *obj._dan && *_mjesec == *obj._mjesec && *_godina == *obj._godina) return true;
  182.         return false;
  183.     }
  184.     friend ostream & operator <<(ostream & cout, const Datum & obj);
  185.     bool operator <(const Datum & obj){
  186.         if (*_godina < *obj._godina) return true;
  187.         else {
  188.             if (*_mjesec < *obj._mjesec)return true;
  189.             else if (*_dan < *obj._dan) return true;
  190.         }
  191.         return false;
  192.     }
  193. };
  194. class Pregled{
  195.     char * _dijagnoza;
  196.     vector<string> _terapije;
  197.     Datum * _datumPregleda;
  198.     //////////////////////////
  199. public:
  200.     Pregled(char * dijagnoza, string terapija, Datum datumPregleda){
  201.         int vel = strlen(dijagnoza) + 1;
  202.         _dijagnoza = new char[vel];
  203.         strcpy_s(_dijagnoza, vel, dijagnoza);
  204.  
  205.         _terapije.push_back(terapija);
  206.         _datumPregleda = new Datum(datumPregleda);
  207.  
  208.     }
  209.     Pregled(const Pregled & obj){
  210.         int vel = strlen(obj._dijagnoza) + 1;
  211.         _dijagnoza = new char[vel];
  212.         strcpy_s(_dijagnoza, vel, obj._dijagnoza);
  213.  
  214.         _terapije = obj._terapije;
  215.         _datumPregleda = new Datum(*obj._datumPregleda);
  216.  
  217.     }
  218.     ~Pregled(){
  219.         delete[] _dijagnoza;
  220.         delete _datumPregleda;
  221.         _dijagnoza = nullptr;
  222.         _datumPregleda = nullptr;
  223.     }
  224.     //    =         ==           <<
  225.     bool operator ==(const Pregled & obj){
  226.         if (strcmp(_dijagnoza, obj._dijagnoza) == 0 && _datumPregleda == obj._datumPregleda) return true;
  227.         return false;
  228.     }
  229.     Pregled & operator = (const Pregled & obj){
  230.         if (this != &obj){
  231.             delete[]_dijagnoza;
  232.             delete _datumPregleda;
  233.             _terapije.erase(_terapije.begin(), _terapije.end());
  234.             /// alokacija novog
  235.             // dijagnoza
  236.             int vel = strlen(obj._dijagnoza) + 1;
  237.             _dijagnoza = new char[vel];
  238.             strcpy_s(_dijagnoza, vel, obj._dijagnoza);
  239.             // datum
  240.             _datumPregleda = new Datum(*obj._datumPregleda);
  241.             // vektor
  242.             for (int i = 0; i < obj._terapije.size(); i++){
  243.                 _terapije.push_back(obj._terapije.at(i));
  244.             }
  245.         }
  246.         return *this;
  247.     }
  248.     friend ostream & operator << (ostream & cout, const Pregled & obj);
  249.     // addterapija greska
  250.     bool addTerapija(string terapija){
  251.         // AddTerapija::dodaje novu terapiju.Onemoguciti ponavljanje terapija.Koristiti iteratore
  252.         vector<string>::iterator it = _terapije.begin();
  253.         for (it; it != _terapije.end(); it++)
  254.             if (*it == terapija)
  255.                 return false;
  256.  
  257.         // ili obicno _terapije.push_back(terapija);
  258.         _terapije.insert(it, terapija);
  259.  
  260.         return true;
  261.  
  262.     }
  263.     bool removeTerapija(string terapija){
  264.         //4. RemoveTerapija :: uklanja terapiju koja je identicna onoj primljenoj kao parametar.
  265.         // Koristiti iteratore
  266.         vector<string>::iterator it = _terapije.begin();
  267.         for (it; it != _terapije.end(); it++){
  268.             if (*it == terapija){
  269.                 _terapije.erase(it);
  270.                 return true;
  271.             }
  272.         }
  273.  
  274.         return false;
  275.  
  276.  
  277.     }
  278.     Datum getDatumPregleda(){
  279.         return *_datumPregleda;
  280.     }
  281.     vector<string> getTerapije(){
  282.         return _terapije;
  283.     }
  284. };
  285. class Pacijent{
  286. protected:
  287.     static int _brojPacijenata;
  288.     ///
  289.     const int _pacijentID;
  290.     char _imePrezime[20];
  291.     Kolekcija<string, Pregled *> * _preglediPacijenta;
  292.     //tip string je za podatke o imenu i prezimenu ljekara koji je obavio pregled, a
  293.     //objekat tipa Pregled za podatke o dijagnozi, terapijama i datumu pregleda
  294. public:
  295.     Pacijent(char * imePrezime) :_pacijentID(++_brojPacijenata){
  296.         strcpy_s(_imePrezime, 20, imePrezime);
  297.         _preglediPacijenta = new Kolekcija < string, Pregled * >;
  298.     }
  299.     ~Pacijent(){
  300.         delete _preglediPacijenta;
  301.         _preglediPacijenta = nullptr;
  302.     }
  303.     Pregled & operator [] (string terapija){
  304.         //1. operator [] :: vraca posljednji Pregled kod koga je postavljena terapija proslijedjena kao parametar.
  305.         int pozicija = -1;
  306.         // kolkecija <string, pregled>
  307.         for (int i = 0; i < (*_preglediPacijenta).getTrenutno(); i++){
  308.             // u pregledima imamo vektor koji cuva vise terapija
  309.             for (int j = 0; j < _preglediPacijenta->getElement2(i)->getTerapije().size(); j++){
  310.                 // setamo kroz terapije sad
  311.                 if (_preglediPacijenta->getElement2(i)->getTerapije().at(j) == terapija)
  312.                     pozicija = i;
  313.             }
  314.         }
  315.         if (pozicija == -1) throw exception("Pregled nije pronadjen! ");
  316.         return *_preglediPacijenta->getElement2(pozicija);
  317.     }
  318.     bool addPregled(string ime,Pregled & pregled){
  319.         //2. AddPregled :: dodaje podatke o novom pregledu pacijenta. Nije dozvoljeno dodati dva
  320.         // identicna pregleda. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false
  321.         for (int i = 0; i < _preglediPacijenta->getTrenutno(); i++){
  322.             if (*_preglediPacijenta->getElement2(i) == pregled){
  323.                 cout << "GRESKA! - Pregled je vec dodan u listu pregleda!" << endl;
  324.                 return false;
  325.             }
  326.         }
  327.  
  328.         if (_preglediPacijenta->addElement(ime, &pregled)){
  329.             //cout << "Uspjenso dodano." << endl;
  330.             return true;
  331.         }
  332.         else{
  333.             cout << "GRESKA! - Pregled je vec dodan u listu pregleda!" << endl;
  334.             return false;
  335.         }
  336.  
  337.     }
  338.     bool removePregledByDatum(Datum & datum){
  339.         //3. RemovePregledByDatum :: na osnovu primljenog parametra (tipa Datum) uklanja podatke o svim pregledima
  340.         // koji su obavljeni prije odredjenog datuma. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false
  341.         bool uklonjen = false;
  342.         for (int i = 0; i < _preglediPacijenta->getTrenutno(); i++){
  343.             if (_preglediPacijenta->getElement2(i)->getDatumPregleda() < datum){
  344.                 _preglediPacijenta->removeElement(_preglediPacijenta->getElement1(i));
  345.                 uklonjen = true;
  346.             }
  347.         }
  348.         if (uklonjen == true) return true;
  349.         else return false;
  350.     }
  351.     int removePregledByLjekar(string imePrezime){
  352.         int brojac = 0;
  353.         for (int i = 0; i < _preglediPacijenta->getTrenutno(); i++){
  354.             if (_preglediPacijenta->getElement1(i) == imePrezime){
  355.                 _preglediPacijenta->removeElement(imePrezime);
  356.                 brojac++;
  357.             }
  358.         }
  359.         return brojac;
  360.     }
  361.     friend ostream & operator <<(ostream & cout, const Pacijent & obj);
  362. };
  363. // ------------------------------------------------------------------------------
  364. int Pacijent::_brojPacijenata = 0;
  365. template<class T1, class T2>
  366. ostream & operator << (ostream & cout, const Kolekcija<T1, T2> & obj){
  367.     cout << crt << "\tKOLEKCIJA\n" << crt;
  368.     for (int i = 0; i < obj._trenutnoElemenata; i++){
  369.         cout << obj._elementi1[i] << " - " << obj._elementi2[i] << endl;
  370.     }
  371.     return cout;
  372. }
  373. ostream & operator <<(ostream & cout, const Datum & obj){
  374.     cout << "DATUM: " << *obj._dan << "/" << *obj._mjesec << "/" << *obj._godina << endl;
  375.     return cout;
  376. }
  377. ostream & operator << (ostream & cout, const Pregled & obj){
  378.     //  operator<< ::ispisuje sve podatke o pregledu.Koristiti ostream_iterator.Prije ispisa
  379.     // sve terapije sortirati
  380.  
  381.     cout << crt << "\tPREGLED\n" << crt;
  382.     cout << "DIJAGNOZA: " << obj._dijagnoza << endl;
  383.     cout << *obj._datumPregleda;
  384.  
  385.     // #include<algorithm>   sort pocetak i kraj vektora i sortira i potreban operator <, valjda string ima <
  386.     // sort(obj._terapije.begin(), obj._terapije.end());
  387.  
  388.     cout << "TERAPIJE: \n" << crt;
  389.     ostream_iterator<string> it(cout, "\n-------------------------------------|\n");
  390.     copy(obj._terapije.begin(), obj._terapije.end(), it);
  391.     return cout;
  392. }
  393. ostream & operator <<(ostream & cout, const Pacijent & obj){
  394.     cout << crt << "\tPACIJENT\n" << crt;
  395.     cout << "PACIJENT ID: " << obj._pacijentID << endl;
  396.     cout << "IME PREZIME: " << obj._imePrezime << endl;
  397.     for (int i = 0; i < obj._preglediPacijenta->getTrenutno(); i++){
  398.         cout <<"DOKTOR: "<< obj._preglediPacijenta->getElement1(i) << endl;
  399.         cout << *obj._preglediPacijenta->getElement2(i) << endl;
  400.     }
  401.     return cout;
  402. }
  403. int main(){
  404.    
  405.     try{
  406.         // pregleda
  407.         Datum d1(13, 1, 2015);
  408.         Datum d2(11, 2, 2015);
  409.         Datum d3(10, 4, 2015);
  410.         Pregled p1("P1 DIJAGNOZA", "P1 TERAPIJA ;) ", d1);
  411.         Pregled p2("P2 DIJAGNOZA", "P2 TERAPIJA ;) ", d2);
  412.         Pregled p3("P3 DIJAGNOZA", "P3 TERAPIJA ;) ", d3);
  413.        
  414.         Pacijent pacijent1("Nedim Fejzic");
  415.         pacijent1.addPregled("Doktor Karabeg", p1);
  416.         pacijent1.addPregled("Doktor Karabeg", p2);
  417.         pacijent1.addPregled("Doktorica Nina", p3);
  418.        
  419.        
  420.         cout << pacijent1 << endl <<crt<<crt<<crt;
  421.         //cout <<"KOLIKO ??????????: "<< pacijent1.removePregledByLjekar("Doktorica Nina");
  422.         //cout << pacijent1 << endl;
  423.         pacijent1.removePregledByDatum(d3);
  424.         cout << pacijent1;
  425.  
  426.     }
  427.     catch (exception & err){
  428.         cout << "GRESKA: " <<  err.what() << endl;
  429.  
  430.     }
  431.  
  432.  
  433.     system("pause > null");
  434.     return 0;
  435. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement