Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<string>
- #include<regex>
- #include<vector>
- #include<algorithm>
- #include<exception>
- using namespace std;
- char crt[] = "----------------------------------------------------\n";
- string praviloDatumMatch = "([1-9]|0[1-9]|1[0-9]|2[0-9]|3[0-1]){1}([./]{1})([1-9]|0[1-9]|1[0-2]){1}([./]{1})(200[0-9]|201[0-9]|202[0-9]|203[0-9]|204[0-9])"; // dd.mm.gggg || dd/mm/gggg (dd [1-31] / mm [1-12] / gggg [2000-2049])
- string praviloLozinkaSearch = "(?=.{5,})(?=.+\\d)(?=.*[A-Z])";
- string praviloMail = "([a-z0-9._-]+)@([a-z0-9.-]+)\\.([a-z]{2,63})";
- bool _provjeriIspravnost(string tekst, string pravilo, bool match) {
- if (match) return regex_match(tekst, regex(pravilo)); else return regex_search(tekst, regex(pravilo));
- }
- //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;
- }
- NedozvoljenaOperacija(const NedozvoljenaOperacija & obj): exception(obj.what()) {
- _linijaKoda = obj._linijaKoda;
- }
- NedozvoljenaOperacija & operator = (const NedozvoljenaOperacija & obj) {
- if (this != &obj) {
- exception(obj.what());
- _linijaKoda = obj._linijaKoda;
- } return *this;
- }
- 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() {
- if (_elementi1 != nullptr) {
- delete[] _elementi1; _elementi1 = nullptr;
- } if (_elementi2 != nullptr) {
- delete[] _elementi2; _elementi2 = nullptr;
- }
- }
- FITKolekcija(const FITKolekcija & obj) {
- if (obj._trenutno == 0) {
- _elementi1 = nullptr;
- _elementi2 = nullptr;
- _trenutno = 0;
- } else {
- _elementi1 = new T1[obj._trenutno];
- _elementi2 = new T2[obj._trenutno];
- _trenutno = obj._trenutno;
- for (int i = 0; i < _trenutno; i++) {
- _elementi1[i] = obj._elementi1[i];
- _elementi2[i] = obj._elementi2[i];
- }
- }
- }
- FITKolekcija & operator = (const FITKolekcija & obj) {
- if (this != &obj) {
- delete[] _elementi1;
- delete[] _elementi2;
- _trenutno = obj._trenutno;
- _elementi1 = new T1[obj._trenutno];
- _elementi2 = new T2[obj._trenutno];
- for (int i = 0; i < obj._trenutno; i++) {
- _elementi1[i] = obj._elementi1[i];
- _elementi2[i] = obj._elementi2[i];
- }
- } return *this;
- }
- void AddElement(T1 & element1, T2 & element2) {
- for (int i = 0; i < _trenutno; i++)
- if (_elementi1[i] == element1 && _elementi2[i] == element2)
- throw NedozvoljenaOperacija("Nije dozvoljeno dodavati vise istih elemenata u Kolekciju!", __LINE__);
- 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];
- }
- _temp1[_trenutno] = element1;
- _temp2[_trenutno] = element2;
- delete[]_elementi1;
- delete[]_elementi2;
- _elementi1 = _temp1;
- _elementi2 = _temp2;
- _trenutno++;
- }
- void sortirajKolekcijuPoBodovima() {
- int brSwap;
- for (int i = _trenutno; i > 0; i--) {
- brSwap = 0;
- for (int j = 1; j < i; j++) {
- if (_elementi1[j] > _elementi1[j-1]) {
- swap(_elementi1[j], _elementi1[j-1]);
- swap(_elementi2[j], _elementi2[j-1]);
- brSwap++;
- }
- }
- if (!brSwap) return;
- }
- }
- void sortirajKolekcijuPoKategorijamaClanovaKomisije() {
- int brSwap;
- for (int i = _trenutno; i > 0; i--) {
- brSwap = 0;
- for (int j = 1; j < i; j++) {
- if (_elementi2[j] > _elementi2[j-1]) {
- swap(_elementi1[j], _elementi1[j-1]);
- swap(_elementi2[j], _elementi2[j-1]);
- brSwap++;
- }
- }
- if (!brSwap) return;
- }
- }
- T1 & _getElement1(int lokacija) const {
- if (lokacija < 0 || lokacija >= _trenutno)
- throw NedozvoljenaOperacija("Pristup memorijskoj lokaciji nije dozvoljen!", __LINE__);
- return _elementi1[lokacija];
- }
- T2 & _getElement2(int lokacija) const {
- if (lokacija < 0 || lokacija >= _trenutno)
- throw NedozvoljenaOperacija("Pristup memorijskoj lokaciji nije dozvoljen!", __LINE__);
- return _elementi2[lokacija];
- }
- void _setElement1(int lokacija, T1 vrijednost) {
- if (lokacija < 0 || lokacija >= _trenutno)
- throw NedozvoljenaOperacija("Pristup memorijskoj lokaciji nije dozvoljen!", __LINE__);
- _elementi1[lokacija] = vrijednost;
- }
- void _setElement2(int lokacija, T2 vrijednost) {
- if (lokacija < 0 || lokacija >= _trenutno)
- throw NedozvoljenaOperacija("Pristup memorijskoj lokaciji nije dozvoljen!", __LINE__);
- _elementi2[lokacija] = vrijednost;
- }
- int _getTrenutno() const { return _trenutno; }
- };
- template <class T1, class T2>
- bool operator == (const FITKolekcija<T1, T2> & prvi, const FITKolekcija <T1, T2> & drugi) {
- if (prvi._getTrenutno() != drugi._getTrenutno()) return false;
- for (int i = 0; i < prvi._getTrenutno(); i++) {
- if (prvi._getElement1(i) != drugi._getElement1(i))
- return false;
- if (prvi._getElement2(i) != drugi._getElement2(i))
- return false;
- }
- return true;
- }
- enum Kategorija { GameChallenge, InnovationChallenge, MobileChallenge, SQLChallenge, CodingChallenge };
- char *_ispisKategorije[]{ "GameChallenge", "InnovationChallenge", "MobileChallenge", "SQLChallenge", "CodingChallenge" };
- //Klasu proglasiti apstraktnom
- class Osoba {
- char* _ime;
- char* _prezime;
- int _godiste;
- public:
- Osoba(char* ime = "---", char* prezime = "---", int godiste = 0) {
- 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;
- }
- /*The destructor is the only method that even if it is pure virtual has to have an implementation
- in order to instantiate derived classes (yes pure virtual functions can have implementations).*/
- virtual ~Osoba() = 0 {
- delete[] _ime; _ime = nullptr;
- delete[] _prezime; _prezime = nullptr;
- }
- Osoba & operator = (const Osoba & obj) {
- if (this != &obj) {
- delete[]_ime;
- delete[]_prezime;
- 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;
- } return *this;
- }
- string _getImePrezime() const { return (string)_ime + " " + (string)_prezime; }
- int _getGodiste() const { return _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(char* ime = "---", char* prezime = "---", int godiste = 0, char* email = "---", string pw = "PassW0RD", string obInstitucija = "---"): Osoba(ime, prezime, godiste) {
- int vel = strlen(email)+1;
- _email = new char[vel];
- strcpy_s(_email, vel, email);
- if (_provjeriIspravnost(pw, praviloLozinkaSearch, 0)) {
- password = pw;
- } else pw = "Passw0RD";
- _obrazovnaInstitucija = obInstitucija;
- }
- virtual ~Ucesnik() {
- if (_email != nullptr) { delete[]_email; _email = nullptr; };
- }
- Ucesnik(const Ucesnik & obj): Osoba(obj) {
- int vel = strlen(obj._email)+1;
- _email = new char[vel];
- strcpy_s(_email, vel, obj._email);
- password = obj.password;
- _obrazovnaInstitucija = obj._obrazovnaInstitucija;
- }
- Ucesnik & operator = (const Ucesnik & obj) {
- if (this != &obj) {
- if (_email)
- delete[]_email;
- Osoba::operator=(obj);
- int vel = strlen(obj._email)+1;
- _email = new char[vel];
- strcpy_s(_email, vel, obj._email);
- password = obj.password;
- _obrazovnaInstitucija = obj._obrazovnaInstitucija;
- } return *this;
- }
- friend bool operator == (const Ucesnik prvi, const Ucesnik drugi);
- friend ostream & operator << (ostream &C, const Ucesnik &obj);
- friend bool operator != (const Ucesnik prvi, const Ucesnik drugi);
- };
- bool operator != (const Ucesnik prvi, const Ucesnik drugi) {
- return !(prvi == drugi);
- }
- ostream & operator << (ostream &C, const Ucesnik &obj) {
- C << "Ime i prezime: " << obj._getImePrezime() << endl;
- C << "Godiste: " << obj._getGodiste() << endl;
- C << "Obrazovna institucija: " << obj._obrazovnaInstitucija << endl;
- C << "E-mail: " << obj._email << endl;
- return C;
- }
- bool operator == (const Ucesnik prvi, const Ucesnik drugi) {
- return strcmp(prvi._email, drugi._email) == 0 && prvi._getImePrezime() == drugi._getImePrezime() && prvi._getGodiste() == drugi._getGodiste();
- }
- class ClanKomisije: public Ucesnik {
- char* _pozicija; //Radno mjesto u firmi
- string _firma;
- public:
- ClanKomisije(char* ime = "---", char* prezime = "---", int godiste = 0, char* email = "---", string pw = "PassW0RD", string obInstitucija = "---", char* pozicija = "---", string firma = "---"): Ucesnik(ime, prezime, godiste, email, pw, obInstitucija) {
- int vel = strlen(pozicija) +1;
- _pozicija = new char[vel];
- strcpy_s(_pozicija, vel, pozicija);
- _firma = firma;
- }
- virtual ~ClanKomisije() { delete[]_pozicija; _pozicija = nullptr; }
- ClanKomisije(const ClanKomisije & obj): Ucesnik(obj) {
- int vel = strlen(obj._pozicija) +1;
- _pozicija = new char[vel];
- strcpy_s(_pozicija, vel, obj._pozicija);
- _firma = obj._firma;
- }
- ClanKomisije & operator = (const ClanKomisije & obj) {
- if (this != &obj) {
- Ucesnik::operator=(obj);
- delete[]_pozicija;
- int vel = strlen(obj._pozicija) +1;
- _pozicija = new char[vel];
- strcpy_s(_pozicija, vel, obj._pozicija);
- _firma = obj._firma;
- } return *this;
- }
- friend ostream & operator << (ostream &C, const ClanKomisije &obj);
- };
- ostream & operator << (ostream &C, const ClanKomisije &obj) {
- C << (Ucesnik)obj;
- C << "Firma: " << obj._firma << endl;
- C << "Pozicija: " << obj._pozicija << endl;
- return C;
- }
- int sumaDana(int _dan, int _mjesec, int _godina) {
- int suma = 0, brDana[]{ 31,28,31,30,31,30,31,31,30,31,30,31 };
- for (int i = 1900; i < _godina; i++) {
- if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
- suma += 366;
- else suma += 365;
- }
- for (int i = 1; i < _mjesec; i++) {
- if (((_godina % 4 == 0 && _godina % 100 != 0) || _godina % 400 == 0) && i == 2)
- suma += 29;
- else suma += brDana[i-1];
- } return suma += _dan;
- }
- bool _porediDatume(string _datumPrijave, string _datumDO) {
- string dan1 = _datumPrijave.substr(0, 2), mjesec1 = _datumPrijave.substr(3, 2), godina1 = _datumPrijave.substr(6, 4);
- string dan2 = _datumDO.substr(0, 2), mjesec2 = _datumDO.substr(3, 2), godina2 = _datumDO.substr(6, 4);
- int _dan1, _mjesec1, _godina1, _dan2, _mjesec2, _godina2;
- _dan1 = stoi(dan1, nullptr, 10); _dan2 = stoi(dan2, nullptr, 10);
- _mjesec1 = stoi(mjesec1, nullptr, 10); _mjesec2 = stoi(mjesec2, nullptr, 10);
- _godina1 = stoi(godina1, nullptr, 10); _godina2 = stoi(godina1, nullptr, 10);
- return sumaDana(_dan1, _mjesec1, _godina1) <= sumaDana(_dan2, _mjesec2, _godina2);
- }
- //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:
- //Konstruktor
- Prijava(string datum, Kategorija kategorija) {
- if (_provjeriIspravnost(datum, praviloDatumMatch,1))
- _datum = datum;
- else NedozvoljenaOperacija("Datum nije unesen u pravilnom formatu!", __LINE__);
- _kategorija = kategorija;
- }
- virtual ~Prijava() {};
- Prijava(const Prijava & obj) {
- _datum = obj._datum;
- _kategorija = obj._kategorija;
- _tim = obj._tim;
- }
- Prijava & operator = (const Prijava & obj) {
- if (this != &obj) {
- _datum = obj._datum;
- _kategorija = obj._kategorija;
- _tim = obj._tim;
- } return *this;
- }
- //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 AddClanaTima(Ucesnik & ucesnik, bool predstavnik = false) {
- switch (_kategorija) {
- case CodingChallenge:
- case SQLChallenge: if (_tim._getTrenutno() == 2) throw NedozvoljenaOperacija("Dostigli ste maksimalni broj clanova tima! Dodavanje novih nije omoguceno!", __LINE__);
- for (int i = 0; i < _tim._getTrenutno(); i++) {
- if (_tim._getElement2(i) && predstavnik) throw NedozvoljenaOperacija("U jednom timu moze biti samo jedan Predstavnik tima!", __LINE__);
- if (_tim._getElement1(i) == ucesnik) throw NedozvoljenaOperacija("Nije moguce dodati isto lice dva puta u tim!", __LINE__);
- } _tim.AddElement(ucesnik, predstavnik); break;
- case GameChallenge:
- case MobileChallenge: if (_tim._getTrenutno() == 3) throw NedozvoljenaOperacija("Dostigli ste maksimalni broj clanova tima! Dodavanje novih nije omoguceno!", __LINE__);
- for (int i = 0; i < _tim._getTrenutno(); i++) {
- if (_tim._getElement2(i) && predstavnik) throw NedozvoljenaOperacija("U jednom timu moze biti samo jedan Predstavnik tima!", __LINE__);
- if (_tim._getElement1(i) == ucesnik) throw NedozvoljenaOperacija("Nije moguce dodati isto lice dva puta u tim!", __LINE__);
- } _tim.AddElement(ucesnik, predstavnik); break;
- case InnovationChallenge: if (_tim._getTrenutno() == 4) throw NedozvoljenaOperacija("Dostigli ste maksimalni broj clanova tima! Dodavanje novih nije omoguceno!", __LINE__);
- for (int i = 0; i < _tim._getTrenutno(); i++) {
- if (_tim._getElement2(i) && predstavnik) throw NedozvoljenaOperacija("U jednom timu moze biti samo jedan Predstavnik tima!", __LINE__);
- if (_tim._getElement1(i) == ucesnik) throw NedozvoljenaOperacija("Nije moguce dodati isto lice dva puta u tim!", __LINE__);
- } _tim.AddElement(ucesnik, predstavnik); break;
- }
- }
- //Funkciju za promjenu predstavnika tima.
- void PromjeniPredstavnikaTima(Ucesnik ucesnik) {
- bool izvrsenaPromjena = false;
- for (int i = 0; i < _tim._getTrenutno(); i++) {
- if (_tim._getElement2(i))
- _tim._setElement2(i, false);
- if (ucesnik == _tim._getElement1(i)) {
- _tim._setElement2(i, true);
- izvrsenaPromjena = true;
- }
- }
- if (!izvrsenaPromjena)
- throw NedozvoljenaOperacija("Navedeni ucesnik nije registrovan u timu!", __LINE__);
- }
- FITKolekcija<Ucesnik, bool> _getTim() const { return _tim; }
- Kategorija & _getKategorija() { return _kategorija; }
- string _getDatum() const { return _datum; }
- friend ostream& operator << (ostream &C, const Prijava &obj);
- friend bool operator == (const Prijava &prva, const Prijava &druga);
- };
- bool operator == (const Prijava &prva, const Prijava &druga) {
- if (prva._tim._getTrenutno() != druga._tim._getTrenutno())
- return false;
- for (int i = 0; i < prva._tim._getTrenutno(); i++) {
- if (prva._tim._getElement1(i) != druga._tim._getElement1(i))
- return false;
- }
- if (prva._kategorija == druga._kategorija)
- return true;
- return false;
- }
- ostream& operator << (ostream &C, const Prijava &obj) {
- C << "Datum prijave: " << obj._datum << endl;
- C << "Kategorija: " << _ispisKategorije[obj._kategorija] << endl;
- C << "Tim:\n";
- if (obj._tim._getTrenutno() == 0)
- C << "Podaci o clanovima tima nisu evidentirani!" << endl;
- else {
- for (int i = 0; i < obj._tim._getTrenutno(); i++)
- C << obj._tim._getElement1(i) << endl;
- } return C;
- }
- //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:
- //Konstruktor i destruktor
- PrijavaProjekta(char* naziv, string opis, string datum, Kategorija kategorija):Prijava(datum, kategorija) {
- int vel = strlen(naziv) +1;
- _nazivProjekta = new char[vel];
- strcpy_s(_nazivProjekta, vel, naziv);
- _opisProjekta = opis;
- _finalizirano = _prezentacija = false;
- }
- virtual ~PrijavaProjekta() { cout << "PrijavaProjekta::destruktor! "; if (_nazivProjekta) { delete[]_nazivProjekta; _nazivProjekta = nullptr; } }
- PrijavaProjekta(const PrijavaProjekta & obj): Prijava(obj) {
- int vel = strlen(obj._nazivProjekta) +1;
- _nazivProjekta = new char[vel];
- strcpy_s(_nazivProjekta, vel, obj._nazivProjekta);
- _opisProjekta = obj._opisProjekta;
- _finalizirano = obj._finalizirano;
- _prezentacija = obj._prezentacija;
- }
- PrijavaProjekta & operator = (const PrijavaProjekta & obj) {
- if (this != &obj) {
- delete[]_nazivProjekta;
- int vel = strlen(obj._nazivProjekta) +1;
- _nazivProjekta = new char[vel];
- strcpy_s(_nazivProjekta, vel, obj._nazivProjekta);
- _opisProjekta = obj._opisProjekta;
- _finalizirano = obj._finalizirano;
- _prezentacija = obj._prezentacija;
- } return *this;
- }
- void _setOpisProjekta(string noviOpis) { _opisProjekta = noviOpis; }
- void _setFinalizirano(bool vrijednost) { _finalizirano = vrijednost; }
- void _setPrezentacija(bool vrijednost) { _prezentacija = vrijednost; }
- bool _getFinalizirano() const { return _finalizirano; }
- bool _getPrezentacija() const { return _prezentacija; }
- friend ostream & operator << (ostream &C, const PrijavaProjekta &obj);
- friend bool operator == (const PrijavaProjekta &prvi, const PrijavaProjekta &drugi);
- };
- ostream & operator << (ostream &C, const PrijavaProjekta &obj) {
- C << "Naziv projekta: " << obj._nazivProjekta << endl;
- C << "Opis projekta: " << obj._opisProjekta << endl;
- C << "Datum prijave: " << obj._datum << endl;
- C << "Kategorija: " << _ispisKategorije[obj._kategorija] << endl;
- if (obj._tim._getTrenutno() == 0)
- C << "Podaci o clanovima tima nisu evidentirani!" << endl;
- else {
- for (int i = 0; i < obj._tim._getTrenutno(); i++)
- C << obj._tim._getElement1(i) << endl;
- } return C;
- }
- bool operator == (const PrijavaProjekta &prvi, const PrijavaProjekta &drugi) {
- return strcmp(prvi._nazivProjekta, drugi._nazivProjekta) == 0;
- }
- 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:
- //Konstruktor
- FITCodingChallenge(int godina, string prijaveDo) {
- _godina = godina;
- if (_provjeriIspravnost(prijaveDo, praviloDatumMatch, 1))
- _prijaveDo = prijaveDo;
- else _prijaveDo = "01.01.2000";
- }
- ~FITCodingChallenge() { cout << "FITCodingChallange::destruktor! "; }
- FITCodingChallenge(const FITCodingChallenge & obj) {
- _godina = obj._godina;
- _prijaveDo = obj._prijaveDo;
- _prijave = obj._prijave;
- _komisija = obj._komisija;
- _ocjene = obj._ocjene;
- }
- FITCodingChallenge & operator = (const FITCodingChallenge & obj) {
- if (this != &obj) {
- _godina = obj._godina;
- _prijaveDo = obj._prijaveDo;
- _prijave = obj._prijave;
- _komisija = obj._komisija;
- _ocjene = obj._ocjene;
- } return *this;
- }
- //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 (!_porediDatume(prijava._getDatum(), _prijaveDo))
- throw NedozvoljenaOperacija("Rok za prijave je istekao!", __LINE__);
- for (unsigned int i = 0; i < _prijave.size(); i++) {
- if (_prijave[i]->_getKategorija() == prijava._getKategorija()) {
- for (int j = 0; j < _prijave[i]->_getTim()._getTrenutno(); j++) {
- for (int e = 0; e < prijava._getTim()._getTrenutno(); e++)
- if (_prijave[i]->_getTim()._getElement1(j) == prijava._getTim()._getElement1(e))
- throw NedozvoljenaOperacija("Ucesnik iz prijave vec postoji u prijavljen na istoj Kategoriji!", __LINE__);
- }
- }
- }
- PrijavaProjekta * pok = dynamic_cast<PrijavaProjekta *>(&prijava);
- if (pok)
- _prijave.push_back(pok);
- else
- _prijave.push_back(&prijava);
- return *this;
- }
- //Funkciju koja odredjenu prijavu oznacava kao finaliziranu i odabranu za prezentaciju ili ne.
- void _finalizirajPrijavu(PrijavaProjekta & prijava) {
- PrijavaProjekta *pok = nullptr; bool pronadjen = false;
- for (unsigned int i = 0; i < _prijave.size(); i++) {
- pok = dynamic_cast<PrijavaProjekta *>(_prijave[i]);
- if (pok != nullptr && prijava == *pok) {
- dynamic_cast<PrijavaProjekta *>(_prijave[i])->_setFinalizirano(1);
- dynamic_cast<PrijavaProjekta *>(_prijave[i])->_setPrezentacija(1);
- return;
- }
- }
- if (!pronadjen)
- throw NedozvoljenaOperacija("Navedena prijava nije pronadjena!", __LINE__);
- }
- //Operator () za dodavanje clanova komisije po kategorijama. Sprijeciti dodavanje istih clanova u sklopu jedne kategorije.
- void operator () (ClanKomisije &obj, Kategorija kat) {
- try {
- _komisija.AddElement(obj, kat);
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- }
- //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 _ispisPrijavaPoKategorijama(Kategorija kat = (Kategorija)101) {
- sort(_prijave.begin(), _prijave.end());
- if (kat == (Kategorija)101) {
- for (Prijava* i : _prijave)
- cout << crt << *i;
- } else {
- bool pronadjena = false;
- for (int i = 0; i < _prijave.size(); i++)
- if (_prijave[i]->_getKategorija() == kat) {
- cout << crt << *_prijave[i]; pronadjena = true;
- }
- if (!pronadjena) throw NedozvoljenaOperacija("Navedena Kategorija ne postoji u Prijavama!", __LINE__);
- }
- }
- //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 _ocjeniPrijavu(Prijava & prijava, ClanKomisije * clan, double ocjena) {
- PrijavaProjekta * pok = nullptr;
- if (dynamic_cast<PrijavaProjekta*>(&prijava)) {
- if (ocjena < 1 || ocjena > 10)
- throw NedozvoljenaOperacija("Unesena ocjena ne postoji u skali za projekte!", __LINE__);
- } else {
- if (ocjena < 0 || ocjena > 100)
- throw NedozvoljenaOperacija("Uneseni broj bodova nije moguce dodijeliti prijavi!", __LINE__);
- }
- for (int i = 0; i < _komisija._getTrenutno(); i++) {
- if (*clan == _komisija._getElement1(i) && prijava._getKategorija() == _komisija._getElement2(i)) {
- FITKolekcija<ClanKomisije *, double> _temp;
- for (int j = 0; j < _prijave.size(); j++) {
- pok = dynamic_cast<PrijavaProjekta*>(_prijave[j]);
- if (*_prijave[j] == prijava) { //ne postoji bolji nacin provjere da li je to odgovarajuca prijava // poor class
- if (pok) {
- if (pok->_getFinalizirano() && pok->_getPrezentacija()) {
- _temp.AddElement(clan, ocjena);
- _ocjene.AddElement(_prijave[j], _temp);
- } else throw NedozvoljenaOperacija("Projekat prijave nije finaliziran ili nije odredjen za prezentaciju!", __LINE__);
- } else {
- _temp.AddElement(clan, ocjena);
- _ocjene.AddElement(_prijave[j], _temp);
- } return;
- }
- }
- }
- } throw NedozvoljenaOperacija("Navedena prijava ne postoji!", __LINE__);
- }
- //Funkcija koja na osnovu imena i prezimena clana komisije ispisuje podatke o njegovim ocjenama uključujući
- //prijave na koje se one odnose.
- void _pretragaClanovaKomisije(char *imePrezime) {
- string _imePrezime = (string)imePrezime; int brIspisa = 0;
- for (int i = 0; i < _ocjene._getTrenutno(); i++) {
- for (int j = 0; j < _ocjene._getElement2(i)._getTrenutno(); j++)
- if (_imePrezime == _ocjene._getElement2(i)._getElement1(j)->_getImePrezime()) {
- if (brIspisa == 0) {
- cout << crt << "..:: CLAN KOMISIJE ::..\n" << crt << *_ocjene._getElement2(i)._getElement1(j); brIspisa++;
- }
- cout << crt << "..:: UCESNIK ::..\n" << crt << *_ocjene._getElement1(i);
- cout << crt << _ocjene._getElement2(i)._getElement1(j)->_getImePrezime() << " ocjenio sa: " << _ocjene._getElement2(i)._getElement2(j) << endl << crt;
- }
- }
- }
- //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 _pretragaUcesnika(char *imePrezime) {
- string _imePrezime = (string)imePrezime; int brIspisa = 0; bool pronadjen = false;
- for (int i = 0; i < _prijave.size(); i++) {
- for (int j = 0; j < _prijave[i]->_getTim()._getTrenutno(); j++) {
- if (_prijave[i]->_getTim()._getElement1(j)._getImePrezime() == _imePrezime) {
- pronadjen = true;
- if (brIspisa == 0) {
- cout << crt << _prijave[i]->_getTim()._getElement1(j) << crt; brIspisa++;
- }
- cout << crt << _prijave[i];
- for (int e = 0; e < _ocjene._getTrenutno(); e++) {
- for (int a = 0; a < _ocjene._getElement2(e)._getTrenutno(); a++) {
- if (_ocjene._getElement1(e) == _prijave[i])
- cout << _ocjene._getElement2(e)._getElement1(a)->_getImePrezime() << " ocijenio sa: " << _ocjene._getElement2(e)._getElement2(a) << endl << crt;
- }
- }
- }
- }
- }
- if (!pronadjen) throw NedozvoljenaOperacija("Navedeni Ucesnik nije pronadjen!", __LINE__);
- }
- //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 kat) {
- int brojOcjena = 0; bool ulaz = false, pronadjenaKat = false;
- FITKolekcija<double, int> _bodoviIndeks;
- for (int i = 0; i < _ocjene._getTrenutno(); i++) {
- if (_ocjene._getElement1(i)->_getKategorija() == kat) {
- pronadjenaKat = true;
- for (int j = 0; j < _ocjene._getElement2(i)._getTrenutno(); j++) {
- ulaz = false;
- for (int e = 0; e < _bodoviIndeks._getTrenutno(); e++)
- if (_ocjene._getElement1(_bodoviIndeks._getElement2(e)) == _ocjene._getElement1(i)) {
- _bodoviIndeks._setElement1(e, (_bodoviIndeks._getElement1(e)+_ocjene._getElement2(i)._getElement2(j))/2); ulaz = true;
- }
- if (!ulaz)
- _bodoviIndeks.AddElement(_ocjene._getElement2(i)._getElement2(j), i);
- }
- }
- }
- if (!pronadjenaKat) throw NedozvoljenaOperacija("Navedena Kategorija nije pronadjena!", __LINE__);
- _bodoviIndeks.sortirajKolekcijuPoBodovima();
- cout << crt << "Kategorija: " << _ispisKategorije[kat] << endl << crt;
- for (int i = 0; i < _bodoviIndeks._getTrenutno(); i++) {
- cout << crt << *_ocjene._getElement1(_bodoviIndeks._getElement2(i)) << endl << crt;
- cout << "Prosjek: " << _bodoviIndeks._getElement1(i) << endl << crt;
- }
- }
- //Funkciju Info koja ispisuje sve podatke o takmicenju: prijave i clanove komisije po kategorijama, projekte i
- void Info() {
- cout << crt << " ..:: FIT Coding Challenge " << _godina << " ::.. " << endl << crt;
- try {
- this->_rangirajKandidate(CodingChallenge);
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- try {
- this->_rangirajKandidate(SQLChallenge);
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- try {
- this->_rangirajKandidate(InnovationChallenge);
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- try {
- this->_rangirajKandidate(MobileChallenge);
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- try {
- this->_rangirajKandidate(GameChallenge);
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- _komisija.sortirajKolekcijuPoKategorijamaClanovaKomisije();
- int brIspisa = 0;
- for (int i = 0; i < _komisija._getTrenutno(); i++) {
- if (i != 0 && _komisija._getElement2(i) != _komisija._getElement2(i-1)) { brIspisa = 0; }
- if (brIspisa == 0) {
- cout << endl << crt << " ..:: CLANOVI KOMISIJE ZA " << _ispisKategorije[_komisija._getElement2(i)] << " :: .." << endl << crt; brIspisa++;
- }
- cout << crt << _komisija._getElement1(i) << crt;
- }
- cout << "\n-----****-----\n MAKE CODE\n GREAT AGAIN\n-----****-----\n";
- }
- };
- void main() {
- #pragma region Ucesnici&ClanoviKomisije
- Ucesnik dzenana("Dzenana", "Kuric", 1994, "dzenana.kuric@etf.unsa.ba", "Dz3na", "ETF");
- Ucesnik vehid("Vehid", "Djukic", 1991, "vehid.djukic@edu.fit.ba", "vegn4Gun", "FIT");
- Ucesnik mirza("Mirza", "Smajic", 1992, "mirza.smajic@edu.fit.ba", "M1kik1", "FIT");
- Ucesnik tarik("Tarik", "Djurdjevic", 1996, "tarik.djurdjevic@edu.fit.ba", "Djur4", "FIT");
- Ucesnik borki("Dalibor", "Blazevic", 1992, "dalibor.blazevic@edu.fit.ba", "Dal1b0rkiC", "FIT");
- Ucesnik ajdin("Ajdin", "Meskovic", 1998, "ajdin.meskovic@edu.fit.ba", "p4saMal1", "FIT");
- Ucesnik rusmir("Rusmir", "Hockic", 1996, "rusmir.hockic@edu.fit.ba", "ruk1m0n", "FIT");
- Ucesnik amer("Amer", "Karamustafic", 1996, "amer.karamustafic@edu.fit.ba", "k4raMu", "FIT");
- ClanKomisije adnan("Adnan", "Jusic", 1995, "jusic.adnan@edu.fit.ba", "uberG33k", "FIT", "Full-stack Developer", "MAKE CODE GREAT AGAIN");
- ClanKomisije ensar("Ensar", "Meskovic", 1994, "ensar.meskovic@edu.fit.ba", "Lak1luk", "FIT", "K-dant", "MAKE CODE GREAT AGAIN");
- #pragma endregion
- #pragma region Prijave&PrijaveProjekata
- Prijava kod1("12.05.2017", CodingChallenge), kod2("13.05.2017", CodingChallenge), kod3("15.05.2017", CodingChallenge), kod4("14.05.2017", CodingChallenge);
- Prijava sql1("11.05.2017", SQLChallenge), sql2("13.05.2017", SQLChallenge), sql3("23.05.2017", SQLChallenge);
- PrijavaProjekta kacket("Eyetelligence", "Pomoc slijepim osobama", "01.05.2017", InnovationChallenge);
- PrijavaProjekta ecomm("Fast-commerce", "New eway-commerce", "17.02.2019", InnovationChallenge);
- PrijavaProjekta eSkola("eSkola", "Online skola", "17.04.2017", InnovationChallenge);
- PrijavaProjekta igraFIT("FIT Game", "Igra", "20.04.2017", GameChallenge);
- try {
- kod1.AddClanaTima(ajdin, true);
- kod3.AddClanaTima(rusmir, true);
- kod4.AddClanaTima(amer, true);
- kod2.AddClanaTima(borki, true);
- kod2.AddClanaTima(tarik, false);
- kod2.AddClanaTima(amer, false);//izuzetak
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- cout << crt << kod2;
- try {
- sql1.AddClanaTima(tarik, true);
- sql2.AddClanaTima(vehid, false);
- sql3.AddClanaTima(amer, true);
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- cout << crt << sql2;
- try {
- sql2.PromjeniPredstavnikaTima(amer);//izuzetak
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- sql2.PromjeniPredstavnikaTima(vehid);
- sql3 = kod2;
- if (sql3 == kod2) {
- cout << "Identicne prijave!" << endl;
- }
- cout << crt << sql2;
- try {
- kacket.AddClanaTima(mirza, true);
- kacket.AddClanaTima(borki, false);
- igraFIT.AddClanaTima(tarik, true);
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- cout << crt << kacket;
- cout << crt << igraFIT;
- #pragma endregion
- #pragma region TestiranjeFITCodingChallenge
- FITCodingChallenge CC17(2017, "22.05.2017");
- CC17(adnan, SQLChallenge);
- CC17(ensar, InnovationChallenge);
- CC17(adnan, CodingChallenge);
- CC17(ensar, CodingChallenge);
- CC17(adnan, GameChallenge);
- try {
- CC17 += igraFIT; CC17 += kacket;
- CC17 += kod1; CC17 += kod2; CC17 += kod3; CC17 += kod4;
- CC17 += sql1; CC17 += sql2; CC17 += sql3;
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- CC17._finalizirajPrijavu(igraFIT);
- try {
- CC17._ocjeniPrijavu(kacket, &ensar, 78);
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- try {
- CC17._ocjeniPrijavu(kod1, &ensar, 79);
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- try {
- CC17._ocjeniPrijavu(kod1, &adnan, 74);//
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- try {
- CC17._ocjeniPrijavu(sql2, &adnan, 83);//
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- try {
- CC17._ocjeniPrijavu(kod2, &ensar, 65);
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- try {
- CC17._ocjeniPrijavu(kod2, &adnan, 70);//
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- try {
- CC17._ocjeniPrijavu(kod3, &adnan, 72);//
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- try {
- CC17._ocjeniPrijavu(kod4, &adnan, 76);//
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- try {
- CC17._ocjeniPrijavu(sql1, &adnan, 69);//
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- try {
- CC17._ocjeniPrijavu(igraFIT, &adnan, 10);
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- CC17._pretragaClanovaKomisije("Adnan Jusic");
- cout << "\n\n\n";
- try {
- CC17._ispisPrijavaPoKategorijama();
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- try {
- CC17._rangirajKandidate(CodingChallenge);
- } catch (NedozvoljenaOperacija &greska) {
- greska.Info();
- }
- CC17.Info();
- #pragma endregion
- getchar();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement