Advertisement
Guest User

Untitled

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