Advertisement
Guest User

Untitled

a guest
Aug 21st, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.59 KB | None | 0 0
  1. #include<iostream>
  2. #include<fstream>
  3. using namespace std;
  4. //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
  5. #pragma warning(disable:4996)
  6.  
  7. enum VrstaObaveze { Seminarski, Parcijalni1, Parcijalni2, Integralni, Prakticni };
  8. char *Obaveze[] { "Seminarski", "Parcijalni1", "Parcijalni2", "Integralni", "Prakticni"};
  9. struct Datum {
  10. int *_dan, *_mjesec, *_godina;
  11. void Unos(int d, int m, int g) {
  12. _dan = new int(d); _mjesec = new int(m); _godina = new int(g);
  13. }
  14. void Ispis() { cout << *_dan << "/" << *_mjesec << "/" << *_godina << endl; }
  15. void Dealociraj() { delete _dan; delete _mjesec; delete _godina; }
  16. };
  17. struct ObavezeNaPredmetu {
  18. VrstaObaveze _vrstaObaveze;
  19. Datum * _datumIzvrsenja;
  20. char * _napomena;
  21. int _ocjena; // 5 - 10
  22. void Unos(VrstaObaveze vrsta, Datum * datum, int ocjena, char * napomena) {
  23. _vrstaObaveze = vrsta;
  24. _datumIzvrsenja = new Datum;
  25. _datumIzvrsenja->Unos(*datum->_dan, *datum->_mjesec, *datum->_godina);
  26. _ocjena = ocjena;
  27. int size = strlen(napomena) + 1;
  28. _napomena = new char[size];
  29. strcpy_s(_napomena, size, napomena);
  30. }
  31. void Ispis() {
  32. cout << _vrstaObaveze << " " << _ocjena << " " << _napomena;
  33. _datumIzvrsenja->Ispis();
  34. cout << endl;
  35. }
  36. void DodajNapomenu(char *napomena)
  37. {
  38. int x = strlen(_napomena);
  39. char *temp;
  40. temp = new char[strlen(_napomena) + 1];
  41. strcpy(temp, _napomena);
  42. _napomena = new char[strlen(napomena) + 2+strlen(temp)];
  43. strcpy(_napomena, temp);
  44. strcat(_napomena, " ");
  45. strcat(_napomena, napomena);
  46. }
  47. void Dealociraj() {
  48. _datumIzvrsenja->Dealociraj();
  49. delete[] _datumIzvrsenja; _datumIzvrsenja = nullptr;
  50. delete[] _napomena; _napomena = nullptr;
  51. }
  52. };
  53. struct PolozeniPredmet {
  54. char * _nazivPredmeta;
  55. ObavezeNaPredmetu * _listaIzvrsenihObaveza[10];//ogranicen je broj izvrsenih obavezan na predmetu
  56. int _trenutnoIzvrsenihObaveza=0;
  57. int _konacnaOcjena=0; //formira se na osnovu ocjena izvrsenih obaveza
  58. void Unos(char * naziv) {
  59. int size = strlen(naziv) + 1;
  60. _nazivPredmeta = new char[size];
  61. strcpy_s(_nazivPredmeta, size, naziv);
  62. _trenutnoIzvrsenihObaveza = 0;
  63. _konacnaOcjena = 5;
  64. }
  65. void Dealociraj() {
  66. delete[] _nazivPredmeta; _nazivPredmeta = nullptr;
  67. for (size_t i = 0; i < _trenutnoIzvrsenihObaveza; i++) {
  68. _listaIzvrsenihObaveza[i]->Dealociraj();
  69. delete _listaIzvrsenihObaveza[i];
  70. _listaIzvrsenihObaveza[i] = nullptr;
  71. }
  72. }
  73. void Ispis() {
  74. cout << _nazivPredmeta << "(" << _konacnaOcjena << ")" << endl;
  75. for (size_t i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  76. _listaIzvrsenihObaveza[i]->Ispis();
  77. }
  78. bool DodajIzvrsenuObavezu(ObavezeNaPredmetu obaveza)
  79. {
  80. bool istina = false;
  81. if (_trenutnoIzvrsenihObaveza == 0)
  82. {
  83. _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza] = new ObavezeNaPredmetu;
  84. _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza]->Unos(obaveza._vrstaObaveze, obaveza._datumIzvrsenja, obaveza._ocjena, obaveza._napomena);
  85. _trenutnoIzvrsenihObaveza++;
  86. return true;
  87. }
  88. else
  89. {
  90. for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  91. {
  92. if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == obaveza._vrstaObaveze)
  93. {
  94. if (_listaIzvrsenihObaveza[i]->_ocjena == 5)
  95. istina = true;
  96. if (obaveza._vrstaObaveze == Prakticni)
  97. {
  98. istina = true;
  99. }
  100. if (istina == true)
  101. {
  102. _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza] = new ObavezeNaPredmetu;
  103. _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza]->Unos(obaveza._vrstaObaveze, obaveza._datumIzvrsenja, obaveza._ocjena, obaveza._napomena);
  104. _trenutnoIzvrsenihObaveza++;
  105. return true;
  106. }
  107. istina = false;
  108. return false;
  109. }
  110. }
  111. _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza] = new ObavezeNaPredmetu;
  112. _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza]->Unos(obaveza._vrstaObaveze, obaveza._datumIzvrsenja, obaveza._ocjena, obaveza._napomena);
  113. _trenutnoIzvrsenihObaveza++;
  114. return true;
  115. }
  116. }
  117. int FormirajKonacnuOcjenu()
  118. {
  119. int brojac = 0;
  120. bool polozen1 = false,polozen2=false;
  121. for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  122. {
  123. if(_listaIzvrsenihObaveza[i]->_vrstaObaveze == Integralni)
  124. {
  125. _konacnaOcjena = _listaIzvrsenihObaveza[i]->_ocjena;
  126. return _konacnaOcjena;
  127. }
  128. }
  129. for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  130. {
  131. if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni1 && _listaIzvrsenihObaveza[i]->_ocjena>5)
  132. {
  133. polozen1 = true;
  134. }
  135. else if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni2 && _listaIzvrsenihObaveza[i]->_ocjena > 5)
  136. {
  137. polozen2 = true;
  138. }
  139. }
  140. if (polozen1 == true)
  141. cout << "Polozen1 = true";
  142. else
  143. cout << "Polozen2 = false";
  144. if (polozen2 == true)
  145. cout << "Polozen2 = true";
  146. else
  147. cout << "Polozen2 = false";
  148. if (polozen1 && polozen2)
  149. {
  150. for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  151. {
  152. if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Seminarski && _listaIzvrsenihObaveza[i]->_ocjena > 5)
  153. {
  154. cout <<"Ocjena: "<<_listaIzvrsenihObaveza[i]->_ocjena << endl;
  155. brojac++;
  156. }
  157. }
  158. }
  159. cout << "Brojac= " << brojac;
  160. if (brojac == 2)
  161. {
  162. for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  163. {
  164. _konacnaOcjena += _listaIzvrsenihObaveza[i]->_ocjena;
  165. }
  166. _konacnaOcjena /= _trenutnoIzvrsenihObaveza;
  167. }
  168. else
  169. {
  170. _konacnaOcjena = 5;
  171. }
  172. return _konacnaOcjena;
  173. }
  174. /*
  175. 1. DodajIzvrsenuObavezu – na osnovu vrijednosti primljenog parametra osigurati dodavanje novoizvrsene obaveze na predmetu.
  176. Potrebno je onemoguciti dodavanje identicnih obaveza. Identicna vrsta obaveze se moze dodati samo u slucaju da se radi o Prakticno radu ili je prethodno dodana obaveza
  177. (identicne vrste) imala ocjenu 5.
  178. 2. FormirajKonacnuOcjenu - formiranje konacne ocjene se vrsi prema sljedecim pravilima:
  179. student mora posjedovati polozen integralni ili dva parijcalna ispita; ukoliko je ispit polozen putem parcijalnih ispita,
  180. student takodjer mora imati pozitivno (ocjenom vecom od 5) ocijenjena najmanje dva seminarska rada u okviru kojih nije evidentirana losa napomena
  181. (rijeci koje oznacavaju losu napomenu: nije dobro, kopirano, nije ispravljeno); u slucaju da je ispit polozen putem integralnog ispita student mora imati polozen
  182. i prakticni ispit (polozen najkasnije 15 dana od dana polaganja integralnog ispita).
  183. */
  184. };
  185.  
  186. struct Student {
  187. char * _imePrezime;
  188. char * _brojIndeksa;
  189. PolozeniPredmet * _polozeniPredmeti;
  190. int _brojPolozenih;
  191. void Unos(char * IB, char * imePrezime) {
  192. int size = strlen(imePrezime) + 1;
  193. _imePrezime = new char[size];
  194. strcpy_s(_imePrezime, size, imePrezime);
  195. size = strlen(IB) + 1;
  196. _brojIndeksa = new char[size];
  197. strcpy_s(_brojIndeksa, size, IB);
  198. _brojPolozenih = 0;
  199. }
  200. bool DodajPolozeniPredmet(PolozeniPredmet predmet)
  201. {
  202. if (_brojPolozenih == 0)
  203. {
  204. _polozeniPredmeti = new PolozeniPredmet;
  205. _polozeniPredmeti->Unos(predmet._nazivPredmeta);
  206. _brojPolozenih++;
  207. return true;
  208. }
  209. else
  210. {
  211. for (int i = 0; i < _brojPolozenih; i++)
  212. {
  213. if (strcmp(_polozeniPredmeti[i]._nazivPredmeta, predmet._nazivPredmeta) == 0)
  214. return false;
  215. }
  216. }
  217. PolozeniPredmet *temp;
  218. temp = new PolozeniPredmet[_brojPolozenih];
  219. for (int i = 0; i < _brojPolozenih; i++)
  220. {
  221. temp[i] = _polozeniPredmeti[i];
  222. }
  223. delete[] _polozeniPredmeti;
  224. _polozeniPredmeti = new PolozeniPredmet[_brojPolozenih + 1];
  225. for (int i = 0; i < _brojPolozenih; i++)
  226. {
  227. _polozeniPredmeti[i] = temp[i];
  228. }
  229. delete[] temp;
  230. _polozeniPredmeti->Unos(predmet._nazivPredmeta);
  231. _brojPolozenih++;
  232. return true;
  233. }
  234. /*PolozeniPredmet *PronadjiNajuspjesnijuObavezu(VrstaObaveze obaveza)
  235. {
  236. PolozeniPredmet *temp;
  237. temp = new PolozeniPredmet;
  238. temp = nullptr;
  239. int ocjena = 5;
  240. for (int i = 0; i < _brojPolozenih; i++)
  241. {
  242. for (int j = 0; j < _brojPolozenih; j++)
  243. {
  244. if (ocjena < _polozeniPredmeti[i]._konacnaOcjena)
  245. {
  246. ocjena = _polozeniPredmeti[i]._konacnaOcjena;
  247. temp = &_polozeniPredmeti[i];
  248. }
  249. }
  250. }
  251. return temp;
  252. }*/
  253. /*
  254. 1. DodajPolozeniPredmet - na osnovu vrijednosti primljenog parametra osigurati dodavanje novopolozenog predmeta.
  255. Potrebno je onemoguciti dodavanje identicnih predmeta, predmeta koja ne posjeduju formiranu konacnu ocjenu,
  256. te predmeta kod kojih je u napomeni neke od izvrsenih obaveza navedena rijec 'prepisivao' ili 'izbacen'.
  257. 2. PronadjiNajuspjesnijuObavezu - vraca pokazivac na predmet u okviru koga je student ostvario najvecu ocjenu tokom realizacije odredjene obaveze
  258. (vrsta obaveze je proslijedjena kao parametar). Ukoliko postoje dva identicna predmeta, onda funkcija vraca pokazivac na posljednje pronadjeni predmet.
  259. U slucaju da obaveza nije pronadjena, funkcija vraca nullptr.
  260. */
  261.  
  262. void Ispis() {
  263. cout << _brojIndeksa << " " << _imePrezime << endl;
  264. for (size_t i = 0; i < _brojPolozenih; i++)
  265. _polozeniPredmeti[i].Ispis();
  266. }
  267. void Dealociraj() {
  268. delete[] _imePrezime; _imePrezime = nullptr;
  269. delete[] _brojIndeksa; _brojIndeksa = nullptr;
  270. for (size_t i = 0; i < _brojPolozenih; i++)
  271. _polozeniPredmeti[i].Dealociraj();
  272. delete[] _polozeniPredmeti;
  273. _polozeniPredmeti = nullptr;
  274.  
  275. }
  276. };
  277. void UpisiUBinarniFajl(PolozeniPredmet predmet)
  278. {
  279. char *niz,*n;
  280. niz = new char[strlen(predmet._nazivPredmeta) + 3];
  281. strcpy(niz, predmet._nazivPredmeta);
  282. strcat(niz, "_");
  283. n = new char[3];
  284. itoa(predmet._konacnaOcjena, n, 10);
  285. strcat(niz, n);
  286. ofstream upis(niz,ios::binary);
  287. for (int i = 0; i < predmet._trenutnoIzvrsenihObaveza; i++)
  288. {
  289. upis <<"Datum izvrsenja-> "<<*predmet._listaIzvrsenihObaveza[i]->_datumIzvrsenja->_dan<<"/"<< *predmet._listaIzvrsenihObaveza[i]->_datumIzvrsenja->_mjesec<<"/"<< *predmet._listaIzvrsenihObaveza[i]->_datumIzvrsenja->_godina<< endl;
  290. upis <<"Napomena-> "<<predmet._listaIzvrsenihObaveza[i]->_napomena << endl;
  291. upis <<"Ocjena-> "<<predmet._listaIzvrsenihObaveza[i]->_ocjena << endl;
  292. upis <<"Vrsta obaveze-> "<<Obaveze[i] << endl;
  293. }
  294. upis << "Predmet-> " << predmet._nazivPredmeta << endl;
  295. upis << "Konacna ocjena-> " << predmet._konacnaOcjena << endl;
  296. }
  297. //void UcitajIzBinarnogFajla(PolozeniPredmet prII_fromFajl, char *nazivFajla)
  298. //{
  299. //
  300. //}
  301. /*
  302. 1. UpisiUBinarniFajl - objekat koji je primljen kao parametar upisuje u binarni fajl. Naziv fajla treba biti sastavljen od naziva predmeta i konacne ocjena npr. "Programiranje II_6"
  303. 2. UcitajIzBinarnogFajla - u objekat koji je primljen kao parametar ucitava sadrzaj binarnog fajla (naziv fajla je takodjer proslijedjen kao parametar)
  304. */
  305. void main() {
  306. /*
  307. 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEĆE BODOVATI
  308. 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  309. 3. KREIRAJTE .DOC FAJL SA VAŠIM BROJEM INDEKSA ( NPR. IB130030.DOC BEZ IMENA I PREZIMENA), TE NA KRAJU ISPITA U NJEGA KOPIRAJTE RJEŠENJA VAŠIH ZADATAKA. NE PREDAVATI .TXT ILI .CPP FAJLOVE
  310. 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  311. 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)
  312. 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  313. */
  314.  
  315.  
  316. Datum datumSeminarski1, datumSeminarski2, datumParcijalni1, datumParcijalni2,
  317. datumIntegralni;
  318. datumSeminarski1.Unos(10, 6, 2016);
  319. datumSeminarski2.Unos(18, 6, 2016);
  320. datumParcijalni1.Unos(22, 3, 2016);
  321. datumParcijalni2.Unos(22, 6, 2016);
  322.  
  323. ObavezeNaPredmetu parcijalni1, parcijalni2, seminarski1, seminarski2;
  324. parcijalni1.Unos(Parcijalni1, &datumParcijalni1, 6, "uslovno polozen");
  325.  
  326. parcijalni2.Unos(Parcijalni2, &datumParcijalni2, 5, "previse gresaka");
  327. parcijalni2.DodajNapomenu("sugerisati da se vise paznje obrati na rad sa dinamickim nizovima");
  328.  
  329. seminarski1.Unos(Seminarski, &datumSeminarski1, 8, "implementirani svi algoritmi");
  330. seminarski1.DodajNapomenu("predloziti ucesce na FITCC 2017");//omogucava dodavanje dodatnih napomena vezano za obeveze na predmetu
  331.  
  332. seminarski2.Unos(Seminarski, &datumSeminarski2, 6, "rad slican kao kod studenta IB150388");
  333.  
  334.  
  335.  
  336. //polozeni predmet
  337. PolozeniPredmet prII, prII_FromFile;
  338. prII.Unos("Programiranje II");
  339. if (prII.DodajIzvrsenuObavezu(parcijalni1))
  340. cout << "Parcijalni 1...dodan" << endl;
  341. if (prII.DodajIzvrsenuObavezu(parcijalni2))
  342. cout << "Parcijalni 2...dodan" << endl;
  343. if (prII.DodajIzvrsenuObavezu(seminarski1))
  344. cout << "Seminarski1...dodan" << endl;
  345. if (prII.DodajIzvrsenuObavezu(seminarski2))
  346. cout << "Seminarski2...dodan" << endl;
  347.  
  348.  
  349. datumParcijalni2.Unos(22, 7, 2016);
  350. parcijalni2._datumIzvrsenja = &datumParcijalni2;
  351.  
  352. if (prII.DodajIzvrsenuObavezu(parcijalni2))
  353. cout << "Parcijalni 2...dodan" << endl;
  354. cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;
  355.  
  356. //manipulacija fajlovima
  357. UpisiUBinarniFajl(prII);
  358. prII.Ispis();
  359. //UcitajIzBinarnogFajla(prII_FromFile, "Programiranje II_5");
  360. //prII_FromFile.Ispis();
  361.  
  362. Student jasmin;
  363. jasmin.Unos("IB130031", "Jasmin Azemovic");
  364. if (jasmin.DodajPolozeniPredmet(prII))
  365. cout << "PRII uspjesno dodan!" << endl;
  366. //PolozeniPredmet * p = jasmin.PronadjiNajuspjesnijuObavezu(Seminarski);
  367. //cout << "Najuspjesniji seminarski je realizovan u okviru predmeta "; p->Ispis();
  368. //jasmin.Ispis();
  369.  
  370. //izvrsiti potrebne dealokacije
  371. prII.Dealociraj();
  372. parcijalni1.Dealociraj();
  373. //parcijalni2.Dealociraj();
  374. seminarski1.Dealociraj();
  375. seminarski2.Dealociraj();
  376. datumParcijalni1.Dealociraj();
  377. datumParcijalni2.Dealociraj();
  378. datumSeminarski1.Dealociraj();
  379. datumSeminarski2.Dealociraj();
  380. system("pause");
  381. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement