Advertisement
Guest User

Untitled

a guest
May 20th, 2018
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.06 KB | None | 0 0
  1. // ConsoleApplication37.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5.  
  6.  
  7. #include<iostream>
  8. #include<memory>
  9. #include<cstring>
  10. using namespace std;
  11.  
  12.  
  13. enum VrstaObaveze { Seminarski, Parcijalni1, Parcijalni2, Integralni, Prakticni };
  14. struct Datum {
  15. int * _dan, *_mjesec, *_godina;
  16. void Unos(int d, int m, int g) {
  17. _dan = new int(d);
  18. _mjesec = new int(m);
  19. _godina = new int(g);
  20. }
  21. void Ispis() {
  22. cout << *_dan << "/" << *_mjesec << "/" << *_godina << endl;
  23. }
  24. void Dealociraj() { delete _dan; delete _mjesec; delete _godina;// moramo vratiti na nulu pokazivace
  25. _dan = nullptr; _mjesec = nullptr; _godina = nullptr;}
  26.  
  27. bool provjeraDana(Datum date,int brojDana)
  28. {
  29. if (_godina==date._godina)
  30. {
  31. if (_mjesec==date._mjesec)
  32. {
  33. if (_dan-date._dan<brojDana)
  34. {
  35. return true;
  36. }
  37. }
  38. }
  39. }
  40. };
  41. struct ObavezeNaPredmetu {
  42. shared_ptr<VrstaObaveze> _vrstaObaveze;
  43. Datum _datumIzvrsenja;
  44. char * _napomena;
  45. int _ocjena; // 5 - 10
  46. void Unos(VrstaObaveze vrsta, Datum datum, int ocjena,const char * napomena) {
  47. _vrstaObaveze=make_shared<VrstaObaveze>(vrsta);
  48. _datumIzvrsenja = datum;
  49. _ocjena = ocjena;
  50. _napomena = new char[strlen(napomena) + 1];
  51. strcpy_s(_napomena, strlen(napomena) + 1, napomena);
  52. }
  53. void Ispis() {
  54. cout << _vrstaObaveze<< " " << _ocjena << " " << _napomena;
  55. _datumIzvrsenja.Ispis();
  56. cout << endl;
  57. }
  58. void Dealociraj() {
  59. //_datumIzvrsenja.Dealociraj(); ne mozemo varijablu dealocirati pokazivac se dealocira
  60. delete[] _napomena; _napomena = nullptr;
  61. }
  62. };
  63.  
  64. const char * _kljucneRijeci[15] = { NULL }; /*da bi se odredjena obaveza na predmetu smatrala uspjesno
  65. izvrsenom, u napomeni (objekta ObavezeNaPredmetu) ne smije stajati
  66. niti jedna od rijeci koja se nalazi u nizu _kljucneRijeci*/
  67.  
  68. struct PolozeniPredmet
  69. {
  70. Datum _datumPolaganja;//datum koji ce se evidentirati kao datum kada je predmet polozen tj. kada je formirana konacna ocjena
  71. char * _nazivPredmeta;
  72. ObavezeNaPredmetu * _listaIzvrsenihObaveza;
  73. int _trenutnoIzvrsenihObaveza;
  74. int _minimalanBrojDana; //odnosi se na minimalan broj dana koji mora proci od izvrsenja pojedinih obaveza na predmetu (npr. 7 dana)
  75. int _konacnaOcjena; //formira se na osnovu ocjena izvrsenih obaveza
  76.  
  77. void Unos(const char * naziv, int minimalanBrojDana) {
  78. _nazivPredmeta = new char[strlen(naziv) + 1];
  79. strcpy_s(_nazivPredmeta, strlen(naziv) + 1, naziv);
  80. _listaIzvrsenihObaveza = nullptr;
  81. _trenutnoIzvrsenihObaveza = 0;
  82. _minimalanBrojDana = minimalanBrojDana;
  83. _konacnaOcjena = 0;
  84. }
  85. void Dealociraj() {
  86. //_datumPolaganja.Dealociraj(); ne moze se varijabla dealocirati mora biti pokazivac
  87. delete[] _nazivPredmeta; _nazivPredmeta = nullptr;
  88. for (size_t i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  89. _listaIzvrsenihObaveza[i].Dealociraj();
  90. delete[]_listaIzvrsenihObaveza;
  91. }
  92. bool DodajIzvrsenuObavezu(VrstaObaveze vrsta, Datum date, int ocjena, const char*napomena)
  93. {
  94. const char *pok = nullptr;
  95. for (int j = 0; j < 3; j++)
  96. {
  97. pok = strstr(napomena, _kljucneRijeci[j]);
  98. if (pok != nullptr)
  99. {
  100. cout << "Ne smije sadrzavati kljucne rijeci" << endl;
  101. return false;
  102. }
  103. }
  104.  
  105. for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  106. {
  107. if (_listaIzvrsenihObaveza[i]._datumIzvrsenja.provjeraDana(date,_minimalanBrojDana) == false)
  108. {
  109. cout << "Datum 1 mora biti manji datuma 2" << endl;
  110. return false;
  111. }
  112. if (*_listaIzvrsenihObaveza[i]._vrstaObaveze==vrsta && _listaIzvrsenihObaveza[i]._ocjena>5 && vrsta!=Seminarski)
  113. {
  114. cout << "Ocjena i vrsta" << endl;
  115. return false;
  116.  
  117. }
  118.  
  119. }
  120.  
  121.  
  122. if (_trenutnoIzvrsenihObaveza==0)
  123. {
  124. _listaIzvrsenihObaveza = new ObavezeNaPredmetu;
  125. _listaIzvrsenihObaveza->Unos(vrsta, date, ocjena, napomena);
  126. _trenutnoIzvrsenihObaveza++;
  127. }
  128. else
  129. {
  130. ObavezeNaPredmetu *temp = new ObavezeNaPredmetu[_trenutnoIzvrsenihObaveza + 1];
  131. temp[_trenutnoIzvrsenihObaveza].Unos(vrsta, date, ocjena, napomena);
  132. for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  133. {
  134. temp[i] = _listaIzvrsenihObaveza[i];
  135. }
  136. _trenutnoIzvrsenihObaveza++;
  137.  
  138. _listaIzvrsenihObaveza = nullptr;
  139. _listaIzvrsenihObaveza = new ObavezeNaPredmetu[_trenutnoIzvrsenihObaveza];
  140. for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  141. {
  142. _listaIzvrsenihObaveza[i] = temp[i];
  143. }
  144. delete[]temp;
  145. temp = nullptr;
  146. }
  147. }
  148. int FormirajKonacnuOcjenu()
  149. {
  150. int brojacPar=0, brojacSem=0, brojacPrak = 0,brojacDat=0;
  151. Datum par1, par2;
  152. bool temp = true;
  153. for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  154. {
  155. if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Integralni)
  156. {
  157. _konacnaOcjena = _listaIzvrsenihObaveza[i]._ocjena;
  158.  
  159. _datumPolaganja = _listaIzvrsenihObaveza[i]._datumIzvrsenja;
  160. return _konacnaOcjena;
  161. }
  162. if (*_listaIzvrsenihObaveza[i]._vrstaObaveze== Parcijalni1 || *_listaIzvrsenihObaveza[i]._vrstaObaveze==Parcijalni2)
  163. {
  164. if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Parcijalni1)
  165. {
  166. par1 = _listaIzvrsenihObaveza[i]._datumIzvrsenja;
  167. brojacDat++;
  168. }
  169. if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Parcijalni2)
  170. {
  171. par2 = _listaIzvrsenihObaveza[i]._datumIzvrsenja;
  172. brojacDat++;
  173. }
  174. if (brojacDat == 2)
  175. {
  176. if (*par1._mjesec > *par2._mjesec)
  177. {
  178. if (*par1._dan > *par2._dan)
  179. {
  180. cout << "Datum prvog parcijalnog mora biti manji od datuma drugog parcijalnog";
  181. _konacnaOcjena = 5;
  182. temp = false;
  183. }
  184. }
  185. }
  186. char *pok = nullptr;
  187. for (int j = 0; j < 3; j++)
  188. {
  189. pok = strstr(_listaIzvrsenihObaveza[i]._napomena, _kljucneRijeci[j]);
  190. if (pok != nullptr)
  191. {
  192. cout << "Ne smije biti kljucnih rijeci" << endl;
  193. _konacnaOcjena = 5;
  194. return _konacnaOcjena;
  195. }
  196. }
  197.  
  198. if (_listaIzvrsenihObaveza[i]._ocjena<=5)
  199. {
  200. cout << "Obaveze moraju imati vecu ocjenu od 5" << endl;
  201. _konacnaOcjena = 5;
  202. temp = false;
  203. }
  204. if (temp==true)
  205. {
  206. _konacnaOcjena += _listaIzvrsenihObaveza[i]._ocjena;
  207. brojacPar++;
  208. }
  209.  
  210.  
  211. }
  212. if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Seminarski)
  213. {
  214. if (_listaIzvrsenihObaveza[i]._ocjena>5)
  215. {
  216. brojacSem++;
  217. }
  218.  
  219. }
  220. if (*_listaIzvrsenihObaveza[i]._vrstaObaveze==Prakticni)
  221. {
  222. brojacPar;
  223. }
  224. if (brojacPar>=2)
  225. {
  226. if (brojacSem>=2)
  227. {
  228. if (brojacPrak>0)
  229. {
  230. _konacnaOcjena /= 5;
  231. return _konacnaOcjena;
  232. }
  233. }
  234. }
  235.  
  236. }
  237. _konacnaOcjena = 5;
  238. return _konacnaOcjena;
  239. }
  240. };
  241. bool ODDO(Datum OD, Datum DO, Datum DatObaveze)
  242. {
  243. if (*OD._godina<*DatObaveze._godina<*DO._godina)
  244. {
  245. return true;
  246. }
  247. if (*OD._godina==*DatObaveze._godina==*DO._godina)
  248. {
  249. if (*OD._mjesec<*DatObaveze._mjesec<*DO._mjesec)
  250. {
  251. return true;
  252. }
  253. if (*OD._mjesec==*DatObaveze._mjesec==*DO._mjesec)
  254. {
  255. if (*OD._dan==*DatObaveze._dan<*DO._dan)
  256. {
  257. return true;
  258. }
  259. }
  260. }
  261. }
  262. float PretragaRekurzivno(PolozeniPredmet predmet, VrstaObaveze vrsta, Datum OD, Datum DO, int brojac, float prosjek)
  263. {
  264. int brojac2 = 0;
  265. if (predmet._trenutnoIzvrsenihObaveza==brojac)
  266. {
  267. for (int i = 0; i < predmet._trenutnoIzvrsenihObaveza; i++)
  268. {
  269. if (*predmet._listaIzvrsenihObaveza[i]._vrstaObaveze == vrsta)
  270. {
  271. if (ODDO(OD, DO, predmet._listaIzvrsenihObaveza[i]._datumIzvrsenja) == true)
  272. {
  273. brojac2++;
  274. }
  275. }
  276. }
  277. return prosjek /= brojac2;
  278.  
  279. }
  280. else
  281. {
  282. if (*predmet._listaIzvrsenihObaveza[brojac]._vrstaObaveze == vrsta)
  283. {
  284. if (ODDO(OD, DO, predmet._listaIzvrsenihObaveza[brojac]._datumIzvrsenja) == true)
  285. {
  286. prosjek += predmet._listaIzvrsenihObaveza[brojac]._ocjena;
  287. }
  288. }
  289. return PretragaRekurzivno(predmet, vrsta, OD, DO, brojac+1, prosjek);
  290. }
  291. }
  292. int GetBrojObavezaIznadProsjeka(PolozeniPredmet predmet, float prosjek)
  293. {
  294. int brojac = 0,brojac2=0;
  295. auto lambd=[&brojac](PolozeniPredmet predmet,float prosjek)
  296. {
  297. for (int i = 0; i < predmet._trenutnoIzvrsenihObaveza; i++)
  298. {
  299. if (predmet._listaIzvrsenihObaveza[i]._ocjena>prosjek)
  300. {
  301. brojac=brojac+1;
  302. }
  303. }
  304. return brojac;
  305. };
  306. brojac2=lambd(predmet,prosjek);
  307. return brojac2;
  308. }
  309. void main() {
  310. _kljucneRijeci[0] = "prepisivao";
  311. _kljucneRijeci[1] = "ometao";
  312. _kljucneRijeci[2] = "nije dostavio";
  313.  
  314. Datum datumSeminarski1, datumSeminarski2, datumParcijalni1, datumParcijalni2, datumIntegralni;
  315. datumSeminarski1.Unos(10, 6, 2017);
  316. datumSeminarski2.Unos(18, 6, 2017);
  317. datumParcijalni1.Unos(22, 6, 2017);
  318. datumParcijalni2.Unos(30, 6, 2017);
  319.  
  320. PolozeniPredmet prII;
  321. //naziv predmeta, minimalan broj dana
  322. prII.Unos("Programiranje II", 7);
  323.  
  324. /*Na osnovu vrijednosti primljenih parametara osigurati dodavanje
  325. novoizvrsene obaveze na predmetu. Potrebno je onemoguciti dodavanje identicnih obaveza, a izmedju izvrsenja pojedinih obaveza mora proci
  326. najmanje onoliko dana koliko je definisano vrijednoscu atributa _minimalanBrojDana.
  327. Identicna vrsta obaveze se moze dodati samo u slucaju da je prethodno dodana obaveza (identicne vrste)
  328. imala ocjenu 5 ili je u napomeni sadrzavala neku od zabranjenih rijeci (definisanih nizom _kljucneRijeci).*/
  329. if (prII.DodajIzvrsenuObavezu(Parcijalni1, datumParcijalni1, 6, "uslovno polozen ispit"))
  330. cout << "Parcijalni 1...dodan" << endl;
  331. if (prII.DodajIzvrsenuObavezu(Parcijalni2, datumParcijalni2, 5, "previse gresaka, a tokom ispita ometao druge studente"))
  332. cout << "Parcijalni 2...dodan" << endl;
  333. if (prII.DodajIzvrsenuObavezu(Seminarski, datumSeminarski1, 8, "implementirani svi algoritmi"))
  334. cout << "Seminarski1...dodan" << endl;
  335. if (prII.DodajIzvrsenuObavezu(Seminarski, datumSeminarski2, 6, "rad slican kao kod studenta IB150388"))
  336. cout << "Seminarski2...dodan" << endl;
  337.  
  338. ///*Konacna ocjene predstavlja prosjecnu ocjenu na predmetu
  339. //(prosjecnu ocjenu izvrsenih obaveza koje ispunjavaju uslove za uspjesno polaganje predmeta),
  340. //a za njeno formiranje student mora posjedovati polozen integralni ili dva parijcalna ispita.
  341. /*Ukoliko je ispit polozen putem parcijalnih ispita, student takodjer mora imati pozitivno (ocjenom vecom od 5)
  342. ocijenjena najmanje dva seminarska i jedan prakticni rad. Takodjer, datum polaganja drugog parcijalnog ispita ne
  343. smije biti raniji (manji) od datuma polaganja prvog parcijalnog ispita. Konacna ocjena ne smije biti formirana u
  344. slucaju da napomena bilo koje odbaveze (koja je ucestvovala u formiranju konacne ocjene) sadrzi neku od zabranjenih
  345. rijeci (niz _kljucneRijeci). U slucaju da neki od navedenih uslova nije zadovoljen konacna ocjena treba biti postavljena na vrijednost 5.
  346. Ukoliko su ispunjeni svi uslovi, osim formiranja konacne ocjene, datum polaganja je potrebno postaviti na vrijednost datuma posljednje
  347. izvrsene obaveze sa najvecom ocjenom.*/
  348. //*/
  349. cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;
  350.  
  351. datumParcijalni2.Unos(22, 7, 2017);
  352. if (prII.DodajIzvrsenuObavezu(Parcijalni2, datumParcijalni2, 6, ""))
  353. cout << "Parcijalni 2...dodan" << endl;
  354. cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;
  355. Datum OD, DO; OD.Unos(1, 1, 2017); DO.Unos(1, 7, 2017);
  356.  
  357. /*Rekurzivna funkcija treba vratiti prosjecnu ocjenu uspjesno izvrsenih obaveze na predmetu
  358. odredjene vrste u definisanom periodu. Izbjegavati koristenje globalnih varijabli*/
  359. float prosjek = PretragaRekurzivno(prII, Seminarski, OD, DO, 0, 0);
  360. cout << "Prosjecna ocjena izvrsenih obaveza je: " << prosjek << endl;
  361.  
  362. /*Koristeci lambda-u, unutar funkcije GetBrojObavezaIznadProsjeka pronaci broj izvrsenih obaveza koje imaju istu ili vecu ocjenu od prosjecne*/
  363. int iznadProsjeka = GetBrojObavezaIznadProsjeka(prII, prosjek);
  364. cout << "Broj izvrsenih obaveza iznad prosjeka je: " << iznadProsjeka << endl;
  365.  
  366. datumParcijalni1.Dealociraj();
  367. datumParcijalni2.Dealociraj();
  368. datumSeminarski1.Dealociraj();
  369. datumSeminarski2.Dealociraj();
  370. //datumIntegralni.Dealociraj(); ne mozemo dealocirati kada ga nismo unusili
  371. prII.Dealociraj();
  372. system("pause>0");
  373. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement