rijads

PR2 ROK SEPTEMBAR 2013 rijads

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