rijads

Pripreme 31.8.14

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