Advertisement
Guest User

Untitled

a guest
Aug 25th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.23 KB | None | 0 0
  1. #include<iostream>
  2. #include<exception>
  3. #include<vector>
  4. #include<string>
  5. #include<iterator>
  6. using namespace std;
  7.  
  8. /****************************************************************************
  9. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  10. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ĆE BITI OZNACENO KAO "RE"
  11. 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEČILO GUBLJENJE URAĐENOG ZADATKA
  12. 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.
  13. 5. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNAČENO.
  14. ****************************************************************************/
  15.  
  16. const char* nedozvoljena_operacija = "Nedozvoljena operacija";
  17. const char* not_set = "NOT_SET";
  18. const int min_polgavlja = 3;
  19. const int min_karaktera_po_poglavlju = 30;
  20.  
  21. char * AlocirajNizKaraktera(const char * sadrzaj) {
  22. if (sadrzaj == nullptr)
  23. return nullptr;
  24. int vel = strlen(sadrzaj) + 1;
  25. char * temp = new char[vel];
  26. strcpy_s(temp, vel, sadrzaj);
  27. return temp;
  28. }
  29.  
  30. template<class T1, class T2>
  31. class Kolekcija {
  32. T1 * _elementi1;
  33. T2 * _elementi2;
  34. int _trenutno;
  35. public:
  36. Kolekcija() :_trenutno(0), _elementi1(nullptr), _elementi2(nullptr) { }
  37.  
  38. ~Kolekcija() {
  39. delete[] _elementi1; _elementi1 = nullptr;
  40. delete[] _elementi2; _elementi2 = nullptr;
  41. }
  42. void AddElement(const T1& elem1, const T2& elem2) {
  43. for (int i = 0; i < _trenutno; i++)
  44. if (_elementi1[i] == elem1 || _elementi2[i] == elem2)
  45. throw exception(nedozvoljena_operacija);
  46.  
  47. T1 * temp1 = new T1[_trenutno + 1];
  48. T2 * temp2 = new T2[_trenutno + 1];
  49. for (int i = 0; i < _trenutno; i++) {
  50. temp1[i] = _elementi1[i];
  51. temp2[i] = _elementi2[i];
  52. }
  53. delete[] _elementi1; _elementi1 = nullptr;
  54. delete[] _elementi2; _elementi2 = nullptr;
  55. _elementi1 = temp1;
  56. _elementi2 = temp2;
  57.  
  58. _elementi1[_trenutno] = elem1;
  59. _elementi2[_trenutno++] = elem2;
  60.  
  61. }
  62.  
  63. T1 * getElementi1Pok() { return _elementi1; }
  64. T2 * getElementi2Pok() { return _elementi2; }
  65. T1 & getElement1(int lokacija) { return _elementi1[lokacija]; }
  66. T2 & getElement2(int lokacija) { return _elementi2[lokacija]; }
  67. int getTrenutno() { return _trenutno; }
  68.  
  69. friend ostream & operator<<(ostream & COUT, Kolekcija<T1, T2> & obj) {
  70. for (size_t i = 0; i < obj._trenutno; i++)
  71. COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
  72. return COUT;
  73. }
  74. };
  75. class Poglavlje {
  76. char * _naslov;
  77. char * _sadrzaj;
  78. bool _prihvaceno;
  79. int _ocjena;//da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6 - 10
  80. public:
  81. Poglavlje(const char * naslov = nullptr, const char * sadrzaj = nullptr)
  82. :_ocjena(0), _prihvaceno(false) {
  83. _naslov = AlocirajNizKaraktera(naslov);
  84. _sadrzaj = AlocirajNizKaraktera(sadrzaj);
  85. }
  86. ~Poglavlje() {
  87. delete[] _naslov; _naslov = nullptr;
  88. delete[] _sadrzaj; _sadrzaj = nullptr;
  89. }
  90. friend ostream & operator<<(ostream & COUT, Poglavlje & obj) {
  91. if (obj._naslov == nullptr || obj._sadrzaj == nullptr)
  92. return COUT;
  93. COUT << endl << obj._naslov << endl << obj._sadrzaj << endl;
  94. if (obj._prihvaceno)
  95. COUT << "Ocjena: " << obj._ocjena << endl;;
  96. return COUT;
  97. }
  98. char * GetNaslov() { return _naslov; }
  99. char * GetSadrzaj() { return _sadrzaj; }
  100. bool GetPrihvaceno() { return _prihvaceno; }
  101. int GetOcjena() { return _ocjena; }
  102.  
  103. void SetSadrzaj(string sadrzaj) {
  104. char *temp = AlocirajNizKaraktera((sadrzaj + string(_sadrzaj)).c_str());
  105. delete[] _sadrzaj;
  106. _sadrzaj = temp;
  107. }
  108.  
  109. void OcijeniPoglavlje(int ocjena) {
  110. _ocjena = ocjena;
  111. if (_ocjena > 5 && ocjena <= 10)
  112. _prihvaceno = true;
  113. }
  114. };
  115.  
  116. class ZavrsniRad {
  117. char* _tema;
  118. vector<Poglavlje> _poglavljaRada;
  119. string _datumOdbrane;
  120. float _konacnaOcjena; //prosjek ocjena svih poglavlja u zavrsnom radu koja se izracunava u momentu zakazivanja odbrane
  121. public:
  122. ZavrsniRad(const char * nazivTeme = nullptr) : _konacnaOcjena(0), _datumOdbrane(not_set) {
  123. _tema = AlocirajNizKaraktera(nazivTeme);
  124. }
  125.  
  126. ZavrsniRad(const ZavrsniRad& org) : _poglavljaRada(org._poglavljaRada), _konacnaOcjena(org._konacnaOcjena), _datumOdbrane(org._datumOdbrane) {
  127. _tema = AlocirajNizKaraktera(org._tema);
  128. }
  129.  
  130. ~ZavrsniRad() {
  131. delete[] _tema; _tema = nullptr;
  132. }
  133. /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj.
  134. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome
  135. zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor).
  136. u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
  137. //nazivPoglavlja, sadrzajPoglavlja
  138. void DodajPoglavlje(string nazivPoglavlja, string sadrzajPoglavlja) {
  139. for (vector<Poglavlje>::iterator i = _poglavljaRada.begin(); i != _poglavljaRada.end(); i++) {
  140. if (strcmp(i->GetNaslov(), nazivPoglavlja.c_str()) == 0) {
  141. i->SetSadrzaj(sadrzajPoglavlja);
  142. return;
  143. }
  144. }
  145. _poglavljaRada.push_back(Poglavlje(nazivPoglavlja.c_str(), sadrzajPoglavlja.c_str()));
  146. }
  147. void OcijeniPoglavlje(string naslov, int ocjena) {
  148. for (int i = 0; i < _poglavljaRada.size(); i++) {
  149. if (strcmp(_poglavljaRada[i].GetNaslov, naslov.c_str()) == 0) {
  150. _poglavljaRada[i].OcijeniPoglavlje(ocjena);
  151. return;
  152. }
  153. }
  154. }
  155. char* GetNazivTeme()const { return _tema; }
  156. vector<Poglavlje>& GetPoglavlja() { return _poglavljaRada; };
  157. string GetDatumOdbrane()const { return _datumOdbrane; }
  158. float GetOcjena() { return _konacnaOcjena; }
  159. friend ostream& operator<<(ostream& COUT, ZavrsniRad& obj) {
  160. COUT << "Tema rada: " << obj._tema << endl;
  161. COUT << "Sadrzaj: " << endl;
  162. for (size_t i = 0; i < obj._poglavljaRada.size(); i++)
  163. COUT << obj._poglavljaRada[i] << endl;
  164. COUT << "Datum odbrane rada: " << obj._datumOdbrane << endl << " Ocjena: " << obj._konacnaOcjena << endl;
  165. return COUT;
  166. }
  167. };
  168.  
  169. class Osoba {
  170. protected:
  171. string _imePrezime;
  172. public:
  173. Osoba(string imePrezime) : _imePrezime(imePrezime) {}
  174. string GetImePrezime() { return _imePrezime; }
  175. virtual void Info() = 0;
  176.  
  177. friend ostream &operator << (ostream &o, const Osoba &os) {
  178. o << os._imePrezime;
  179. return o;
  180. }
  181. };
  182.  
  183. class Nastavnik: public Osoba {
  184. //Parametar string predstavlja broj indeksa studenta koji prijavljuje zavrsni rad kod odredjenog nastavnika
  185. Kolekcija<string, ZavrsniRad> _teme;
  186. public:
  187. Nastavnik(string imeprezime) :Osoba(imeprezime) {}
  188. Kolekcija<string, ZavrsniRad>& GetTeme() { return _teme; };
  189.  
  190. friend ostream &operator<<(ostream &COUT, Nastavnik &n) {
  191. COUT << dynamic_cast<Osoba&>(n) << endl;
  192. COUT << "Teme: " << endl << n._teme;
  193. return COUT;
  194. }
  195. void info() { cout << *this << endl; }
  196.  
  197. /*funkcija DodajZavrsniRad ima zadatak da odredjenom nastavniku dodijeli mentorstvo na zavrsnom radu.
  198. zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
  199. sprijeciti dodavanje zavrsnih radova sa istom temom*/
  200. //brojIndeksa, zavrsniRad
  201. bool DodajZavrsniRad(string brojIndexa, ZavrsniRad z) {
  202. try
  203. {
  204. _teme.AddElement(brojIndexa, z);
  205. return true;
  206. }
  207. catch (const std::exception& e)
  208. {
  209. return false;
  210. }
  211. return false;
  212. }
  213. };
  214.  
  215. int main() {
  216. const int max = 4;
  217. Nastavnik * nastavnici[max];
  218.  
  219. nastavnici[0] = new Nastavnik("Denis Music");
  220. nastavnici[1] = new Nastavnik("Zanin Vejzovic");
  221. nastavnici[2] = new Nastavnik("Jasmin Azemovic");
  222. nastavnici[3] = new Nastavnik("Emina Junuz");
  223.  
  224.  
  225. ZavrsniRad multimedijalni("Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
  226. ZavrsniRad podrsa_operaterima("Sistem za podršku rada kablovskog operatera");
  227. ZavrsniRad analiza_sigurnosti("Prakticna analiza sigurnosti bežičnih računarskih mreža");
  228. ZavrsniRad kriptografija("Primjena teorije informacija u procesu generisanja kriptografskih ključeva");
  229.  
  230.  
  231. /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj.
  232. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome
  233. zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor).
  234. u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
  235. //nazivPoglavlja, sadrzajPoglavlja
  236. multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
  237. multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
  238. multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
  239. multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistema, a neke od najznacajnijih su ...");
  240. multimedijalni.DodajPoglavlje("Teorija multimedije", "Sadrzaj koji bi trebao stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130011");
  241.  
  242. //nazivPoglavlja, ocjena
  243. multimedijalni.OcijeniPoglavlje("Uvod", 8);
  244.  
  245.  
  246. /*funkcija DodajZavrsniRad ima zadatak da odredjenom nastavniku dodijeli mentorstvo na zavrsnom radu.
  247. zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
  248. sprijeciti dodavanje zavrsnih radova sa istom temom*/
  249. //brojIndeksa, zavrsniRad
  250. if (nastavnici[0]->DodajZavrsniRad("IB130011", multimedijalni))
  251. cout << "Zavrsni rad uspjesno dodat!" << endl;
  252. if (nastavnici[0]->DodajZavrsniRad("IB120051", podrsa_operaterima))
  253. cout << "Zavrsni rad uspjesno dodat!" << endl;
  254. if (!nastavnici[0]->DodajZavrsniRad("IB120056", podrsa_operaterima))//dupliranje rada
  255. cout << "Zavrsni rad nije dodat!" << endl;
  256. if (!nastavnici[0]->DodajZavrsniRad("IB120051", kriptografija)) //studentu vec dodijeljen rad
  257. cout << "Zavrsni rad nije dodat!" << endl;
  258. if (nastavnici[1]->DodajZavrsniRad("IB140102", analiza_sigurnosti))
  259. cout << "Zavrsni rad uspjesno dodat!" << endl;
  260. if (nastavnici[2]->DodajZavrsniRad("IB140002", kriptografija))
  261. cout << "Zavrsni rad uspjesno dodat!" << endl;
  262.  
  263. /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva definisanje
  264. datuma odbrane. odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio.
  265. Za zakazivanje odbrane rada moraju biti zadovoljeni sljedeci uslovi:
  266. 1. zavrsni rad mora imati broj poglavlja veci od minimalnog
  267. 2. svako poglavlje mora imati broj karaktera veci od minimalnog
  268. 3. svako poglavlje mora biti prihvaceno/odobreno
  269. ukoliko su zadovoljeni prethodni kriteriji, izracunava se konacna ocjena rada (prosjek ocjena svih poglavlja), postavlja datum odbrane rada i vraca pokazivac na rad kome je zakazan odbrana.
  270. u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija nije zadovoljen, funkcija vraca nullptr.
  271. */
  272.  
  273. //brojIndeksa, datumOdbrane
  274. ZavrsniRad * zr1 = nastavnici[0]->ZakaziOdbranuRada("IB130011", "25.09.2018");
  275. if (zr1 != nullptr)
  276. cout << *zr1 << endl;
  277.  
  278. zr1 = nastavnici[0]->ZakaziOdbranuRada("IB130111", "25.09.2018");//student sa brojem indeksa IB130111 jos uvijek nije prijavio rad
  279. if (zr1 != nullptr)
  280. cout << *zr1 << endl;
  281.  
  282. //ispisuje sve podatke o nastavniku i njegovim mentorstvima
  283. cout << *nastavnici[0] << endl;
  284.  
  285. /*Funkcija PronadjiNajStudenta ima zadatak da svim studentima koji su uspjesno okoncali svoj zavrsni rad kod nastavnika/mentora sa najnizom prosjecnom ocjenom
  286. i tom prilikom ostvarili ocjenu vecu od proslijedjene, u zasebnom thread.u, posalje email poruku (mail adresa: brojIndeksa@edu.fit.ba) sa sadrzajem, "Postovani {brojIndeksa}, uzimajuci u obzir cinjenicu da ste kod mentora {imePrezimeMentora} uspjesno odbranili rad sa ocjenom {ocjena} cast nam je pozvati vas na dodjelu nagrada za najbolje studente koja ce se odrzatu u na FIT-u 20.09.2018. godine."
  287. da su svoj zavrsni rad uspjesno odbranili sa vecom ili manjom ocjenom od prosjecne.
  288. funkcija treba da vrati sadrzaj svih poslatih email poruka, a ukoliko niti jedan od nastavnika ne posjeduje evidentirano mentorstvo na zavrsnom radu, funkcija vraca not_set*/
  289. cout << "Studenti za dodjelu nagrada: " << PosaljiPozivZaDodjeluNagrada(nastavnici, max, 9.5) << endl;
  290.  
  291. /*
  292. Koristeci postojeci programski code, demonstrirati i ukratko opisati polimorfizam.
  293. */
  294.  
  295. for (int i = 0; i < max; i++)
  296. {
  297. delete nastavnici[i];
  298. nastavnici[i] = nullptr;
  299. }
  300. system("pause>0");
  301. return 0;
  302. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement