Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<string>
- #include<vector>
- //#include<iterator>
- #include<algorithm>
- using namespace std;
- int id = 0;
- template<class T1, class T2>
- class Kolekcija{
- private:
- T1 * _elementi1;
- T2 * _elementi2;
- int * _max;
- int * _trenutnoElemenata;
- public:
- Kolekcija(){
- _max = new int(3);
- _trenutnoElemenata = new int(0);
- _elementi1 = new T1[*_max];
- _elementi2 = new T2[*_max];
- }
- ~Kolekcija(){
- delete _max;
- _max = NULL;
- delete _trenutnoElemenata;
- _trenutnoElemenata = NULL;
- delete[]_elementi1;
- _elementi1 = NULL;
- delete[]_elementi2;
- _elementi2 = NULL;
- }
- //1. AddElement :: omogucava dodavanje novog elementa u kolekciju. Osigurati automatsko
- // prosiranje kolekcije ukoliko broj elemenata dostigne trenutni maksimum, te onemoguciti
- // ponavljanje elemenata. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false
- bool AddElement(T1 el1, T2 el2){
- if (ponavlja(el1)==false){
- if (*_trenutnoElemenata == *_max)
- prosiri();
- _elementi1[*_trenutnoElemenata] = el1;
- _elementi2[*_trenutnoElemenata] = el2;
- (*_trenutnoElemenata)++;
- return true;
- }
- return false;
- }
- //2. RemoveElement :: na osnovu parametra tipa T1 uklanja elemente iz kolekcije. Ukoliko je
- // potrebno,prilikom uklanjanja elementa izvrsiti dealokaciju. Onemoguciti pojavljivanje
- // neinicijaliziranih elemenata, te ocuvati redoslijed dodavanja elemenata. U zavisnosti od
- // uspjesnosti operacije, funkcija vraca true ili false
- bool RemoveElement(T1 el){
- for (int i = 0; i < *_trenutnoElemenata; i++)
- {
- if (_elementi1[i] == el){
- for (int j = i; j < *_trenutnoElemenata; j++){
- _elementi1[j] = _elementi1[j + 1];
- _elementi2[j] = _elementi2[j + 1];
- }
- (*_trenutnoElemenata)--;
- return true;
- }
- }
- reutrn false;
- }
- //3. operator -= :: uklanja sve elemente iz kolekcije koji su identicni onima koje posjeduje
- // drugi objekat tipa Kolekcija koji je primljen kao parametar. Funkcija vraca broj uklonjenih elemenata
- int operator-=(Kolekcija<T1, T2>&obj){
- int brojac = 0;
- for (int i = 0; i < *_trenutnoElemenata; i++)
- {
- for (int j = 0; j < *(obj._trenutnoElemenata); j++)
- {
- if (_elementi1[i] == obj._elementi1[j] && _elementi2[i] == _elementi2[j]){
- removepoz(i);
- brojac++;
- }
- }
- }
- return brojac;
- }
- //DODATNE
- //Provjerava da li se ponavlja
- bool ponavlja(T1 el){
- for (int i = 0; i < *_trenutnoElemenata; i++)
- {
- if (_elementi1[i] == el)
- return true;
- }
- return false;
- }
- void prosiri(){
- T1 *temp1;
- T2 *temp2;
- (*_max) += 3;
- temp1 = new T1[*_max];
- temp2 = new T2[*_max];
- for (int i = 0; i < *_trenutnoElemenata; i++)
- {
- temp1[i] = _elementi1[i];
- temp2[i] = _elementi2[i];
- }
- delete[]_elementi1;
- delete[]_elementi2;
- _elementi1 = temp1;
- _elementi2 = temp2;
- }
- T1& getT1bylokacija(int i){
- if (i >= 0 && i < *_trenutnoElemenata){
- return _elementi1[i];
- }
- }
- T2& getT2bylokacija(int i){
- if (i >= 0 && i < *_trenutnoElemenata){
- return _elementi2[i];
- }
- }
- void removepoz(int j){
- for (int i = j; i < *_trenutnoElemenata; i++)
- {
- _elementi1[i] = _elementi1[i + 1];
- _elementi2[i] = _elementi2[i + 1];
- }
- (*_trenutnoElemenata)--;
- }
- int gettreuntno(){
- return *_trenutnoElemenata;
- }
- //ISPIS
- friend ostream & operator<< <> (ostream &, Kolekcija<T1, T2> &); //// PAZITI NA <> znak kod templejta !!!!!!!!!! AWHIPUAWFHUIAWFWAWFFWFAWF
- };
- template<class T1, class T2>
- ostream & operator<< (ostream & out, Kolekcija<T1, T2> & obj) {
- for (int i = 0; i < *(obj._trenutnoElemenata); i++)
- {
- out << obj._elementi1[i] << " " << obj._elementi2[i] << endl;
- }
- return out;
- }
- class Datum{
- private:
- int _dan, _mjesec, _godina;
- public:
- Datum(int dan = 1, int mjesec = 1, int godina = 1900){
- _dan = dan;
- _mjesec = mjesec;
- _godina = godina;
- }
- //1. potrebne funkcije
- bool operator==(Datum d){
- if (_dan == d._dan&&_mjesec == d._mjesec&&_godina == d._godina)
- return true;
- return false;
- }
- friend ostream &operator<<(ostream &, Datum&);
- };
- ostream &operator<<(ostream &out, Datum &d){
- out << d._dan << "." << d._mjesec << "." << d._godina;
- return out;
- }
- class Pregled{
- private:
- vector<char *> _terapije;
- bool * _zakazanNoviTermin; //u slucaju da je pacijent narucen na kontrolni pregled
- Datum _datumPregleda;
- public:
- Pregled(){
- _zakazanNoviTermin = new bool;
- *_zakazanNoviTermin = false;
- }
- Pregled(Datum dat){
- _zakazanNoviTermin = new bool(false);
- _datumPregleda = dat;
- }
- ~Pregled(){
- //delete _zakazanNoviTermin;
- _zakazanNoviTermin = NULL;
- }
- //1. potrebne funkcije
- bool postojiTerapija(char* t){
- for (vector<char*>::iterator it = _terapije.begin(); it != _terapije.end(); it++){
- if (strcmp(*it, t) == 0)
- return true;
- }
- return false;
- }
- //2. Info :: ispisuje sve podatke o pregledu. Koristiti ostream_iterator. Prije ispisa
- // sve terapije sortirati
- void info(){
- cout << "\nDatum pregleda: " << _datumPregleda << endl;
- if ((*_zakazanNoviTermin) == true)
- cout << "Novi termin je zakazan";
- else
- cout << "Novi termin nije zakazan";
- sort(_terapije.begin(), _terapije.end());
- cout << endl;
- for (vector<char *>::iterator it = _terapije.begin(); it != _terapije.end(); it++){
- cout << "Terapija: " << *it << endl;
- }
- }
- //3. AddTerapija :: dodaje novu terapiju. Onemoguciti ponavljanje terapija. Koristiti iteratore
- void AddTerapija(char* t){
- bool dodaj = true;
- for (vector<char *>::iterator it = _terapije.begin(); it != _terapije.end(); it++){
- if (strcmp(*it, t) == 0)
- dodaj = false;
- }
- if (dodaj)
- _terapije.push_back(t);
- }
- //4. RemoveTerapija :: uklanja sve terapije koje u sebi sadrze rijec primljenu kao parametar.
- // Koristiti iteratore
- void RemoveTerapija(char* t){
- //int i = 0;
- vector<char *>::iterator it = _terapije.begin();
- for (int i = 0; i <= _terapije.size(); i++)
- {
- int j = 0;
- for (it = _terapije.begin(); it != _terapije.end(); it++){
- if (strstr(*it, t) != NULL){
- cout << *it << endl;
- _terapije.erase(_terapije.begin() + j);
- cout << _terapije.size() << endl;
- i = 0;
- break;
- }
- j++;
- }
- //sort(_terapije.begin(), _terapije.end());
- }
- }
- Datum vratiDatum(){
- return _datumPregleda;
- }
- bool operator==(Pregled& p){
- if (_terapije == p._terapije)
- return true;
- return false;
- }
- friend ostream &operator<<(ostream&, Pregled &);
- };
- ostream &operator<<(ostream& out, Pregled &p){
- for (vector<char *>::iterator it = p._terapije.begin(); it != p._terapije.end(); it++)
- {
- out << *it << endl;
- }
- return out;
- }
- class Pacijent{
- protected:
- const int _pacijentID;
- char _imePrezime[20];
- //tip string je za podatke o postavljenoj dijagnozi (jedna dijagnoza moze imati vise terapija)
- //objekat tipa Pregled je za podatke o terapijama, te o zakazanom pregledu
- Kolekcija<string, Pregled> * _preglediPacijenta;
- public:
- Pacijent(char*ime="<Nepoznato>"):_pacijentID(++id){
- strcpy(_imePrezime, ime);
- _preglediPacijenta = new Kolekcija < string, Pregled >() ;
- }
- ~Pacijent(){
- delete _preglediPacijenta;
- _preglediPacijenta = NULL;
- }
- Kolekcija <string, Pregled> getpregledi(){
- return *_preglediPacijenta;
- }
- //1. operator [] :: vraca Pregled kod koga je postavljena dijagnoza koja je proslijedjena kao
- // parametar. Dakle, operatorska funkcija prima dijagnozu kao parametar
- Pregled operator[](string dij){
- for (int i = 0; i < _preglediPacijenta->gettreuntno(); i++)
- {
- if (dij.compare(_preglediPacijenta->getT1bylokacija(i))==0)
- return _preglediPacijenta->getT2bylokacija(i);
- }
- }
- //2. AddPregled :: dodaje podatke o novom pregledu pacijenta. Nije dozvoljeno dodati dva
- // identicna pregleda. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false
- bool AddPregled(string dij, Pregled p){
- return _preglediPacijenta->AddElement(dij, p);
- }
- //3. RemovePregledByDatum :: na osnovu primljenog parametra (tipa Datum) uklanja podatke o svim pregledima
- // koji su obavljeni odredjenog datuma. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili
- // false
- bool RemovePregledByDatum(Datum d){
- bool t = false;
- for (int i = 0; i < _preglediPacijenta->gettreuntno(); i++)
- {
- if (d == _preglediPacijenta->getT2bylokacija(i).vratiDatum()){
- _preglediPacijenta->removepoz(i);
- t = true;
- }
- }
- return t;
- }
- //4. RemovePregledByTerapija :: na osnovu primljenog parametra (terapije) uklanja podatke o svim
- // pregledima kod koji je propisana trazena terapija. U zavisnosti od uspjesnosti operacije,
- // funkcija vraca true ili false
- bool RemovePregledByTerapija(char *t){
- bool ukl = false;
- for (int i = 0; i < _preglediPacijenta->gettreuntno(); i++)
- {
- if (_preglediPacijenta->getT2bylokacija(i).postojiTerapija(t)){
- _preglediPacijenta->removepoz(i);
- ukl = true;
- }
- }
- return ukl;
- }
- //5. operator<< :: ispisuje vrijednosti svih atributa klase
- friend ostream &operator<<(ostream &, Pacijent &);
- };
- ostream &operator<<(ostream &out, Pacijent & p){
- out << "\nPacijent ID: " << p._pacijentID << endl << "Ime i prezime pacijenta: " << p._imePrezime << endl<<"Pregledi pacijenta:\n"<<*(p._preglediPacijenta);
- return out;
- }
- void main(){
- //izbjegavajte koristenje vlastitog imena i prezimena.
- //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti na objektu tipa Pacijent
- cout << "\n---TESTIRANJE DATUMA" << endl;
- Datum dat1;
- Datum dat2(6, 06, 2014);
- Datum dat3(4, 06, 2014);
- cout << dat1 << endl << dat2;
- cout << "\n---TESTIRANJE PREGLEDA" << endl;
- Pregled pr(dat2);
- Pregled pr1(dat2);
- Pregled pr2(dat3);
- Pregled pr3(dat2);
- pr.AddTerapija("Prva terapija");
- pr.AddTerapija("Druga terapija");
- pr.AddTerapija("1 terapija");
- pr.AddTerapija("2 terapija");
- pr.AddTerapija("10 terapija");
- pr.AddTerapija("1 terapija");
- pr2.AddTerapija("1 terapija");
- pr2.AddTerapija("2 terapija");
- pr2.AddTerapija("10 terapija");
- //pr.RemoveTerapija("1");
- //pr.RemoveTerapija("Prva");
- //pr.RemoveTerapija("2");
- pr.info();
- cout << "\n---TESTIRANJE Pacijenta i kolekcije" << endl;
- Pacijent p;
- p.AddPregled("Dijagnoza1", pr);
- p.AddPregled("Dijagnoza2", pr1);
- p.AddPregled("Dijagnoza3", pr2);
- cout << p;
- Pacijent p2;
- p2.AddPregled("Dijagnoza1", pr2);
- p2.AddPregled("Deseta dijagnoza", pr1);
- cout << p2;
- cout << "\n---TESTIRANJE operatora[]" << endl;
- cout << p["Dijagnoza3"];
- cout << "\n---TESTIRANJE brisanja pregleda po datumu" << endl;
- p.RemovePregledByDatum(dat3);//brise dijagnozu 3
- cout << p;
- cout << "\n---TESTIRANJE brisanja pregleda po terapiji" << endl;
- p.RemovePregledByTerapija("2 terapija");
- cout << p;
- system("pause>0");
- }
Advertisement
Add Comment
Please, Sign In to add comment