Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <conio.h>
- #include <string>
- #include <vector>
- #include <regex>
- #include <iomanip>
- using namespace std;
- const string ln = "\n-----------------------------------------------------------\n";
- //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;
- }
- };
- bool ValidirajPodatak(const string & podatak, const string & pravilo, string funkcija = "match")
- {
- if (funkcija == "match")
- return regex_match(podatak, regex(pravilo));
- return regex_search(podatak, regex(pravilo));
- }
- template<class T>
- void Swap(T & prvi, T & drugi)
- {
- T temp = prvi;
- prvi = drugi;
- drugi = temp;
- }
- template<class T1, class T2>
- class Kolekcija
- {
- T1* _elementi1;
- T2* _elementi2;
- int _trenutno;
- public:
- Kolekcija()
- {
- _trenutno = 0;
- _elementi1 = nullptr;
- _elementi2 = nullptr;
- }
- Kolekcija(const Kolekcija & obj)
- {
- _trenutno = obj._trenutno;
- _elementi1 = new T1[_trenutno];
- _elementi2 = new T2[_trenutno];
- for (size_t i = 0; i < _trenutno; i++)
- {
- _elementi1[i] = obj._elementi1[i];
- _elementi2[i] = obj._elementi2[i];
- }
- }
- ~Kolekcija()
- {
- delete[]_elementi1;
- _elementi1 = nullptr;
- delete[]_elementi2;
- _elementi2 = nullptr;
- }
- Kolekcija & operator =(const Kolekcija & right)
- {
- if (this != &right)
- {
- delete[]_elementi1;
- delete[]_elementi2;
- _trenutno = right._trenutno;
- _elementi1 = new T1[_trenutno];
- _elementi2 = new T2[_trenutno];
- for (size_t i = 0; i < _trenutno; i++)
- {
- _elementi1[i] = right._elementi1[i];
- _elementi2[i] = right._elementi2[i];
- }
- }
- return *this;
- }
- void Add(const T1 & element_1, const T2 & element_2)
- {
- for (size_t i = 0; i < _trenutno; i++)
- if (_elementi1[i] == element_1 && _elementi2[i] == element_2)
- throw NedozvoljenaOperacija("Ne mozete dodavati iste elemente u kolekciju", __LINE__);
- T1 * temp_1 = new T1[_trenutno + 1];
- T2 * temp_2 = new T2[_trenutno + 1];
- for (size_t i = 0; i < _trenutno; i++)
- {
- temp_1[i] = _elementi1[i];
- temp_2[i] = _elementi2[i];
- }
- temp_1[_trenutno] = element_1;
- temp_2[_trenutno++] = element_2;
- delete[]_elementi1;
- delete[]_elementi2;
- _elementi1 = temp_1;
- _elementi2 = temp_2;
- }
- int size()const
- {
- return _trenutno;
- }
- void sort(int NaOsnovuKojegElementa = 2)
- {
- int indikatorZamjene = 0;
- int length = _trenutno;
- do
- {
- indikatorZamjene = 1;
- for (size_t i = 0; i < length - 1; i++)
- {
- if (NaOsnovuKojegElementa == 2)
- {
- if (_elementi2[i] < _elementi2[i + 1])
- {
- Swap(_elementi1[i], _elementi1[i + 1]);
- Swap(_elementi2[i], _elementi2[i + 1]);
- indikatorZamjene = 0;
- }
- }
- else
- {
- if (_elementi1[i] < _elementi1[i + 1])
- {
- Swap(_elementi1[i], _elementi1[i + 1]);
- Swap(_elementi2[i], _elementi2[i + 1]);
- indikatorZamjene = 0;
- }
- }
- }
- length--;
- } while (length > 1 && indikatorZamjene == 0);
- }
- T1 & operator [](int index)const
- {
- if (index >= 0 && index < _trenutno)
- return _elementi1[index];
- throw NedozvoljenaOperacija("Index lokacija nije validna", __LINE__);
- }
- T2 & GetElement_2(int index)const
- {
- if (index >= 0 && index < _trenutno)
- return _elementi2[index];
- throw NedozvoljenaOperacija("Index lokacija nije validna", __LINE__);
- }
- friend bool operator == <>(const Kolekcija &, const Kolekcija &);
- friend bool operator != <>(const Kolekcija &, const Kolekcija &);
- };
- template<class T1, class T2>
- bool operator == <>(const Kolekcija<T1, T2> & left, const Kolekcija<T1, T2> & right)
- {
- if (left._trenutno != right._trenutno)
- return false;
- else
- {
- for (size_t i = 0; i < left._trenutno; i++)
- if (left._elementi1[i] != right._elementi1[i] || left._elementi2[i] != right._elementi2[i])
- return false;
- }
- return true;
- }
- template<class T1, class T2>
- bool operator != <>(const Kolekcija<T1, T2> & left, const Kolekcija<T1, T2> & right)
- {
- return !(left == right);
- }
- enum Kategorija { GameChallenge, InnovationChallenge, MobileChallenge, SQLChallenge, CodingChallenge, IspisiSveKategorije };
- char * ispisKategorije[] = { "GameChallenge", "InnovationChallenge", "MobileChallenge", "SQLChallenge", "CodingChallenge" };
- class Osoba
- {
- char* _ime;
- char* _prezime;
- int _godiste;
- public:
- Osoba()
- {
- _ime = _prezime = nullptr;
- _godiste = 1997;
- }
- 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(const Osoba & obj)
- {
- int vel = strlen(obj._ime) + 1;
- _ime = new char[vel];
- strcpy_s(_ime, vel, obj._ime);
- vel = strlen(obj._prezime) + 1;
- _prezime = new char[vel];
- strcpy_s(_prezime, vel, obj._prezime);
- _godiste = obj._godiste;
- }
- virtual ~Osoba() = 0
- {
- delete[] _ime;
- _ime = nullptr;
- delete[] _prezime;
- _prezime = nullptr;
- }
- Osoba & operator =(const Osoba & right)
- {
- if (this != &right)
- {
- delete[] _ime;
- delete[] _prezime;
- int vel = strlen(right._ime) + 1;
- _ime = new char[vel];
- strcpy_s(_ime, vel, right._ime);
- vel = strlen(right._prezime) + 1;
- _prezime = new char[vel];
- strcpy_s(_prezime, vel, right._prezime);
- _godiste = right._godiste;
- }
- return *this;
- }
- const char * GetIme() const
- {
- return _ime;
- }
- const char * GetPrezime() const
- {
- return _prezime;
- }
- string GetImePrezime()const
- {
- return string(_ime) + " " + string(_prezime);
- }
- int GetGodiste()const
- {
- return _godiste;
- }
- };
- //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 = nullptr;
- }
- Ucesnik(char* ime, char* prezime, int godiste, char * email, string password, string obrzInst) : Osoba(ime, prezime, godiste)
- {
- if (ValidirajPodatak(password, "(?=.{5,})(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])", "search"))
- {
- int size = strlen(email) + 1;
- _email = new char[size];
- strcpy_s(_email, size, email);
- _password = password;
- _obrazovnaInstitucija = obrzInst;
- }
- else
- throw NedozvoljenaOperacija("Procitatjte uslove koje vasa lozinka mora ispuniti", __LINE__);
- }
- Ucesnik(const Ucesnik & obj) : Osoba(obj)
- {
- int size = strlen(obj._email) + 1;
- _email = new char[size];
- strcpy_s(_email, size, obj._email);
- _password = obj._password;
- _obrazovnaInstitucija = obj._obrazovnaInstitucija;
- }
- ~Ucesnik()
- {
- delete[] _email;
- _email = nullptr;
- }
- Ucesnik & operator =(const Ucesnik & right)
- {
- if (this != &right)
- {
- delete[]_email;
- Osoba::operator=(right);
- int size = strlen(right._email) + 1;
- _email = new char[size];
- strcpy_s(_email, size, right._email);
- _password = right._password;
- _obrazovnaInstitucija = right._obrazovnaInstitucija;
- }
- return *this;
- }
- const char * GetEmail()const
- {
- return _email;
- }
- string GetPassword()const
- {
- return _password;
- }
- string GetInstitucija()const
- {
- return _obrazovnaInstitucija;
- }
- friend bool operator ==(const Ucesnik &, const Ucesnik &);
- friend bool operator !=(const Ucesnik &, const Ucesnik &);
- friend ostream & operator <<(ostream &, const Ucesnik &);
- };
- ostream & operator <<(ostream & cout, const Ucesnik & obj)
- {
- cout << "Ime i prezime: " << obj.GetImePrezime() << " - " << obj.GetGodiste() << endl;
- cout << "Obrazovna institucija: " << obj._obrazovnaInstitucija << endl;
- cout << "Email: " << obj._email << endl;
- return cout;
- }
- bool operator ==(const Ucesnik & left, const Ucesnik & right)
- {
- if (left.GetImePrezime() != right.GetImePrezime())
- return false;
- else if (left.GetGodiste() != right.GetGodiste())
- return false;
- else if (left._obrazovnaInstitucija != right._obrazovnaInstitucija)
- return false;
- else if (strcmp(left._email, right._email) != 0)
- return false;
- else if (left._password != right._password)
- return false;
- return true;
- }
- bool operator !=(const Ucesnik & left, const Ucesnik & right)
- {
- return !(left == right);
- }
- class ClanKomisije : public Ucesnik
- {
- char* _pozicija; //Radno mjesto u firmi
- string _firma;
- public:
- ClanKomisije()
- {
- _pozicija = nullptr;
- }
- ClanKomisije(char* ime, char* prezime, int godiste, char * pozicija, char * email, string password, string obrzInst, string firma) :
- Ucesnik(ime, prezime, godiste, email, password, obrzInst)
- {
- int size = strlen(pozicija) + 1;
- _pozicija = new char[size];
- strcpy_s(_pozicija, size, pozicija);
- _firma = firma;
- }
- ClanKomisije(const ClanKomisije & obj) : Ucesnik(obj)
- {
- int size = strlen(obj._pozicija) + 1;
- _pozicija = new char[size];
- strcpy_s(_pozicija, size, obj._pozicija);
- _firma = obj._firma;
- }
- ~ClanKomisije()
- {
- delete[] _pozicija;
- _pozicija = nullptr;
- }
- ClanKomisije & operator =(const ClanKomisije & right)
- {
- if (this != &right)
- {
- delete[] _pozicija;
- Ucesnik::operator=(right);
- int size = strlen(right._pozicija) + 1;
- _pozicija = new char[size];
- strcpy_s(_pozicija, size, right._pozicija);
- _firma = right._firma;
- }
- return *this;
- }
- const char * GetPozicija()const
- {
- return _pozicija;
- }
- string GetFirma()const
- {
- return _firma;
- }
- friend ostream & operator <<(ostream &, const ClanKomisije &);
- };
- ostream & operator <<(ostream & cout, const ClanKomisije & obj)
- {
- cout << ClanKomisije(obj);
- cout << "Pozicija: " << obj._pozicija << endl;
- cout << "Firma: " << obj._firma << endl;
- return cout;
- }
- //Prijave koje ne ukljucuju izradu i predaju projekata (kategorije: SQLChallenge i CodingChallenge)
- class Prijava
- {
- string _datum; //Podrzani format: dd.MM.yyyy
- Kategorija _kategorija;
- Kolekcija<Ucesnik, bool> _tim; //Tim se sastoji od jednog ili vise ucesnika, drugi paramtetar oznacava predstavnika tima
- bool ImaLiPredstavnika()const
- {
- for (size_t i = 0; i < _tim.size(); i++)
- if (_tim.GetElement_2(i))
- return true;
- return false;
- }
- void PonistiPredstavnika()
- {
- for (size_t i = 0; i < _tim.size(); i++)
- if (_tim.GetElement_2(i))
- _tim.GetElement_2(i) = false;
- }
- public:
- Prijava(string datum, Kategorija kategorija)
- {
- if (ValidirajPodatak(datum, "(\\d{2})\\.(\\d{2})\\.(\\d{4})"))
- {
- _datum = datum;
- _kategorija = kategorija;
- }
- else
- throw NedozvoljenaOperacija("Niste unijeli datum u trazenom formatu", __LINE__);
- }
- Prijava(const Prijava & obj)
- {
- _datum = obj._datum;
- _tim = obj._tim;
- _kategorija = obj._kategorija;
- }
- virtual ~Prijava()
- {
- }
- //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.
- void DodajClana(const Ucesnik & ucesnik, bool predstavnik = false)
- {
- for (size_t i = 0; i < _tim.size(); i++)
- if (_tim[i] == ucesnik)
- throw NedozvoljenaOperacija("Ne mozete dodati istog ucesnika vise puta", __LINE__);
- int ukupnoClanova = _tim.size();
- if (_kategorija == SQLChallenge || _kategorija == CodingChallenge)
- {
- if (ukupnoClanova < 2)
- {
- if (ImaLiPredstavnika() && predstavnik)
- throw NedozvoljenaOperacija("Ovaj tim vec ima predstavnika", __LINE__);
- if (ukupnoClanova == 1 && !ImaLiPredstavnika() && !predstavnik)
- throw NedozvoljenaOperacija("Neko u timu mora biti predstavnik", __LINE__);
- //cout << ucesnik.GetImePrezime() << " uspjesno dodan u tim" << endl;
- _tim.Add(ucesnik, predstavnik);
- }
- else
- throw NedozvoljenaOperacija("Tim moze imati maksimalno 2 clana", __LINE__);
- }
- else if (_kategorija == GameChallenge || _kategorija == MobileChallenge)
- {
- if (ukupnoClanova < 3)
- {
- if (ImaLiPredstavnika() && predstavnik)
- throw NedozvoljenaOperacija("Ovaj tim vec ima predstavnika", __LINE__);
- if (ukupnoClanova == 2 && !ImaLiPredstavnika() && !predstavnik)
- throw NedozvoljenaOperacija("Neko u timu mora biti predstavnik", __LINE__);
- //cout << ucesnik.GetImePrezime() << " uspjesno dodan u tim" << endl;
- _tim.Add(ucesnik, predstavnik);
- }
- else
- throw NedozvoljenaOperacija("Tim moze imati maksimalno 3 clana", __LINE__);
- }
- else
- {
- if (ukupnoClanova < 4)
- {
- if (ImaLiPredstavnika() && predstavnik)
- throw NedozvoljenaOperacija("Ovaj tim vec ima predstavnika", __LINE__);
- if (ukupnoClanova == 3 && !ImaLiPredstavnika() && !predstavnik)
- throw NedozvoljenaOperacija("Neko u timu mora biti predstavnik", __LINE__);
- //cout << ucesnik.GetImePrezime() << " uspjesno dodan u tim" << endl;
- _tim.Add(ucesnik, predstavnik);
- }
- else
- throw NedozvoljenaOperacija("Tim moze imati maksimalno 4 clana", __LINE__);
- }
- }
- Prijava & operator =(const Prijava & right)
- {
- if (this != &right)
- {
- _tim = right._tim;
- _datum = right._datum;
- _kategorija = right._kategorija;
- }
- return *this;
- }
- //Funkciju za promjenu predstavnika tima.
- void PromjeniPredstavnikaTima(const Ucesnik & ucesnik)
- {
- if (!ImaLiPredstavnika())
- throw NedozvoljenaOperacija("Tim jos uvijek nema predstavnika", __LINE__);
- bool pronadjen = false;
- for (size_t i = 0; i < _tim.size(); i++)
- {
- if (_tim[i] == ucesnik)
- {
- PonistiPredstavnika();
- _tim.GetElement_2(i) = true;
- pronadjen = true;
- }
- }
- if (!pronadjen)
- throw NedozvoljenaOperacija("Ovaj ucesnik nije registrovan u timu", __LINE__);
- }
- string GetDatumKategorija()const
- {
- return string(ispisKategorije[_kategorija]) + " (" + _datum + ")";
- }
- string GetDatum()const
- {
- return _datum;
- }
- Kategorija GetKategorija()const
- {
- return _kategorija;
- }
- Kolekcija<Ucesnik, bool> GetTim()const
- {
- return _tim;
- }
- friend ostream & operator <<(ostream &, const Prijava &);
- friend bool operator ==(const Prijava &, const Prijava &);
- friend bool operator !=(const Prijava &, const Prijava &);
- };
- bool operator ==(const Prijava & left, const Prijava & right)
- {
- if (left._datum != right._datum)
- return false;
- else if (left._kategorija != right._kategorija)
- return false;
- if (left._tim != right._tim)
- return false;
- return true;
- }
- bool operator !=(const Prijava & left, const Prijava & right)
- {
- return !(left == right);
- }
- ostream & operator <<(ostream & cout, const Prijava & obj)
- {
- cout << "Datum prijave: " << obj._datum << endl;
- cout << "Kategorija: " << ispisKategorije[obj._kategorija] << endl;
- cout << "\t:::TIM INFO:::\n";
- for (size_t i = 0; i < obj._tim.size(); i++)
- {
- cout << i + 1 << ". " << obj._tim[i].GetImePrezime();
- if (obj._tim.GetElement_2(i))
- cout << " - Predstavnik tima" << endl;
- else
- cout << endl;
- }
- return cout;
- }
- //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(char * nazivProjekta, string opisProjekta, string datum, Kategorija kategorija) : Prijava(datum, kategorija)
- {
- int size = strlen(nazivProjekta) + 1;
- _nazivProjekta = new char[size];
- strcpy_s(_nazivProjekta, size, nazivProjekta);
- _opisProjekta = opisProjekta;
- _finalizirano = _prezentacija = false;
- }
- PrijavaProjekta(const PrijavaProjekta & obj) : Prijava(obj)
- {
- int size = strlen(obj._nazivProjekta) + 1;
- _nazivProjekta = new char[size];
- strcpy_s(_nazivProjekta, size, obj._nazivProjekta);
- _opisProjekta = obj._opisProjekta;
- _finalizirano = obj._finalizirano;
- _prezentacija = obj._prezentacija;
- }
- ~PrijavaProjekta()
- {
- delete[] _nazivProjekta;
- _nazivProjekta = nullptr;
- }
- PrijavaProjekta & operator =(const PrijavaProjekta & right)
- {
- if (this != &right)
- {
- delete[]_nazivProjekta;
- Prijava::operator=(right);
- int size = strlen(right._nazivProjekta) + 1;
- _nazivProjekta = new char[size];
- strcpy_s(_nazivProjekta, size, right._nazivProjekta);
- _opisProjekta = right._opisProjekta;
- _finalizirano = right._finalizirano;
- _prezentacija = right._prezentacija;
- }
- return *this;
- }
- void Finaliziraj(bool odabranoZaPrezentaciju)
- {
- _finalizirano = true;
- _prezentacija = odabranoZaPrezentaciju;
- }
- bool GetFinalizirano()const
- {
- return _finalizirano;
- }
- bool GetPrezentacija()const
- {
- return _prezentacija;
- }
- const char * GetNazivProjekta()const
- {
- return _nazivProjekta;
- }
- friend ostream & operator <<(ostream &, const PrijavaProjekta &);
- friend bool operator ==(const PrijavaProjekta &, const PrijavaProjekta &);
- friend bool operator !=(const PrijavaProjekta &, const PrijavaProjekta &);
- };
- ostream & operator <<(ostream & cout, const PrijavaProjekta & obj)
- {
- cout << "Naziv projekta: " << obj._nazivProjekta << endl;
- cout << "Kratak opis projekta: " << obj._opisProjekta << endl;
- cout << "Odabrano za prezentaciju: " << boolalpha << obj._prezentacija << endl;
- cout << "Finalizirano: " << boolalpha << obj._finalizirano << endl;
- cout << Prijava(obj);
- return cout;
- }
- bool operator ==(const PrijavaProjekta & left, const PrijavaProjekta & right)
- {
- if (Prijava(left) != Prijava(right))
- return false;
- else if (strcmp(left._nazivProjekta, right._nazivProjekta) != 0)
- return false;
- else if (left._opisProjekta != right._opisProjekta)
- return false;
- return true;
- }
- bool operator !=(const PrijavaProjekta & left, const PrijavaProjekta & right)
- {
- return !(left == right);
- }
- class FITCodingChallenge
- {
- int _godina; //01.34.6789
- string _prijaveDo; //Podrzani format unosa: dd.MM.yyyy (koristiti regex)
- vector<Prijava*> _prijave;
- Kolekcija<ClanKomisije, Kategorija> _komisija;
- Kolekcija<Prijava*, Kolekcija<ClanKomisije*, double>> _ocjene;
- int GetDan(string datum)
- {
- char dan[3] = { datum[0], datum[1], '\0' };
- return atoi(dan);
- }
- int GetMjesec(string datum)
- {
- char mjesec[3] = { datum[3], datum[4], '\0' };
- return atoi(mjesec);
- }
- int GetGodina(string datum)
- {
- char godina[5] = { datum[6], datum[7], datum[8],datum[9], '\0' };
- return atoi(godina);
- }
- bool ProvjeriDatumPrijave(string datum)
- {
- // _prijaveDo
- int _dan = GetDan(_prijaveDo);
- int _mjesec = GetMjesec(_prijaveDo);
- int _godina = GetGodina(_prijaveDo);
- // datum nove prijave
- int dan = GetDan(datum);
- int mjesec = GetMjesec(datum);
- int godina = GetGodina(datum);
- if (_godina > godina)
- return true;
- else if (_godina == godina)
- {
- if (_mjesec > mjesec)
- return true;
- else if (_mjesec == mjesec)
- {
- if (_dan > dan)
- return true;
- }
- }
- return false;
- }
- void PrikaziOcjeneProjekta(Prijava & prijava)
- {
- /*PrijavaProjekta * p1 = dynamic_cast<PrijavaProjekta*>(&prijava);
- if (p1 != nullptr)
- {
- PrijavaProjekta * p2 = nullptr;
- for (size_t i = 0; i < _ocjene.size(); i++)
- {
- p2 = dynamic_cast<PrijavaProjekta*>(_ocjene[i]);
- if (p2 != nullptr)
- {
- if (*p1 == *p2)
- {
- for (size_t j = 0; j < _ocjene.GetElement_2(i).size(); j++)
- {
- cout << _ocjene.GetElement_2(i)[j]->GetImePrezime() << " dao ocjenu " << _ocjene.GetElement_2(i).GetElement_2(j) << endl;
- }
- }
- }
- }
- }
- else
- {
- for (size_t i = 0; i < _ocjene.size(); i++)
- {
- if (_ocjene[i] != nullptr && (_ocjene[i]->GetKategorija() == CodingChallenge || _ocjene[i]->GetKategorija() == SQLChallenge))
- {
- for (size_t j = 0; j < _ocjene.GetElement_2(i).size(); j++)
- {
- cout << _ocjene.GetElement_2(i)[j]->GetImePrezime() << " dao ocjenu " << _ocjene.GetElement_2(i).GetElement_2(j) << endl;
- }
- }
- }
- }*/
- for (size_t i = 0; i < _ocjene.size(); i++)
- {
- if (*_ocjene[i] == prijava)
- {
- for (size_t j = 0; j < _ocjene.GetElement_2(i).size(); j++)
- {
- cout << _ocjene.GetElement_2(i)[j]->GetImePrezime() << " je ocijenio/la rad sa ocjenom " << _ocjene.GetElement_2(i).GetElement_2(j) << endl;
- }
- }
- }
- }
- bool NalaziLiSeUTimu(const Prijava & prijava, const string & imePrezime)
- {
- for (size_t i = 0; i < prijava.GetTim().size(); i++)
- if (prijava.GetTim()[i].GetImePrezime() == imePrezime)
- return true;
- return false;
- }
- double GetProsjecnaOcjena(Prijava & prijava)
- {
- int suma = 0;
- int brojOcjena = 0;
- for (size_t i = 0; i < _ocjene.size(); i++)
- {
- for (size_t j = 0; j < _ocjene.GetElement_2(i).size(); j++)
- {
- if (*_ocjene[i] == prijava)
- {
- suma += _ocjene.GetElement_2(i).GetElement_2(j);
- brojOcjena++;
- }
- }
- }
- return (double)suma / brojOcjena;
- }
- void IspisiKategoriju(Kategorija kategorija)
- {
- PrijavaProjekta * pp = nullptr;
- cout << "\t===" << ispisKategorije[kategorija] << "===\n";
- for (size_t i = 0; i < _prijave.size(); i++)
- {
- if (kategorija == SQLChallenge || kategorija == CodingChallenge)
- {
- if (_prijave[i]->GetKategorija() == kategorija)
- cout << *_prijave[i];
- }
- else
- {
- pp = dynamic_cast<PrijavaProjekta*>(_prijave[i]);
- if (pp != nullptr)
- {
- if (pp->GetKategorija() == kategorija)
- cout << *pp;
- }
- }
- }
- cout << ln;
- }
- public:
- FITCodingChallenge(int godina, string prijaveDo)
- {
- if (ValidirajPodatak(prijaveDo, "(\\d{2})\\.(\\d{2})\\.(\\d{4})"))
- {
- _prijaveDo = prijaveDo;
- _godina = godina;
- }
- else
- throw NedozvoljenaOperacija("Niste unijeli datum u trazenom formatu", __LINE__);
- }
- ~FITCodingChallenge()
- {
- for (size_t i = 0; i < _prijave.size(); i++)
- {
- delete _prijave[i];
- _prijave[i] = nullptr;
- }
- }
- //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)
- FITCodingChallenge & operator +=(Prijava & prijava)
- {
- if (!ProvjeriDatumPrijave(prijava.GetDatum()))
- throw NedozvoljenaOperacija("Kasno ste prijavili projekat", __LINE__);
- for (size_t i = 0; i < _prijave.size(); i++)
- {
- for (size_t j = 0; j < _prijave[i]->GetTim().size(); j++)
- {
- for (size_t k = 0; k < prijava.GetTim().size(); k++)
- {
- if (_prijave[i]->GetTim()[j] == prijava.GetTim()[k] && _prijave[i]->GetKategorija() == prijava.GetKategorija())
- throw NedozvoljenaOperacija("Isti ucesnik ne moze imati vise prijava u sklopu iste kategorije", __LINE__);
- }
- }
- }
- PrijavaProjekta * pp = dynamic_cast<PrijavaProjekta*>(&prijava);
- if (pp != nullptr)
- {
- PrijavaProjekta * novaPrijava = new PrijavaProjekta(*pp);
- if (pp->GetFinalizirano() && pp->GetPrezentacija())
- novaPrijava->Finaliziraj(pp->GetPrezentacija());
- _prijave.push_back(new PrijavaProjekta(*novaPrijava));
- }
- else
- _prijave.push_back(new Prijava(prijava));
- return *this;
- }
- //Funkciju koja odredjenu prijavu oznacava kao finaliziranu i odabranu za prezentaciju ili ne.
- void FinalizirajPrijavu(PrijavaProjekta & prijavaProjekta, bool odabranaZaPrezentaciju)
- {
- PrijavaProjekta * pp = nullptr;
- bool pronadjena = false;
- for (size_t i = 0; i < _prijave.size(); i++)
- {
- pp = dynamic_cast<PrijavaProjekta*>(_prijave[i]);
- if (pp != nullptr)
- {
- if (prijavaProjekta == *pp)
- {
- pp->Finaliziraj(odabranaZaPrezentaciju);
- pronadjena = true;
- }
- }
- }
- if (!pronadjena)
- throw NedozvoljenaOperacija("Nismo uspjeli pronaci trazenu prijavu", __LINE__);
- };
- //Operator () za dodavanje clanova komisije po kategorijama. Sprijeciti dodavanje istih clanova u sklopu jedne kategorije.
- FITCodingChallenge & operator()(const ClanKomisije & clanKomisije, Kategorija kategorija)
- {
- for (size_t i = 0; i < _komisija.size(); i++)
- if (_komisija[i] == clanKomisije && _komisija.GetElement_2(i) == kategorija)
- throw NedozvoljenaOperacija("Nije dozvoljeno dodavati iste clanove u sklopu jedne kategorije", __LINE__);
- _komisija.Add(clanKomisije, kategorija);
- //cout << clanKomisije.GetImePrezime() << " uspjesno dodan/a u komisiju za kategoriju " << ispisKategorije[kategorija] << endl;
- return *this;
- }
- //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.
- void IspisPoKategorijama(Kategorija kategorija = IspisiSveKategorije)
- {
- if (kategorija == IspisiSveKategorije)
- {
- IspisiKategoriju(SQLChallenge);
- IspisiKategoriju(CodingChallenge);
- IspisiKategoriju(MobileChallenge);
- IspisiKategoriju(GameChallenge);
- IspisiKategoriju(InnovationChallenge);
- }
- else
- {
- if (kategorija == SQLChallenge)
- IspisiKategoriju(SQLChallenge);
- else if (kategorija == CodingChallenge)
- IspisiKategoriju(CodingChallenge);
- else if (kategorija == MobileChallenge)
- IspisiKategoriju(MobileChallenge);
- else if (kategorija == GameChallenge)
- IspisiKategoriju(GameChallenge);
- else if (kategorija == InnovationChallenge)
- IspisiKategoriju(InnovationChallenge);
- }
- }
- //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.
- void OcijeniProjekte(Prijava & prijava, ClanKomisije & clanKomisije, double ocjena)
- {
- PrijavaProjekta * pp = nullptr;
- Kolekcija<ClanKomisije*, double> ocjenaClan;
- pp = dynamic_cast<PrijavaProjekta*>(&prijava);
- PrijavaProjekta * projekat = nullptr;
- bool ok = false;
- for (size_t i = 0; i < _prijave.size(); i++)
- {
- projekat = dynamic_cast<PrijavaProjekta*>(_prijave[i]);
- if (projekat != nullptr && pp != nullptr)
- {
- if (*projekat == *pp)
- {
- ok = true;
- break;
- }
- }
- }
- if (ok)
- {
- if (!projekat->GetFinalizirano() || !projekat->GetPrezentacija())
- throw NedozvoljenaOperacija("Projekti koji nisu finalizirani i odabrani za prezentaciju se ne mogu ocijenjivati", __LINE__);
- else if (ocjena < 1 || ocjena > 10)
- throw NedozvoljenaOperacija("Ocjene za projekte se krecu od 1 do 10", __LINE__);
- }
- else
- {
- if (ocjena < 0 || ocjena > 100)
- throw NedozvoljenaOperacija("Ocjene za radove se krecu od 0 do 100", __LINE__);
- }
- bool mozeOcjenjivati = false;
- for (size_t i = 0; i < _komisija.size(); i++)
- {
- if (clanKomisije == _komisija[i] && prijava.GetKategorija() == _komisija.GetElement_2(i))
- mozeOcjenjivati = true;
- }
- if (!mozeOcjenjivati)
- throw NedozvoljenaOperacija("Ovaj clan ne moze ocjenjivati ovu kategoriju", __LINE__);
- ocjenaClan.Add(&clanKomisije, ocjena);
- _ocjene.Add(&prijava, ocjenaClan);
- }
- //Funkcija koja na osnovu imena i prezimena clana komisije ispisuje podatke o njegovim ocjenama uključujući
- //prijave na koje se one odnose.
- void InfoClanKomisije(const string & imePrezime)
- {
- bool pronadjen = false;
- for (size_t i = 0; i < _komisija.size(); i++)
- if (_komisija[i].GetImePrezime() == imePrezime)
- pronadjen = true;
- if (!pronadjen)
- throw NedozvoljenaOperacija("Ne postoji clan komisije sa imenom koje ste unijeli", __LINE__);
- cout << "Clan komisije " << imePrezime << " je ocjenio sljedece projekte:\n";
- PrijavaProjekta * pp = nullptr;
- for (size_t i = 0; i < _ocjene.size(); i++)
- {
- pp = dynamic_cast<PrijavaProjekta*>(_ocjene[i]);
- for (size_t j = 0; j < _ocjene.GetElement_2(i).size(); j++)
- {
- if (_ocjene.GetElement_2(i)[j]->GetImePrezime() == imePrezime)
- {
- if (pp != nullptr)
- cout << pp->GetNazivProjekta() << " - Ocjena: " << _ocjene.GetElement_2(i).GetElement_2(j) << endl;
- else
- cout << _ocjene[i]->GetDatumKategorija() << " - Ocjena: " << _ocjene.GetElement_2(i).GetElement_2(j) << endl;
- }
- }
- }
- cout << "---------------------------------------------------------\n";
- }
- //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.
- void InfoUcesnik(const string & imePrezime)
- {
- bool pronadjen = false;
- for (size_t i = 0; i < _prijave.size(); i++)
- {
- for (size_t j = 0; j < _prijave[i]->GetTim().size(); j++)
- if (_prijave[i]->GetTim()[j].GetImePrezime() == imePrezime)
- pronadjen = true;
- }
- if (!pronadjen)
- throw NedozvoljenaOperacija("Ne postoji ucesnik sa imenom koje ste unijeli", __LINE__);
- PrijavaProjekta * pp = nullptr;
- cout << "Ucesnik " << imePrezime << " je ucestvovao na sljedecim projektima:\n";
- for (size_t i = 0; i < _prijave.size(); i++)
- {
- pp = dynamic_cast<PrijavaProjekta*>(_prijave[i]);
- if (pp != nullptr)
- {
- if (NalaziLiSeUTimu(*_prijave[i], imePrezime))
- {
- cout << "\t==== " << pp->GetNazivProjekta() << " ====" << endl;
- PrikaziOcjeneProjekta(*_prijave[i]);
- }
- }
- else
- {
- if (NalaziLiSeUTimu(*_prijave[i], imePrezime))
- {
- cout << "\t==== " << _prijave[i]->GetDatumKategorija() << " ====" << endl;
- PrikaziOcjeneProjekta(*_prijave[i]);
- }
- }
- }
- }
- //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.
- void RangirajKandidate(Kategorija kategorija)
- {
- Kolekcija<string, double> rezultat;
- PrijavaProjekta * pp = nullptr;
- for (size_t i = 0; i < _prijave.size(); i++)
- {
- if (_prijave[i]->GetKategorija() == kategorija)
- {
- pp = dynamic_cast<PrijavaProjekta*>(_prijave[i]);
- if (pp != nullptr)
- rezultat.Add(pp->GetNazivProjekta(), GetProsjecnaOcjena(*pp));
- else
- rezultat.Add(_prijave[i]->GetDatumKategorija(), GetProsjecnaOcjena(*_prijave[i]));
- }
- }
- rezultat.sort();
- cout << "\t:::RANKING " << ispisKategorije[kategorija] << ":::\n";
- for (size_t i = 0; i < rezultat.size(); i++)
- cout << i + 1 << ". " << rezultat[i] << " - " << rezultat.GetElement_2(i) << endl;
- }
- //Funkciju Info koja ispisuje sve podatke o takmicenju: prijave i clanove komisije po kategorijama, projekte i ocjene
- void InfoTakmicenje()
- {
- cout << "\t\t>>>>> FIT Coding Challenge " << to_string(_godina) << " <<<<<" << endl;
- cout << ln << "Prijave se mogu vrsiti do: " << _prijaveDo << endl;
- PrijavaProjekta * pp = nullptr;
- int izbor = 0;
- do
- {
- cout << "Izbornik:\n\t1. Prikazi sve prijave\n\t2. Prikazi clanove komisije\n\t3. Prikazi pojedinacne ocjene projekata\n";
- cout << "Vas izbor: ";
- cin >> izbor;
- cin.ignore();
- system("cls");
- } while (izbor < 1 || izbor > 3);
- switch (izbor)
- {
- case 1:
- system("cls");
- cout << "\t:::Prikaz svih prijava na ovogodisnji FITCC:::\n";
- cout << "Ukupan broj prijava: " << _prijave.size() << endl;
- for (size_t i = 0; i < _prijave.size(); i++)
- {
- pp = dynamic_cast<PrijavaProjekta*>(_prijave[i]);
- cout << "\tPROJEKAT[" << i + 1 << "/" << _prijave.size() << "]\n\n";
- if (pp != nullptr)
- cout << *pp << endl;
- else
- cout << *_prijave[i] << endl;
- }
- break;
- case 2:
- system("cls");
- cout << "\t:::Prikaz clanova komisije:::\n\n";
- for (size_t i = 0; i < _komisija.size(); i++)
- cout << i + 1 << ". " << _komisija[i].GetImePrezime() << " - " << ispisKategorije[_komisija.GetElement_2(i)] << "\n";
- break;
- case 3:
- system("cls");
- cout << "\t:::Prikaz ocjena na projektima:::\n";
- for (size_t i = 0; i < _prijave.size(); i++)
- {
- pp = dynamic_cast<PrijavaProjekta*>(_prijave[i]);
- if (pp != nullptr)
- {
- cout << "\t..:[" << pp->GetNazivProjekta() << "]:.." << endl;
- }
- else
- cout << "\t..:[" << _prijave[i]->GetDatumKategorija() << "]:.." << endl;
- PrikaziOcjeneProjekta(*_prijave[i]);
- }
- break;
- }
- }
- };
- void main()
- {
- #pragma region DodavanjeUcesnika
- Ucesnik nisvet("Nisvet", "Mujkic", 1996, "nisvet.mujkic@edu.fit.ba", "n1sveT", "FIT");
- Ucesnik sahzudin("Sahzudin", "Mahmic", 1996, "sahzudin.mahmic@edu.fit.ba", "S4hz0", "FIT");
- Ucesnik adnan("Adnan", "Pasic", 1994, "adnan.pasic@edu.fit.ba", "4dN4n", "FIT");
- Ucesnik eman("Eman", "Basic", 1997, "eman.basic@tu.au", "B4sic", "TU");
- Ucesnik elvedin("Elvedin", "Dzihanovic", 1993, "elvedin.dzihanovic@edu.fit.ba", "3Lv3DiN", "FIT");
- ClanKomisije mirza("Mirza", "Muratovic", 1997, "Full stack dev", "mirza.murat@tu.au", "M1rz4", "TU", "MMdev");
- ClanKomisije ahmed("Ahmed", "Arnaut", 1997, "Developer", "ahmed.arnaut@tu.au", "4hmEd", "TU", "DevDevs");
- ClanKomisije eldin("Eldin", "Husic", 1998, "Beta tester", "eldin.husic@etr.slo", "3ld1N", "ETR", "CrnaMunja");
- ClanKomisije emina("Emina", "Junuz", 1977, "SQL PRO", "emina@fit.ba", "3Mina", "FIT", "Profesor"); // sql
- ClanKomisije admir("Admir", "Sehidic", 1985, "SQL PRO", "admir@fit.ba", "4dm1R", "FIT", "Asistent"); // sql
- ClanKomisije denis("Denis", "Music", 1983, "C# Pro", "denis@fit.ba", "d3n1S", "FIT", "Profesor"); // innovation
- ClanKomisije larisa("Larisa", "Dedovic", 1986, "Web dev", "larisa@fit.ba", "LaR1sa", "FIT", "Asistent"); // innovation
- #pragma endregion
- PrijavaProjekta brzaPosta("Brza Posta", "SpeedyExpress", "20.05.2017", InnovationChallenge);
- brzaPosta.DodajClana(sahzudin);
- brzaPosta.DodajClana(adnan, true);
- brzaPosta.DodajClana(nisvet);
- PrijavaProjekta GTA("Grand Theft Auto 7", "GTA7", "26.05.2017", GameChallenge);
- GTA.DodajClana(elvedin, true);
- GTA.DodajClana(eman);
- Prijava ccPrijava("27.05.2017", CodingChallenge);
- ccPrijava.DodajClana(nisvet, true);
- FITCodingChallenge CC(2017, "31.05.2017");
- CC(emina, SQLChallenge);
- CC(admir, SQLChallenge);
- CC(denis, InnovationChallenge);
- CC(denis, CodingChallenge);
- CC(larisa, InnovationChallenge);
- CC(larisa, CodingChallenge);
- CC(ahmed, GameChallenge);
- CC += brzaPosta;
- CC += GTA;
- CC += ccPrijava;
- CC.FinalizirajPrijavu(brzaPosta, true);
- CC.FinalizirajPrijavu(GTA, true);
- try
- {
- CC.OcijeniProjekte(ccPrijava, larisa, 88);
- CC.OcijeniProjekte(brzaPosta, denis, 10);
- CC.OcijeniProjekte(brzaPosta, larisa, 8);
- CC.OcijeniProjekte(GTA, ahmed, 7);
- }
- catch (NedozvoljenaOperacija & e)
- {
- e.Info();
- }
- CC.InfoClanKomisije("Larisa Dedovic"); // ocijenila CC i IC
- CC.InfoUcesnik("Nisvet Mujkic"); // brzaPosta i CC
- CC.RangirajKandidate(InnovationChallenge);
- //CC.InfoTakmicenje();
- _getch();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement