Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ConsoleApplication50.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include<iostream>
- #include<string>
- #include<regex>
- 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(const FITKolekcija<T1, T2> &org)
- {
- _trenutno = org._trenutno;
- _elementi1 = new T1[_trenutno];
- _elementi2 = new T2[_trenutno];
- for (size_t i = 0; i < _trenutno; i++)
- {
- _elementi1[i] = org._elementi1[i];
- _elementi2[i] = org._elementi2[i];
- }
- }
- ~FITKolekcija()
- {
- delete[]_elementi1;
- delete[]_elementi2;
- _elementi1 = nullptr;
- _elementi2 = nullptr;
- }
- FITKolekcija & operator=(const FITKolekcija<T1, T2>& org)
- {
- if (this != &org)
- {
- delete[]_elementi1;
- delete[]_elementi2;
- _trenutno = org._trenutno;
- _elementi1 = new T1[_trenutno];
- _elementi2 = new T2[_trenutno];
- for (size_t i = 0; i < _trenutno; i++)
- {
- _elementi1[i] = org._elementi1[i];
- _elementi2[i] = org._elementi2[i];
- }
- }
- return *this;
- }
- void dodajElemente(T1 element1, T2 element2)
- {
- T1 *temp1 = new T1[_trenutno + 1];
- T2 *temp2 = new T2[_trenutno + 1];
- for (size_t i = 0; i < _trenutno; i++)
- {
- temp1[i] = _elementi1[i];
- temp2[i] = _elementi2[i];
- }
- delete[]_elementi1;
- delete[]_elementi2;
- temp1[_trenutno] = element1;
- temp2[_trenutno++] = element2;
- _elementi1 = temp1;
- _elementi2 = temp2;
- }
- void RemoveElementPoLok(int lokacija)
- {
- if (lokacija<0 || lokacija>=_trenutno)
- return;
- T1* temp1 = new T1[_trenutno - 1];
- T2* temp2 = new T2[_trenutno - 1];
- int j = 0;
- for (size_t i = 0; i < _trenutno; i++)
- {
- if (i != lokacija)
- {
- temp1[j] = _elementi1[i];
- temp2[j++] = _elementi2[i];
- }
- }
- _trenutno--;
- delete[]_elementi1; delete[]_elementi2;
- _elementi1 = temp1;
- _elementi2 = temp2;
- }
- T1 & getElement1(int lokacija)
- {
- if (lokacija >= 0 && lokacija < _trenutno)
- return _elementi1[lokacija];
- }
- T2 & getElement2(int lokacija)
- {
- if (lokacija >= 0 && lokacija < _trenutno)
- return _elementi2[lokacija];
- }
- int getTrenutno() { return _trenutno; }
- bool operator==(FITKolekcija<T1, T2> &obj)
- {
- if (_trenutno != obj._trenutno)
- return false;
- for (size_t i = 0; i < _trenutno; i++)
- {
- if (_elementi1[i] == obj._elementi1[i] && _elementi2[i] == obj._elementi2[i])
- return true;
- }
- return false;
- }
- friend ostream & operator<< <>(ostream &COUT, FITKolekcija<T1, T2> &org);
- };
- template<class T1, class T2>
- ostream & operator<< <>(ostream &COUT, FITKolekcija<T1, T2> &org)
- {
- COUT << "Elementi 1: " << endl;
- for (size_t i = 0; i < org._trenutno; i++)
- {
- COUT << org._elementi1[i] << ", ";
- }
- COUT << endl;
- COUT << "Elementi 2: " << endl;
- for (size_t i = 0; i < org._trenutno; i++)
- {
- COUT << org._elementi2[i] << ", ";
- }
- COUT << endl;
- return COUT;
- }
- enum Kategorija { GameChallenge, InnovationChallenge, MobileChallenge, SQLChallenge, CodingChallenge };
- //Klasu proglasiti apstraktnom
- class Osoba
- {
- protected:
- char* _ime;
- char* _prezime;
- int _godiste;
- public:
- Osoba()
- {
- _ime = nullptr;
- _prezime = nullptr;
- _godiste = 2018;
- }
- 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;
- }
- Osoba(const Osoba &org)
- {
- int vel = strlen(org._ime) + 1;
- _ime = new char[vel];
- strcpy_s(_ime, vel, org._ime);
- vel = strlen(org._prezime) + 1;
- _prezime = new char[vel];
- strcpy_s(_prezime, vel, org._prezime);
- _godiste = org._godiste;
- }
- Osoba & operator=(const Osoba& org)
- {
- if (this != &org)
- {
- delete[]_ime; delete[]_prezime;
- int vel = strlen(org._ime) + 1;
- _ime = new char[vel];
- strcpy_s(_ime, vel, org._ime);
- vel = strlen(org._prezime) + 1;
- _prezime = new char[vel];
- strcpy_s(_prezime, vel, org._prezime);
- _godiste = org._godiste;
- }
- return *this;
- }
- bool operator==(const Osoba& obj)
- {
- if (strcmp(_ime, obj._ime) == 0 && strcmp(_prezime, obj._prezime) == 0 && _godiste == obj._godiste)
- return true;
- }
- virtual ~Osoba()
- {
- delete[] _ime;
- _ime = nullptr;
- delete[] _prezime;
- _prezime = nullptr;
- }
- virtual void Info()=0;
- /*{
- cout << _ime << "\n" << _prezime << "\n" << _godiste << endl;
- }*/
- };
- //Prepoznati nasljedjivanje izmedju odgovarajući klasa
- //I ucesnici i clanovi komisije trebaju imati podatke za pristup sistemu (email i password)
- class Ucesnik:virtual public Osoba
- {
- protected:
- char* _email;
- string password; //Najmanje 5 karaktera, kombinacija brojeva i velikih slova
- string _obrazovnaInstitucija;
- public:
- //Potrebne funkcije za rad sa klasom
- Ucesnik()
- {
- _email = nullptr;
- password = "-";
- _obrazovnaInstitucija = "-";
- }
- Ucesnik(const char* ime, const char* prezime, int godiste,const char* email, string pswd, string obrazovnaInstitucija)
- :Osoba(ime,prezime,godiste)
- {
- int size = strlen(email) + 1;
- _email = new char[size];
- strcpy_s(_email, size, email);
- password = pswd;
- _obrazovnaInstitucija = obrazovnaInstitucija;
- }
- Ucesnik(const Ucesnik &org) :Osoba(org)
- {
- int size = strlen(org._email) + 1;
- _email = new char[size];
- strcpy_s(_email, size, org._email);
- password = org.password;
- _obrazovnaInstitucija = org._obrazovnaInstitucija;
- }
- Ucesnik & operator=(const Ucesnik &org)
- {
- if (this != &org)
- {
- delete[]_email;
- int size = strlen(org._email) + 1;
- _email = new char[size];
- strcpy_s(_email, size, org._email);
- password = org.password;
- _obrazovnaInstitucija = org._obrazovnaInstitucija;
- }
- return *this;
- }
- bool operator==(const Ucesnik& obj)
- {
- if (strcmp(_email, obj._email) == 0 && _obrazovnaInstitucija == obj._obrazovnaInstitucija)
- return true;
- }
- ~Ucesnik()
- {
- delete[]_email;
- _email = nullptr;
- }
- void Info()
- {
- cout << _ime << "\n" << _prezime << "\n" << _godiste << endl;
- cout << _email << "\n" << password << "\n" << _obrazovnaInstitucija << endl;
- }
- };
- class ClanKomisije:public Ucesnik {
- char* _pozicija; //Radno mjesto u firmi
- string _firma;
- public:
- //Potrebne funkcije za rad sa klasom
- ClanKomisije()
- {
- _pozicija = nullptr;
- _firma = "-";
- }
- ClanKomisije(const char* ime, const char* prezime, int godiste,const char* email, string pswd,string obrazovnaInstitucija,const char* pozicija, string firma)
- :Ucesnik(ime,prezime,godiste,email,pswd,obrazovnaInstitucija),
- Osoba(ime,prezime,godiste)
- {
- int size = strlen(pozicija) + 1;
- _pozicija = new char[size];
- strcpy_s(_pozicija, size, pozicija);
- _firma = firma;
- }
- ClanKomisije(const ClanKomisije &org) :Ucesnik(org), Osoba(org)
- {
- int size = strlen(org._pozicija) + 1;
- _pozicija = new char[size];
- strcpy_s(_pozicija, size, org._pozicija);
- _firma = org._firma;
- }
- ClanKomisije & operator=(const ClanKomisije& org)
- {
- if (this != &org)
- {
- delete[]_pozicija;
- int size = strlen(org._pozicija) + 1;
- _pozicija = new char[size];
- strcpy_s(_pozicija, size, org._pozicija);
- _firma = org._firma;
- }
- }
- bool operator==(const ClanKomisije& obj)
- {
- if (strcmp(_pozicija, obj._pozicija) == 0 && _firma == obj._firma)
- return true;
- }
- ~ClanKomisije()
- {
- delete[]_pozicija;
- _pozicija = nullptr;
- }
- void Info()
- {
- cout << _ime << "\n" << _prezime << "\n" << _godiste << endl;
- cout << _email << "\n" << password << "\n" << _obrazovnaInstitucija << endl;
- cout << _pozicija << "\n" << _firma << endl;
- }
- };
- //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 kat)
- {
- _datum = datum;
- _kategorija = kat;
- }
- //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.
- bool DodajClanaTima(Ucesnik &uc, bool predstavnik=false)
- {
- if (_kategorija == SQLChallenge || _kategorija == CodingChallenge)
- {
- if (_tim.getTrenutno() > 2)
- return false;
- for (size_t i = 0; i < _tim.getTrenutno(); i++)
- {
- if (_tim.getElement1(i) == uc)
- return false;
- }
- _tim.dodajElemente(uc, predstavnik);
- }
- if (_kategorija == GameChallenge || _kategorija == MobileChallenge)
- {
- if (_tim.getTrenutno() > 3)
- return false;
- for (size_t i = 0; i < _tim.getTrenutno(); i++)
- {
- if (_tim.getElement1(i) == uc)
- return false;
- }
- _tim.dodajElemente(uc, predstavnik);
- }
- if (_kategorija == InnovationChallenge)
- {
- if (_tim.getTrenutno() > 4)
- return false;
- for (size_t i = 0; i < _tim.getTrenutno(); i++)
- {
- if (_tim.getElement1(i) == uc)
- return false;
- }
- _tim.dodajElemente(uc, predstavnik);
- }
- return true;
- }
- //Funkciju za promjenu predstavnika tima.
- void PromjenaPredstavnikaTima(Ucesnik &uc)
- {
- for (size_t i = 0; i < _tim.getTrenutno(); i++)
- {
- if (_tim.getElement1(i) == uc)
- _tim.getElement2(i) = true;
- else
- _tim.getElement2(i) = false;
- }
- }
- };
- //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(string datum, Kategorija kat,const char* nazivPr, string opisPr):Prijava(datum,kat) {
- int size = strlen(nazivPr) + 1;
- _nazivProjekta = new char[size];
- strcpy_s(_nazivProjekta, size, nazivPr);
- _opisProjekta = opisPr;
- _finalizirano = false;
- _prezentacija = false;
- }
- ~PrijavaProjekta()
- {
- delete[] _nazivProjekta;
- _nazivProjekta = nullptr;
- }
- //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:
- //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.
- //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 novi("Josip", "Jelica", 1999, "josipjelica@mail.com", "sifrapassword", "FIT");
- Ucesnik novi2 = novi;
- Ucesnik drugi("Milan", "Rapaic", 1995, "milanrapaic@mail.com", "sifrapassword", "FIT");
- ClanKomisije noviClan("Robert", "Prosinecki", 1998, "robertprosinecki@mail.com", "sifrapassword", "FIT", "sef", "FirmaNeka");
- ClanKomisije noviClan2 = noviClan;
- Prijava p1("20.01.2018", SQLChallenge);
- if (p1.DodajClanaTima(novi,true))
- cout << "Clan tima uspjesno dodan!" << endl;
- if (p1.DodajClanaTima(drugi))
- cout << "Clan tima uspjesno dodan!" << endl;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement