Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<string>
- #include<regex>
- #include<exception>
- using namespace std;
- //Koristiti klasu NedozvoljenaOperacija za bacanje izuzetaka u cijelom programu
- class NedozvoljenaOperacija : public exception
- {
- int _linijaKoda;
- public:
- NedozvoljenaOperacija(const char* poruka, int linijaKoda) : exception(poruka)
- {
- _linijaKoda = linijaKoda;
- }
- void Info()
- {
- cout << "Greska u liniji koda " << _linijaKoda << ": " << exception::what() << endl;
- }
- };
- template<class T1, class T2>
- class FITKolekcija
- {
- T1* _elementi1;
- T2* _elementi2;
- int _trenutno;
- public:
- //Konstruktor, destruktor i ostale funkcije potrebne za rad sa klasom
- FITKolekcija()
- {
- _elementi1 = nullptr;
- _elementi2 = nullptr;
- _trenutno = 0;
- }
- ~FITKolekcija()
- {
- delete[] _elementi1;
- _elementi1 = nullptr;
- delete[] _elementi2;
- _elementi2 = nullptr;
- }
- void Add(T1& el1, T2& el2)
- {
- T1* temp1 = new T1[_trenutno + 1];
- T2* temp2 = new T2[_trenutno + 1];
- for (int i = 0; i < _trenutno; i++)
- {
- temp1[i] = _elementi1[i]; // operator=
- temp2[i] = _elementi2[i];
- }
- delete[] _elementi1;
- delete[] _elementi2;
- temp1[_trenutno] = el1; // operator=
- temp2[_trenutno++] = el2;
- _elementi1 = temp1;
- _elementi2 = temp2;
- }
- int GetTrenutno() { return _trenutno; }
- T1& GetElementi1(int i)
- {
- return _elementi1[i];
- }
- T2& GetElementi2(int i)
- {
- return _elementi2[i];
- }
- friend ostream& operator<< <>(ostream&, FITKolekcija&);
- };
- template<class T1, class T2>
- ostream& operator<<(ostream& cout, FITKolekcija<T1, T2>& k)
- {
- for (int i = 0; i < k._trenutno; i++)
- {
- cout << k._elementi1[i] << " " << k._elementi2[i] << endl; //operator<<
- }
- return cout;
- }
- enum Kategorija { GameChallenge, InnovationChallenge, MobileChallenge, SQLChallenge, CodingChallenge };
- const char *KategorijaChar[] = { "GameChallenge", "InnovationChallenge", "MobileChallenge", "SQLChallenge", "CodingChallenge" };
- //Klasu proglasiti apstraktnom
- class Osoba
- {
- protected:
- char* _ime;
- char* _prezime;
- int _godiste;
- public:
- Osoba()
- {
- _ime = nullptr;
- _prezime = nullptr;
- _godiste = 0;
- }
- Osoba(const char* ime, const 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;
- }
- virtual ~Osoba() = 0
- {
- delete[] _ime;
- _ime = nullptr;
- delete[] _prezime;
- _prezime = nullptr;
- }
- Osoba& operator=(Osoba& o)
- {
- delete[] _ime;
- delete[] _prezime;
- int vel = strlen(o._ime) + 1;
- if (o._ime != nullptr)
- {
- _ime = new char[vel];
- strcpy_s(_ime, vel, o._ime);
- }
- else
- {
- _ime = nullptr;
- }
- if (o._prezime != nullptr)
- {
- vel = strlen(o._prezime) + 1;
- _prezime = new char[vel];
- strcpy_s(_prezime, vel, o._prezime);
- }
- else
- {
- _prezime = nullptr;
- }
- _godiste = o._godiste;
- return *this;
- }
- virtual void Info()
- {
- cout << "Ime: " << _ime << endl;
- cout << "Prezime :" << _prezime << endl;
- cout << "Godiste: " << _godiste << endl;
- }
- char* GetIme() { return _ime; }
- char* GetPrezime() { return _prezime; }
- };
- //Prepoznati nasljedjivanje izmedju odgovarajućih klasa
- //I učesnici i članovi komisije trebaju imati podatke za pristup sistemu (email i password)
- class Ucesnik: public Osoba
- {
- protected:
- char* _email;
- string _password; //Najmanje 5 karaktera, kombinacija brojeva i velikih slova (dopuniti sa regex-ima)
- string _obrazovnaInstitucija;
- public:
- //Potrebne funkcije za rad sa klasom
- Ucesnik()
- {
- _email = nullptr;
- _password = "NOT SET";
- _obrazovnaInstitucija = "NOT SET";
- }
- Ucesnik(const char* ime, const char* prezime, int godiste, const char* email, string pass, string obrazovnaInstitucija)
- :Osoba(ime, prezime, godiste)
- {
- int vel = strlen(email) + 1;
- _email = new char[vel];
- strcpy_s(_email, vel, email);
- _password = pass;
- _obrazovnaInstitucija = obrazovnaInstitucija;
- }
- virtual ~Ucesnik()
- {
- delete[] _email; _email = nullptr;
- }
- virtual void Info()
- {
- cout << "Ime: " << _ime << endl;
- cout << "Prezime :" << _prezime << endl;
- cout << "Godiste: " << _godiste << endl;
- cout << "Email: " << _email << endl;
- cout << "Obrazovna institucija: " << _obrazovnaInstitucija << endl;
- }
- Ucesnik& operator=(Ucesnik& u)
- {
- (Osoba&)*this = u;
- delete[] _email;
- if (u._email != nullptr)
- {
- int vel = strlen(u._email) + 1;
- _email = new char[vel];
- strcpy_s(_email, vel, u._email);
- }
- else
- {
- _email = nullptr;
- }
- _password = u._password;
- _obrazovnaInstitucija = u._obrazovnaInstitucija;
- return *this;
- }
- friend bool operator==(Ucesnik&, Ucesnik&);
- };
- bool operator==(Ucesnik& u1, Ucesnik& u2)
- {
- return strcmp(u1._ime, u2._ime) == 0 && strcmp(u1._prezime, u2._prezime) == 0 && u1._godiste == u2._godiste;
- }
- class ClanKomisije : public Ucesnik
- {
- char* _pozicija; //Radno mjesto u firmi
- string _firma;
- public:
- //Potrebne funkcije za rad sa klasom
- ClanKomisije(const char* ime, const char* prezime, int godiste, const char* email, string pass, string obrazovnaInstitucija, const char* pozicija, string firma)
- :Ucesnik(ime, prezime, godiste, email, pass, obrazovnaInstitucija)
- {
- int vel = strlen(pozicija) + 1;
- _pozicija = new char[vel];
- strcpy_s(_pozicija, vel, pozicija);
- _firma = firma;
- }
- ~ClanKomisije()
- {
- delete[] _pozicija;
- _pozicija = nullptr;
- }
- virtual void Info()
- {
- cout << "Ime: " << _ime << endl;
- cout << "Prezime :" << _prezime << endl;
- cout << "Godiste: " << _godiste << endl;
- cout << "Email: " << _email << endl;
- cout << "Obrazovna institucija: " << _obrazovnaInstitucija << endl;
- cout << "Pozicija: " << _pozicija << endl;
- cout << "Firma: " << _firma << endl;
- }
- };
- //Prijave koje ne uključuju izradu i predaju projekata (kategorije: SQLChallenge i CodingChallenge)
- class Prijava
- {
- string _datum; //Podržani format: dd.MM.yyyy (dopuniti sa regex-ima)
- Kategorija _kategorija;
- FITKolekcija<Ucesnik, bool> _tim; //Tim se sastoji od jednog ili više učesnika, drugi parametar označava predstavnika tima
- void PonistiPredsavnika()
- {
- for (int i = 0; i < _tim.GetTrenutno(); i++)
- {
- _tim.GetElementi2(i) = false;
- }
- }
- public:
- //Konstruktor
- Prijava(string datum, Kategorija kategorija)
- {
- _datum = datum;
- _kategorija = kategorija;
- }
- Prijava(Prijava& p)
- {
- _datum = p._datum;
- _kategorija = p._kategorija;
- for (int i = 0; i < p._tim.GetTrenutno(); i++)
- {
- _tim.Add(p._tim.GetElementi1(i), p._tim.GetElementi2(i));
- }
- }
- //Funkciju za dodavanje članova tima uz poštivanje ograničenja maksimalno dozvoljenog broja članova u timu.
- //SQLChallenge i CodingChallenge: 2
- //GameChallenge i MobileChallenge: 3
- //InnovationChallenge: 4
- //Onemogućiti dodavanje istog učesnika više puta. Tim može imati najviše jednog predstavnika.
- void DodajClana(Ucesnik* ucesnik, bool predstavnik)
- {
- if (GetBrojPredstavnika() == 1 && predstavnik == true)
- throw NedozvoljenaOperacija("Vec je dodan predstavnik tima!", __LINE__);
- for (int i = 0; i < _tim.GetTrenutno(); i++)
- {
- if (_tim.GetElementi1(i) == *ucesnik)
- {
- throw NedozvoljenaOperacija("Nije moguce dodati istog ucesnika!", __LINE__);
- }
- }
- if ((_kategorija == SQLChallenge || _kategorija == CodingChallenge) && _tim.GetTrenutno() == 2)
- {
- throw NedozvoljenaOperacija("Dodan je maksimalan broj clanova, dodavanje nije uspijelo!", __LINE__);
- }
- if ((_kategorija == GameChallenge || _kategorija == MobileChallenge) && _tim.GetTrenutno() == 3)
- {
- throw NedozvoljenaOperacija("Dodan je maksimalan broj clanova, dodavanje nije uspijelo!", __LINE__);
- }
- if (_kategorija == InnovationChallenge && _tim.GetTrenutno() == 4)
- {
- throw NedozvoljenaOperacija("Dodan je maksimalan broj clanova, dodavanje nije uspijelo!", __LINE__);
- }
- _tim.Add(*ucesnik, predstavnik);
- }
- int GetBrojPredstavnika()
- {
- int brojac = 0;
- for (int i = 0; i < _tim.GetTrenutno(); i++)
- {
- if (_tim.GetElementi2(i))
- brojac++;
- }
- return brojac;
- }
- //Funkciju za promjenu predstavnika tima.
- bool PromijeniPredstavnika(const char* ime, const char* prezime)
- {
- PonistiPredsavnika();
- for (int i = 0; i < _tim.GetTrenutno(); i++)
- {
- if (strcmp(_tim.GetElementi1(i).GetIme(), ime) == 0 && strcmp(_tim.GetElementi1(i).GetPrezime(), prezime) == 0)
- {
- _tim.GetElementi2(i) = true;
- cout << "Predstavnik tima postavljen!" << endl;
- return true;
- }
- }
- cout << "Unesnik sa unesenim imenom i prezimenom nije pronadjen!" << endl;
- return false;
- }
- virtual void Info()
- {
- }
- friend bool operator==(Prijava&, Prijava&);
- };
- bool operator==(Prijava& p1, Prijava& p2)
- {
- for (int i = 0; i < p1._tim.GetTrenutno(); i++)
- {
- for (int j = 0; j < p2._tim.GetTrenutno(); j++)
- {
- if (p1._tim.GetElementi1(i) == p2._tim.GetElementi1(j) && p1._kategorija == p2._kategorija)
- {
- return true;
- }
- }
- }
- return false;
- }
- //Prijave koje uključuju izradu projekata (kategorije: GameChallenge, InnovationChallenge i MobileChallenge)
- class PrijavaProjekta : public Prijava
- {
- char* _nazivProjekta;
- string _opisProjekta;
- bool _finalizirano; //Atribut označava da li je projekat završen i predan u predviđenom roku
- bool _prezentacija; //Projekti koji se prezentuju i ocjenjuju
- public:
- //Konstruktor i destruktor
- PrijavaProjekta(const char* nazivProjekta, string datum, Kategorija kategorija, string opisProjekta, bool finalizirano, bool prezentacija)
- :Prijava(datum, kategorija)
- {
- int vel = strlen(nazivProjekta) + 1;
- _nazivProjekta = new char[vel];
- strcpy_s(_nazivProjekta, vel, nazivProjekta);
- _opisProjekta = opisProjekta;
- _finalizirano = finalizirano;
- _prezentacija = prezentacija;
- }
- //Ostale potrebne funkcije za rad sa klasom
- PrijavaProjekta(PrijavaProjekta& p): Prijava(p)
- {
- int vel = strlen(p._nazivProjekta) + 1;
- _nazivProjekta = new char[vel];
- strcpy_s(_nazivProjekta, vel, p._nazivProjekta);
- _opisProjekta = p._opisProjekta;
- _finalizirano = p._finalizirano;
- _prezentacija = p._prezentacija;
- }
- virtual void Info()
- {
- }
- };
- class FITCodingChallenge
- {
- int _godina;
- string _prijaveDo; //Podržani format unosa: dd.MM.yyyy (dopuniti sa regex-ima)
- vector<Prijava*> _prijave;
- FITKolekcija<ClanKomisije, Kategorija> _komisija;
- FITKolekcija<Prijava*, FITKolekcija<ClanKomisije*, double>> _ocjene;
- public:
- //Konstruktor
- FITCodingChallenge(int godina, string prijaveDo)
- {
- _godina = godina;
- _prijaveDo = prijaveDo;
- }
- //Operator += za dodavanje novih prijava. Isti učesnik ne može imati više prijava u sklopu iste kategorije.
- //Poštovati ograničenje roka za prijave (_prijaveDo).
- //Voditi računa o alokaciji memorije za prijave (ne zadržavati adresu proslijeđenog objekta)
- void operator+=(Prijava* novaPrijava)
- {
- for (int i = 0; i < _prijave.size(); i++)
- {
- if (*_prijave[i] == *novaPrijava)
- {
- throw NedozvoljenaOperacija("Isti ucesnik ne moze imati vise prijava u sklopu iste kategorije", __LINE__);
- }
- }
- PrijavaProjekta *t = dynamic_cast<PrijavaProjekta*>(novaPrijava);
- if (t != nullptr)
- {
- cout << "Dodana je prijava s projektom!" << endl;
- _prijave.push_back(new PrijavaProjekta(*t));
- }
- else
- {
- cout << "Dodana je obicna prijava!" << endl;
- _prijave.push_back(new Prijava(*t));
- }
- }
- //Funkciju koja određenu prijavu označava kao finaliziranu i odabranu za prezentaciju ili ne.
- //Operator () za dodavanje članova komisije po kategorijama. Spriječiti dodavanje istih članova u sklopu jedne kategorije.
- //Funkciju za ispis svih prijava po kategorijama. Funkcija neobavezno prima parametar kategoriju.
- //Ispis treba da uključi i podatke o učesnicima, odnosno članovima tima.
- //Ukoliko kategorija nije proslijeđena, podaci treba da budu grupisani po kategorijama.
- //Funkciju za ocjenu projekata (radova) od strane članova komisije (kolekcija _ocjene).
- //Kolekcija sadrzi samo pokazivače (bez alokacije nove memorije) na postojeće prijave i vec definisane članove komisije.
- //Voditi računa da se ne mogu ocijeniti projekti koji nisu finalizirani i nisu odabrani za prezentaciju, niti da ocjenu mogu dati članovi komisije koji
- //nisu pridruženi odgovarajućoj kategoriji prijave. Svaki član komisije daje ocjenu za svaki projekat, odnosno rad, u
- //kategoriji gdje je dodijeljen. Ocjene se kreću 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 učesnici prijavljeni u kategorijama SQL i CodingChallenge predali radove.
- //Funkcija koja na osnovu imena i prezimena člana komisije ispisuje podatke o njegovim ocjenama uključujući
- //prijave na koje se one odnose.
- //Funkcija koja na osnovu imena i prezimena učesnika ispisuje podatke o njegovim prijavama na takmičenju, zajedno sa
- //ocjenama, ukoliko su one definisane za prijavu/e datog učesnika.
- //Funkciju za rangiranje kandidata na osnovu kategorije proslijeđene kao parametar.
- //Funkcija treba da na osnovu ocjena članova komisije ispiše rang liste timova zajedno sa prosječnim ocjenama njihovih projekata (radova).
- //Dakle, konačna rang lista uključuje nazive timova (u zavisnosti od kategorije i naziv projekta), te prosječnu ocjenu.
- //Funkciju Info koja ispisuje sve podatke o takmičenju.
- };
- int main()
- {
- //Kreirati objekat klase FITCodingChallenge, te demonstrirati sve implementirane funkcionalnosti.
- FITKolekcija<int, int> kol;
- for (int i = 0; i < 10; i++)
- {
- kol.Add(i, i);
- }
- cout << kol << endl;
- Osoba* osobe[10] = { nullptr };
- //for (int i = 0; i < 10; i++)
- //{
- // osobe[i] = nullptr;
- //}
- cout << "-----------------------------------" << endl;
- osobe[0] = new Ucesnik("Salko", "Sehic", 1997, "salalex48@gmail.com", "password123", "FIT");
- osobe[0]->Info();
- cout << "-----------------------------------" << endl;
- osobe[1] = new Ucesnik("Haris", "Sehic", 1999, "hariss@gmail.com", "password321", "FIT");
- osobe[1]->Info();
- cout << "-----------------------------------" << endl;
- osobe[2] = new ClanKomisije("Alen", "Hondjo", 1997, "alenh@gmail.com", "passworddd", "FIT", "Direktor", "EuroDemex");
- osobe[2]->Info();
- cout << "-----------------------------------" << endl;
- Prijava* prijava = new Prijava("15.1.2019", CodingChallenge);
- PrijavaProjekta* prijavaProjekta = new PrijavaProjekta("eBolnica", "3.1.2019", InnovationChallenge, "Projekat s ciljem unapredjena rada zdravstva", true, true);
- Prijava* prijave[5] = { nullptr };
- prijave[0] = new Prijava("15.1.2019", CodingChallenge);
- prijave[1] = new PrijavaProjekta("eBolnica", "3.1.2019", InnovationChallenge, "Projekat s ciljem unapredjena rada zdravstva", true, true);
- FITCodingChallenge fitCC(2019, "25.6.2019");
- //fitCC += prijava; ovo ne radi
- fitCC += prijave[1];
- fitCC += prijavaProjekta;
- for (int i = 0; i < 3; i++)
- {
- delete osobe[i]; osobe[i] = nullptr;
- }
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement