Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <vector>
- #include <algorithm>
- using namespace std;
- char crt[] = { "----------------------------------------------\n" };
- template<class T1, class T2>
- class Kolekcija{
- T1 * _elementi1;
- T2 * _elementi2;
- int _trenutnoElemenata;
- public:
- Kolekcija(){
- _elementi1 = nullptr;
- _elementi2 = nullptr;
- _trenutnoElemenata = 0;
- }
- Kolekcija(const Kolekcija & obj){
- _trenutnoElemenata = obj._trenutnoElemenata;
- _elementi1 = new T1 [_trenutnoElemenata];
- _elementi2 = new T2 [_trenutnoElemenata];
- for (int i = 0; i < _trenutnoElemenata; i++){
- _elementi1[i] = obj._elementi1[i];
- _elementi2[i] = obj._elementi2[i];
- }
- }
- ~Kolekcija(){
- delete[]_elementi1;
- delete[]_elementi2;
- _elementi1 = nullptr;
- _elementi2 = nullptr;
- }
- //////////////////////////////////// << =
- bool addElement(const T1 e1, const T2 e2){
- // sprijeciti ponavljanje
- for (int i = 0; i < _trenutnoElemenata; i++)
- if (_elementi1[i] == e1 && _elementi2[i] == e2)
- return false;
- // dodati
- T1 * temp1 = new T1 [_trenutnoElemenata + 1];
- T2 * temp2 = new T2 [_trenutnoElemenata + 1];
- for (int i = 0; i < _trenutnoElemenata; i++){
- temp1[i] = _elementi1[i];
- temp2[i] = _elementi2[i];
- }
- delete[]_elementi1;
- delete[]_elementi2;
- _elementi1 = temp1;
- _elementi2 = temp2;
- _elementi1[_trenutnoElemenata] = e1;
- _elementi2[_trenutnoElemenata] = e2;
- _trenutnoElemenata++;
- }
- bool removeElement( T1 element){
- for (int i = 0; i < _trenutnoElemenata; i++){
- if (_elementi1[i] == element){
- T1 * temp1 = new T1 [_trenutnoElemenata - 1];
- T2 * temp2 = new T2 [_trenutnoElemenata - 1];
- for (int j = 0; j < i; j++){
- temp1[j] = _elementi1[j];
- temp2[j] = _elementi2[j];
- }
- for (int j = i; j < _trenutnoElemenata-1; j++){
- temp1[j] = _elementi1[j+1];
- temp2[j] = _elementi2[j+1];
- }
- delete[]_elementi1;
- delete[]_elementi2;
- _elementi1 = temp1;
- _elementi2 = temp2;
- _trenutnoElemenata--;
- return true;
- }
- }
- return false;
- }
- bool removeElementPozicija(int pozicija){
- for (int i = 0; i < _trenutnoElemenata; i++){
- if (i == pozicija){
- T1 * temp1 = new T1[_trenutnoElemenata - 1];
- T2 * temp2 = new T2[_trenutnoElemenata - 1];
- for (int j = 0; j < i; j++){
- temp1[j] = _elementi1[j];
- temp2[j] = _elementi2[j];
- }
- for (int j = i; j < _trenutnoElemenata; j++){
- temp1[j] = _elementi1[j + 1];
- temp2[j] = _elementi2[j + 1];
- }
- delete[]_elementi1;
- delete[]_elementi2;
- _elementi1 = temp1;
- _elementi2 = temp2;
- _trenutnoElemenata--;
- return true;
- }
- }
- return false;
- }
- Kolekcija operator -(const Kolekcija & obj){
- //3. operator- :: vraca objekat tipa Kolekcija koji u sebi sadrzi elemente zajednicke za objekat koji je
- // pozvao funkciju i objekat koji je proslijedjen kao parametar (takodjer tipa Kolekcija).
- Kolekcija<T1, T2> temp;
- for (int i = 0; i < _trenutnoElemenata; i++)
- if (_elementi1[i] == obj._elementi1[i] && _elementi2[i] == obj._elementi2[i])
- temp.addElement(_elementi1[i], _elementi2[i]);
- return temp;
- }
- /////////////////////////////////////
- Kolekcija & operator = (const Kolekcija & obj){
- delete[]_elementi1;
- delete[]_elementi2;
- _trenutnoElemenata = 0;
- _elementi1 = new T1[obj._trenutnoElemenata];
- _elementi2 = new T2[obj._trenutnoElemenata];
- for (int i = 0; i < obj._tenutnoElemenata; i++){
- _elementi1[i] = obj._elementi1[i];
- _elementi2[i] = obj._elementi2[i];
- }
- _trenutnoElemenata = obj._trenutnoElemenata;
- }
- friend ostream & operator << <>(ostream & cout, const Kolekcija<T1,T2> & obj);
- int getTrenutno()const{
- return _trenutnoElemenata;
- }
- T1 & getElement1(int id)const{
- return _elementi1[id];
- // treba obratiti paznju je li id u opsegu i exception ?
- }
- T2 & getElement2(int id)const{
- return _elementi2[id];
- }
- };
- class Datum{
- int *_dan, *_mjesec, *_godina;
- public:
- Datum(int dan= 1, int mjesec= 1, int godina= 1900){
- _dan = new int (dan);
- _mjesec = new int (mjesec);
- _godina = new int (godina);
- }
- Datum(const Datum & obj){
- _dan = new int(*obj._dan);
- _mjesec = new int(*obj._mjesec);
- _godina = new int(*obj._godina);
- }
- ~Datum(){
- delete _dan;
- delete _mjesec;
- delete _godina;
- _dan = nullptr;
- _mjesec = nullptr;
- _godina = nullptr;
- }
- // = == <<
- Datum & operator =(const Datum & obj){
- if (this != &obj){
- delete _dan;
- delete _mjesec;
- delete _godina;
- _dan = new int(*obj._dan);
- _mjesec = new int(*obj._mjesec);
- _godina = new int(*obj._godina);
- }
- return *this;
- }
- bool operator == (const Datum & obj){
- if (*_dan == *obj._dan && *_mjesec == *obj._mjesec && *_godina == *obj._godina) return true;
- return false;
- }
- friend ostream & operator <<(ostream & cout, const Datum & obj);
- bool operator <(const Datum & obj){
- if (*_godina < *obj._godina) return true;
- else {
- if (*_mjesec < *obj._mjesec)return true;
- else if (*_dan < *obj._dan) return true;
- }
- return false;
- }
- };
- class Pregled{
- char * _dijagnoza;
- vector<string> _terapije;
- Datum * _datumPregleda;
- //////////////////////////
- public:
- Pregled(char * dijagnoza, string terapija, Datum datumPregleda){
- int vel = strlen(dijagnoza) + 1;
- _dijagnoza = new char[vel];
- strcpy_s(_dijagnoza, vel, dijagnoza);
- _terapije.push_back(terapija);
- _datumPregleda = new Datum(datumPregleda);
- }
- Pregled(const Pregled & obj){
- int vel = strlen(obj._dijagnoza) + 1;
- _dijagnoza = new char[vel];
- strcpy_s(_dijagnoza, vel, obj._dijagnoza);
- _terapije = obj._terapije;
- _datumPregleda = new Datum(*obj._datumPregleda);
- }
- ~Pregled(){
- delete[] _dijagnoza;
- delete _datumPregleda;
- _dijagnoza = nullptr;
- _datumPregleda = nullptr;
- }
- // = == <<
- bool operator ==(const Pregled & obj){
- if (strcmp(_dijagnoza, obj._dijagnoza) == 0 && _datumPregleda == obj._datumPregleda) return true;
- return false;
- }
- Pregled & operator = (const Pregled & obj){
- if (this != &obj){
- delete[]_dijagnoza;
- delete _datumPregleda;
- _terapije.erase(_terapije.begin(), _terapije.end());
- /// alokacija novog
- // dijagnoza
- int vel = strlen(obj._dijagnoza) + 1;
- _dijagnoza = new char[vel];
- strcpy_s(_dijagnoza, vel, obj._dijagnoza);
- // datum
- _datumPregleda = new Datum(*obj._datumPregleda);
- // vektor
- for (int i = 0; i < obj._terapije.size(); i++){
- _terapije.push_back(obj._terapije.at(i));
- }
- }
- return *this;
- }
- friend ostream & operator << (ostream & cout, const Pregled & obj);
- // addterapija greska
- bool addTerapija(string terapija){
- // AddTerapija::dodaje novu terapiju.Onemoguciti ponavljanje terapija.Koristiti iteratore
- vector<string>::iterator it = _terapije.begin();
- for (it; it != _terapije.end(); it++)
- if (*it == terapija)
- return false;
- // ili obicno _terapije.push_back(terapija);
- _terapije.insert(it, terapija);
- return true;
- }
- bool removeTerapija(string terapija){
- //4. RemoveTerapija :: uklanja terapiju koja je identicna onoj primljenoj kao parametar.
- // Koristiti iteratore
- vector<string>::iterator it = _terapije.begin();
- for (it; it != _terapije.end(); it++){
- if (*it == terapija){
- _terapije.erase(it);
- return true;
- }
- }
- return false;
- }
- Datum getDatumPregleda(){
- return *_datumPregleda;
- }
- vector<string> getTerapije(){
- return _terapije;
- }
- };
- class Pacijent{
- protected:
- static int _brojPacijenata;
- ///
- const int _pacijentID;
- char _imePrezime[20];
- Kolekcija<string, Pregled *> * _preglediPacijenta;
- //tip string je za podatke o imenu i prezimenu ljekara koji je obavio pregled, a
- //objekat tipa Pregled za podatke o dijagnozi, terapijama i datumu pregleda
- public:
- Pacijent(char * imePrezime) :_pacijentID(++_brojPacijenata){
- strcpy_s(_imePrezime, 20, imePrezime);
- _preglediPacijenta = new Kolekcija < string, Pregled * >;
- }
- ~Pacijent(){
- delete _preglediPacijenta;
- _preglediPacijenta = nullptr;
- }
- Pregled & operator [] (string terapija){
- //1. operator [] :: vraca posljednji Pregled kod koga je postavljena terapija proslijedjena kao parametar.
- int pozicija = -1;
- // kolkecija <string, pregled>
- for (int i = 0; i < (*_preglediPacijenta).getTrenutno(); i++){
- // u pregledima imamo vektor koji cuva vise terapija
- for (int j = 0; j < _preglediPacijenta->getElement2(i)->getTerapije().size(); j++){
- // setamo kroz terapije sad
- if (_preglediPacijenta->getElement2(i)->getTerapije().at(j) == terapija)
- pozicija = i;
- }
- }
- if (pozicija == -1) throw exception("Pregled nije pronadjen! ");
- return *_preglediPacijenta->getElement2(pozicija);
- }
- bool addPregled(string ime,Pregled & pregled){
- //2. AddPregled :: dodaje podatke o novom pregledu pacijenta. Nije dozvoljeno dodati dva
- // identicna pregleda. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false
- for (int i = 0; i < _preglediPacijenta->getTrenutno(); i++){
- if (*_preglediPacijenta->getElement2(i) == pregled){
- cout << "GRESKA! - Pregled je vec dodan u listu pregleda!" << endl;
- return false;
- }
- }
- if (_preglediPacijenta->addElement(ime, &pregled)){
- //cout << "Uspjenso dodano." << endl;
- return true;
- }
- else{
- cout << "GRESKA! - Pregled je vec dodan u listu pregleda!" << endl;
- return false;
- }
- }
- bool removePregledByDatum(Datum & datum){
- //3. RemovePregledByDatum :: na osnovu primljenog parametra (tipa Datum) uklanja podatke o svim pregledima
- // koji su obavljeni prije odredjenog datuma. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false
- bool uklonjen = false;
- for (int i = 0; i < _preglediPacijenta->getTrenutno(); i++){
- if (_preglediPacijenta->getElement2(i)->getDatumPregleda() < datum){
- _preglediPacijenta->removeElement(_preglediPacijenta->getElement1(i));
- uklonjen = true;
- }
- }
- if (uklonjen == true) return true;
- else return false;
- }
- int removePregledByLjekar(string imePrezime){
- int brojac = 0;
- for (int i = 0; i < _preglediPacijenta->getTrenutno(); i++){
- if (_preglediPacijenta->getElement1(i) == imePrezime){
- _preglediPacijenta->removeElement(imePrezime);
- brojac++;
- }
- }
- return brojac;
- }
- friend ostream & operator <<(ostream & cout, const Pacijent & obj);
- };
- // ------------------------------------------------------------------------------
- int Pacijent::_brojPacijenata = 0;
- template<class T1, class T2>
- ostream & operator << (ostream & cout, const Kolekcija<T1, T2> & obj){
- cout << crt << "\tKOLEKCIJA\n" << crt;
- for (int i = 0; i < obj._trenutnoElemenata; i++){
- cout << obj._elementi1[i] << " - " << obj._elementi2[i] << endl;
- }
- return cout;
- }
- ostream & operator <<(ostream & cout, const Datum & obj){
- cout << "DATUM: " << *obj._dan << "/" << *obj._mjesec << "/" << *obj._godina << endl;
- return cout;
- }
- ostream & operator << (ostream & cout, const Pregled & obj){
- // operator<< ::ispisuje sve podatke o pregledu.Koristiti ostream_iterator.Prije ispisa
- // sve terapije sortirati
- cout << crt << "\tPREGLED\n" << crt;
- cout << "DIJAGNOZA: " << obj._dijagnoza << endl;
- cout << *obj._datumPregleda;
- // #include<algorithm> sort pocetak i kraj vektora i sortira i potreban operator <, valjda string ima <
- // sort(obj._terapije.begin(), obj._terapije.end());
- cout << "TERAPIJE: \n" << crt;
- ostream_iterator<string> it(cout, "\n-------------------------------------|\n");
- copy(obj._terapije.begin(), obj._terapije.end(), it);
- return cout;
- }
- ostream & operator <<(ostream & cout, const Pacijent & obj){
- cout << crt << "\tPACIJENT\n" << crt;
- cout << "PACIJENT ID: " << obj._pacijentID << endl;
- cout << "IME PREZIME: " << obj._imePrezime << endl;
- for (int i = 0; i < obj._preglediPacijenta->getTrenutno(); i++){
- cout <<"DOKTOR: "<< obj._preglediPacijenta->getElement1(i) << endl;
- cout << *obj._preglediPacijenta->getElement2(i) << endl;
- }
- return cout;
- }
- int main(){
- try{
- // pregleda
- Datum d1(13, 1, 2015);
- Datum d2(11, 2, 2015);
- Datum d3(10, 4, 2015);
- Pregled p1("P1 DIJAGNOZA", "P1 TERAPIJA ;) ", d1);
- Pregled p2("P2 DIJAGNOZA", "P2 TERAPIJA ;) ", d2);
- Pregled p3("P3 DIJAGNOZA", "P3 TERAPIJA ;) ", d3);
- Pacijent pacijent1("Nedim Fejzic");
- pacijent1.addPregled("Doktor Karabeg", p1);
- pacijent1.addPregled("Doktor Karabeg", p2);
- pacijent1.addPregled("Doktorica Nina", p3);
- cout << pacijent1 << endl <<crt<<crt<<crt;
- //cout <<"KOLIKO ??????????: "<< pacijent1.removePregledByLjekar("Doktorica Nina");
- //cout << pacijent1 << endl;
- pacijent1.removePregledByDatum(d3);
- cout << pacijent1;
- }
- catch (exception & err){
- cout << "GRESKA: " << err.what() << endl;
- }
- system("pause > null");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement