rijads

Pripreme_1.9.2014

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