rijads

PR2 ispitni

Jun 23rd, 2014
329
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.22 KB | None | 0 0
  1. # include <iostream>
  2. # include <vector>
  3. # include <string>
  4. # include <sstream>
  5. # include <exception>
  6. #include <algorithm>
  7. using namespace std;
  8.  
  9. char* crt = "\n==========================================\n";
  10. //globalne varijabla
  11. int PACIJENT_ID = 0;
  12.  
  13. //globalna funkcija
  14. template<class S>
  15. string toString(S& obj){
  16.     stringstream out;
  17.     out << obj;
  18.     return out.str();
  19. }
  20.  
  21. //////////////////////////////////////KLASA KOLEKCIJA///////////////////////////////////////////////
  22.  
  23. template<class T1, class T2>
  24. class Kolekcija{
  25.     T1 * elementi1;
  26.     T2 * elementi2;
  27.     int * max;
  28.     int * trenutnoElemenata;
  29. public:
  30.     //DEF. KONSTRUKTOR
  31.     Kolekcija(){
  32.         max = new int(3);
  33.         trenutnoElemenata = new int(0);
  34.         elementi1 = new T1[*max]; //def. konstruktor T1
  35.         elementi2 = new T2[*max]; //def. konstruktor T2
  36.     }
  37.     //KONSTRUKTOR KOPIJE
  38.     Kolekcija(Kolekcija<T1, T2> &obj){
  39.         max = new int(*obj.max);
  40.         trenutnoElemenata = new int(*obj.trenutnoElemenata);
  41.         elementi1 = new T1[*max]; //def. konstruktor T1
  42.         elementi2 = new T2[*max]; //def. konstruktor T2
  43.         for (int i = 0; i < *trenutnoElemenata; i++){
  44.             elementi1[i] = T1(obj.elementi1[i]); // konstruktor kopije T1
  45.             elementi2[i] = T2(obj.elementi2[i]); // konstruktor kopije T1
  46.         }
  47.     }
  48.     //DESTRUKTOR
  49.     ~Kolekcija(){
  50.         //cout << "DESTRUKTOR KOLEKCIJA\n";
  51.         delete max;
  52.         delete trenutnoElemenata;
  53.         delete[] elementi1;
  54.         delete[] elementi2;
  55.         max = NULL;
  56.         trenutnoElemenata = NULL;
  57.         elementi1 = NULL;
  58.         elementi2 = NULL;
  59.     }
  60.  
  61.     //1. AddElement :: omogucava dodavanje novog elementa u kolekciju. Osigurati automatsko
  62.     // prosiranje kolekcije ukoliko broj elemenata dostigne trenutni maksimum, te onemoguciti
  63.     // ponavljanje elemenata. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false
  64.     bool AddElement(T1 el1, T2 el2){
  65.  
  66.         for (int i = 0; i < *trenutnoElemenata; i++)
  67.         {
  68.             if (elementi1[i] == el1 && elementi2[i] == el2)
  69.                 return false;
  70.         }
  71.         if (*trenutnoElemenata == *max)
  72.             ProsiriKapacitet();
  73.  
  74.         elementi1[*trenutnoElemenata] = el1;
  75.         elementi2[*trenutnoElemenata] = el2;
  76.         (*trenutnoElemenata)++;
  77.         return true;
  78.     }
  79.     //2. RemoveElement :: na osnovu parametra tipa T1 uklanja elemente iz kolekcije. Ukoliko je
  80.     // potrebno,prilikom uklanjanja elementa izvrsiti dealokaciju. Onemoguciti pojavljivanje
  81.     // neinicijaliziranih elemenata, te ocuvati redoslijed dodavanja elemenata. U zavisnosti od
  82.     // uspjesnosti operacije, funkcija vraca true ili false
  83.     bool RemoveElement(T1 el){
  84.         for (int i = 0; i < *trenutnoElemenata; i++)
  85.         {
  86.             if (elementi1[i] == el)
  87.             {
  88.                 for (int j = i; j < (*trenutnoElemenata) - 1; j++)
  89.                 {
  90.                     elementi1[j] = elementi1[j + 1];
  91.                     elementi2[j] = elementi2[j + 1];
  92.                 }
  93.                 (*trenutnoElemenata)--;
  94.                 return true;
  95.             }
  96.         }
  97.         return false;
  98.     }
  99.     //3. operator -= :: uklanja sve elemente iz kolekcije koji su identicni onima koje posjeduje
  100.     // drugi objekat tipa Kolekcija koji je primljen kao parametar. Funkcija vraca broj uklonjenih elemenata
  101.  
  102.     //Kako bi se ispostovalo ocekivano ponasanje operatora -= prirodnija je implementacija na nacin prikazan ispod,
  103.     //prvi operand je objekat tipa Kolekcija<T1,T2> te na njega utice rezultat operacije
  104.     Kolekcija<T1, T2>& operator-= (T2 el2){
  105.         int brojac = 0;
  106.         for (int i = 0; i < (*trenutnoElemenata); i++)
  107.         {
  108.             if (elementi2[i] == el2)
  109.             {
  110.                 for (int j = i; j < (*trenutnoElemenata) - 1; j++)
  111.                 {
  112.                     elementi1[j] = elementi1[j + 1];
  113.                     elementi2[j] = elementi2[j + 1];
  114.                 }
  115.                 brojac++;
  116.                 (*trenutnoElemenata)--;
  117.             }
  118.         }
  119.         return *this;
  120.     }
  121.  
  122.  
  123.     //DODATNO/////////////////////////////////////////////////////////////////////////////////////////////////
  124.  
  125.     //Funkcija vrace velicinu kolekcije
  126.     int getTrenutno(){ return *trenutnoElemenata; }
  127.  
  128.     //Funkcija prosiruje kapacitet kolekcije
  129.     void ProsiriKapacitet(){
  130.  
  131.         T1 * temp1 = new T1[(*max) + 3];
  132.         T2 * temp2 = new T2[(*max) + 3];
  133.  
  134.         for (int i = 0; i < *trenutnoElemenata; i++){
  135.             temp1[i] = elementi1[i];
  136.             temp2[i] = elementi2[i];
  137.         }
  138.  
  139.         delete[] elementi1;
  140.         delete[] elementi2;
  141.         elementi1 = temp1;
  142.         elementi2 = temp2;
  143.         (*max) += 3;
  144.     }
  145.  
  146.     //Funkcija vraca objekt T1 na osnovu primljene lokacije
  147.     T1& getT1byLokacija(int lokacija) throw (exception){
  148.         if (lokacija >= 0 && lokacija < *trenutnoElemenata)
  149.             return elementi1[lokacija];
  150.         throw exception("Lokacija ne postoji");
  151.     }
  152.  
  153.     //Funkcija vraca objekt T1 na osnovu primljene lokacije
  154.     T2& getT2byLokacija(int lokacija) throw (exception){
  155.         if (lokacija >= 0 && lokacija < *trenutnoElemenata)
  156.             return elementi2[lokacija];
  157.         throw exception("Lokacija ne postoji");
  158.     }
  159.  
  160.     //Primjetite da nije preklopljen operator << za klasu kolekcija
  161.     //Ispis vrijednosti objekata ce se vrsiti pomocu predhodna dva getera za T1 i T2,
  162.     //te je za te tipove, ako su korisnicki definirani, potrebno preklopiti operator << ili implementirati funkciju za ispis
  163.     //Operator [] generalno nema smisla, osim u nekim eksplicitno trazenim situacijama,
  164.     //konkretno u ovom zadatku bi mogao zamijeniti jednu od predhodne dvije funkcije
  165.     //ali na taj nacin se opet gubi expected behavior
  166. };
  167.  
  168. ///////////////////////////////////////KLASA DATUM//////////////////////////////////////////////////
  169.  
  170. class Datum{
  171.     int * dan, *mjesec, *godina;
  172. public:
  173.     Datum(){
  174.         dan = new int(1);
  175.         mjesec = new int(1);
  176.         godina = new int(1900);
  177.     }
  178.     Datum(int d, int m, int g){
  179.         dan = new int(d);
  180.         mjesec = new int(m);
  181.         godina = new int(g);
  182.     }
  183.     Datum(Datum & obj)
  184.     {
  185.         dan = new int(obj.getDan());
  186.         mjesec = new int(obj.getMjesec());
  187.         godina = new int(obj.getGodina());
  188.     }
  189.     Datum& operator= (Datum & obj)
  190.     {
  191.         if (this != &obj)
  192.         {
  193.             *dan = obj.getDan();
  194.             *mjesec = obj.getMjesec();
  195.             *godina = obj.getGodina();
  196.         }
  197.         return *this;
  198.     }
  199.     ~Datum(){
  200.         //cout << "DESTRUKTOR DATUM\n";
  201.         delete dan; dan = NULL;
  202.         delete mjesec; mjesec = NULL;
  203.         delete godina; godina = NULL;
  204.     }
  205.     bool operator==(const Datum &d)
  206.     {
  207.         if (*dan != *d.dan || *mjesec != *d.mjesec || *godina != *d.godina)
  208.             return false;
  209.         return true;
  210.     }
  211.     bool operator!=(const Datum &d) { return !(*this == d); }
  212.     int getDan(){ return *dan; }
  213.     int getMjesec(){ return *mjesec; }
  214.     int getGodina(){ return *godina; }
  215.     string Info(){
  216.         string out = "";
  217.         out += toString(*dan) + "." + toString(*mjesec) + "." + toString(*godina);
  218.         return out;
  219.     }
  220.     //friend ostream & operator<<(ostream& cout, Datum & d);
  221. };
  222.  
  223. //ostream & operator<<(ostream& out, Datum & d){
  224. //  out << *d.dan << "." << *d.mjesec << "." << *d.godina;
  225. //  return out;
  226. //}
  227.  
  228. //////////////////////////////////////KLASA PREGLED/////////////////////////////////////////////////
  229.  
  230. class Pregled{
  231. protected:
  232.     vector<char *> terapije;
  233.     bool * zakazanNoviTermin; //u slucaju da je pacijent narucen na kontrolni pregled
  234.     Datum datumPregleda;
  235. public:
  236.     //1. potrebne funkcije
  237.     //DEF. KONSTRUKTOR
  238.     Pregled(bool novit = 0, Datum d = Datum(1, 1, 2000))
  239.     {
  240.         zakazanNoviTermin = new bool;
  241.         *zakazanNoviTermin = novit;
  242.         datumPregleda = d;
  243.     }
  244.     //KONSTRUKTOR
  245.     Pregled(char*t, bool novit = 0, Datum d = Datum(1, 1, 2000))
  246.     {
  247.         zakazanNoviTermin = new bool;
  248.         *zakazanNoviTermin = novit;
  249.         datumPregleda = d;
  250.         AddTerapija(t);
  251.     }
  252.     //KONSTRUKTOR KOPIJE
  253.     Pregled(Pregled & obj){
  254.         zakazanNoviTermin = new bool;
  255.         *zakazanNoviTermin = *(obj.zakazanNoviTermin); //provjeriti
  256.         terapije = obj.terapije;
  257.         datumPregleda = obj.datumPregleda;
  258.     }
  259.     //DESTRUKTOR
  260.     ~Pregled(){
  261.         delete zakazanNoviTermin;
  262.         zakazanNoviTermin = NULL;//cout << "DESTRUKTOR PREGLED\n";
  263.     }
  264.  
  265.     //2. Info :: ispisuje sve podatke o pregledu. Koristiti ostream_iterator. Prije ispisa sve terapije sortirati
  266.     string info(){
  267.         string out = "";
  268.         out += "Datum pregleda: " + datumPregleda.Info() + "\n";
  269.        
  270.         vector<char*>::iterator it;
  271.         for (it = terapije.begin(); it != terapije.end(); it++)
  272.             out += "Terapija: " + toString(*it) + "\n";
  273.         if (*zakazanNoviTermin)
  274.             out += "Kontrolni pregled je zakazan\n";
  275.         return out;
  276.     }
  277.  
  278.     //3. AddTerapija :: dodaje novu terapiju. Onemoguciti ponavljanje terapija. Koristiti iteratore
  279.     void AddTerapija(char* t){
  280.         vector<char*>::iterator it;
  281.         for (it = terapije.begin(); it != terapije.end(); it++)
  282.         {
  283.             if (strcmp(t, (*it)) == 0)
  284.                 return;
  285.         }
  286.         terapije.push_back(t);
  287.         SortTerapije();
  288.     }
  289.  
  290.     //4. RemoveTerapija :: uklanja sve terapije koje u sebi sadrze rijec primljenu kao parametar. Koristiti iteratore
  291.     void RemoveTerapija(char* t){
  292.         int lokacija = 0;
  293.         vector<char*>::iterator it;
  294.         for (it = terapije.begin(); it != terapije.end(); it++)
  295.         {
  296.             if (strcmp(t, (*it)) == 0)
  297.             {
  298.                 terapije.erase(terapije.begin() + lokacija);//IT
  299.             }
  300.             else
  301.                 lokacija++;
  302.         }
  303.         SortTerapije();
  304.     }
  305.  
  306.     //DODATNO////////////////////////////////////////////////////////////////////////////////////////////////////////
  307.     vector<char*> getTerapije(){ return terapije; }
  308.     Datum getDatumpregleda(){ return datumPregleda; }
  309.     char* getTerapija(int lokacija) throw (exception){     
  310.         if (lokacija >= 0 && lokacija < terapije.size())
  311.             throw exception("Lokacija ne postoji");
  312.         else
  313.             return terapije[lokacija];
  314.  
  315.     }
  316.     void SortTerapije(){ sort(terapije.begin(), terapije.end()); }; //algorithm biblioteka
  317.     //OPERATORI
  318.     Pregled & operator=(Pregled& obj){
  319.         if (this != &obj){
  320.             zakazanNoviTermin = new bool;
  321.             *zakazanNoviTermin = *(obj.zakazanNoviTermin); //provjeriti
  322.             terapije = obj.terapije;
  323.             datumPregleda = obj.datumPregleda;
  324.         }
  325.         return *this;
  326.     }
  327.     bool operator==(Pregled & obj){
  328.         if (datumPregleda != obj.datumPregleda)
  329.             return false;
  330.         if (*zakazanNoviTermin != *obj.zakazanNoviTermin)
  331.             return false;
  332.         if (terapije != obj.terapije)
  333.             return false;
  334.  
  335.         return true;
  336.     }
  337.     bool operator!=(Pregled & obj){ return !(*this == obj); }
  338. };
  339.  
  340. //////////////////////////////////////KLASA PACIJENT////////////////////////////////////////////////
  341.  
  342. class Pacijent{
  343. protected:
  344.     const int pacijentID;
  345.     char imePrezime[20];
  346.     Kolekcija<string, Pregled> * preglediPacijenta;
  347.     //tip string je za podatke o postavljenoj dijagnozi (jedna dijagnoza moze imati vise terapija)
  348.     //objekat tipa Pregled je za podatke o terapijama, te o zakazanom pregledu  
  349.  
  350. public:
  351.     //KONSTRUKTOR 2 in 1(DEF i OBICNI)
  352.     Pacijent(char * ip = "") : pacijentID(PACIJENT_ID){
  353.         PACIJENT_ID++;
  354.         strncpy_s(imePrezime, 19, ip, _TRUNCATE);      
  355.         preglediPacijenta = new Kolekcija<string, Pregled>();
  356.     }
  357.     //KONSTRUKTOR KOPIJE
  358.     Pacijent(Pacijent& obj): pacijentID(PACIJENT_ID){
  359.         PACIJENT_ID++;
  360.         strcpy_s(imePrezime, 19, obj.imePrezime);
  361.         imePrezime[19] = '\0';
  362.         preglediPacijenta = new Kolekcija<string, Pregled>(*obj.preglediPacijenta);//konstruktor kopije Kolekcija      
  363.     }
  364.     //DESTRUKTOR
  365.     ~Pacijent(){
  366.         //cout << "DESTRUKTOR PACIJENT\n";
  367.         delete preglediPacijenta;
  368.         preglediPacijenta = NULL;
  369.     }
  370.  
  371.     //1. operator [] :: vraca Pregled kod koga je postavljena dijagnoza koja je proslijedjena kao
  372.     // parametar. Dakle, operatorska funkcija prima dijagnozu kao parametar
  373.     Pregled& operator[] (string dijagnoza) throw(exception)
  374.     {
  375.         for (int i = 0; i < preglediPacijenta->getTrenutno(); i++)
  376.         if (dijagnoza.compare(preglediPacijenta->getT1byLokacija(i)) == 0)
  377.             return preglediPacijenta->getT2byLokacija(i);
  378.         throw exception("Pregled ne postoji");
  379.     }
  380.  
  381.     //2. AddPregled :: dodaje podatke o novom pregledu pacijenta. Nije dozvoljeno dodati dva
  382.     // identicna pregleda. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false
  383.     bool AddPregled(string dijagnoza, Pregled * p){
  384.         for (int i = 0; i < preglediPacijenta->getTrenutno(); i++)
  385.         if (preglediPacijenta->getT2byLokacija(i) == *p)
  386.             return false;
  387.         return preglediPacijenta->AddElement(dijagnoza, *p);
  388.     }
  389.  
  390.     //3. RemovePregledByDatum :: na osnovu primljenog parametra (tipa Datum) uklanja podatke o svim pregledima
  391.     // koji su obavljeni odredjenog datuma. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili
  392.     // false
  393.     bool RemovePregledByDatum(Datum d){
  394.         bool uklonjeno = false;
  395.         for (int i = 0; i < preglediPacijenta->getTrenutno(); i++)
  396.         {
  397.             if (d == preglediPacijenta->getT2byLokacija(i).getDatumpregleda())
  398.             {
  399.                 preglediPacijenta->RemoveElement(preglediPacijenta->getT1byLokacija(i));
  400.                 uklonjeno = true;
  401.                 i--;
  402.             }
  403.         }
  404.         return uklonjeno;
  405.     }
  406.  
  407.     //4. RemovePregledByTerapija :: na osnovu primljenog parametra (terapije) uklanja podatke o svim
  408.     // pregledima kod koji je propisana trazena terapija. U zavisnosti od uspjesnosti operacije,
  409.     // funkcija vraca true ili false
  410.     bool RemovePregledByterapija(char *terapija){
  411.         bool uklonjeno = false;
  412.         //int BrojPregleda = 0;
  413.         for (int i = 0; i < preglediPacijenta->getTrenutno(); i++)
  414.         {
  415.             for (int j = 0; j < preglediPacijenta->getT2byLokacija(i).getTerapije().size(); j++)
  416.             {
  417.                 if (strcmp(terapija, preglediPacijenta->getT2byLokacija(i).getTerapije()[j]) == 0)
  418.                 {
  419.                     (*preglediPacijenta) -= (preglediPacijenta->getT2byLokacija(i));
  420.                     i--;
  421.                     break;
  422.                 }
  423.             }
  424.         }
  425.         return uklonjeno;
  426.     }
  427.  
  428.     //5. operator<< :: ispisuje vrijednosti svih atributa klase
  429.     friend ostream& operator<< (ostream & out, Pacijent & obj);
  430. };
  431. ostream& operator<< (ostream & out, Pacijent & obj){
  432.     out << "ID: [" << obj.pacijentID << "] - Ime i prezime: " << obj.imePrezime << crt;
  433.     for (int i = 0; i < obj.preglediPacijenta->getTrenutno(); i++)
  434.         out << "Dijagnoza: " << obj.preglediPacijenta->getT1byLokacija(i) << endl << obj.preglediPacijenta->getT2byLokacija(i).info() << "\n------------------------------------------\n";
  435.     return out;
  436. }
  437. void main(){
  438.     //Konstruiranje objekta tipa Pacijent i dodavanje pregleda
  439.     Pacijent p("Mustafa Mustafic"); // konstruktor Pacijent
  440.  
  441.     //Info pacijenta
  442.     cout << "\t\tPACIJENT" << crt << p;
  443.  
  444.     cout << "Dodavanje pregleda\n\n";
  445.     p.AddPregled("Depresija", new Pregled("Antidepresiv 500mg", true, Datum(25, 01, 2014)));
  446.     p.AddPregled("Migrena", new Pregled("Antimigrenik 250 mg", true, Datum(15, 01, 2014)));
  447.     p.AddPregled("Nervoza", new Pregled("Oxetin 100 mg", false, Datum(15, 01, 2014)));
  448.     p.AddPregled("Astma", new Pregled("Flexofen 100 mg", true, Datum(17, 01, 2014)));
  449.     p.AddPregled("Laringitis", new Pregled("Kortikosteroid ampule 2ml", true, Datum(17, 01, 2014)));
  450.  
  451.     cout << "Dodavanje istog elementa -> onemoguceno\n\n";
  452.     p.AddPregled("Laringitis", new Pregled("Kortikosteroid ampule 2ml", true, Datum(17, 01, 2014)));
  453.     p.AddPregled("Laringitis", new Pregled("Kortikosteroid ampule 2ml", true, Datum(17, 01, 2014)));
  454.  
  455.     //Info pacijenta
  456.     cout << "\t\tPACIJENT" << crt << p;
  457.  
  458.     cout << "Test RemovePregledByDatum\n- uklanjamo sve preglede navedenog datuma\n\n";
  459.     p.RemovePregledByDatum(Datum(15, 01, 2014));
  460.     cout << "\t\tPACIJENT" << crt << p;
  461.  
  462.     cout << "Test Dodavanje terapija\n\n";
  463.     p["Depresija"].AddTerapija("Deksometazon 50mg");
  464.     p["Depresija"].AddTerapija("Kortikosteroid ampule 2ml");
  465.     p["Depresija"].AddTerapija("Glibenklamid 2g");
  466.  
  467.     p["Astma"].AddTerapija("Glibenklamid 2g");
  468.     p["Astma"].AddTerapija("Budelin 1000mg");
  469.  
  470.     p["Laringitis"].AddTerapija("Budelin 1000mg");
  471.     p["Laringitis"].AddTerapija("Baby Inhaler Pinque");
  472.     cout << "\t\tPACIJENT" << crt << p;
  473.  
  474.     cout << "TEST RemovePregledByTerapija\n\n";
  475.     p.RemovePregledByterapija("Budelin 1000mg");
  476.     cout << "\t\tPACIJENT" << crt << p;
  477.  
  478.  
  479.     //izbjegavajte koristenje vlastitog imena i prezimena.
  480.     //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti na objektu tipa Pacijent
  481. }
Advertisement
Add Comment
Please, Sign In to add comment