Advertisement
Guest User

Untitled

a guest
Nov 14th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.29 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. #pragma warning(disable:4996)
  5. const char *crt = "\n-------------------------------------------\n";
  6. enum eRazred { PRVI = 1, DRUGI, TRECI, CETVRTI };
  7. const char* razred[] = { "Prvi", "Drugi", "Treci", "Cetvrti" };
  8. const float minimalan_prosjek = 4.5;
  9.  
  10. char * AlocirajNizKaraktera(const char * sadrzaj) {
  11. if (sadrzaj == nullptr)
  12. return nullptr;
  13. int vel = strlen(sadrzaj) + 1;
  14. char * temp = new char[vel];
  15. strcpy_s(temp, vel, sadrzaj);
  16. return temp;
  17. }
  18.  
  19. template<class T1, class T2>
  20. class Kolekcija {
  21. T1 * _elementi1;
  22. T2 * _elementi2;
  23. int _trenutno;
  24. public:
  25. Kolekcija() {
  26. _elementi1 = nullptr;
  27. _elementi2 = nullptr;
  28. _trenutno = 0;
  29. }
  30. Kolekcija(const Kolekcija & k) {
  31. _trenutno = k._trenutno;
  32. _elementi1 = new T1[_trenutno];
  33. _elementi2 = new T2[_trenutno];
  34. for (size_t i = 0; i < _trenutno; i++)
  35. {
  36. _elementi1[i] = k._elementi1[i];
  37. _elementi2[i] = k._elementi2[i];
  38. }
  39. }
  40. ~Kolekcija() {
  41. delete[] _elementi1;
  42. delete[] _elementi2;
  43. }
  44. void AddElement(T1 el1, T2 el2) {
  45. T1 *temp1 = new T1[_trenutno + 1];
  46. T2 *temp2 = new T2[_trenutno + 1];
  47. for (size_t i = 0; i < _trenutno; i++)
  48. {
  49. temp1[i] = _elementi1[i];
  50. temp2[i] = _elementi2[i];
  51. }
  52. temp1[_trenutno] = el1;
  53. temp2[_trenutno] = el2;
  54. delete[]_elementi1;
  55. delete[]_elementi2;
  56. _elementi1 = temp1;
  57. _elementi2 = temp2;
  58. _trenutno++;
  59. }
  60. Kolekcija & operator = (const Kolekcija & k) {
  61. delete[]_elementi1;
  62. delete[]_elementi2;
  63. _trenutno = k._trenutno;
  64. _elementi1 = new T1[_trenutno];
  65. _elementi2 = new T2[_trenutno];
  66. for (size_t i = 0; i < _trenutno; i++)
  67. {
  68. _elementi1[i] = k._elementi1[i];
  69. _elementi2[i] = k._elementi2[i];
  70. }
  71. return *this;
  72. }
  73. void SortOpadajuciByT2() {
  74. bool prolaz = true;
  75. while (prolaz) {
  76. prolaz = false;
  77. for (size_t i = 0; i < _trenutno-1; i++)
  78. {
  79. if (_elementi1[i] < _elementi1[i + 1]) {
  80. T1 temp = _elementi1[i];
  81. _elementi1[i] = _elementi1[i + 1];
  82. _elementi1[i + 1] = temp;
  83. prolaz = true;
  84. }
  85. else if (_elementi2[i] < _elementi2[i + 1]) {
  86. T2 temp = _elementi2[i];
  87. _elementi2[i] = _elementi2[i + 1];
  88. _elementi2[i + 1] = temp;
  89. prolaz = true;
  90. }
  91. }
  92. }
  93. }
  94. T1& getElement1(int lokacija) { return _elementi1[lokacija]; }
  95. T2& getElement2(int lokacija) { return _elementi2[lokacija]; }
  96. int getTrenutno() { return _trenutno; }
  97. friend ostream& operator<< (ostream &COUT, Kolekcija &obj) {
  98. for (int i = 0; i < obj._trenutno; i++)
  99. COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
  100. return COUT;
  101. }
  102. };
  103.  
  104. class DatumVrijeme {
  105. int *_dan, *_mjesec, *_godina, *_sati, *_minuti;
  106. public:
  107. DatumVrijeme(int dan = 1, int mjesec = 1, int godina = 2000, int sati = 0, int minuti = 0) {
  108. _dan = new int(dan);
  109. _mjesec = new int(mjesec);
  110. _godina = new int(godina);
  111. _sati = new int(sati);
  112. _minuti = new int(minuti);
  113. }
  114. DatumVrijeme(const DatumVrijeme & d) {
  115. _dan = new int(*d._dan);
  116. _mjesec = new int(*d._mjesec);
  117. _godina = new int(*d._godina);
  118. _sati = new int(*d._sati);
  119. _minuti = new int(*d._minuti);
  120. }
  121. DatumVrijeme & operator=(const DatumVrijeme & d) {
  122. delete _dan, _mjesec, _godina, _sati, _minuti;
  123. _dan = nullptr, _mjesec = nullptr, _godina = nullptr, _sati = nullptr, _minuti = nullptr;
  124. return *this;
  125. }
  126. ~DatumVrijeme() {
  127. delete _dan; _dan = nullptr;
  128. delete _mjesec; _mjesec = nullptr;
  129. delete _godina; _godina = nullptr;
  130. delete _sati; _sati = nullptr;
  131. delete _minuti; _minuti = nullptr;
  132. }
  133. friend ostream& operator<< (ostream &COUT, DatumVrijeme &obj) {
  134. COUT << *obj._dan << "." << *obj._mjesec << "." << *obj._godina << " " << *obj._sati << ":" << *obj._minuti << endl;
  135. return COUT;
  136. }
  137. };
  138.  
  139. class Predmet {
  140. char * _naziv;
  141. int _ocjena;
  142. char* _napomena;
  143. public:
  144. Predmet(const char * naziv, int ocjena, const char* napomena = "") :_ocjena(ocjena) {
  145. _naziv = AlocirajNizKaraktera(naziv);
  146. _napomena = AlocirajNizKaraktera(napomena);
  147. }
  148. Predmet(const Predmet & p) {
  149. _naziv = AlocirajNizKaraktera(p._naziv);
  150. _ocjena = p._ocjena;
  151. _napomena = AlocirajNizKaraktera(p._napomena);
  152. }
  153. ~Predmet() {
  154. delete[] _naziv; _naziv = nullptr;
  155. if (_napomena != nullptr) delete[] _napomena;
  156. }
  157. void DodajNapomenu(const char * napomena) {
  158. if (strlen(_napomena) < 1) {
  159. _napomena = AlocirajNizKaraktera(napomena);
  160. }
  161. else {
  162. char tmp[250];
  163. strcpy_s(tmp, 250, _napomena);
  164. delete[]_napomena;
  165. _napomena = new char[strlen(tmp) + strlen(napomena) + 1];
  166. strcpy_s(_napomena, strlen(tmp) + strlen(napomena) + 1, tmp);
  167. strcat_s(_napomena, strlen(tmp) + strlen(napomena) + 1, napomena);
  168. }
  169. }
  170. Predmet & operator=(Predmet & p) {
  171. delete[]_naziv;
  172. _ocjena = p._ocjena;
  173. _naziv = AlocirajNizKaraktera(p._naziv);
  174. delete[]_napomena;
  175. _napomena = AlocirajNizKaraktera(p._napomena);
  176. return *this;
  177. }
  178. friend ostream& operator<< (ostream &COUT, Predmet &obj) {
  179. COUT << obj._naziv << " (" << obj._ocjena << ") " << obj._napomena << endl;
  180. return COUT;
  181. }
  182. int GetOcjenu() { return _ocjena; }
  183. char * GetNaziv() { return _naziv; }
  184. char* GetNapomena() { return _napomena; }
  185. };
  186.  
  187. //Uspjeh je ustvari razred. Jedan uspjeh(razred) sadrzi vise predmeta koje student slusa.
  188. class Uspjeh {
  189. eRazred _razred;
  190. Kolekcija<Predmet*, DatumVrijeme> * _predmeti; //datumvrijeme se odnosi na vrijeme evidentiranja polozenog predmeta
  191. public:
  192. Uspjeh() {
  193. _predmeti = nullptr;
  194. }
  195. Uspjeh(eRazred razred) :_razred(razred), _predmeti(new Kolekcija<Predmet*, DatumVrijeme>()) {}
  196.  
  197. ~Uspjeh() {
  198. delete _predmeti; _predmeti = nullptr;
  199. }
  200. eRazred GetRazred() { return _razred; }
  201. Kolekcija<Predmet*, DatumVrijeme> * GetPredmeti() { return _predmeti; }
  202. Uspjeh & operator=(Uspjeh & u) {
  203. _razred = u._razred;
  204. delete _predmeti;
  205. _predmeti = new Kolekcija<Predmet *, DatumVrijeme>(*u._predmeti);
  206. return *this;
  207. }
  208. friend ostream& operator<< (ostream &COUT, const Uspjeh &obj) {
  209. COUT << razred[obj._razred - 1] << *obj._predmeti << endl;
  210. return COUT;
  211. }
  212. };
  213.  
  214. class Kandidat {
  215. char * _imePrezime;
  216. char* _brojTelefona;
  217. int _trenutno;
  218. Uspjeh * _uspjeh;
  219. public:
  220. Kandidat(const char * imePrezime, const char* brojTelefona) :_trenutno(0), _uspjeh(nullptr) {
  221. _imePrezime = AlocirajNizKaraktera(imePrezime);
  222. _brojTelefona = AlocirajNizKaraktera(brojTelefona);
  223. }
  224.  
  225. ~Kandidat() {
  226. delete[] _imePrezime; _imePrezime = nullptr;
  227. delete[] _uspjeh;
  228. }
  229. /*
  230. uspjeh (tokom srednjoskolskog obrazovanja) se dodaje za svaki predmet na nivou razreda.
  231. tom prilikom onemoguciti:
  232. - dodavanje vise od 6 predmeta za jedan razred
  233. - dodavanje istoimenih predmeta na nivou jednog razreda,
  234. razredi (predmeti ili uspjeh) ne moraju biti dodavani sortiranim redoslijedom (npr. prvo se moze dodati uspjeh za II
  235. razred, pa onda za I razred i sl.). Funkcija vraca true ili false u zavisnosti od (ne)uspjesnost izvrsenja.
  236. */
  237. bool DodajPredmetKandidatu(eRazred razred, Predmet & predmet, DatumVrijeme & d) {
  238. for (size_t i = 0; i < _trenutno; i++)
  239. {
  240. if (_uspjeh[i].GetRazred() == razred) {
  241. Kolekcija<Predmet *, DatumVrijeme>*temp = _uspjeh[i].GetPredmeti();
  242. if (temp->getTrenutno() > 6) {
  243. return false;
  244. }
  245. for (size_t i = 0; i < temp->getTrenutno(); i++)
  246. {
  247. if (strcmp(temp->getElement1(i)->GetNaziv(), predmet.GetNaziv()) == 0) {
  248. return false;
  249. }
  250. }
  251. temp->AddElement(&predmet, d);
  252. return true;
  253. }
  254. }
  255. Uspjeh t(razred);
  256. t.GetPredmeti()->AddElement(&predmet, d);
  257. Uspjeh *temp = new Uspjeh[_trenutno + 1];
  258. for (size_t i = 0; i < _trenutno; i++)
  259. {
  260. temp[i] = _uspjeh[i];
  261. }
  262. temp[_trenutno] = t;
  263. delete[]_uspjeh;
  264. _uspjeh = temp;
  265. _trenutno++;
  266. return true;
  267. }
  268. int operator ()(eRazred razred) {
  269. float suma = 0;
  270. float PROSJECNA = 0;
  271. float brojac = 0;
  272. int trenutno;
  273. for (size_t i = 0; i < _trenutno; i++)
  274. {
  275. if (_uspjeh[i].GetRazred() == razred) {
  276. trenutno = _uspjeh[i].GetPredmeti()->getTrenutno();
  277. for(size_t j = 0; j <trenutno; j++)
  278. {
  279. suma += _uspjeh[i].GetPredmeti()->getElement1(j)->GetOcjenu();
  280. brojac++;
  281. }
  282. PROSJECNA = suma / brojac;
  283. return PROSJECNA;
  284. }
  285. }
  286.  
  287. }
  288. friend ostream& operator<< (ostream &COUT, Kandidat &obj) {
  289. COUT << obj._imePrezime << " " << obj._brojTelefona << endl;
  290. for (int i = 0; i < obj._trenutno; i++)
  291. COUT << obj._uspjeh[i] << endl;
  292. return COUT;
  293. }
  294. Uspjeh * GetUspjeh() { return _uspjeh; }
  295.  
  296. };
  297.  
  298. void main() {
  299. /****************************************************************************
  300. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  301. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR CE BITI OZNACENO KAO "RE"
  302. 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJECILO GUBLJENJE URAÐENOG ZADATKA
  303. 4. PROGRAMSKI CODE SE TAKOÐER NALAZI U FAJLU CODE.TXT
  304. 5. NAZIVI FUNKCIJA, TE BROJ I TIP PARAMETARA MORAJU BITI IDENTICNI ONIMA KOJI SU KORIŠTENI U TESTNOM CODE-U, OSIM U SLUCAJU DA POSTOJI ADEKVATAN RAZLOG ZA NJIHOVU MODIFIKACIJU. OSTALE, POMOCNE FUNKCIJE MOŽETE IMENOVATI I DODAVATI PO ŽELJI.
  305. 6. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNACENO.
  306. ****************************************************************************/
  307.  
  308. DatumVrijeme temp,
  309. datum19062018_1015(19, 6, 2018, 10, 15),
  310. datum20062018_1115(20, 6, 2018, 11, 15),
  311. datum30062018_1215(30, 6, 2018, 12, 15),
  312. datum05072018_1231(5, 7, 2018, 12, 31),
  313. datum20062018_1115_Copy(datum20062018_1115);
  314.  
  315. cout << datum20062018_1115;
  316.  
  317. const int kolekcijaTestSize = 10;
  318. Kolekcija<int, int> kolekcija1;
  319. for (int i = 0; i < kolekcijaTestSize; i++)
  320. kolekcija1.AddElement(i + 1, i * i);
  321. cout << kolekcija1 << endl;
  322.  
  323. Kolekcija<int, int> kolekcija2 = kolekcija1;
  324. cout << kolekcija2 << crt;
  325. Kolekcija<int, int> kolekcija3;
  326. kolekcija3 = kolekcija1;
  327. kolekcija3.SortOpadajuciByT2(); //od najvece prema najmanjoj vrijednosti
  328. cout << kolekcija3 << crt;
  329.  
  330.  
  331. //napomena se moze dodati i prilikom kreiranja objekta
  332. Predmet Matematika("Matematika", 5, "Ucesce na takmicenju"), Fizika("Fizika", 5), Hemija("Hemija", 2), Engleski("Engleski", 5);
  333. Fizika.DodajNapomenu("Pohvala za ostvareni uspjeh!"); // dodaje novu napomenu
  334. Fizika.DodajNapomenu("Pohvala za uspjeh na takmicenju!");
  335. //krajnji rezulat nakona dodavanja napomena: Pohvala za ostvareni uspjeh!; Pohvala za uspjeh na takmicenju!;
  336. cout << Fizika << endl;
  337. cout << Matematika << endl;
  338.  
  339. Kandidat jasmin("Jasmin Azemovic", "033 281 172");
  340. Kandidat adel("Adel Handzic", "033 281 170");
  341.  
  342. /*
  343. uspjeh (tokom srednjoskolskog obrazovanja) se dodaje za svaki predmet na nivou razreda.
  344. tom prilikom onemoguciti:
  345. - dodavanje vise od 6 predmeta za jedan razred
  346. - dodavanje istoimenih predmeta na nivou jednog razreda,
  347. razredi (predmeti ili uspjeh) ne moraju biti dodavani sortiranim redoslijedom (npr. prvo se moze dodati uspjeh za II
  348. razred, pa onda za I razred i sl.). Funkcija vraca true ili false u zavisnosti od (ne)uspjesnost izvrsenja.
  349. */
  350.  
  351.  
  352. if (jasmin.DodajPredmetKandidatu(DRUGI, Fizika, datum20062018_1115))
  353. cout << "Fizika za DRUGI uspjesno dodana!" << crt;
  354. else
  355. cout << "Fizika za DRUGI nije dodana!" << crt;
  356.  
  357. if (jasmin.DodajPredmetKandidatu(DRUGI, Hemija, datum30062018_1215))
  358. cout << "Hemija za DRUGI uspjesno dodana!" << crt;
  359. else
  360. cout << "Hemija za DRUGI nije dodana" << crt;
  361.  
  362. if (jasmin.DodajPredmetKandidatu(PRVI, Engleski, datum19062018_1015)) //ocjena 5
  363. cout << "Engleski za PRVI uspjesno dodan!" << crt;
  364. else
  365. cout << "Engleski za PRVI nije dodan" << crt;
  366.  
  367.  
  368. if (jasmin.DodajPredmetKandidatu(PRVI, Matematika, datum20062018_1115)) //ocjena 5
  369. cout << "Matematika za PRVI uspjesno dodana!" << crt;
  370. else
  371. cout << "Matematika za PRVI nije dodana!" << crt;
  372.  
  373. //ne treba dodati Matematiku jer je vec dodana u prvom razredu
  374. if (jasmin.DodajPredmetKandidatu(PRVI, Matematika, datum05072018_1231))
  375. cout << "Matematika za PRVI uspjesno dodana!" << crt;
  376. else
  377. cout << "Matematika za PRVI nije dodana!" << crt;
  378.  
  379. if (jasmin.DodajPredmetKandidatu(PRVI, Fizika, datum20062018_1115_Copy)) //ocjena 5
  380. cout << "Fizika za PRVI uspjesno dodana!" << crt;
  381. else
  382. cout << "Fizika za PRVI nije dodana" << crt;
  383.  
  384. cout << "Prosjecna ocjena Jasmina za PRVU godinu: " << jasmin(PRVI) << endl;//vraca uspjeh kandidata ostvaren u prvom razredu
  385.  
  386. system("pause");
  387. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement