Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<string>
- #include<regex>
- using namespace std;
- char*kreirajStrng(char*input)
- {
- if (input == nullptr)
- return nullptr;
- int len = strlen(input) + 1;
- char* povratni = new char[len];
- strcpy_s(povratni, len, input);
- return povratni;
- }
- //Koristiti klasu NedozvoljenaOperacija za bacanje izuzetaka u cijelom programu
- class NedozvoljenaOperacija : public exception
- {
- int _linijaKoda;
- public:
- NedozvoljenaOperacija(char* poruka, int linijaKoda) : exception(poruka)
- {
- _linijaKoda = linijaKoda;
- }
- void Info()
- {
- cout << "Greska u liniji koda " << _linijaKoda << ": " << exception::what() << endl;
- }
- };
- enum Kategorija { GameChallenge, InnovationChallenge, MobileChallenge, SQLChallenge, CodingChallenge };
- template<class T1, class T2>
- class FITKolekcija
- {
- T1* _elementi1;
- T2* _elementi2;
- int _trenutno;
- public:
- FITKolekcija()
- {
- _elementi1 = nullptr;
- _elementi2 = nullptr;
- _trenutno = 0;
- }
- FITKolekcija(const FITKolekcija& list)
- {
- _elementi1 = new T1[list._trenutno];
- _elementi2 = new T2[list._trenutno];
- for (int i = 0; i < list._trenutno; i++)
- {
- _elementi1[i] = list._elementi1[i];
- _elementi2[i] = list._elementi2[i];
- }
- _trenutno = list._trenutno;
- }
- ~FITKolekcija()
- {
- delete[] _elementi1;
- _elementi1 = nullptr;
- delete[] _elementi2;
- _elementi2 = nullptr;
- }
- bool Add(T1& el1, T2& el2)
- {
- for (int i = 0; i < _trenutno; i++)
- {
- if (_elementi1[i] == el1 || _elementi2[i] == el2)
- return false;
- }
- T1* temp1 = new T1[_trenutno + 1];
- T2* temp2 = new T2[_trenutno + 1];
- for (int i = 0; i < _trenutno; i++)
- {
- temp1[i] = _elementi1[i];
- temp2[i] = _elementi2[i];
- }
- delete[] _elementi1;
- delete[] _elementi2;
- _elementi1 = temp1;
- _elementi2 = temp2;
- _elementi1[_trenutno] = el1;
- _elementi2[_trenutno] = el2;
- _trenutno++;
- }
- bool Remove(int index)
- {
- if (index < 0 || index > _trenutno)
- return false;
- T1* temp1 = new T1[_trenutno - 1];
- T2* temp2 = new T2[_trenutno - 1];
- int j = 0;
- for (int i = 0; i < _trenutno; i++)
- {
- if (i != index)
- {
- temp1[j] = _elementi1[i];
- temp2[j] = _elementi2[i];
- j++;
- }
- }
- delete[] _elementi1;
- delete[] _elementi2;
- _elementi1 = temp1;
- _elementi2 = temp2;
- _trenutno--;
- return true;
- }
- T1& operator[](int index)
- {
- if (index >= 0 && index < _trenutno)
- return _elementi1[index];
- //U suprotnom baciti izuzetak
- }
- T2& GetElement2(int index)
- {
- if (index >= 0 && index < _trenutno)
- return _elementi2[index];
- else throw NedozvoljenaOperacija("nema elementa na tom indeksu!", __LINE__);
- //U suprotnom baciti izuzetak
- }
- T1* dohvatiElement1(int index)
- {
- return &_elementi1[index];
- }
- T2* dohvatiElement2(int index)
- {
- return &_elementi2[index];
- }
- int GetTrenutno()const { return _trenutno; }
- friend ostream& operator<< (ostream& COUT, FITKolekcija<T1,T2>& list)
- {
- for (int i = 0; i < list.GetTrenutno(); i++)
- {
- COUT << list._elementi1[i] << "\t" <<list._elementi2[i] << endl;
- }
- return COUT;
- }
- };
- //Klasu proglasiti apstraktnom
- class Osoba
- {
- protected:
- char* _ime;
- char* _prezime;
- int _godiste;
- public:
- Osoba(char* ime, char* prezime, int godiste)
- {
- int vel = strlen(ime) + 1;
- _ime = new char[vel];
- strcpy_s(_ime, vel, ime);
- vel = strlen(prezime) + 1;
- _prezime = new char[vel];
- strcpy_s(_prezime, vel, prezime);
- _godiste = godiste;
- }
- Osoba()
- {
- _ime = nullptr;
- _prezime = nullptr;
- }
- Osoba(Osoba& obj)
- {
- _ime = kreirajStrng(obj._ime);
- _prezime = kreirajStrng(obj._prezime);
- _godiste = obj._godiste;
- }
- virtual ~Osoba()=0
- {
- delete[] _ime;
- _ime = nullptr;
- delete[] _prezime;
- _prezime = nullptr;
- }
- Osoba& operator= (Osoba &o)
- {
- if (this == &o)
- return *this;
- delete[]_ime;
- delete[]_prezime;
- _ime = kreirajStrng(o._ime);
- _prezime = kreirajStrng(o._prezime);
- _godiste = o._godiste;
- }
- };
- //Prepoznati nasljedjivanje izmedju odgovarajući klasa
- //I ucesnici i clanovi komisije trebaju imati podatke za pristup sistemu (email i password)
- class Ucesnik: public Osoba
- {
- char* _email;
- string _password; //Najmanje 5 karaktera, kombinacija brojeva i velikih slova
- string _obrazovnaInstitucija;
- public:
- Ucesnik()
- {
- _email = kreirajStrng("---");
- }
- Ucesnik(char* ime, char* prezime, int godiste,char*email, string password, string institucija):Osoba(ime,prezime,godiste)
- {
- _email = kreirajStrng(email);
- password = password;
- _obrazovnaInstitucija = _obrazovnaInstitucija;
- }
- Ucesnik(Ucesnik& obj):Osoba(obj)
- {
- _email = kreirajStrng(obj._email);
- _password = obj._password;
- _obrazovnaInstitucija = obj._obrazovnaInstitucija;
- }
- ~Ucesnik()
- {
- delete[]_email;
- _email = nullptr;
- }
- Ucesnik& operator=(Ucesnik& obj)
- {
- if (this == &obj)
- return *this;
- Osoba::operator=(obj);
- delete[]_email;
- _email = kreirajStrng(obj._email);
- _password = obj._password;
- _obrazovnaInstitucija = obj._obrazovnaInstitucija;
- return *this;
- }
- bool operator==(Ucesnik& obj)
- {
- return (_email == obj._email);
- }
- friend ostream& operator<< (ostream& COUT, Ucesnik& obj)
- {
- COUT << obj._ime << " " << obj._prezime << " " << obj._godiste << endl;
- return COUT;
- }
- //Potrebne funkcije za rad sa klasom
- };
- class ClanKomisije:public Ucesnik {
- char* _pozicija; //Radno mjesto u firmi
- string _firma;
- public:
- ClanKomisije(char* ime, char* prezime,char* email,string password,string institucija,int godiste,char*pozicija, string firma):
- Ucesnik(ime,prezime,godiste,email,password,institucija)
- {
- _pozicija = kreirajStrng(pozicija);
- _firma = firma;
- }
- ClanKomisije()
- {
- _pozicija = kreirajStrng("---");
- }
- ClanKomisije(ClanKomisije& obj):Ucesnik(obj)
- {
- _pozicija = kreirajStrng(obj._pozicija);
- _firma = obj._firma;
- }
- ~ClanKomisije()
- {
- delete[]_pozicija;
- _pozicija = nullptr;
- }
- //Potrebne funkcije za rad sa klasom
- };
- //Prijave koje ne ukljucuju izradu i predaju projekata (kategorije: SQLChallenge i CodingChallenge)
- class Prijava {
- protected:
- string _datum; //Podrzani format: dd.MM.yyyy
- Kategorija _kategorija;
- FITKolekcija<Ucesnik, bool> _tim; //Tim se sastoji od jednog ili vise ucesnika, drugi paramtetar oznacava predstavnika tima
- public:
- Prijava(char* datum, Kategorija kategorija)
- {
- string rgx = "\\d{1,2}.\\d{1,4}.\\d{1,4}";
- regex obj(rgx);
- if (!regex_match(datum, obj))
- {
- cout << "Format datuma nije valjan,postavljen defaultni" << endl;
- _datum = "01.01.2017";
- }
- _datum = datum;
- _kategorija = kategorija;
- }
- virtual void Info()
- {
- cout << "Datum: " << _datum << endl;
- cout << "Kategorija: " << _kategorija << endl;
- cout << _tim;
- cout << endl;
- }
- void dodajUTim(Ucesnik ucesnik,bool predstavnik)
- {
- bool getPredstavnika = false;
- for (int i = 0; i < _tim.GetTrenutno(); i++)
- {
- if(_tim.GetElement2(i)==true)
- {
- getPredstavnika = true; break;
- }
- }
- if (_kategorija == SQLChallenge || _kategorija == CodingChallenge && _tim.GetTrenutno() >= 2)
- throw NedozvoljenaOperacija("Tim je popunjen!", __LINE__);
- if (_kategorija == GameChallenge || _kategorija == MobileChallenge&&_tim.GetTrenutno()>=3)
- throw NedozvoljenaOperacija("Tim je popunjen!", __LINE__);
- if (_kategorija == InnovationChallenge&& _tim.GetTrenutno()>=4)
- throw NedozvoljenaOperacija("Tim je popunjen!", __LINE__);
- if (predstavnik == true && getPredstavnika == true)
- throw NedozvoljenaOperacija("Tim vec ima predstavnika", __LINE__);
- _tim.Add(ucesnik,predstavnik);
- }
- void promijeniPredstavnika(int index)
- {
- if (index < 0 || index >= _tim.GetTrenutno())
- throw NedozvoljenaOperacija("Index nije valjan!", __LINE__);
- for (int i = 0; i < _tim.GetTrenutno(); i++)
- {
- if (_tim.GetElement2(i))
- {
- _tim.GetElement2(i) = false;
- }
- }
- _tim.GetElement2(index) = true;
- }
- Kategorija getKategoriju()
- {
- return _kategorija;
- }
- Ucesnik& getIme(int index)
- {
- return _tim[index];
- }
- //Konstruktor
- //Funkciju za dodavanje clanova tima uz postivanje ogranicenja maksimalno dozvoljenog broja clanova u timu.
- //SQLChallenge i CodingChallenge: 2
- //GameChallenge i MobileChallenge: 3
- //InnovationChallenge: 4
- //Onemoguciti dodavanje istog ucesnika vise puta. Tim moze imati najvise jednog predstavnika.
- //Funkciju za promjenu predstavnika tima.
- };
- //Prijave koje ukljucuju izradu projekata (kategorije: GameChallenge, InnovationChallenge i MobileChallenge)
- class PrijavaProjekta : public Prijava {
- char* _nazivProjekta;
- string _opisProjekta;
- bool _finalizirano; //Atribut oznacava da li je projekat zavrsen i predan u predvidjenom roku
- bool _prezentacija; //Projekti koji se prezentuju i ocjenjuju
- public:
- PrijavaProjekta(Prijava&prijava, char* nazivprojekta, string opisprojekta, bool finalizirano, bool prezentacija) :Prijava(prijava)
- {
- if (!(_kategorija == GameChallenge || _kategorija == InnovationChallenge || _kategorija == MobileChallenge))
- throw exception("Nije moguce kreirati projekat za ovu kategoriju!", __LINE__);
- _nazivProjekta = kreirajStrng(nazivprojekta);
- _opisProjekta = opisprojekta;
- _finalizirano = finalizirano;
- _prezentacija = prezentacija;
- }
- ~PrijavaProjekta()
- {
- delete[]_nazivProjekta;
- _nazivProjekta = nullptr;
- }
- bool setFinalizirano(bool finalizirano)
- {
- _finalizirano = finalizirano;
- }
- bool setPrezentacija(bool prezentacija)
- {
- _prezentacija = prezentacija;
- }
- void setOpisProjekta(string opis)
- {
- _opisProjekta = opis;
- }
- void Info()
- {
- cout << "Naziv projekta: " << _nazivProjekta << endl;
- cout << "Opis projekta: " << _opisProjekta << endl;
- Prijava::Info();
- cout << "Finalizirano :";
- if (_finalizirano)
- cout << "DA " << endl;
- else cout << "NE " << endl;
- cout << "Prezentirano :";
- if (_prezentacija)
- cout << "DA " << endl;
- else cout << "NE " << endl;
- }
- //Konstruktor i destruktor
- //Ostale potrebne funkcije za rad sa klasom
- };
- class FITCodingChallenge
- {
- int _godina;
- string _prijaveDo; //Podrzani format unosa: dd.MM.yyyy (koristiti regex)
- vector<Prijava*> _prijave;
- FITKolekcija<ClanKomisije, Kategorija> _komisija;
- FITKolekcija<Prijava*, FITKolekcija<ClanKomisije*, double>> _ocjene;
- public:
- FITCodingChallenge(int godina, string prijavedo)
- {
- _godina = godina;
- _prijaveDo = prijavedo;
- }
- bool operator+= (Prijava *p)
- {
- Prijava* novaPrijava;
- PrijavaProjekta* prijavaprojekta = dynamic_cast<PrijavaProjekta*>(p);
- Prijava* prijava = dynamic_cast<Prijava*>(p);
- if (prijavaprojekta != nullptr)
- novaPrijava = new PrijavaProjekta(*prijavaprojekta);
- else
- if (prijava!= nullptr)
- novaPrijava = new Prijava(*prijava);
- _prijave.push_back(novaPrijava);
- return true;
- }
- bool operator() (ClanKomisije c, Kategorija k)
- {
- for (int i = 0; i < _komisija.GetTrenutno(); i++)
- {
- if (_komisija[i] == c && k == _komisija.GetElement2(i))
- throw exception("Nemoguce dvaput dodati istog clana komisije u jednu kategoriju!", __LINE__);
- }
- _komisija.Add(*(new ClanKomisije(c)), *(new Kategorija(k)));
- return true;
- }
- //Konstruktor
- //Operator += za dodavanje novih prijava. Isti ucesnik ne moze imati vise prijava u sklopu iste kategorije.
- //Postovati ogranicenje roka za prijave (_prijaveDo).
- //Voditi racuna o alokaciji memorije za prijave (ne zadrzavati adresu proslijedjenog objekta)
- //Funkciju koja odredjenu prijavu oznacava kao finaliziranu i odabranu za prezentaciju ili ne.
- //Operator () za dodavanje clanova komisije po kategorijama. Sprijeciti dodavanje istih clanova u sklopu jedne kategorije.
- void IspisiKategorije(Kategorija k)
- {
- cout << "Ispis po kategoriji: " << endl;
- for (int i = 0; i < _prijave.size(); i++)
- {
- if (_prijave[i]->getKategoriju() == k)
- _prijave[i]->Info();
- }
- cout << endl;
- }
- //Funkciju za ispis svih prijava po kategorijama. Funkcija neobavezno prima parametar kategoriju.
- //Ispis treba da ukljuci i podatke o ucesnicima, odnosno clanovima tima.
- //Ukoliko kategorija nije proslijedjena, podaci treba da budu grupisani po kategorijama.
- //Funkciju za ocjenu projekata (radova) od strane clanova komisije (kolekcija _ocjene).
- //Kolekcija sadrzi samo pokazivace (bez alokacije nove memorije) na postojece prijave i vec definisane clanove komisije.
- //Voditi racuna da se ne mogu ocijeniti projekti koji nisu finalizirani i nisu odabrani za prezentaciju, niti da ocjenu mogu dati clanovi komisije koji
- //nisu pridruzeni odgovarajucoj kategoriji prijave. Svaki clan komisije daje ocjenu za svaki projekat, odnosno rad, u
- //kategoriji gdje je dodijeljen. Ocjene se krecu u rasponu od 1 do 10 za projekte, a za radove u kategoriji SQL ili CodingChallenge
- //u rasponu osvojenih bodova od 0 do 100. Pretpostaviti da su svi ucesnici prijavljeni u kategorijama SQL i CodingChallenge predali radove.
- //Funkcija koja na osnovu imena i prezimena clana komisije ispisuje podatke o njegovim ocjenama uključujući
- //prijave na koje se one odnose.
- //Funkcija koja na osnovu imena i prezimena ucesnika ispisuje podatke o njegovim prijavama na takmicenju, zajedno sa
- //ocjenama, ukoliko su one definisane za prijavu/e datog ucenika.
- //Funkciju za rangiranje kandidata na osnovu kategorije proslijedjene kao parametar.
- //Funkcija treba da na osnovu ocjena clanova komisije ispise rang liste timova zajedno sa prosjecnim ocjenama njihovih projekata (radova).
- //Dakle, konacna rang lista ukljucuje nazive timova (u zavisnosti od kategorije i naziv projekta), te prosjecnu ocjenu.
- //Funkciju Info koja ispisuje sve podatke o takmicenju: prijave i clanove komisije po kategorijama, projekte i
- };
- int main()
- {
- //Kreirati objekat klase FITCodingChallenge, te demonstrirati sve implementirane funkcionalnosti.
- Ucesnik u1("danijel", "tolj", 1995, "asdad@live.com", "dasda", "fit");
- Ucesnik u2("petar", "lukic", 1995, "asdad@live.com", "dasda", "fit");
- Ucesnik u3("josip", "jelica", 1995, "asdad@live.com", "dasda", "fit");
- Ucesnik u4("ivo", "gavran", 1996, "adasdaaa@gmailcom", "dsadsadad", "fit");
- Prijava p("22.11.2011", CodingChallenge);
- p.dodajUTim(u1, 0);
- p.dodajUTim(u2, 1);
- Prijava p2("22.2,2016", MobileChallenge);
- p2.dodajUTim(u3, 0);
- p2.dodajUTim(u4, 1);
- PrijavaProjekta prijavaprojekta(p2, "imeprojekta", "opisprojekta", 1, 1);
- FITCodingChallenge challenge(2015, "22.11.2015");
- challenge += &p;
- challenge += &prijavaprojekta;
- challenge.IspisiKategorije(CodingChallenge);
- challenge.IspisiKategorije(MobileChallenge);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement