Advertisement
Guest User

Untitled

a guest
Jan 29th, 2015
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.48 KB | None | 0 0
  1. #include<iostream>
  2. #include<vector>
  3. #include<string>
  4. #include<algorithm>
  5. using namespace std;
  6. template<class T1,class T2,int max>
  7. class Kolekcija{
  8. T1 _elementi1[max];
  9. T2 _elementi2[max];
  10. int _trenutnoElemenata;
  11. public:
  12. Kolekcija(){
  13. _trenutnoElemenata = 0;
  14. }
  15. //1. AddElement :: omogucava dodavanje novog elementa u kolekciju. Onemoguciti ponavljanje
  16. // elemenata, te osigurati automatsko prosiranje kolekcije ukoliko broj elemenata dostigne
  17. // trenutni maksimum
  18. void AddElement(T1& e1, T2& e2){
  19. // Prosirenje kolekcije nije moguce, zbog toga sto se radi o statickom nizu
  20. if(_trenutnoElemenata == max)
  21. throw exception("Niz je isupnjen do kraja");
  22. for (int i = 0; i < _trenutnoElemenata; i++){
  23. if(e1 == _elementi1[i] && e2 == _elementi2[i])
  24. throw exception("Dupliranje elemenata");
  25. }
  26. _elementi1[_trenutnoElemenata] = e1;
  27. _elementi2[_trenutnoElemenata] = e2;
  28. _trenutnoElemenata++;
  29. }
  30. //2. RemoveElement :: na osnovu parametara tipa T1 i T2 uklanja element iz kolekcije. Ukoliko je
  31. // potrebno,prilikom uklanjanja elementa izvrsiti dealokaciju. Onemoguciti pojavljivanje
  32. // neinicijaliziranih elemenata, te ocuvati redoslijed dodavanja elemenata
  33. bool RemoveElement(T1& e1, T2& e2){
  34. for (int i = 0; i < _trenutnoElemenata; i++){
  35. if(_elementi1[i] == e1 && _elementi2[i] == e2){
  36. for (int j = i; j < _trenutnoElemenata - 1; j++){
  37. _elementi1[j] = _elementi1[j+1];
  38. _elementi2[j] = _elementi2[j+1];
  39. }
  40. _trenutnoElemenata--;
  41. return true;
  42. }
  43. }
  44. return false;
  45. }
  46. //3. PopFront :: uklanja prvi element iz kolekcije(iz oba niza). Ukoliko je kolekcija prazna
  47. // funkcija vraca false, a u suprotnom funkcija vraca true
  48. bool PopFront(){
  49. if(_trenutnoElemenata == 0)
  50. return false;
  51. return (RemoveElement(_elementi1[0], _elementi2[0]));
  52. }
  53. //4. operator -= :: uklanja sve elemnte iz kolekcije koji su identicni onima koje posjeduje
  54. // drugi objekat tipa Kolekcija koji je primljen kao parametar. Funkcija vraca broj uklonjenih
  55. // elemenata
  56. int operator-=(Kolekcija& obj){
  57. int brojElemenata = 0;
  58. for (int i = 0; i < obj._trenutnoElemenata; i++){
  59. if(RemoveElement(obj._elementi1[i], obj._elementi2[i]))
  60. brojElemenata++;
  61. }
  62. return brojElemenata;
  63. }
  64. T1& getElement1(int indeks){
  65. return _elementi1[indeks];
  66. }
  67. T2& getElement2(int indeks){
  68. return _elementi2[indeks];
  69. }
  70. int getSize(){
  71. return _trenutnoElemenata;
  72. }
  73. friend ostream& operator<< <>(ostream&, Kolekcija<T1,T2,max>&);
  74. };
  75. template<class T1,class T2,int max>
  76. ostream& operator<<(ostream& COUT, Kolekcija<T1,T2,max>& obj){
  77. for (int i = 0; i < obj._trenutnoElemenata; i++){
  78. COUT << obj._elementi1[i] << " - " << obj._elementi2[i] << endl;
  79. }
  80. return COUT;
  81. }
  82. class Pregled{
  83. char * _dijagnoza;
  84. vector<string> _terapije;
  85. public:
  86. Pregled(char* dijagnoza){
  87. int vel = strlen(dijagnoza) + 1;
  88. _dijagnoza = new char[vel];
  89. strcpy_s(_dijagnoza,vel,dijagnoza);
  90. }
  91. Pregled(const Pregled& obj){
  92. int vel = strlen(obj._dijagnoza) + 1;
  93. _dijagnoza = new char[vel];
  94. strcpy_s(_dijagnoza,vel,obj._dijagnoza);
  95. _terapije = obj._terapije;
  96. }
  97. ~Pregled(){
  98. delete[] _dijagnoza;
  99. _dijagnoza = nullptr;
  100. }
  101. void operator=(const Pregled& obj){
  102. delete[] _dijagnoza;
  103. int vel = strlen(obj._dijagnoza);
  104. _dijagnoza = new char[vel];
  105. strcpy_s(_dijagnoza,vel,obj._dijagnoza);
  106. _terapije = obj._terapije;
  107. }
  108. //1. Info :: ispisuje sve podatke o pregledu. Koristiti ostream_iterator. Prije ispisa
  109. // sve terapije sortirati
  110. void Info(){
  111. cout << "Dijagnoza: " << _dijagnoza << endl;
  112. cout << "Terapije: " << endl;
  113. ostream_iterator<string> ispis(cout, "\n");
  114. copy(_terapije.begin(), _terapije.end(), ispis);
  115.  
  116. }
  117. //2. AddTerapija :: dodaje novu terapiju. Onemoguciti ponavljanje terapija. Koristiti iteratore
  118. void AddTerapija(string terapija){
  119. auto it = _terapije.begin();
  120. while(it != _terapije.end()){
  121. if(*it == terapija)
  122. throw exception("Ova terapija vec postoji");
  123. it++;
  124. }
  125. _terapije.push_back(terapija);
  126. }
  127. //3. RemoveTerapija :: uklanja terapiju koja je primljena kao parametar. Koristiti iteratore
  128. void RemoveTerapija(string terapija){
  129. auto it = _terapije.begin();
  130. while(it != _terapije.end()){
  131. if(*it == terapija){
  132. _terapije.erase(it);
  133. return;
  134. }
  135. it++;
  136. }
  137. }
  138. char* getDijagnoza(){
  139. return _dijagnoza;
  140. }
  141. bool DaLiPostojiTrazenaTerapija(string terapija){
  142. auto it = _terapije.begin();
  143. while(it != _terapije.end()){
  144. if(*it == terapija)
  145. return true;
  146. it++;
  147. }
  148. it++;
  149. return false;
  150. }
  151. friend ostream& operator<<(ostream&, Pregled&);
  152. };
  153. ostream& operator<<(ostream& COUT, Pregled& obj){
  154. cout << "Dijagnoza: " << obj._dijagnoza << endl;
  155. cout << "Terapije: " << endl;
  156. ostream_iterator<string> ispis(cout, "\n");
  157. sort(obj._terapije.begin(), obj._terapije.end());
  158. copy(obj._terapije.begin(), obj._terapije.end(), ispis);
  159. return COUT;
  160. }
  161. int pacijentID = 1;
  162. class Pacijent{
  163. protected:
  164. const int _pacijentID;
  165. char * _imePrezime;
  166. //tip bool čuva podatak o tome da li je zakazan kontrolni pregled
  167. //objekat tipa Pregled je za podatke o dijagnozi i terapijama
  168. Kolekcija<Pregled *, bool, 20> * _preglediPacijenta;
  169. public:
  170. Pacijent(char* imePrezime) : _pacijentID(pacijentID++){
  171. int vel = strlen(imePrezime) + 1;
  172. _imePrezime = new char[vel];
  173. strcpy_s(_imePrezime,vel,imePrezime);
  174. _preglediPacijenta = new Kolekcija<Pregled*, bool, 20>;
  175. }
  176. Pacijent(const Pacijent& obj) : _pacijentID(pacijentID++){
  177. int vel = strlen(obj._imePrezime) + 1;
  178. _imePrezime = new char[vel];
  179. strcpy_s(_imePrezime,vel,obj._imePrezime);
  180. _preglediPacijenta = new Kolekcija<Pregled*, bool, 20>(*obj._preglediPacijenta);
  181. }
  182. ~Pacijent(){
  183. delete[] _imePrezime;
  184. _imePrezime = nullptr;
  185. for (int i = 0; i < _preglediPacijenta->getSize(); i++){
  186. delete _preglediPacijenta->getElement1(i);
  187. }
  188. delete _preglediPacijenta;
  189. _preglediPacijenta = nullptr;
  190. }
  191. //1. operator [] :: vraca Pregled kod koga je postavljena dijagnoza koja je proslijedjena kao
  192. // parametar. Dakle, operatorska funkcija prima dijagnozu kao parametar
  193. Pregled& operator[](char* dijagnoza){
  194. for (int i = 0; i < _preglediPacijenta->getSize(); i++){
  195. if(strcmp(dijagnoza, _preglediPacijenta->getElement1(i)->getDijagnoza()) == 0)
  196. return *_preglediPacijenta->getElement1(i);
  197. }
  198. return Pregled("x");
  199. }
  200. //2. AddPregled :: dodaje podatke o novom pregledu pacijenta. Ukoliko je moguće, osigurati
  201. // proširanje nize. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false.
  202. bool AddPregled(Pregled& obj){
  203. bool kontrolni = false;
  204. Pregled* pregled = new Pregled(obj);
  205. try{
  206. _preglediPacijenta->AddElement(pregled,kontrolni);
  207. }
  208. catch(exception e){
  209. cout << "Greska: " << e.what() << endl;
  210. return false;
  211. }
  212. return true;
  213. }
  214. //3. RemovePregled :: na osnovu primljenog parametra (dijagnoze) uklanja sve podatke o pregledu.
  215. // U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false
  216. bool RemovePregled(char* dijagnoza){
  217. for (int i = 0; i < _preglediPacijenta->getSize(); i++){
  218. if(strcmp(_preglediPacijenta->getElement1(i)->getDijagnoza(), dijagnoza) == 0)
  219. if(_preglediPacijenta->RemoveElement(_preglediPacijenta->getElement1(i),
  220. _preglediPacijenta->getElement2(i)))
  221. return true;
  222. }
  223. return false;
  224. }
  225. //4. RemovePregledByTerapija :: na osnovu primljenog parametra (terapije) uklanja podatke o svim
  226. // pregledima kod koji je propisana trazena terapija, ali pod uslovom da je tokom tog pregleda
  227. // zakazan novi pregled. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false
  228.  
  229. bool RemovePregledByTerapija(string terapija){
  230. for (int i = 0; i < _preglediPacijenta->getSize(); i++){
  231. if(_preglediPacijenta->getElement1(i)->DaLiPostojiTrazenaTerapija(terapija)){
  232. _preglediPacijenta->RemoveElement(_preglediPacijenta->getElement1(i), _preglediPacijenta->getElement2(i));
  233. i--;
  234. }
  235. }
  236. return true;
  237. }
  238. //5. operator<< :: ispisuje vrijednosti svih atributa klase
  239. friend ostream& operator<<(ostream&, Pacijent&);
  240. };
  241. ostream& operator<<(ostream& COUT, Pacijent& obj){
  242. COUT << "Ime i prezime: " << obj._imePrezime << endl;
  243. COUT << "\n \t#### PREGLEDI #####\n"<<endl;
  244. for (int i = 0; i < obj._preglediPacijenta->getSize(); i++){
  245. cout <<"Kontrolni pregled: ";
  246. if(obj._preglediPacijenta->getElement2(i))
  247. cout << "Da" << endl;
  248. else
  249. cout << "Ne" << endl;
  250. COUT << *obj._preglediPacijenta->getElement1(i) << endl;
  251. COUT << "-------------------------------------------------\n";
  252. }
  253. return COUT;
  254. }
  255.  
  256. void main(){
  257. //izbjegavajte koristenje vlastitog imena i prezimena.
  258. //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti na objektu tipa Pacijent
  259. //ukratko pojasniti i demonstrirati koncepciju polimorfizma
  260.  
  261. Pregled p1("Dijagnoza broj jedan");
  262. Pregled p2("Dijagnoza broj dva");
  263. Pregled p3("Dijagnoza broj 3");
  264. p3.AddTerapija("Neka terapija");
  265. p3.AddTerapija("Terapija 2");
  266. p2.AddTerapija("Terapija 3");
  267. p2.AddTerapija("Terapija 2");
  268. p2.AddTerapija("Terapija 1");
  269. p2.AddTerapija("Terapija broj 1");
  270. try{
  271. p1.AddTerapija("Terapija 1");
  272. p1.AddTerapija("Terapija 2");
  273. p1.AddTerapija("Terapija 3");
  274. }
  275. catch(exception e){
  276. cout << "Greska: " << e.what() << endl;
  277. }
  278. p1.RemoveTerapija("Terapija 2");
  279. Pacijent pa1("Almin Latovic");
  280. pa1.AddPregled(p1);
  281. pa1.AddPregled(p2);
  282. pa1.AddPregled(p3);
  283. //pa1.RemovePregled("Dijagnoza broj dva");
  284. pa1.RemovePregledByTerapija("Terapija 1");
  285. cout << pa1 << endl;
  286. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement