Advertisement
Guest User

Untitled

a guest
Jan 20th, 2018
314
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.25 KB | None | 0 0
  1. // ConsoleApplication50.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include<iostream>
  6. #include<string>
  7. #include<regex>
  8.  
  9. using namespace std;
  10.  
  11. //Koristiti klasu NedozvoljenaOperacija za bacanje izuzetaka u cijelom programu
  12. class NedozvoljenaOperacija : public exception
  13. {
  14. int _linijaKoda;
  15. public:
  16. NedozvoljenaOperacija(const char* poruka, int linijaKoda) : exception(poruka)
  17. {
  18. _linijaKoda = linijaKoda;
  19. }
  20.  
  21. void Info()
  22. {
  23. cout << "Greska u liniji koda " << _linijaKoda << ": " << exception::what() << endl;
  24. }
  25. };
  26.  
  27. template<class T1, class T2>
  28. class FITKolekcija
  29. {
  30. T1* _elementi1;
  31. T2* _elementi2;
  32. int _trenutno;
  33. public:
  34. //Konstruktor, destruktor i ostale funkcije potrebne za rad sa klasom
  35. FITKolekcija()
  36. {
  37. _elementi1 = nullptr;
  38. _elementi2 = nullptr;
  39. _trenutno = 0;
  40. }
  41. FITKolekcija(const FITKolekcija<T1, T2> &org)
  42. {
  43. _trenutno = org._trenutno;
  44. _elementi1 = new T1[_trenutno];
  45. _elementi2 = new T2[_trenutno];
  46. for (size_t i = 0; i < _trenutno; i++)
  47. {
  48. _elementi1[i] = org._elementi1[i];
  49. _elementi2[i] = org._elementi2[i];
  50. }
  51. }
  52. ~FITKolekcija()
  53. {
  54. delete[]_elementi1;
  55. delete[]_elementi2;
  56. _elementi1 = nullptr;
  57. _elementi2 = nullptr;
  58. }
  59.  
  60. FITKolekcija & operator=(const FITKolekcija<T1, T2>& org)
  61. {
  62. if (this != &org)
  63. {
  64. delete[]_elementi1;
  65. delete[]_elementi2;
  66.  
  67. _trenutno = org._trenutno;
  68. _elementi1 = new T1[_trenutno];
  69. _elementi2 = new T2[_trenutno];
  70. for (size_t i = 0; i < _trenutno; i++)
  71. {
  72. _elementi1[i] = org._elementi1[i];
  73. _elementi2[i] = org._elementi2[i];
  74. }
  75.  
  76. }
  77. return *this;
  78. }
  79. void dodajElemente(T1 element1, T2 element2)
  80. {
  81. T1 *temp1 = new T1[_trenutno + 1];
  82. T2 *temp2 = new T2[_trenutno + 1];
  83.  
  84. for (size_t i = 0; i < _trenutno; i++)
  85. {
  86. temp1[i] = _elementi1[i];
  87. temp2[i] = _elementi2[i];
  88. }
  89. delete[]_elementi1;
  90. delete[]_elementi2;
  91.  
  92. temp1[_trenutno] = element1;
  93. temp2[_trenutno++] = element2;
  94.  
  95. _elementi1 = temp1;
  96. _elementi2 = temp2;
  97. }
  98. void RemoveElementPoLok(int lokacija)
  99. {
  100. if (lokacija<0 || lokacija>=_trenutno)
  101. return;
  102.  
  103. T1* temp1 = new T1[_trenutno - 1];
  104. T2* temp2 = new T2[_trenutno - 1];
  105. int j = 0;
  106.  
  107. for (size_t i = 0; i < _trenutno; i++)
  108. {
  109. if (i != lokacija)
  110. {
  111. temp1[j] = _elementi1[i];
  112. temp2[j++] = _elementi2[i];
  113. }
  114. }
  115. _trenutno--;
  116. delete[]_elementi1; delete[]_elementi2;
  117. _elementi1 = temp1;
  118. _elementi2 = temp2;
  119. }
  120.  
  121.  
  122.  
  123. T1 & getElement1(int lokacija)
  124. {
  125. if (lokacija >= 0 && lokacija < _trenutno)
  126. return _elementi1[lokacija];
  127. }
  128. T2 & getElement2(int lokacija)
  129. {
  130. if (lokacija >= 0 && lokacija < _trenutno)
  131. return _elementi2[lokacija];
  132. }
  133. int getTrenutno() { return _trenutno; }
  134.  
  135. bool operator==(FITKolekcija<T1, T2> &obj)
  136. {
  137. if (_trenutno != obj._trenutno)
  138. return false;
  139. for (size_t i = 0; i < _trenutno; i++)
  140. {
  141. if (_elementi1[i] == obj._elementi1[i] && _elementi2[i] == obj._elementi2[i])
  142. return true;
  143. }
  144. return false;
  145. }
  146.  
  147. friend ostream & operator<< <>(ostream &COUT, FITKolekcija<T1, T2> &org);
  148. };
  149. template<class T1, class T2>
  150. ostream & operator<< <>(ostream &COUT, FITKolekcija<T1, T2> &org)
  151. {
  152. COUT << "Elementi 1: " << endl;
  153. for (size_t i = 0; i < org._trenutno; i++)
  154. {
  155. COUT << org._elementi1[i] << ", ";
  156. }
  157. COUT << endl;
  158. COUT << "Elementi 2: " << endl;
  159. for (size_t i = 0; i < org._trenutno; i++)
  160. {
  161. COUT << org._elementi2[i] << ", ";
  162. }
  163. COUT << endl;
  164.  
  165. return COUT;
  166. }
  167.  
  168.  
  169.  
  170. enum Kategorija { GameChallenge, InnovationChallenge, MobileChallenge, SQLChallenge, CodingChallenge };
  171.  
  172. //Klasu proglasiti apstraktnom
  173. class Osoba
  174. {
  175. protected:
  176. char* _ime;
  177. char* _prezime;
  178. int _godiste;
  179. public:
  180. Osoba()
  181. {
  182. _ime = nullptr;
  183. _prezime = nullptr;
  184. _godiste = 2018;
  185. }
  186. Osoba(const char* ime, const char* prezime, int godiste)
  187. {
  188. int vel = strlen(ime) + 1;
  189. _ime = new char[vel];
  190. strcpy_s(_ime, vel, ime);
  191.  
  192. vel = strlen(prezime) + 1;
  193. _prezime = new char[vel];
  194. strcpy_s(_prezime, vel, prezime);
  195.  
  196. _godiste = godiste;
  197. }
  198. Osoba(const Osoba &org)
  199. {
  200. int vel = strlen(org._ime) + 1;
  201. _ime = new char[vel];
  202. strcpy_s(_ime, vel, org._ime);
  203.  
  204. vel = strlen(org._prezime) + 1;
  205. _prezime = new char[vel];
  206. strcpy_s(_prezime, vel, org._prezime);
  207.  
  208. _godiste = org._godiste;
  209.  
  210. }
  211. Osoba & operator=(const Osoba& org)
  212. {
  213. if (this != &org)
  214. {
  215. delete[]_ime; delete[]_prezime;
  216. int vel = strlen(org._ime) + 1;
  217. _ime = new char[vel];
  218. strcpy_s(_ime, vel, org._ime);
  219.  
  220. vel = strlen(org._prezime) + 1;
  221. _prezime = new char[vel];
  222. strcpy_s(_prezime, vel, org._prezime);
  223.  
  224. _godiste = org._godiste;
  225. }
  226. return *this;
  227. }
  228. bool operator==(const Osoba& obj)
  229. {
  230. if (strcmp(_ime, obj._ime) == 0 && strcmp(_prezime, obj._prezime) == 0 && _godiste == obj._godiste)
  231. return true;
  232. }
  233. virtual ~Osoba()
  234. {
  235.  
  236. delete[] _ime;
  237. _ime = nullptr;
  238.  
  239. delete[] _prezime;
  240. _prezime = nullptr;
  241. }
  242. virtual void Info()=0;
  243. /*{
  244. cout << _ime << "\n" << _prezime << "\n" << _godiste << endl;
  245. }*/
  246.  
  247. };
  248.  
  249. //Prepoznati nasljedjivanje izmedju odgovarajući klasa
  250. //I ucesnici i clanovi komisije trebaju imati podatke za pristup sistemu (email i password)
  251. class Ucesnik:virtual public Osoba
  252. {
  253. protected:
  254. char* _email;
  255. string password; //Najmanje 5 karaktera, kombinacija brojeva i velikih slova
  256. string _obrazovnaInstitucija;
  257. public:
  258. //Potrebne funkcije za rad sa klasom
  259. Ucesnik()
  260. {
  261. _email = nullptr;
  262. password = "-";
  263. _obrazovnaInstitucija = "-";
  264. }
  265. Ucesnik(const char* ime, const char* prezime, int godiste,const char* email, string pswd, string obrazovnaInstitucija)
  266. :Osoba(ime,prezime,godiste)
  267. {
  268. int size = strlen(email) + 1;
  269. _email = new char[size];
  270. strcpy_s(_email, size, email);
  271.  
  272. password = pswd;
  273. _obrazovnaInstitucija = obrazovnaInstitucija;
  274. }
  275. Ucesnik(const Ucesnik &org) :Osoba(org)
  276. {
  277. int size = strlen(org._email) + 1;
  278. _email = new char[size];
  279. strcpy_s(_email, size, org._email);
  280.  
  281. password = org.password;
  282. _obrazovnaInstitucija = org._obrazovnaInstitucija;
  283. }
  284. Ucesnik & operator=(const Ucesnik &org)
  285. {
  286. if (this != &org)
  287. {
  288. delete[]_email;
  289.  
  290. int size = strlen(org._email) + 1;
  291. _email = new char[size];
  292. strcpy_s(_email, size, org._email);
  293.  
  294. password = org.password;
  295. _obrazovnaInstitucija = org._obrazovnaInstitucija;
  296. }
  297. return *this;
  298. }
  299. bool operator==(const Ucesnik& obj)
  300. {
  301. if (strcmp(_email, obj._email) == 0 && _obrazovnaInstitucija == obj._obrazovnaInstitucija)
  302. return true;
  303. }
  304. ~Ucesnik()
  305. {
  306. delete[]_email;
  307. _email = nullptr;
  308. }
  309. void Info()
  310. {
  311. cout << _ime << "\n" << _prezime << "\n" << _godiste << endl;
  312. cout << _email << "\n" << password << "\n" << _obrazovnaInstitucija << endl;
  313. }
  314. };
  315.  
  316. class ClanKomisije:public Ucesnik {
  317. char* _pozicija; //Radno mjesto u firmi
  318. string _firma;
  319. public:
  320. //Potrebne funkcije za rad sa klasom
  321. ClanKomisije()
  322. {
  323. _pozicija = nullptr;
  324. _firma = "-";
  325. }
  326. ClanKomisije(const char* ime, const char* prezime, int godiste,const char* email, string pswd,string obrazovnaInstitucija,const char* pozicija, string firma)
  327. :Ucesnik(ime,prezime,godiste,email,pswd,obrazovnaInstitucija),
  328. Osoba(ime,prezime,godiste)
  329. {
  330. int size = strlen(pozicija) + 1;
  331. _pozicija = new char[size];
  332. strcpy_s(_pozicija, size, pozicija);
  333.  
  334. _firma = firma;
  335. }
  336. ClanKomisije(const ClanKomisije &org) :Ucesnik(org), Osoba(org)
  337. {
  338. int size = strlen(org._pozicija) + 1;
  339. _pozicija = new char[size];
  340. strcpy_s(_pozicija, size, org._pozicija);
  341.  
  342. _firma = org._firma;
  343. }
  344. ClanKomisije & operator=(const ClanKomisije& org)
  345. {
  346. if (this != &org)
  347. {
  348. delete[]_pozicija;
  349. int size = strlen(org._pozicija) + 1;
  350. _pozicija = new char[size];
  351. strcpy_s(_pozicija, size, org._pozicija);
  352.  
  353. _firma = org._firma;
  354. }
  355. }
  356. bool operator==(const ClanKomisije& obj)
  357. {
  358. if (strcmp(_pozicija, obj._pozicija) == 0 && _firma == obj._firma)
  359. return true;
  360. }
  361. ~ClanKomisije()
  362. {
  363. delete[]_pozicija;
  364. _pozicija = nullptr;
  365. }
  366. void Info()
  367. {
  368. cout << _ime << "\n" << _prezime << "\n" << _godiste << endl;
  369. cout << _email << "\n" << password << "\n" << _obrazovnaInstitucija << endl;
  370. cout << _pozicija << "\n" << _firma << endl;
  371.  
  372. }
  373. };
  374.  
  375. //Prijave koje ne ukljucuju izradu i predaju projekata (kategorije: SQLChallenge i CodingChallenge)
  376. class Prijava {
  377. protected:
  378. string _datum; //Podrzani format: dd.MM.yyyy
  379. Kategorija _kategorija;
  380. FITKolekcija<Ucesnik, bool> _tim; //Tim se sastoji od jednog ili vise ucesnika, drugi paramtetar oznacava predstavnika tima
  381. public:
  382. //Konstruktor
  383. Prijava(string datum, Kategorija kat)
  384. {
  385. _datum = datum;
  386. _kategorija = kat;
  387. }
  388. //Funkciju za dodavanje clanova tima uz postivanje ogranicenja maksimalno dozvoljenog broja clanova u timu.
  389. //SQLChallenge i CodingChallenge: 2
  390. //GameChallenge i MobileChallenge: 3
  391. //InnovationChallenge: 4
  392. //Onemoguciti dodavanje istog ucesnika vise puta. Tim moze imati najvise jednog predstavnika.
  393. bool DodajClanaTima(Ucesnik &uc, bool predstavnik=false)
  394. {
  395. if (_kategorija == SQLChallenge || _kategorija == CodingChallenge)
  396. {
  397. if (_tim.getTrenutno() > 2)
  398. return false;
  399. for (size_t i = 0; i < _tim.getTrenutno(); i++)
  400. {
  401. if (_tim.getElement1(i) == uc)
  402. return false;
  403. }
  404. _tim.dodajElemente(uc, predstavnik);
  405. }
  406.  
  407. if (_kategorija == GameChallenge || _kategorija == MobileChallenge)
  408. {
  409. if (_tim.getTrenutno() > 3)
  410. return false;
  411. for (size_t i = 0; i < _tim.getTrenutno(); i++)
  412. {
  413. if (_tim.getElement1(i) == uc)
  414. return false;
  415. }
  416. _tim.dodajElemente(uc, predstavnik);
  417. }
  418.  
  419. if (_kategorija == InnovationChallenge)
  420. {
  421. if (_tim.getTrenutno() > 4)
  422. return false;
  423. for (size_t i = 0; i < _tim.getTrenutno(); i++)
  424. {
  425. if (_tim.getElement1(i) == uc)
  426. return false;
  427. }
  428. _tim.dodajElemente(uc, predstavnik);
  429. }
  430. return true;
  431. }
  432.  
  433. //Funkciju za promjenu predstavnika tima.
  434. void PromjenaPredstavnikaTima(Ucesnik &uc)
  435. {
  436. for (size_t i = 0; i < _tim.getTrenutno(); i++)
  437. {
  438. if (_tim.getElement1(i) == uc)
  439. _tim.getElement2(i) = true;
  440. else
  441. _tim.getElement2(i) = false;
  442. }
  443. }
  444. };
  445.  
  446. //Prijave koje ukljucuju izradu projekata (kategorije: GameChallenge, InnovationChallenge i MobileChallenge)
  447. class PrijavaProjekta : public Prijava {
  448. char* _nazivProjekta;
  449. string _opisProjekta;
  450. bool _finalizirano; //Atribut oznacava da li je projekat zavrsen i predan u predvidjenom roku
  451. bool _prezentacija; //Projekti koji se prezentuju i ocjenjuju
  452. public:
  453. //Konstruktor i destruktor
  454. PrijavaProjekta(string datum, Kategorija kat,const char* nazivPr, string opisPr):Prijava(datum,kat) {
  455. int size = strlen(nazivPr) + 1;
  456. _nazivProjekta = new char[size];
  457. strcpy_s(_nazivProjekta, size, nazivPr);
  458. _opisProjekta = opisPr;
  459. _finalizirano = false;
  460. _prezentacija = false;
  461. }
  462. ~PrijavaProjekta()
  463. {
  464. delete[] _nazivProjekta;
  465. _nazivProjekta = nullptr;
  466. }
  467. //Ostale potrebne funkcije za rad sa klasom
  468.  
  469. };
  470.  
  471. class FITCodingChallenge
  472. {
  473. int godina;
  474. string _prijaveDo; //Podrzani format unosa: dd.MM.yyyy (koristiti regex)
  475. vector<Prijava*> _prijave;
  476. FITKolekcija<ClanKomisije, Kategorija> _komisija;
  477. FITKolekcija<Prijava*, FITKolekcija<ClanKomisije*, double>> _ocjene;
  478. public:
  479. //Konstruktor
  480.  
  481. //Operator += za dodavanje novih prijava. Isti ucesnik ne moze imati vise prijava u sklopu iste kategorije.
  482. //Postovati ogranicenje roka za prijave (_prijaveDo).
  483. //Voditi racuna o alokaciji memorije za prijave (ne zadrzavati adresu proslijedjenog objekta)
  484.  
  485. //Funkciju koja odredjenu prijavu oznacava kao finaliziranu i odabranu za prezentaciju ili ne.
  486.  
  487. //Operator () za dodavanje clanova komisije po kategorijama. Sprijeciti dodavanje istih clanova u sklopu jedne kategorije.
  488.  
  489. //Funkciju za ispis svih prijava po kategorijama. Funkcija neobavezno prima parametar kategoriju.
  490. //Ispis treba da ukljuci i podatke o ucesnicima, odnosno clanovima tima.
  491. //Ukoliko kategorija nije proslijedjena, podaci treba da budu grupisani po kategorijama.
  492.  
  493. //Funkciju za ocjenu projekata (radova) od strane clanova komisije (kolekcija _ocjene).
  494. //Kolekcija sadrzi samo pokazivace (bez alokacije nove memorije) na postojece prijave i vec definisane clanove komisije.
  495. //Voditi racuna da se ne mogu ocijeniti projekti koji nisu finalizirani i nisu odabrani za prezentaciju, niti da ocjenu mogu dati clanovi komisije koji
  496. //nisu pridruzeni odgovarajucoj kategoriji prijave. Svaki clan komisije daje ocjenu za svaki projekat, odnosno rad, u
  497. //kategoriji gdje je dodijeljen. Ocjene se krecu u rasponu od 1 do 10 za projekte, a za radove u kategoriji SQL ili CodingChallenge
  498. //u rasponu osvojenih bodova od 0 do 100. Pretpostaviti da su svi ucesnici prijavljeni u kategorijama SQL i CodingChallenge predali radove.
  499.  
  500. //Funkcija koja na osnovu imena i prezimena clana komisije ispisuje podatke o njegovim ocjenama uključujući
  501. //prijave na koje se one odnose.
  502.  
  503. //Funkcija koja na osnovu imena i prezimena ucesnika ispisuje podatke o njegovim prijavama na takmicenju, zajedno sa
  504. //ocjenama, ukoliko su one definisane za prijavu/e datog ucenika.
  505.  
  506. //Funkciju za rangiranje kandidata na osnovu kategorije proslijedjene kao parametar.
  507. //Funkcija treba da na osnovu ocjena clanova komisije ispise rang liste timova zajedno sa prosjecnim ocjenama njihovih projekata (radova).
  508. //Dakle, konacna rang lista ukljucuje nazive timova (u zavisnosti od kategorije i naziv projekta), te prosjecnu ocjenu.
  509.  
  510. //Funkciju Info koja ispisuje sve podatke o takmicenju: prijave i clanove komisije po kategorijama, projekte i
  511.  
  512. };
  513.  
  514.  
  515. int main()
  516. {
  517. //Kreirati objekat klase FITCodingChallenge, te demonstrirati sve implementirane funkcionalnosti.
  518.  
  519.  
  520. Ucesnik novi("Josip", "Jelica", 1999, "josipjelica@mail.com", "sifrapassword", "FIT");
  521. Ucesnik novi2 = novi;
  522. Ucesnik drugi("Milan", "Rapaic", 1995, "milanrapaic@mail.com", "sifrapassword", "FIT");
  523. ClanKomisije noviClan("Robert", "Prosinecki", 1998, "robertprosinecki@mail.com", "sifrapassword", "FIT", "sef", "FirmaNeka");
  524. ClanKomisije noviClan2 = noviClan;
  525. Prijava p1("20.01.2018", SQLChallenge);
  526.  
  527. if (p1.DodajClanaTima(novi,true))
  528. cout << "Clan tima uspjesno dodan!" << endl;
  529. if (p1.DodajClanaTima(drugi))
  530. cout << "Clan tima uspjesno dodan!" << endl;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement