Advertisement
Guest User

Untitled

a guest
Jan 21st, 2018
269
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.13 KB | None | 0 0
  1. #include<iostream>
  2. #include<string>
  3. #include<vector>
  4.  
  5. /****************************************************************************
  6. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  7. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ĆE BITI OZNACENO KAO "RE"
  8. 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEČILO GUBLJENJE URAĐENOG ZADATKA
  9. 4. NAZIVI FUNKCIJA, TE BROJ I TIP PARAMETARA MORAJU BITI IDENTIČNI ONIMA KOJI SU KORIŠTENI U TESTNOM CODE-U, OSIM U SLUČAJU DA POSTOJI ADEKVATAN RAZLOG ZA NJIHOVU MODIFIKACIJU. OSTALE, POMOĆNE FUNKCIJE MOŽETE IMENOVATI I DODAVATI PO ŽELJI.
  10. 5. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNAČENO.
  11. ****************************************************************************/
  12.  
  13. using namespace std;
  14.  
  15. enum Oblast { SoftverskiInzinjering, KomunikacijskiSistemi, SigurnostInformacijskihSistema, InteligentniSistemi };
  16. const char* oblast_txt[] = { "Softverski inzinjering", "Komunikacijski sistemi", "Sigurnost informacijskih sistema", "Inteligentni sistemi" };
  17.  
  18. template<class T1, class T2, int max>
  19. class Kolekcija {
  20. T1 _elementi1[max];
  21. T2 _elementi2[max];
  22. int _trenutno;
  23. public:
  24. Kolekcija()
  25. {
  26. _trenutno = 0;
  27. }
  28.  
  29. void AddElement(const T1& elem1, const T2& elem2)
  30. {
  31. if (_trenutno == max)
  32. throw exception("Dostigli ste maksimalan broj elemenata u kolekciji!");
  33.  
  34. //for (int i = 0; i < _trenutno; i++)
  35. //{
  36. // if (_elementi1[i] == elem1 || _elementi2[i] == elem2)
  37. // throw exception("Nije moguce dodati duple elemente u kolekciju!");
  38. //}
  39.  
  40. _elementi1[_trenutno] = elem1;
  41. _elementi2[_trenutno++] = elem2;
  42. }
  43.  
  44. T1 * getElementi1Pok() { return _elementi1; }
  45. T2 * getElementi2Pok() { return _elementi2; }
  46. T1 & getElement1(int lokacija) { return _elementi1[lokacija]; }
  47. T2 & getElement2(int lokacija) { return _elementi2[lokacija]; }
  48. int getTrenutno() { return _trenutno; }
  49.  
  50. friend ostream & operator<<(ostream & COUT, Kolekcija<T1, T2, max> & obj)
  51. {
  52. for (size_t i = 0; i < obj._trenutno; i++)
  53. {
  54. COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
  55. }
  56. return COUT;
  57. }
  58. };
  59.  
  60. //Deklaracija klase Nastavnik omogucava njeno koristenje u klasi ZavrsniRad, a definicija je data naknadno
  61. class Nastavnik;
  62.  
  63. class ZavrsniRad
  64. {
  65. char* _nazivTeme;
  66. Oblast* _oblastTeme;
  67. string _datumPrijave; //Format: dd.MM.gggg
  68. //U vector pohraniti samo adresu objekta tipa Nastavnik, dakle bez alokacije nove memorije
  69. vector<Nastavnik*> _komisija;
  70. string _datumOdbrane; //Format: dd.MM.gggg (najranije 2 mjeseca od datuma prijave)
  71. int _ocjena;
  72. public:
  73. ZavrsniRad() :_nazivTeme(nullptr), _oblastTeme(nullptr), _datumPrijave("NEMA VRIJEDNOST"), _datumOdbrane("NEMA VRIJEDNOST"), _ocjena(5)
  74. { }
  75.  
  76. bool operator==(ZavrsniRad&s)
  77. {
  78. return strcmp(_nazivTeme,s._nazivTeme) == 0;
  79. }
  80.  
  81.  
  82.  
  83. friend bool operator==(ZavrsniRad zv,ZavrsniRad zv1);
  84.  
  85. ZavrsniRad(string nazivTeme, Oblast oblastTeme, string datumPrijave,string datumOdbrane="") : _datumPrijave(datumPrijave), _oblastTeme(new Oblast(oblastTeme))
  86. {
  87. _nazivTeme = new char[nazivTeme.size() + 1];
  88. strcpy_s(_nazivTeme, nazivTeme.size() + 1, nazivTeme.c_str());
  89. }
  90. void zakaziOdbranuRada(string datumOdbrane, vector<Nastavnik*>komisija)
  91. {
  92. _datumOdbrane = datumOdbrane;
  93.  
  94. for (size_t i = 0; i < komisija.size(); i++)
  95. {
  96. komisija.push_back(komisija[i]);
  97. }
  98. }
  99.  
  100. ZavrsniRad(ZavrsniRad&zv)
  101. {
  102.  
  103. _nazivTeme = new char[strlen(zv._nazivTeme)+1];
  104. strcpy_s(_nazivTeme, strlen(zv._nazivTeme) + 1, zv._nazivTeme);
  105. _oblastTeme = new Oblast(zv.GetOblastTeme());
  106. _datumPrijave = zv._datumPrijave;
  107. _datumOdbrane = zv._datumOdbrane;
  108. _ocjena = zv._ocjena;
  109. for (size_t i = 0; i < zv._komisija.size(); i++)
  110. {
  111. _komisija.push_back(zv._komisija[i]);
  112. }
  113. }
  114. ~ZavrsniRad()
  115. {
  116. delete[] _nazivTeme; _nazivTeme = nullptr;
  117. delete _oblastTeme; _oblastTeme = nullptr;
  118. }
  119.  
  120. char* GetNazivTeme()const { return _nazivTeme; }
  121. Oblast GetOblastTeme()const { return *_oblastTeme; }
  122. string GetDatumOdbrane() { return _datumOdbrane; }
  123. string GetDatumPrijeve() { return _datumPrijave; }
  124.  
  125. int GetOcjena() { return _ocjena; }
  126. vector<Nastavnik*>& GetKomisija() { return _komisija; };
  127.  
  128. friend ostream& operator<<(ostream& COUT, ZavrsniRad& r)
  129. {
  130. COUT << "Tema rada: " << r._nazivTeme << endl;
  131. COUT << "Oblast teme: " << oblast_txt[*r._oblastTeme] << endl;
  132. COUT << "Datum prijave rada: " << r._datumPrijave << endl;
  133. //Podatke o nastavnicima nije moguce ispisati ovdje jer klasa jos nije definisana
  134. return COUT;
  135. }
  136. };
  137.  
  138. bool operator==(ZavrsniRad zv, ZavrsniRad zv1)
  139. {
  140. return(strcmp(zv._nazivTeme, zv1._nazivTeme) == 0);
  141. }
  142. class Nastavnik
  143. {
  144. string _imePrezime;
  145. Oblast _oblastIzboraUZvanje;
  146. //Parametar string predstavlja broj indeksa studenta koji prijavljuje zavrsni rad kod odredjenog nastavnika
  147. Kolekcija<string, ZavrsniRad, 10> _teme;
  148.  
  149. public:
  150. Nastavnik(string imePrezime, Oblast oblastIzboraUZvanje) : _imePrezime(imePrezime), _oblastIzboraUZvanje(oblastIzboraUZvanje)
  151. {}
  152.  
  153. string GetImePrezime() { return _imePrezime; }
  154. Oblast GetOblast() { return _oblastIzboraUZvanje; }
  155. Kolekcija<string, ZavrsniRad, 10>& GetTeme() { return _teme; };
  156. void DodajZavrsniRad(string brindexa,string nazivTeme,Oblast o,string datum) {
  157. _teme.AddElement(brindexa, ZavrsniRad(nazivTeme, o, datum));
  158.  
  159. }
  160.  
  161. void ZakaziOdbranuRada(string brojIndexa, string datum, vector<Nastavnik*>komisija)
  162. {
  163. /*Funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva definisanje datuma odbrane i liste clanova komisije
  164. pred kojima ce student braniti zavrsni rad. Odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio.
  165. Komisiju trebaju ciniti najmanje 2 nastavnika koji imaju izbor u zvanje u oblasti kojoj pripada tema rada.
  166. Datum odbrane ne smije biti manji od datuma prijave. U slucaju da bilo koji od navedenih uslova nije ispunjen funkcija treba da baci izuzetak*/
  167. bool studentPronadjen = false;
  168. int lok = -1;
  169. for (size_t i = 0; i < _teme.getTrenutno(); i++)
  170. {
  171. if (_teme.getElement1(i) == brojIndexa)
  172. {
  173. cout << "Pronadjena prijava rada :) " << endl;
  174. studentPronadjen = true;
  175.  
  176. }
  177. }
  178. if (!studentPronadjen)
  179. throw exception("Student nije prijavio zavrsni rad :( ");
  180.  
  181. int brojacPoOblasti = 0;
  182. for (size_t i = 0; i < komisija.size(); i++)
  183. {
  184. for (size_t j= 0; j < _teme.getTrenutno(); j++)
  185. {
  186. if (komisija[i]->GetOblast() == _teme.getElement2(j).GetOblastTeme())
  187. {
  188. brojacPoOblasti++;
  189.  
  190. }
  191. }
  192. }
  193. //if(brojacPoOblasti<2)
  194. // throw exception("Komisija ne sadrzi dovoljan broj strucnih nastavnika :( ");
  195. //for (size_t i = 0; i < _teme.getTrenutno(); i++)
  196. //{
  197. // if (_teme.getElement1(i) == brojIndexa)
  198. // {
  199. // if (_teme.getElement2(i).GetDatumPrijeve()<datum)
  200. // throw exception("Datum noje validan :( ");
  201. // }
  202. //}
  203. _teme.getElement2(lok).zakaziOdbranuRada(datum, komisija);
  204. }
  205.  
  206. };
  207. void main()
  208. {
  209. const int max = 4;
  210. Nastavnik* nastavnici[max];
  211.  
  212. nastavnici[0] = new Nastavnik("Denis Music", SoftverskiInzinjering);
  213. nastavnici[1] = new Nastavnik("Zanin Vejzovic", KomunikacijskiSistemi);
  214. nastavnici[2] = new Nastavnik("Jasmin Azemovic", SigurnostInformacijskihSistema);
  215. nastavnici[3] = new Nastavnik("Emina Junuz", SoftverskiInzinjering);
  216.  
  217. try
  218. {
  219. /*Funkcija DodajZavrsniRad ima zadatak da odredjenom nastavniku dodijeli mentorstvo na zavrsnom radu. Sprijeciti dodavanje zavrsnih radova sa istom temom vise puta. Nastavnik moze imati (mentorisati) samo radove iz oblasti za koju posjeduje izbor u zvanje.U slucaju da se nastavniku pokusa dodati rad koji nije iz njegove oblasti funkcija treba da baci izuzetak sa odgovarajucom porukom */
  220.  
  221. //indeks, naslov, oblast, datum prijave
  222. nastavnici[0]->DodajZavrsniRad("IB130011", "Multimedijalni informacijski sistem za visoko-obrazovnu ustanovu", SoftverskiInzinjering, "01.04.2017");
  223. nastavnici[0]->DodajZavrsniRad("IB120051", "Sistem za podršku rada kablovskog operatera", SoftverskiInzinjering, "03.03.2017");
  224.  
  225. nastavnici[1]->DodajZavrsniRad("IB140102", "Praktična analiza sigurnosti bežičnih računarskih mreža", KomunikacijskiSistemi, "22.08.2017");
  226.  
  227. nastavnici[2]->DodajZavrsniRad("IB140002", "Primjena teorije informacija u procesu generisanja kriptografskih ključeva", SigurnostInformacijskihSistema, "10.09.2017");
  228.  
  229. vector<Nastavnik*> komisija;//formira se komisija
  230. komisija.push_back(nastavnici[0]);
  231. komisija.push_back(nastavnici[2]);
  232. komisija.push_back(nastavnici[3]);
  233.  
  234. /*Funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva definisanje datuma odbrane i liste clanova komisije
  235. pred kojima ce student braniti zavrsni rad. Odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio.
  236. Komisiju trebaju ciniti najmanje 2 nastavnika koji imaju izbor u zvanje u oblasti kojoj pripada tema rada.
  237. Datum odbrane ne smije biti manji od datuma prijave. U slucaju da bilo koji od navedenih uslova nije ispunjen funkcija treba da baci izuzetak*/
  238. nastavnici[0]->ZakaziOdbranuRada("IB130011", "25.09.2017", komisija);
  239. nastavnici[0]->ZakaziOdbranuRada("IB130111", "25.09.2017", komisija);//student sa brojem indeksa IB130111 jos uvijek nije prijavio rad
  240. }
  241. catch (exception& ex)
  242. {
  243. cout << "GRESKA -> " << ex.what() << endl;
  244. }
  245.  
  246.  
  247.  
  248.  
  249. /*Studentu sa brojem indeksa IB130011 dodjeljuje ocjenu 8 na zavrsnom radu. Uslov za dodjelu ocjene je da student posjeduje definisan datum odbrane i listu clanova komisije.
  250. U zavisnosti od uspjesnosti izvrsenja, funkcija vraca true ili false*/
  251.  
  252. // if ((*nastavnici[0])("IB130011", 8))
  253. // cout << "Uspjesno ste ocijenili zavrsni rad!" << endl;
  254.  
  255. // /*Ispisuje sve podatke o nastavniku i njegovim mentorstvima. Za clanove komisije je dovoljno ispisati samo ime i prezime.*/
  256. // cout << *nastavnici[0] << endl;
  257.  
  258. // /*Funkcija PronadjiNajStudenta ima zadatak da pronadje broj indeksa studenta koji je na zavrsnom radu ostvario najvecu ocjenu kod nastavnika koji posjeduje najvecu prosjecnu ocjenu na zavrsnim radovima. Ukoliko se kod nastavnika sa najvecom prosjecnom ocjenom pojavi vise studenata sa istom ocjenom, onda funkcija vraca broj indeksa prvog pronadjenog studenta. Svim studentima koji su odbranili rad kod nastavnika sa najvecom prosjecno ocjenom, u zasebnom thread.u, poslati email poruku (mail adresa: brojIndeksa@edu.fit.ba) sa sadrzajem da su svoj zavrsni rad uspjesno odbranili sa vecom ili manjom ocjenom od prosjecne. Ukoliko niti jedan od nastavnika ne posjeduje evidentirano mentorstvo na zavrsnom radu, funkcija vraca tekst: NIJE PRONADJEN*/
  259.  
  260. // cout << "Najsupjesniji student: " << PronadjiNajStudenta(nastavnici, max) << endl;
  261.  
  262. // //Baca izuzetak zbog neadekvatnog izbora u zvanje, odnosno oblasti
  263. // nastavnici[2]->DodajZavrsniRad("IB150008", "Razvoj sistema autentifikacije na osnovu biometrije glasa", InteligentniSistemi, "15.05.2017");
  264. //}
  265. //catch (exception& ex)
  266. //{
  267. // cout << "GRESKA -> " << ex.what() << endl;
  268. //}
  269.  
  270. //for (int i = 0; i < max; i++)
  271. //{
  272. // delete nastavnici[i];
  273. // nastavnici[i] = nullptr;
  274. //}
  275. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement