Advertisement
Guest User

Untitled

a guest
Aug 18th, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.93 KB | None | 0 0
  1. #include <iostream>
  2. #include <tuple>
  3. #include <memory>
  4. #include <iomanip>
  5. #include <fstream>
  6. using namespace std;
  7. /*
  8. 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEĆE BODOVATI
  9. 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  10. 3. KREIRAJTE .DOC FAJL SA VAŠIM BROJEM INDEKSA ( NPR. IB160061.DOC BEZ IMENA I PREZIMENA), TE NA KRAJU ISPITA U NJEGA KOPIRAJTE RJEŠENJA VAŠIH ZADATAKA. NE PREDAVATI .TXT ILI .CPP FAJLOVE
  11. 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  12. 5. TOKOM IZRADE ISPITA MOGU BITI POKRENUTA SAMO TRI PROGRAMA: PDF READER (ISPITNI ZADACI), MS VISUAL STUDIO, MS WORD (U KOJI ĆETE KOPIRATI VAŠA RJEŠENJA)
  13. 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  14. */
  15. //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
  16. #pragma warning(disable:4996)
  17.  
  18. const char *crt = "\n-------------------------------------------\n";
  19.  
  20. enum eNacinStudiranja { REDOVAN, DL };
  21. enum eRazred { PRVI = 1, DRUGI, TRECI, CETVRTI };
  22.  
  23. const char* eNacinStudiranjaChar[] = { "REDOVAN", "DL" };
  24. const char* eRazredChar[] = { "PRVI", "DRUGI", "TRECI", "CETVRTI" };
  25.  
  26.  
  27. struct DatumVrijeme {
  28. int *_dan, *_mjesec, *_godina, *_sati, *_minuti;
  29.  
  30. int Dani()
  31. {
  32. return *_dan + *_mjesec*31 + *_godina*12*31;
  33. }
  34. char *GetDatumKaoNizKaraktera()
  35. {
  36. //*_dan << "." << *_mjesec << "." << *_godina << " " << *_sati << ":" << *_minuti << endl;
  37. char dan[3], mjesec[3], godina[5], sati[3], minuti[3];
  38.  
  39. itoa(*_dan, dan, 10);
  40. itoa(*_mjesec, mjesec, 10);
  41. itoa(*_godina, godina, 10);
  42. itoa(*_sati, sati, 10);
  43. itoa(*_minuti, minuti, 10);
  44.  
  45. int vel = strlen(dan) + strlen(mjesec) + strlen(godina) + strlen(sati) + strlen(minuti) + 1 + 4;
  46.  
  47.  
  48. char *temp = new char[vel];
  49.  
  50. strcpy_s(temp, vel, dan);
  51. strcat_s(temp, vel, ".");
  52. strcat_s(temp, vel, mjesec);
  53. strcat_s(temp, vel, ".");
  54. strcat_s(temp, vel, godina);
  55. strcat_s(temp, vel, " ");
  56. strcat_s(temp, vel, sati);
  57. strcat_s(temp, vel, ":");
  58. strcat_s(temp, vel, minuti);
  59.  
  60.  
  61. return temp;
  62.  
  63. }
  64.  
  65. void Unos(int dan = 1, int mjesec = 1, int godina = 2000, int sati = 0, int minuti = 0) {
  66. _dan = new int(dan);
  67. _mjesec = new int(mjesec);
  68. _godina = new int(godina);
  69. _sati = new int(sati);
  70. _minuti = new int(minuti);
  71. }
  72. void Dealociraj() {
  73. delete _dan; _dan = nullptr;
  74. delete _mjesec; _mjesec = nullptr;
  75. delete _godina; _godina = nullptr;
  76. delete _sati; _sati = nullptr;
  77. delete _minuti; _minuti = nullptr;
  78. }
  79. void Ispis() {
  80. cout << *_dan << "." << *_mjesec << "." << *_godina << " " << *_sati << ":" << *_minuti << endl;
  81. }
  82. };
  83.  
  84. DatumVrijeme rokZaPrijavu = { new int(5), new int(7), new int(2017), new int(12), new int(30) };
  85.  
  86.  
  87. struct Predmet {
  88. char * _naziv;
  89. int _ocjena;
  90. DatumVrijeme * _datumUnosa;
  91.  
  92. void Unos(const char * naziv, int ocjena, DatumVrijeme datumUnosa) {
  93. int vel = strlen(naziv) + 1;
  94. _naziv = new char[vel];
  95. strcpy_s(_naziv, vel, naziv);
  96. _ocjena = ocjena;
  97. _datumUnosa = new DatumVrijeme;
  98. _datumUnosa->Unos(*datumUnosa._dan, *datumUnosa._mjesec, *datumUnosa._godina, *datumUnosa._sati, *datumUnosa._minuti);
  99. }
  100. void Dealociraj() {
  101. delete[] _naziv; _naziv = nullptr;
  102. _datumUnosa->Dealociraj(); delete _datumUnosa;
  103. }
  104.  
  105. void Ispis() {
  106. //kreirati funkciju GetDatumKaoNizKaraktera() koja vraca vrijednosti atributa strukture datum kao niz karaktera
  107. cout << _naziv << " (" << _ocjena << ") " << _datumUnosa->GetDatumKaoNizKaraktera() << endl;
  108. }
  109. };
  110.  
  111. struct Uspjeh {
  112. eRazred _razred;
  113. Predmet * _predmeti;
  114. int _brojPredmeta;
  115.  
  116. void ProsiriPredmet(Predmet &p)
  117. {
  118. Predmet * t = new Predmet[_brojPredmeta+1];
  119. for (int i = 0; i < _brojPredmeta; i++)
  120. t[i] = _predmeti[i];
  121. delete[] _predmeti;
  122.  
  123. t[_brojPredmeta].Unos(p._naziv, p._ocjena, *p._datumUnosa);
  124. _predmeti = t;
  125. _brojPredmeta++;
  126. }
  127.  
  128.  
  129. void Unos(eRazred razred) {
  130. _razred = razred;
  131. _predmeti = nullptr;
  132. _brojPredmeta = 0;
  133. }
  134. void Dealociraj() {
  135. for (size_t i = 0; i < _brojPredmeta; i++)
  136. _predmeti[i].Dealociraj();
  137. delete[] _predmeti; _predmeti = nullptr;
  138. }
  139.  
  140. void Ispis() {
  141. cout << crt << "Razred -> " << _razred << crt;
  142. for (size_t i = 0; i < _brojPredmeta; i++)
  143. _predmeti[i].Ispis();
  144. }
  145. };
  146.  
  147. struct Kandidat {
  148. eNacinStudiranja _nacinStudiranja;
  149. char * _imePrezime;
  150. shared_ptr<Uspjeh> _uspjeh[4];
  151.  
  152.  
  153.  
  154.  
  155. /*
  156. uspjeh (tokom srednjoskolskog obrazovanja) se dodaje za svaki predmet na nivou razreda.
  157. prilikom dodavanja onemoguciti:
  158. - dodavanje predmeta za razrede koji nisu definisani enumeracijom,
  159.  
  160. - dodavanje istoimenih predmeta na nivou jednog razreda,
  161. - dodavanje predmeta nakon dozvoljenog roka za prijavu (rokZaPrijavu).
  162. razredi (predmeti ili uspjeh) ne moraju biti dodavani sortiranim redoslijedom (npr. prvo se moze dodati uspjeh za II razred,
  163. pa onda za I razred i sl.). Funkcija vraca true ili false u zavisnosti od (ne)uspjesnost izvrsenja
  164. */
  165. //ne bi trebao dodati jer je prosao postavljeni rok za dodavanje predmeta
  166. bool DodajPredmet(eRazred r, Predmet &p)
  167. {
  168. if (r > 4 || r < 1)
  169. return false;
  170. else if (p._datumUnosa->Dani() >= rokZaPrijavu.Dani())
  171. return false;
  172.  
  173. r = eRazred(r - 1);
  174. if (_uspjeh[r] == nullptr)
  175. {
  176. _uspjeh[r] = make_shared<Uspjeh>();
  177. _uspjeh[r]->Unos(eRazred(r + 1));
  178. }
  179.  
  180. for (int i = 0; i < _uspjeh[r]->_brojPredmeta; i++)
  181. if (strcmp(_uspjeh[r]->_predmeti[i]._naziv, p._naziv) == 0)
  182. return false;
  183.  
  184.  
  185. _uspjeh[r]->ProsiriPredmet(p);
  186. return true;
  187. }
  188.  
  189. void Unos(eNacinStudiranja nacinStudiranja, const char * imePrezime) {
  190. int vel = strlen(imePrezime) + 1;
  191. _imePrezime = new char[vel];
  192. strcpy_s(_imePrezime, vel, imePrezime);
  193. _nacinStudiranja = nacinStudiranja;
  194. for (size_t i = 0; i < 4; i++)
  195. _uspjeh[i] = nullptr;
  196. }
  197. void Dealociraj() {
  198. delete[] _imePrezime; _imePrezime = nullptr;
  199. for (size_t i = 0; i < 4; i++)
  200. if (_uspjeh[i] != nullptr)
  201. _uspjeh[i]->Dealociraj();
  202. }
  203. void Ispis() {
  204. cout << crt << _imePrezime << " " << _nacinStudiranja;
  205. for (size_t i = 0; i < 4; i++)
  206. if(_uspjeh[i] != nullptr)
  207. _uspjeh[i]->Ispis();
  208. }
  209. };
  210.  
  211. /*napisati rekurzivnu funkciju koja ce vratiti pokazivac na kandidata sa najvecom ocjenom na predmetu koji je proslijedjen kao
  212. parametar. ukoliko je vise kandidata ostvarilo istu ocjenu, funkcija treba da vrati onog kandidata koji je prvi evidentirao tu
  213. ocjenu (ako je isto vrijeme evidentiranja, onda funkcija vraca kandidata koji je prvi u nizu). u slucaju da niti jedan kandidat
  214. nije evidentirao trazeni predmet funkcija vraca nullptr. u nastavku je prikazan primjer poziva rekurzivne funkcije, a ostale
  215. parametre dodajte po potrebi.*/
  216. Kandidat * rekNajboljaOcjena(Kandidat* niz, int brojac, const char* naziv, Kandidat *najbolji = nullptr, int najbolja = -1, DatumVrijeme *datum = nullptr)
  217. {
  218. brojac--;
  219.  
  220. if (brojac == 0)
  221. return najbolji;
  222.  
  223. for (int i = 0; i < 4; i++)
  224. if(niz[brojac]._uspjeh[i] != nullptr)
  225. for (int j = 0; j < niz[brojac]._uspjeh[i]->_brojPredmeta; j++)
  226. if (strcmp(niz[brojac]._uspjeh[i]->_predmeti[j]._naziv, naziv) == 0)
  227. if (najbolja < niz[brojac]._uspjeh[i]->_predmeti[j]._ocjena)
  228. return rekNajboljaOcjena(niz, brojac, naziv, &niz[brojac], niz[brojac]._uspjeh[i]->_predmeti[j]._ocjena, niz[brojac]._uspjeh[i]->_predmeti[j]._datumUnosa);
  229. else if(najbolja == niz[brojac]._uspjeh[i]->_predmeti[j]._ocjena)
  230. if(niz[brojac]._uspjeh[i]->_predmeti[j]._datumUnosa->Dani() > datum->Dani())
  231. return rekNajboljaOcjena(niz, brojac, naziv, &niz[brojac], niz[brojac]._uspjeh[i]->_predmeti[j]._ocjena, niz[brojac]._uspjeh[i]->_predmeti[j]._datumUnosa);
  232.  
  233.  
  234. return rekNajboljaOcjena(niz, brojac, naziv, najbolji, najbolja, datum);
  235. }
  236.  
  237.  
  238.  
  239. void main()
  240. {
  241. DatumVrijeme datum19062017_1015, datum20062017_1115, datum30062017_1215, datum05072017_1231;
  242. datum19062017_1015.Unos(19, 6, 2017, 10, 15);
  243. datum20062017_1115.Unos(20, 6, 2017, 11, 15);
  244. datum30062017_1215.Unos(30, 6, 2017, 12, 15);
  245. datum05072017_1231.Unos(5, 7, 2017, 12, 31);
  246.  
  247. cout << datum19062017_1015.GetDatumKaoNizKaraktera() << endl;//9.6.2017 10:15
  248.  
  249. Predmet Matematika, Fizika, Hemija, Engleski;
  250. //2 - ocjena na predmetu; datum - datum evidentiranja uspjeha na predmetu jer postoji krajnji rok za evidentiranje
  251. Matematika.Unos("Matematika", 2, datum19062017_1015);
  252. Fizika.Unos("Fizika", 5, datum20062017_1115);
  253. Hemija.Unos("Hemija", 2, datum20062017_1115);
  254. Engleski.Unos("Engleski", 5, datum05072017_1231);
  255.  
  256. int brojKandidata = 2;
  257.  
  258. Kandidat * prijave2017 = new Kandidat[brojKandidata];
  259. prijave2017[0].Unos(DL, "Jasmin Azemovic");
  260. prijave2017[1].Unos(REDOVAN, "Indira Hamulic");
  261.  
  262. /*
  263. uspjeh (tokom srednjoskolskog obrazovanja) se dodaje za svaki predmet na nivou razreda.
  264. prilikom dodavanja onemoguciti:
  265. - dodavanje predmeta za razrede koji nisu definisani enumeracijom,
  266. - dodavanje istoimenih predmeta na nivou jednog razreda,
  267. - dodavanje predmeta nakon dozvoljenog roka za prijavu (rokZaPrijavu).
  268. razredi (predmeti ili uspjeh) ne moraju biti dodavani sortiranim redoslijedom (npr. prvo se moze dodati uspjeh za II razred, pa onda za I razred i sl.). Funkcija vraca true ili false u zavisnosti od (ne)uspjesnost izvrsenja
  269. */
  270. if (prijave2017[0].DodajPredmet(DRUGI, Engleski))//ne bi trebao dodati jer je prosao postavljeni rok za dodavanje predmeta
  271. cout << "Predmet uspjesno dodan!" << crt;
  272. if (prijave2017[0].DodajPredmet(DRUGI, Matematika))
  273. cout << "Predmet uspjesno dodan!" << crt;
  274. if (prijave2017[0].DodajPredmet(PRVI, Fizika))
  275. cout << "Predmet uspjesno dodan!" << crt;
  276. if (prijave2017[0].DodajPredmet(PRVI, Hemija))
  277. cout << "Predmet uspjesno dodan!" << crt;
  278.  
  279. Matematika._ocjena = 5;
  280. Hemija._ocjena = 3;
  281.  
  282. if (prijave2017[1].DodajPredmet(PRVI, Matematika))
  283. cout << "Predmet uspjesno dodan!" << crt;
  284. if (prijave2017[1].DodajPredmet(PRVI, Matematika))//ne bi trebalo ponovo dodati Matematiku!
  285. cout << "Predmet uspjesno dodan!" << crt;
  286. if (prijave2017[1].DodajPredmet(TRECI, Hemija))
  287. cout << "Predmet uspjesno dodan!" << crt;
  288. if (prijave2017[1].DodajPredmet(DRUGI, Engleski))//DODANO - Prosao rok? (vjerovatno)
  289. cout << "Predmet uspjesno dodan!" << crt;
  290.  
  291.  
  292. /*koristeci Lambda izraz kreirati funkciju koja ce vratiti uspjeh kandidata koji je ostvario najveci prosjek (na nivou
  293. razreda, a ne ukupni prosjek). ukoliko vise kandidata ima isti prosjek funkcija vraca uspjeh (najboljeg razreda) prvog
  294. pronadjenog kandidata*/
  295. auto najboljiUspjeh = [&]() -> shared_ptr<Uspjeh>
  296. {
  297.  
  298.  
  299.  
  300. int r, indeks = -1;
  301. float max = 0, suma = 0;
  302. cout << "Unesi razred: ";
  303. cin >> r;
  304.  
  305. for (int i = 0; i < brojKandidata; i++)
  306. if (prijave2017[i]._uspjeh[r] != nullptr)
  307. {
  308. for (int j = 0; j < prijave2017[i]._uspjeh[r]->_brojPredmeta; j++)
  309. suma += prijave2017[i]._uspjeh[r]->_predmeti[j]._ocjena;
  310. suma /= prijave2017[i]._uspjeh[r]->_brojPredmeta;
  311.  
  312. if (suma > max)
  313. {
  314. max = suma;
  315. indeks = i;
  316. }
  317. }
  318.  
  319. if (indeks == -1)
  320. return nullptr;
  321.  
  322. return prijave2017[indeks]._uspjeh[r];
  323. };
  324. shared_ptr<Uspjeh> najbolji = najboljiUspjeh();
  325. najbolji->Ispis();
  326.  
  327. /*
  328. napisati rekurzivnu funkciju koja ce vratiti pokazivac na kandidata sa najvecom ocjenom na predmetu koji je proslijedjen kao parametar. ukoliko je vise kandidata ostvarilo istu ocjenu, funkcija treba da vrati onog kandidata koji je prvi evidentirao tu ocjenu (ako je isto vrijeme evidentiranja, onda funkcija vraca kandidata koji je prvi u nizu). u slucaju da niti jedan kandidat nije evidentirao trazeni predmet funkcija vraca nullptr. u nastavku je prikazan primjer poziva rekurzivne funkcije, a ostale parametre dodajte po potrebi.
  329. */
  330. Kandidat * kandidatSaNajboljomOcjenom = rekNajboljaOcjena(prijave2017, brojKandidata, "Matematika");
  331. kandidatSaNajboljomOcjenom->Ispis();
  332. for (size_t i = 0; i < brojKandidata; i++)
  333. {
  334. prijave2017[i].Ispis();
  335. prijave2017[i].Dealociraj();
  336. }
  337. delete[] prijave2017;
  338. prijave2017 = nullptr;
  339.  
  340.  
  341. system("PAUSE>0");
  342. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement