Advertisement
Kenoo

Obaveze na predmetu ( uradjen )

May 26th, 2018
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.91 KB | None | 0 0
  1. #include<iostream>
  2. #include<fstream>
  3. using namespace std;
  4.  
  5. enum VrstaObaveze { Seminarski, Parcijalni1, Parcijalni2, Integralni, Prakticni };
  6. const char *charVrste[] = { "Seminarski", "Parcijalni1", "Parcijalni2", "Integralni", "Prakticni" };
  7.  
  8. struct Datum
  9. {
  10. int * _dan, *_mjesec, *_godina;
  11.  
  12. void Unos(int d, int m, int g)
  13. {
  14. _dan = new int(d);
  15. _mjesec = new int(m);
  16. _godina = new int(g);
  17. }
  18.  
  19. void Ispis()
  20. { cout << *_dan << "/" << *_mjesec << "/" << *_godina << endl; }
  21.  
  22. void Dealociraj()
  23. {
  24. delete _dan; delete _mjesec; delete _godina;
  25. _dan = _mjesec = _godina = nullptr;
  26. }
  27. };
  28.  
  29. struct ObavezeNaPredmetu
  30. {
  31. VrstaObaveze * _vrstaObaveze;
  32. Datum * _datumIzvrsenja;
  33. char * _napomena;
  34. int _ocjena; // 5 - 10
  35.  
  36. void Unos(VrstaObaveze vrsta, Datum * datum, int ocjena, const char * napomena)
  37. {
  38. _vrstaObaveze = new VrstaObaveze(vrsta);
  39. _datumIzvrsenja = new Datum;
  40. _datumIzvrsenja->Unos(*datum->_dan, *datum->_mjesec, *datum->_godina);
  41. _ocjena = ocjena;
  42. int size = strlen(napomena) + 1;
  43. _napomena = new char[size];
  44. strcpy_s(_napomena, size, napomena);
  45. }
  46.  
  47. void Ispis()
  48. {
  49. cout <<"Vrsta obaveze: "<< charVrste[*_vrstaObaveze] << "\nOcjena: " << _ocjena << "\nNapomena: " << _napomena;
  50. cout << "Datum izvrsenja: ";
  51. _datumIzvrsenja->Ispis();
  52. cout << endl;
  53. }
  54. void Dealociraj()
  55. {
  56. _datumIzvrsenja->Dealociraj();
  57. delete _vrstaObaveze; _vrstaObaveze = nullptr;
  58. delete _datumIzvrsenja; _datumIzvrsenja = nullptr;
  59. delete[] _napomena; _napomena = nullptr;
  60. }
  61. };
  62.  
  63. bool Proslo7dana(Datum d1, Datum d2)
  64. {
  65. if (*d1._godina == *d2._godina && *d1._mjesec == *d2._mjesec)
  66. {
  67. if (*d1._dan<*d2._dan - 7 || *d1._dan>*d2._dan - 7)
  68. return true;
  69. else return false;
  70. }
  71. else
  72. return true;
  73. }
  74. struct PolozeniPredmet
  75. {
  76. Datum _datumPolaganja;//datum koji ce se evidentirati kao datum kada je predmet polozen tj. kada je formirana konacna ocjena
  77. char * _nazivPredmeta;
  78. ObavezeNaPredmetu * _listaIzvrsenihObaveza[10];
  79. int _trenutnoIzvrsenihObaveza;
  80. int _konacnaOcjena; //formira se na osnovu ocjena izvrsenih obaveza
  81.  
  82. void Unos(const char *nazivPredmeta)
  83. {
  84. _nazivPredmeta = new char[strlen(nazivPredmeta) + 1];
  85. strcpy_s(_nazivPredmeta, strlen(nazivPredmeta) + 1, nazivPredmeta);
  86. _trenutnoIzvrsenihObaveza = 0;
  87. }
  88. void Dealokacija()
  89. {
  90. _datumPolaganja.Dealociraj();
  91. delete _nazivPredmeta; _nazivPredmeta = nullptr;
  92. for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  93. _listaIzvrsenihObaveza[i]->Dealociraj();
  94. }
  95.  
  96. void Ispis()
  97. {
  98. cout << "Naziv predmeta: " << _nazivPredmeta << endl;
  99. cout << "Datum polaganja: ";
  100. _datumPolaganja.Ispis();
  101. cout << "Konacna ocjena :" << _konacnaOcjena << endl;
  102. for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  103. {
  104. _listaIzvrsenihObaveza[i]->Ispis();
  105. }
  106. }
  107.  
  108. bool DodajIzvrsenuObavezu(VrstaObaveze obaveza, Datum datum,int ocjena, const char*napomena)
  109. {
  110. if (_trenutnoIzvrsenihObaveza >= 10)
  111. return false;
  112.  
  113. for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  114. {
  115. if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == obaveza)
  116. {
  117. if (charVrste[obaveza] == "Seminarski" || _listaIzvrsenihObaveza[i]->_ocjena==5)
  118. continue;
  119. else
  120. return false;
  121. }
  122. else if (Proslo7dana(*_listaIzvrsenihObaveza[i]->_datumIzvrsenja, datum)==false)
  123. {
  124. cout << "Nije proslo najmanje 7 dana" << endl;
  125. return false;
  126. }
  127. }
  128. _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza] = new ObavezeNaPredmetu;
  129. _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza]->Unos(obaveza, &datum, ocjena, napomena);
  130. _trenutnoIzvrsenihObaveza++;
  131. return true;
  132.  
  133.  
  134.  
  135. }
  136.  
  137. bool ImaLiPolozenParcijalni2ISeminarski()
  138. {
  139. int brojac = 0;
  140. for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  141. {
  142. if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni2)
  143. {
  144. if (_listaIzvrsenihObaveza[i]->_ocjena > 5)
  145. {
  146. if(strcmp(_listaIzvrsenihObaveza[i]->_napomena,"prepisivao")!=0 && (strcmp(_listaIzvrsenihObaveza[i]->_napomena, "izbacen") != 0))
  147. brojac++;
  148. }
  149.  
  150. }
  151. else if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Seminarski)
  152. {
  153. if (_listaIzvrsenihObaveza[i]->_ocjena > 5)
  154. {
  155. if (strcmp(_listaIzvrsenihObaveza[i]->_napomena, "prepisivao") != 0 && (strcmp(_listaIzvrsenihObaveza[i]->_napomena, "izbacen") != 0))
  156. brojac++;
  157. }
  158. }
  159. }
  160. if (brojac == 3)
  161. return true;
  162. else
  163. return false;
  164. }
  165. int Ocjena()
  166. {
  167. int ocjena = 0;
  168. for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  169. {
  170. if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni2)
  171. {
  172. ocjena += _listaIzvrsenihObaveza[i]->_ocjena;
  173.  
  174. }
  175. }
  176. return ocjena;
  177. }
  178.  
  179.  
  180.  
  181. int IndeksPosljednjeObaveze()
  182. {
  183. int p1 = 0, p2 = 0, s = 0;
  184. for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  185. {
  186. if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni1)
  187. p1 = i;
  188. else if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni2)
  189. p2 = i;
  190. else if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Seminarski)
  191. s = i;
  192. }
  193.  
  194. if (p1 > p2 && p1 > s)
  195. return p1;
  196. else if (p2 > p1 && p2 > s)
  197. return p2;
  198. else
  199. return s;
  200. }
  201.  
  202.  
  203. int FormirajKonacnuOcjenu()
  204. {
  205. for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  206. {
  207. if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Integralni)
  208. {
  209. if (_listaIzvrsenihObaveza[i]->_ocjena > 5)
  210. {
  211. _konacnaOcjena = _listaIzvrsenihObaveza[i]->_ocjena;
  212. return _konacnaOcjena;
  213. _datumPolaganja.Unos(*_listaIzvrsenihObaveza[i]->_datumIzvrsenja->_dan, *_listaIzvrsenihObaveza[i]->_datumIzvrsenja->_mjesec, *_listaIzvrsenihObaveza[i]->_datumIzvrsenja->_godina);
  214. }
  215. }
  216. else if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni1)
  217. {
  218. if (_listaIzvrsenihObaveza[i]->_ocjena > 5)
  219. {
  220. if (strcmp(_listaIzvrsenihObaveza[i]->_napomena, "prepisivao") != 0 && (strcmp(_listaIzvrsenihObaveza[i]->_napomena, "izbacen") != 0))
  221. {
  222. if (ImaLiPolozenParcijalni2ISeminarski())
  223. {
  224. _konacnaOcjena = (_listaIzvrsenihObaveza[i]->_ocjena + Ocjena()) / 2;
  225. _datumPolaganja.Unos(*_listaIzvrsenihObaveza[IndeksPosljednjeObaveze()]->_datumIzvrsenja->_dan, *_listaIzvrsenihObaveza[IndeksPosljednjeObaveze()]->_datumIzvrsenja->_mjesec, *_listaIzvrsenihObaveza[IndeksPosljednjeObaveze()]->_datumIzvrsenja->_godina);
  226. return _konacnaOcjena;
  227.  
  228.  
  229.  
  230. }
  231.  
  232. }
  233. }
  234. else
  235. return 5;
  236. }
  237.  
  238. }
  239. return 5;
  240. }
  241. /*
  242. 1. Unos - na osnovu vrijednosti primljenog parametra izvrsiti inicijalizaciju odgovarajucih atributa
  243. 2. DodajIzvrsenuObavezu – na osnovu vrijednosti primljenih parametara osigurati dodavanje novoizvrsene obaveze na predmetu.
  244. Potrebno je onemoguciti dodavanje identicnih obaveza, a izmedju izvrsenja pojedinih obaveza mora proci najmanje 7 dana.
  245. Identicna vrsta obaveze se moze dodati samo u slucaju da se radi o Seminarskom ili je prethodno dodana obaveza
  246. (identicne vrste)
  247. imala ocjenu 5. Ukoliko je moguce, osigurati prosirenje niza na nacin da prihvati vise od 10 obaveza.
  248.  
  249. 3. FormirajKonacnuOcjenu - konacna ocjene predstavlja prosjecnu ocjenu na predmetu, a za njeno formiranje student mora
  250. posjedovati polozen integralni ili dva parijcalna ispita. Ukoliko je ispit polozen putem parcijalnih ispita,
  251. student takodjer mora imati pozitivno (ocjenom vecom od 5) ocijenjena najmanje dva seminarska rada.
  252. U slucaju da bilo koji od navedenih uslova nije zadovoljenkonacna ocjena treba biti postavljena na vrijednost 5.
  253. Konacna ocjena, takodjer, ne smije biti formirana u slucaju da u napomeni od dvije obaveze stoji rijec 'prepisivao' ili
  254. 'izbacen'. Ukoliko su ispunjeni svi uslovi, osim formiranja konacne ocjene, kao datum polaganja je potrebno postaviti
  255. na vrijednost datuma posljednje izvrsene obaveze koja je usla u formiranje ocjene.
  256.  
  257. 4. Ispis – ispsuje vrijednosti svih atributa strukture
  258. */
  259. };
  260.  
  261.  
  262. //1. UpisiUBinarniFajl - objekat koji je primljen kao parametar upisuje u binarni fajl. Naziv fajla treba biti sastavljen od naziva predmeta i
  263. //konacne ocjena npr. "Programiranje II_6"
  264.  
  265. void UpisiUBinarniFajl(PolozeniPredmet &p)
  266. {
  267. char *ocjena;
  268. ocjena = new char[3];
  269. _itoa_s(p._konacnaOcjena, ocjena,strlen(ocjena), 10);
  270. char *nazivFajla = new char[strlen(p._nazivPredmeta) + strlen(ocjena)+2];
  271. strcpy_s(nazivFajla, strlen(p._nazivPredmeta) + strlen(ocjena) + 2, p._nazivPredmeta);
  272. strcat_s(nazivFajla, strlen(p._nazivPredmeta) + strlen(ocjena) + 2, "_");
  273. _itoa_s(p._konacnaOcjena, ocjena, 8, 10);
  274. strcat_s(nazivFajla, strlen(p._nazivPredmeta) + strlen(ocjena) + 2, ocjena);
  275.  
  276. ofstream fajl;
  277. fajl.open(nazivFajla, ios::binary);
  278. fajl.write((char*)(&p),sizeof(p));
  279. fajl.close();
  280. }
  281. //2. UcitajIzBinarnogFajla - u objekat koji je primljen kao parametar ucitava sadrzaj binarnog fajla (naziv fajla je takodjer proslijedjen kao parametar)
  282.  
  283. void UcitajIzBinarnogFajla(PolozeniPredmet &p, const char*naziv)
  284. {
  285. ifstream fajl;
  286. fajl.open(naziv, ios::binary);
  287. fajl.read((char*)(&p), sizeof(p));
  288. fajl.close();
  289. }
  290.  
  291. //3. PretragaRekurzivno - rekurzivna funkcija koja treba da vrati broj obaveza kod koji je student ostvario negativnu ocjenu
  292. int PretragaRekurzivno(PolozeniPredmet p, int brojPredmeta, int brojac = 0, int Brocjena = 0)
  293. {
  294. if (brojac == brojPredmeta)
  295. return Brocjena;
  296. else if (p._listaIzvrsenihObaveza[brojac]->_ocjena == 5)
  297. Brocjena += 1;
  298. PretragaRekurzivno(p, brojPredmeta, brojac + 1, Brocjena);
  299. }
  300. void main() {
  301. /*
  302. 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NECE BODOVATI
  303. 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  304. 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
  305. 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  306. 5. TOKOM IZRADE ISPITA MOGU BITI POKRENUTA SAMO TRI PROGRAMA: PDF READER (ISPITNI ZADACI), MS VISUAL STUDIO, MS WORD (U KOJI CETE KOPIRATI VAŠA RJEŠENJA)
  307. 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  308. */
  309.  
  310. Datum datumSeminarski1, datumSeminarski2, datumParcijalni1, datumParcijalni2,
  311. datumIntegralni;
  312. datumSeminarski1.Unos(10, 6, 2016);
  313. datumSeminarski2.Unos(18, 6, 2016);
  314. datumParcijalni1.Unos(22, 3, 2016);
  315. datumParcijalni2.Unos(22, 6, 2016);
  316.  
  317. //polozeni predmet
  318. PolozeniPredmet prII, prII_FromFile;
  319. prII.Unos("Programiranje II");
  320. if (prII.DodajIzvrsenuObavezu(Parcijalni1, datumParcijalni1, 6, "uslovno polozen"))
  321. cout << "Parcijalni 1...dodan" << endl;
  322. if (prII.DodajIzvrsenuObavezu(Parcijalni2, datumParcijalni2, 5, "previse gresaka"))
  323. cout << "Parcijalni 2...dodan" << endl;
  324. if (prII.DodajIzvrsenuObavezu(Seminarski, datumSeminarski1, 8, "implementirani svi algoritmi"))
  325. cout << "Seminarski1...dodan" << endl;
  326. if (prII.DodajIzvrsenuObavezu(Seminarski, datumSeminarski2, 6, "rad slican kao kod studenta IB150388"))
  327. cout << "Seminarski2...dodan" << endl;
  328.  
  329. cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;
  330.  
  331. datumParcijalni2.Unos(22, 7, 2016);
  332. if (prII.DodajIzvrsenuObavezu(Parcijalni2, datumParcijalni2, 6, ""))
  333. cout << "Parcijalni 2...dodan" << endl;
  334. cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;
  335.  
  336. //rekurzija
  337. cout << "Broj negativnih ocjena je: " << PretragaRekurzivno(prII,prII._trenutnoIzvrsenihObaveza) << endl;
  338. cout << "\n------------------------------------------------------------------------------------------------\n";
  339.  
  340. ////manipulacija fajlovima
  341. UpisiUBinarniFajl(prII);
  342. prII.Ispis();
  343. UcitajIzBinarnogFajla(prII_FromFile, "Programiranje II_8");
  344. prII_FromFile.Ispis();
  345.  
  346. datumSeminarski1.Dealociraj();
  347. datumSeminarski2.Dealociraj();
  348. datumParcijalni1.Dealociraj();
  349. datumParcijalni2.Dealociraj();
  350. prII.Dealokacija();
  351.  
  352. system("pause");
  353.  
  354. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement