Advertisement
Guest User

Untitled

a guest
Dec 19th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.70 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3. char* AlocirajNizKaraktera(const char *s) {
  4. char *noviString = new char[strlen(s) + 1];
  5. strcpy_s(noviString, strlen(s) + 1, s);
  6. return noviString;
  7. }
  8.  
  9. const char *crt = "\n-------------------------------------------\n";
  10. enum OznakaKrvneGrupe { O, A, B, AB };
  11. const char* OznakaKrvneGrupeString[] = { "O", "A", "B", "AB" };
  12.  
  13. class Datum {
  14. int _dan, _mjesec, _godina;
  15. public:
  16. Datum(int dan = 1, int mjesec = 1, int godina = 2000) :
  17. _dan(dan), _mjesec(mjesec), _godina(godina) {}
  18. friend ostream &operator<<(ostream &COUT, const Datum &obj) {
  19. COUT << obj._dan << "." << obj._mjesec << "." << obj._godina << endl;
  20. return COUT;
  21. }
  22.  
  23. };
  24.  
  25. template <class T>
  26. class Kolekcija {
  27. T* _elementi;
  28. int _trenutno;
  29. public:
  30. Kolekcija() {
  31. _elementi = nullptr;
  32. _trenutno = 0;
  33.  
  34. }
  35. Kolekcija(const Kolekcija &temp) {
  36. _trenutno = temp._trenutno;
  37.  
  38. _elementi = new T[_trenutno];
  39.  
  40.  
  41. for (int i = 0; i < _trenutno; i++)
  42. _elementi[i] = temp._elementi[i];
  43.  
  44. }
  45. Kolekcija& operator=(const Kolekcija &temp) {
  46. if (this != &temp) {
  47. _trenutno = temp._trenutno;
  48.  
  49.  
  50.  
  51. delete[] _elementi;
  52. _elementi = new T[_trenutno];
  53.  
  54. for (size_t i = 0; i < _trenutno; i++)
  55. _elementi[i] = temp._elementi[i];
  56.  
  57. }
  58. return *this;
  59. }
  60. void Dodaj(T temp) {
  61. T *tempElementi = new T[_trenutno + 1];
  62. for (size_t i = 0; i < _trenutno; i++)
  63. tempElementi[i] = _elementi[i];
  64. tempElementi[_trenutno] = temp;
  65.  
  66. _trenutno++; //povecaj broj elemenata
  67. delete[] _elementi; //obrisi stare elemente
  68. _elementi = tempElementi; //preusmjeri pointer na novi niz
  69. }
  70.  
  71.  
  72.  
  73. int GetTrenutno() const { return _trenutno; }
  74.  
  75.  
  76. T& GetElement1(int lokacija) const {
  77. return _elementi[lokacija];
  78. }
  79. T& GetLast()
  80. {
  81. return _elementi[_trenutno - 1];
  82. }
  83.  
  84. friend ostream &operator<<(ostream &COUT, const Kolekcija &obj) {
  85. for (size_t i = 0; i < obj.GetTrenutno(); i++)
  86. COUT << obj.GetElement1(i) << endl;
  87. return COUT;
  88. }
  89. };
  90.  
  91. class KrvnaGrupa {
  92. /*postoje 4 krvne grupe koje su navedene u enumeracije OznakaKrvneGrupe, pri cemu svaka od navedenih moze imati pozitivan (+) i negativan (-) Rh faktor*/
  93. OznakaKrvneGrupe _oznaka;//npr: AB
  94. char _rhFaktor; // + ili -
  95. /*prethodno pomenuto je izuzetno bitno iz razloga sto postoje jasna pravila vezana za darivanje krvi tj.
  96. koji primalac moze primiti krv od kojeg donatora sto je prikazano u tabeli, a naredna dvije kolekcije su
  97. zaduzena da cuvaju informacije o tome, npr. za krvnu grupu A+ kolekcija donatori ce cuvati vrijednosti: A+ i AB+ */
  98. Kolekcija<KrvnaGrupa> _donatori; //krvne grupe kojima odredjena krvna grupa moze donirati krv.
  99. Kolekcija<KrvnaGrupa> _primaoci; //krvne grupe od kojih odredjena krvna grupa moze primiti krv.
  100. float _zalihe;//zalihe krve grupe
  101. public:
  102. KrvnaGrupa()
  103. {
  104. _zalihe = 0;
  105. }
  106. KrvnaGrupa(OznakaKrvneGrupe oznaka, const char rhFaktor) :
  107. _oznaka(oznaka), _rhFaktor(rhFaktor), _zalihe(0) {}
  108.  
  109. void SetDonatori(Kolekcija<KrvnaGrupa> donatori) {
  110. _donatori = donatori;
  111. }
  112. void SetPrimaoci(Kolekcija<KrvnaGrupa> primaoci) {
  113. _primaoci = primaoci;
  114. }
  115. void SetZalihe(int zalihe) {
  116. _zalihe += zalihe;
  117. }
  118. int GetZalihe() { return _zalihe; }
  119.  
  120. bool operator ==(const KrvnaGrupa &kg) {
  121. if (_oznaka == kg._oznaka && _rhFaktor == kg._rhFaktor) return true;
  122. return false;
  123. }
  124. char GetRHFaktor() { return _rhFaktor; }
  125. OznakaKrvneGrupe GetOznaka()const { return _oznaka; }
  126. Kolekcija<KrvnaGrupa> GetPrimaoci() { return _primaoci; }
  127. Kolekcija<KrvnaGrupa> GetDonatori() { return _donatori; }
  128. friend ostream & operator<< (ostream & COUT, const KrvnaGrupa * k) {
  129. COUT << "Oznaka krvne grupe ->" << k->_oznaka << endl;
  130. COUT << "RH Faktor krvne grupe ->" << k->_rhFaktor << endl;
  131. COUT << "Donatori ->" << k->_donatori << endl;
  132. COUT << "Primaoci ->" << k->_primaoci << endl;
  133. COUT << "Zalihe ->" << k->_zalihe << endl;
  134. return COUT;
  135. }
  136.  
  137. friend ostream & operator<< (ostream & COUT,const KrvnaGrupa & k) {
  138. COUT << "Oznaka krvne grupe ->" << k._oznaka << endl;
  139. COUT << "RH Faktor krvne grupe ->" << k._rhFaktor << endl;
  140. COUT << "Donatori ->" << k._donatori << endl;
  141. COUT << "Primaoci ->" << k._primaoci << endl;
  142. COUT << "Zalihe ->" << k._zalihe << endl;
  143. return COUT;
  144. }
  145. void Ispis() {
  146. cout << "Oznaka krvne grupe ->" << _oznaka << endl;
  147. cout << "RH Faktor krvne grupe ->" << _rhFaktor << endl;
  148. cout << "Donatori ->" << _donatori << endl;
  149. cout << "Primaoci ->" << _primaoci << endl;
  150. cout << "Zalihe ->" << _zalihe << endl;
  151. }
  152. };
  153.  
  154. //Klasu proglasiti apstraktnom
  155. class Osoba {
  156. protected:
  157. char* _imePrezime;
  158. KrvnaGrupa _krvnaGrupa;
  159. public:
  160. Osoba(const char* imePrezime, KrvnaGrupa krvnaGrupa) : _krvnaGrupa(krvnaGrupa) {
  161. _imePrezime = AlocirajNizKaraktera(imePrezime);
  162.  
  163. }
  164. Osoba(const Osoba &o) :_krvnaGrupa(o._krvnaGrupa) {
  165. _imePrezime = AlocirajNizKaraktera(o._imePrezime);
  166. }
  167. char *getImePrezime()const { return _imePrezime; }
  168. Osoba& operator=(const Osoba& o)
  169. {
  170. if (this != &o)
  171. {
  172. _krvnaGrupa = o._krvnaGrupa;
  173. delete[] _imePrezime;
  174. _imePrezime = AlocirajNizKaraktera(o._imePrezime);
  175. }
  176. return *this;
  177. }
  178. virtual void Info() = 0;
  179. virtual ~Osoba() {
  180. delete[] _imePrezime;
  181. _imePrezime = nullptr;
  182. }
  183. KrvnaGrupa GetKrvnaGrupa()const { return _krvnaGrupa; }
  184.  
  185. bool operator == (const Osoba &o) {
  186. return strcmp(_imePrezime, o._imePrezime) == 0;
  187. }
  188. friend ostream & operator<<(ostream & COUT, const Osoba & o) {
  189. COUT << o._imePrezime << endl;
  190. COUT << o._krvnaGrupa << endl;
  191. return COUT;
  192. }
  193. };
  194.  
  195. class Donator : public Osoba {
  196. char* _telefon;
  197. Datum _datumPosljednjegDoniranja;
  198. bool _podsjetiMe;
  199. bool _kontaktirajMe;
  200. float _doniranokrvi;//zalihe krve grupe
  201. public:
  202. Donator(const char*imeprezime,const KrvnaGrupa &k, const char *brtel, const Datum & datum, bool podsjetime, bool kontaktirajme):Osoba(imeprezime,k) {
  203. _telefon = AlocirajNizKaraktera(brtel);
  204. _datumPosljednjegDoniranja = datum;
  205. _podsjetiMe = podsjetime;
  206. _kontaktirajMe = kontaktirajme;
  207. _doniranokrvi = 0;
  208. }
  209. Donator(const Donator & d):Osoba(d) {
  210. _telefon = AlocirajNizKaraktera(d._telefon);
  211. _datumPosljednjegDoniranja = d._datumPosljednjegDoniranja;
  212. _podsjetiMe = d._podsjetiMe;
  213. _kontaktirajMe = d._kontaktirajMe;
  214. _doniranokrvi = d._doniranokrvi;
  215. }
  216. void setDatumPosljednjegDoniranja(Datum d) {
  217. _datumPosljednjegDoniranja = d;
  218. }
  219. void SetDoniranuKrv(float kolicina) {
  220. _doniranokrvi += kolicina;
  221. }
  222. float GetDoniranuKrv() { return _doniranokrvi; }
  223. virtual void Info() {
  224. cout <<crt<< "Telefon donatora ->" << _telefon << endl;
  225. cout << "Datum posljednjeg doniranja" << _datumPosljednjegDoniranja << endl;
  226. cout << "Donirano krvi ->" << _doniranokrvi << crt;
  227. }
  228. ~Donator()
  229. {
  230. delete[]_telefon;
  231. _telefon = nullptr;
  232. }
  233. };
  234.  
  235. class Zahtjev {
  236. char* _ustanova;
  237. Datum _datumZahtjeva;
  238. KrvnaGrupa _krvnaGrupa;
  239. double _kolicina;
  240. public:
  241. Zahtjev()
  242. {
  243. _ustanova = nullptr;
  244. }
  245. Zahtjev(const char* ustanova, Datum datum, KrvnaGrupa krvnaGrupa, float kolicina) :
  246. _datumZahtjeva(datum), _krvnaGrupa(krvnaGrupa), _kolicina(kolicina) {
  247. _ustanova = AlocirajNizKaraktera(ustanova);
  248. }
  249.  
  250.  
  251. friend ostream& operator<<(ostream& COUT, const Zahtjev& obj) {
  252. COUT << "Ustanova: " << obj._ustanova << endl;
  253. COUT << "Datum: " << obj._datumZahtjeva << endl;
  254. COUT << "Krvna grupa: " << obj._krvnaGrupa << endl;
  255. COUT << "Kolicina: " << obj._kolicina << endl;
  256. return COUT;
  257. }
  258. double GetKolicina() { return _kolicina; }
  259. void Info() {
  260. cout << "Ustanova ->" << _ustanova << endl;
  261. cout << "Datum zahtjeva ->" << _datumZahtjeva << endl;
  262. cout << "Krvna grupa ->" << _krvnaGrupa << endl;
  263. cout << "Kolicina ->" << _kolicina << endl;
  264. }
  265. ~Zahtjev()
  266. {
  267. delete[]_ustanova; _ustanova = nullptr;
  268. }
  269. KrvnaGrupa GetKrvnaGrupa() { return _krvnaGrupa; }
  270.  
  271. };
  272.  
  273.  
  274. class TransfuzijskiCentar {
  275. //stanje zaliha za svaku pojedinu krvnu grupu
  276. Kolekcija<KrvnaGrupa*> _zalihe;
  277. //evidentira svaku donaciju krvi
  278. Kolekcija<Osoba *> _donacije;
  279. Kolekcija<Zahtjev> _zahtjevi;
  280. public:
  281. TransfuzijskiCentar() {
  282. }
  283. /*
  284. // prilikom svake donacije je potrebno povecati zalihe za tu krvnu grupu
  285. // ukoliko krvna grupa vec postoji na zalihi onda se uvecava samo njena kolicina
  286. // takodjer, donatoru se postavlja nova vrijednost datuma posljednje donacije
  287. // */
  288. void AddDonaciju(const Datum & d, Osoba * osoba, float kolicina) {
  289. KrvnaGrupa temp(osoba->GetKrvnaGrupa().GetOznaka(), osoba->GetKrvnaGrupa().GetRHFaktor());
  290. for (size_t i = 0; i < _zalihe.GetTrenutno(); i++)
  291. {
  292. if (_zalihe.GetElement1(i)->GetOznaka() == temp.GetOznaka()) {
  293. _zalihe.GetElement1(i)->SetZalihe(kolicina);
  294. for (size_t j = 0; j < _donacije.GetTrenutno(); j++)
  295. {
  296. if (strcmp(_donacije.GetElement1(j)->getImePrezime(), osoba->getImePrezime()) == 0) {
  297. Donator *neki = dynamic_cast<Donator*>(_donacije.GetElement1(j));
  298. if (neki != nullptr) {
  299. neki->setDatumPosljednjegDoniranja(d);
  300. neki->SetDoniranuKrv(kolicina);
  301. return;
  302. }
  303. }
  304. }
  305. }
  306. }
  307. Donator *os = dynamic_cast<Donator*>(osoba);
  308. _zalihe.Dodaj(new KrvnaGrupa(temp));
  309. _zalihe.GetLast()->SetZalihe(kolicina);
  310. if (os != nullptr) {
  311. _donacije.Dodaj(new Donator(*os));
  312. }
  313. }
  314. ~TransfuzijskiCentar()
  315. {
  316. for (size_t i = 0; i < _zalihe.GetTrenutno(); i++)
  317. {
  318. delete _zalihe.GetElement1(i);
  319. }
  320. for (size_t i = 0; i < _donacije.GetTrenutno(); i++)
  321. {
  322. delete _donacije.GetElement1(i);
  323. }
  324. }
  325. // /*ukoliko transfuzijski centar posjeduje zahtijevane kolicine na stanju, odmah ce ih ustupiti prema zahtjevu
  326. // odnosno funkcija ispisuje da tranfuzijski centar posjeduje zahtjevanu kolicinu
  327. // a u slucaju da ne posjeduje onda funkcija ispisuje da tranfuzijski centar nema dovoljno kolicine krvi.
  328. void DodajZahtjev( Zahtjev & z) {
  329. for (size_t i = 0; i < _zalihe.GetTrenutno(); i++)
  330. {
  331. if (_zalihe.GetElement1(i)->GetOznaka() == z.GetKrvnaGrupa().GetOznaka()) {
  332. cout << "Tranfuzijski centar posjeduje zahtjevanu kolicinu !!! \n";
  333. return;
  334. }
  335. }
  336. cout << "Tranfuzijski centar nema dovoljno kolicine krvi \n";
  337. }
  338. friend ostream & operator<<(ostream & COUT, TransfuzijskiCentar & t) {
  339. COUT << crt;
  340. for (size_t i = 0; i < t._zalihe.GetTrenutno(); i++)
  341. {
  342. t._zalihe.GetElement1(i)->Ispis();
  343. }
  344. for (size_t i = 0; i <t._donacije.GetTrenutno(); i++)
  345. {
  346. t._donacije.GetElement1(i)->Info();
  347. }
  348. for (size_t i = 0; i < t._zahtjevi.GetTrenutno(); i++)
  349. {
  350. t._zahtjevi.GetElement1(i).Info();
  351. }
  352. COUT << crt;
  353. return COUT;
  354. }
  355. };
  356.  
  357.  
  358. void main() {
  359.  
  360. /**************************************************************************
  361. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  362. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR CE BITI OZNACENO KAO "RE"
  363. 3. SPASAVAJTE PROJEKAT KAKO BI SE SPRIJECILO GUBLJENJE URADJENOG ZADATKA
  364. 4. PROGRAMSKI CODE SE TAKODJER NALAZI U FAJLU code.TXT
  365. 5. NAZIVI FUNKCIJA MORAJU BITI IDENTIÈNI ONIMA KOJI SU KORIŠTENI U TESTNOM CODE-U.OSTALE, POMOÆNE FUNKCIJE MOŽETE IMENOVATI PO ŽELJI. TAKOÐER, MOŽETE DODAVATI KOLIKO ŽELITE TESTNIH PODATAKA
  366. ****************************************************************************/
  367. Datum dat_12_01_2018(12, 1, 2018), dat_01_02_2018(1, 2, 2018);
  368. cout << dat_12_01_2018;
  369.  
  370.  
  371. Kolekcija<int> kolekcija1;
  372. for (size_t i = 0; i < 10; i++)
  373. kolekcija1.Dodaj(i);
  374.  
  375. cout << kolekcija1 << endl;
  376.  
  377. KrvnaGrupa
  378. O_poz(O, '+'), O_neg(O, '-'),
  379. A_poz(A, '+'), A_neg(A, '-'),
  380. B_poz(B, '+'), B_neg(B, '-'),
  381. AB_poz(AB, '+'), AB_neg(AB, '-');
  382.  
  383.  
  384. //Donatori O_POZ
  385. Kolekcija<KrvnaGrupa> donori_O_poz;
  386. donori_O_poz.Dodaj(O_poz);
  387. donori_O_poz.Dodaj(A_poz);
  388. donori_O_poz.Dodaj(B_poz);
  389. donori_O_poz.Dodaj(AB_poz);
  390. O_poz.SetDonatori(donori_O_poz);
  391.  
  392.  
  393. //Primaoci O_poz
  394. Kolekcija<KrvnaGrupa> primaoci_O_poz;
  395. primaoci_O_poz.Dodaj(O_poz);
  396. primaoci_O_poz.Dodaj(O_neg);
  397. O_poz.SetPrimaoci(primaoci_O_poz);
  398.  
  399.  
  400. //Donatori A_POZ
  401. Kolekcija<KrvnaGrupa> donori_A_poz;
  402. donori_A_poz.Dodaj(A_poz);
  403. donori_A_poz.Dodaj(AB_poz);
  404. A_poz.SetDonatori(donori_O_poz);
  405.  
  406.  
  407. //Primaoci A_POZ
  408. Kolekcija<KrvnaGrupa> primaoci_A_poz;
  409. primaoci_A_poz.Dodaj(O_poz);
  410. primaoci_A_poz.Dodaj(A_poz);
  411. primaoci_A_poz.Dodaj(O_neg);
  412. primaoci_A_poz.Dodaj(A_neg);
  413. A_poz.SetPrimaoci(primaoci_A_poz);
  414.  
  415.  
  416. //Donatori B_POZ
  417. Kolekcija<KrvnaGrupa> donori_B_poz;
  418. donori_B_poz.Dodaj(B_poz);
  419. donori_B_poz.Dodaj(AB_poz);
  420. B_poz.SetDonatori(donori_B_poz);
  421.  
  422. //PRIMAOCI B_POZ
  423. Kolekcija<KrvnaGrupa> primaoci_B_poz;
  424. primaoci_B_poz.Dodaj(O_poz);
  425. primaoci_B_poz.Dodaj(B_poz);
  426. primaoci_B_poz.Dodaj(O_neg);
  427. primaoci_B_poz.Dodaj(B_neg);
  428. B_poz.SetPrimaoci(primaoci_B_poz);
  429. // /*
  430. // Ispis podataka o krvnoj grupi treba biti u formatu:
  431. // -------------------------------------------
  432. // Krvna grupa -> 0+
  433. // -------------------------------------------
  434. // Donori -> 0+, A+, B+, AB+
  435. // Primaoci -> 0+, 0-
  436. // -------------------------------------------
  437. // */
  438.  
  439. O_poz.Ispis();
  440.  
  441. Osoba * jasmin = new Donator("Jasmin Azemovic", B_poz, "061-111-222", Datum(12, 2, 2017), true, true);
  442. Osoba * adel = new Donator("Adel Handzic", A_neg, "061-222-333", Datum(9, 1, 2017), true, true);
  443. Osoba * goran = new Donator("Goran Skondric", B_neg, "061-333-444", Datum(9, 3, 2017), true, true);
  444.  
  445. //
  446. TransfuzijskiCentar tcMostar;
  447. // /*
  448. // prilikom svake donacije je potrebno povecati zalihe za tu krvnu grupu
  449. // ukoliko krvna grupa vec postoji na zalihi onda se uvecava samo njena kolicina
  450. // takodjer, donatoru se postavlja nova vrijednost datuma posljednje donacije
  451. // */
  452. //datum donacije, donator, kolicina
  453. tcMostar.AddDonaciju(Datum(20, 5, 2017), jasmin, 2.5);
  454. tcMostar.AddDonaciju(Datum(20, 5, 2017), adel, 3);
  455. tcMostar.AddDonaciju(Datum(6, 5, 2017), goran, 1.2);
  456. //
  457. //
  458. tcMostar.AddDonaciju(Datum(10, 9, 2017), jasmin, 2);
  459. tcMostar.AddDonaciju(Datum(18, 10, 2017), adel, 1.8);
  460. tcMostar.AddDonaciju(Datum(15, 9, 2017), goran, 3.8);
  461. cout << tcMostar;
  462.  
  463. //
  464. Zahtjev zahtjev_B_poz("Tranfuziologija KCUS", Datum(18, 2, 2018), B_poz, 2),
  465. zahtjev_0_neg("Tranfuziologija Bakir Nakas", Datum(20, 2, 2018), O_neg, 8);
  466. //
  467. // /*ukoliko transfuzijski centar posjeduje zahtijevane kolicine na stanju, odmah ce ih ustupiti prema zahtjevu
  468. // odnosno funkcija ispisuje da tranfuzijski centar posjeduje zahtjevanu kolicinu
  469. // a u slucaju da ne posjeduje onda funkcija ispisuje da tranfuzijski centar nema dovoljno kolicine krvi.
  470. tcMostar.DodajZahtjev(zahtjev_B_poz); //Ispis: Tranfuzijski centar posjeduje zahtjevanu kolicine krvi.
  471. tcMostar.DodajZahtjev(zahtjev_0_neg);//Ispis: Tranfuzijski centar ne posjeduje zahtjevanu kolicinu krvi.
  472. ////
  473. delete adel;
  474. delete jasmin;
  475. delete goran;
  476. system("pause");
  477. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement