Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ---------------------------------------------------------------------------------------------------------------------------------------
- #include <iostream>
- #include <vector>
- #include <string>
- using namespace std;
- const char* crt = "\n-------------------------------------------\n";
- const char* nedozvoljena_operacija = "Nedozvoljena operacija";
- const char* not_set = "NOT_SET";
- const int min_polgavlja = 3;
- const int min_karaktera_po_poglavlju = 30;
- char* AlocirajNizKaraktera(const char* sadrzaj) {
- if (sadrzaj == nullptr)
- return nullptr;
- int vel = strlen(sadrzaj) + 1;
- char* temp = new char[vel];
- strcpy_s(temp, vel, sadrzaj);
- return temp;
- }
- template <class T1, class T2>
- class Kolekcija {
- T1* _elementi1;
- T2* _elementi2;
- int* _trenutno;
- public:
- Kolekcija() : _elementi1(nullptr), _elementi2(nullptr), _trenutno(new int(0)) {}
- ~Kolekcija() {
- delete[] _elementi1; _elementi1 = nullptr;
- delete[] _elementi2; _elementi2 = nullptr;
- delete _trenutno; _trenutno = nullptr;
- }
- T1* getElementi1Pok() { return _elementi1; }
- T2* getElementi2Pok() { return _elementi2; }
- T1& getElement1(int lokacija) { return _elementi1[lokacija]; }
- T2& getElement2(int lokacija) { return _elementi2[lokacija]; }
- int* getTrenutno() { return _trenutno; }
- void DodajElemente(const T1& el1, const T2& el2) {
- T1* noviElem1 = new T1[*_trenutno + 1];
- T2* noviElem2 = new T2[*_trenutno + 1];
- for (int i = 0; i < *_trenutno; i++) {
- noviElem1[i] = _elementi1[i];
- noviElem2[i] = _elementi2[i];
- }
- noviElem1[*_trenutno] = el1;
- noviElem2[*_trenutno] = el2;
- delete[] _elementi1;
- delete[] _elementi2;
- _elementi1 = noviElem1;
- _elementi2 = noviElem2;
- (*_trenutno)++;
- }
- friend ostream& operator<<(ostream& COUT, Kolekcija<T1, T2>& obj) {
- for (int i = 0; i < *obj._trenutno; i++)
- COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
- return COUT;
- }
- };
- class Poglavlje {
- char* _naslov;
- char* _sadrzaj;
- bool _prihvaceno;
- int _ocjena; //da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6 - 10
- public:
- Poglavlje(const char* naslov = nullptr, const char* sadrzaj = nullptr)
- : _ocjena(0), _prihvaceno(false) {
- _naslov = AlocirajNizKaraktera(naslov);
- _sadrzaj = AlocirajNizKaraktera(sadrzaj);
- }
- Poglavlje(const Poglavlje& p) : _ocjena(p._ocjena), _prihvaceno(p._prihvaceno) {
- _naslov = AlocirajNizKaraktera(p._naslov);
- _sadrzaj = AlocirajNizKaraktera(p._sadrzaj);
- }
- ~Poglavlje() {
- delete[] _naslov; _naslov = nullptr;
- delete[] _sadrzaj; _sadrzaj = nullptr;
- }
- friend ostream& operator<<(ostream& COUT, Poglavlje& obj) {
- if (obj._naslov == nullptr || obj._sadrzaj == nullptr)
- return COUT;
- COUT << endl << obj._naslov << endl << obj._sadrzaj << endl;
- if (obj._prihvaceno)
- COUT << "Ocjena: " << obj._ocjena << endl;
- return COUT;
- }
- char* GetNaslov() { return _naslov; }
- const char* GetSadrzaj() const { return _sadrzaj; }
- bool GetPrihvaceno() const { return _prihvaceno; }
- int GetOcjena() const { return _ocjena; }
- void OcijeniPoglavlje(int ocjena) {
- _ocjena = ocjena;
- if (_ocjena >= 6 && _ocjena <= 10)
- _prihvaceno = true;
- }
- };
- class ZavrsniRad {
- char* _tema;
- vector<Poglavlje> _poglavljaRada;
- string _datumOdbrane;
- float _konacnaOcjena; //prosjek ocjena svih poglavlja u zavrsnom radu koja se izracunava u momentu zakazivanja odbrane
- public:
- void SetKonacnaOcjena(float konacnaOcjena) {
- _konacnaOcjena = konacnaOcjena;
- }
- ZavrsniRad(const char* nazivTeme = nullptr) : _konacnaOcjena(0), _datumOdbrane(not_set) {
- _tema = AlocirajNizKaraktera(nazivTeme);
- }
- ZavrsniRad(const ZavrsniRad& org) : _poglavljaRada(org._poglavljaRada), _konacnaOcjena(org._konacnaOcjena), _datumOdbrane(org._datumOdbrane) {
- _tema = AlocirajNizKaraktera(org._tema);
- }
- ~ZavrsniRad() {
- delete[] _tema; _tema = nullptr;
- }
- char* GetNazivTeme() const { return _tema; }
- vector<Poglavlje>& GetPoglavlja() { return _poglavljaRada; }
- string GetDatumOdbrane() const { return _datumOdbrane; }
- float GetKonacnaOcjena() const { return _konacnaOcjena; }
- void SetDatumOdbrane(string datumOdbrane) { _datumOdbrane = datumOdbrane; }
- ZavrsniRad& operator=(const ZavrsniRad& org) {
- if (this != &org) {
- delete[] _tema;
- _tema = AlocirajNizKaraktera(org._tema);
- _datumOdbrane = org._datumOdbrane;
- _poglavljaRada = org._poglavljaRada;
- _konacnaOcjena = org._konacnaOcjena;
- }
- return *this;
- }
- friend ostream& operator<<(ostream& COUT, ZavrsniRad& obj) {
- COUT << "Tema rada: " << obj._tema << endl;
- COUT << "Sadrzaj: " << endl;
- for (size_t i = 0; i < obj._poglavljaRada.size(); i++)
- COUT << obj._poglavljaRada[i] << endl;
- COUT << "Datum odbrane rada: " << obj._datumOdbrane << endl << " Ocjena: " << obj._konacnaOcjena << endl;
- return COUT;
- }
- void DodajPoglavlje(const char* naslov, const char* sadrzaj) {
- Poglavlje novo(naslov, sadrzaj);
- _poglavljaRada.push_back(novo);
- }
- void OcijeniPoglavlje(const char* naslov, int ocjena) {
- for (size_t i = 0; i < _poglavljaRada.size(); i++) {
- if (strcmp(_poglavljaRada[i].GetNaslov(), naslov) == 0) {
- _poglavljaRada[i].OcijeniPoglavlje(ocjena);
- break;
- }
- }
- }
- };
- class Mentor {
- char* _imePrezime;
- Kolekcija<string, ZavrsniRad> _teme;
- public:
- Mentor(const char* imePrezime) : _teme() {
- _imePrezime = AlocirajNizKaraktera(imePrezime);
- }
- ~Mentor() {
- delete[] _imePrezime; _imePrezime = nullptr;
- }
- Kolekcija<string, ZavrsniRad>& GetTeme() { return _teme; }
- char* GetImePrezime() { return _imePrezime; }
- void Info() {
- cout << _imePrezime << endl << _teme << endl;
- }
- bool DodajZavrsniRad(const string& brojIndeksa, const ZavrsniRad& rad) {
- for (int i = 0; i < *_teme.getTrenutno(); i++) {
- if (_teme.getElement1(i) == brojIndeksa)
- return false; // Student already has a topic assigned by this mentor
- }
- _teme.DodajElemente(brojIndeksa, rad);
- return true;
- }
- ZavrsniRad* ZakaziOdbranuRada(const string& brojIndeksa, const string& datumOdbrane) {
- for (int i = 0; i < *_teme.getTrenutno(); i++) {
- if (_teme.getElement1(i) == brojIndeksa) {
- ZavrsniRad& rad = _teme.getElement2(i);
- if (rad.GetPoglavlja().size() >= min_polgavlja) {
- bool svePrihvaceno = true;
- for (const Poglavlje& poglavlje : rad.GetPoglavlja()) {
- if (strlen(poglavlje.GetSadrzaj()) < min_karaktera_po_poglavlju || !poglavlje.GetPrihvaceno()) {
- svePrihvaceno = false;
- break;
- }
- }
- if (svePrihvaceno) {
- float sumaOcjena = 0;
- for (const Poglavlje& poglavlje : rad.GetPoglavlja()) {
- sumaOcjena += poglavlje.GetOcjena();
- }
- rad.SetKonacnaOcjena(sumaOcjena / rad.GetPoglavlja().size());
- float finalGrade = rad.GetKonacnaOcjena();
- return &rad;
- }
- }
- }
- }
- return nullptr;
- }
- };
- int main() {
- cout << crt << "UPLOAD RADA OBAVEZNO IZVRSITI U ODGOVARAJUCI FOLDER NA FTP SERVERU" << endl;
- cout << "U slucaju da je Upload folder prazan pritisnite tipku F5" << crt;
- const int max = 4;
- Mentor* mentori[max];
- mentori[0] = new Mentor("Armina Hubana");
- mentori[1] = new Mentor("Zanin Vejzovic");
- mentori[2] = new Mentor("Jasmin Azemovic");
- mentori[3] = new Mentor("Emina Junuz");
- ZavrsniRad multimedijalni("Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
- ZavrsniRad podrsa_operaterima("Sistem za podršku rada kablovskog operatera");
- ZavrsniRad analiza_sigurnosti("Prakticna analiza sigurnosti bežičnih računarskih mreža");
- ZavrsniRad kriptografija("Primjena teorije informacija u procesu generisanja kriptografskih ključeva");
- multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
- multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
- multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
- multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistema, a neke od najznacajnijih su ...");
- multimedijalni.DodajPoglavlje("Teorija multimedije", "Sadrzaj koji bi trebao stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130011");
- multimedijalni.DodajPoglavlje("Zakljucak", "U ovom radu su predstavljeni osnovni koncepti i prakticna primjena...");
- try {
- multimedijalni.OcijeniPoglavlje("Uvod", 8);
- multimedijalni.OcijeniPoglavlje("Vrste multimedijalnih sistema", 8);
- multimedijalni.OcijeniPoglavlje("Teorija multimedije", 9);
- multimedijalni.OcijeniPoglavlje("Zakljucak", 7);
- multimedijalni.OcijeniPoglavlje("Naziv poglavlja ne postoji", 8);
- }
- catch (exception& err) {
- cout << "Greska -> " << err.what() << endl;
- }
- if (mentori[0]->DodajZavrsniRad("IB130011", multimedijalni))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (mentori[0]->DodajZavrsniRad("IB120051", podrsa_operaterima))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (!mentori[0]->DodajZavrsniRad("IB120056", podrsa_operaterima))
- cout << "Zavrsni rad nije dodat!" << endl;
- if (!mentori[0]->DodajZavrsniRad("IB120051", kriptografija))
- cout << "Zavrsni rad nije dodat!" << endl;
- if (mentori[1]->DodajZavrsniRad("IB140102", analiza_sigurnosti))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (mentori[2]->DodajZavrsniRad("IB140002", kriptografija))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- ZavrsniRad* zr1 = mentori[0]->ZakaziOdbranuRada("IB130011", "25.09.2018");
- if (zr1 != nullptr)
- cout << *zr1 << endl;
- zr1 = mentori[0]->ZakaziOdbranuRada("IB130111", "25.09.2018");
- if (zr1 != nullptr)
- cout << *zr1 << endl;
- mentori[0]->Info();
- for (int i = 0; i < max; i++) {
- delete mentori[i];
- mentori[i] = nullptr;
- }
- system("pause>0");
- return 0;
- }
- ---------------------------------------------------------------------------------------------------------------------------------------
- #include<iostream>
- #include<vector>
- using namespace std;
- /****************************************************************************
- 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
- 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ĆE BITI OZNACENO KAO "RE"
- 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEČILO GUBLJENJE URAĐENOG ZADATKA
- 4. NAZIVI FUNKCIJA, TE BROJ I TIP PARAMETARA MORAJU BITI IDENTIČNI ONIMA KOJI SU KORIŠTENI U TESTNOM CODE-U, OSIM U SLUČAJU DA POSTOJI ADEKVATAN RAZLOG ZA NJIHOVU MODIFIKACIJU. OSTALE, POMOĆNE FUNKCIJE MOŽETE IMENOVATI I DODAVATI PO ŽELJI.
- 5. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNAČENO.
- ****************************************************************************/
- const char* crt = "\n-------------------------------------------\n";
- const char* nedozvoljena_operacija = "Nedozvoljena operacija";
- const char* not_set = "NOT_SET";
- const int min_polgavlja = 3;
- const int min_karaktera_po_poglavlju = 30;
- char* AlocirajNizKaraktera(const char* sadrzaj) {
- if (sadrzaj == nullptr)
- return nullptr;
- int vel = strlen(sadrzaj) + 1;
- char* temp = new char[vel];
- strcpy_s(temp, vel, sadrzaj);
- return temp;
- }
- template<class T1, class T2>
- class Kolekcija {
- T1* _elementi1;
- T2* _elementi2;
- int* _trenutno;
- public:
- bool AddElement(T1 el1, T2 el2) {
- //napraviti provjeru da li se unutar _elementi1 ili _elementi2 vec nalaze el1 ii el2
- for (int i = 0; i < *_trenutno; i++)
- {
- if (_elementi1[i] == el1 || _elementi2[i] == el2)
- {
- return false;
- }
- }
- //napraviti privremene temp nizove koji ce imati _trenutno +1 broj elemenata
- T1* temp1 = new T1[*_trenutno + 1];
- T2* temp2 = new T2[*_trenutno + 1];
- // nizovi su prazni z temp nizove cemo prebaciti stare elemente
- for (int i = 0; i < *_trenutno; i++)
- {
- temp1[i] = _elementi1[i];
- temp2[i] = _elementi2[i];
- }
- temp1[*_trenutno] = el1;
- temp2[*_trenutno] = el2;
- delete[]_elementi1;
- delete[]_elementi2;
- _elementi1 = temp1;
- _elementi2 = temp2;
- (*_trenutno)++;
- return true;
- }
- Kolekcija() :_elementi1(nullptr), _elementi2(nullptr) {
- _trenutno = new int(0);
- }
- ~Kolekcija() {
- delete[] _elementi1; _elementi1 = nullptr;
- delete[] _elementi2; _elementi2 = nullptr;
- delete _trenutno; _trenutno = nullptr;
- }
- T1* getElementi1Pok() { return _elementi1; }
- T2* getElementi2Pok() { return _elementi2; }
- T1& getElement1(int lokacija) { return _elementi1[lokacija]; }
- T2& getElement2(int lokacija) { return _elementi2[lokacija]; }
- int* getTrenutno() { return _trenutno; }
- friend ostream& operator<<(ostream& COUT, Kolekcija<T1, T2>& obj) {
- for (int i = 0; i < *obj._trenutno; i++)
- COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
- return COUT;
- }
- };
- class Poglavlje {
- char* _naslov;
- char* _sadrzaj;
- bool _prihvaceno;
- int _ocjena;//da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6 - 10
- public:
- void addOcjena(int ocjena) {
- _ocjena = ocjena;
- if (ocjena >= 6 && ocjena <= 10)
- {
- _prihvaceno = true;
- }
- }
- void addSadrzaj(string noviSadrzaj) {
- char* temp = AlocirajNizKaraktera((string(_sadrzaj) + " " + noviSadrzaj).c_str());
- delete[]_sadrzaj;
- _sadrzaj = temp;
- }
- Poglavlje(const char* naslov = nullptr, const char* sadrzaj = nullptr)
- :_ocjena(0), _prihvaceno(false) {
- _naslov = AlocirajNizKaraktera(naslov);
- _sadrzaj = AlocirajNizKaraktera(sadrzaj);
- }
- //const kopije
- Poglavlje(const Poglavlje& obj) {
- _naslov = AlocirajNizKaraktera(obj._naslov);
- _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
- _prihvaceno = obj._prihvaceno;
- _ocjena = obj._ocjena;
- }
- //operator =
- Poglavlje& operator=(const Poglavlje& obj) {
- if (this != &obj)
- {
- delete[]_naslov;
- delete[] _sadrzaj;
- _naslov = AlocirajNizKaraktera(obj._naslov);
- _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
- _prihvaceno = obj._prihvaceno;
- _ocjena = obj._ocjena;
- }
- return*this;
- }
- ~Poglavlje() {
- delete[] _naslov; _naslov = nullptr;
- delete[] _sadrzaj; _sadrzaj = nullptr;
- }
- friend ostream& operator<<(ostream& COUT, Poglavlje& obj) {
- if (obj._naslov == nullptr || obj._sadrzaj == nullptr)
- return COUT;
- COUT << endl << obj._naslov << endl << obj._sadrzaj << endl;
- if (obj._prihvaceno)
- COUT << "Ocjena: " << obj._ocjena << endl;;
- return COUT;
- }
- char* GetNaslov() { return _naslov; }
- char* GetSadrzaj() { return _sadrzaj; }
- bool GetPrihvaceno() { return _prihvaceno; }
- int GetOcjena() { return _ocjena; }
- void OcijeniPoglavlje(int ocjena) {
- _ocjena = ocjena;
- if (_ocjena > 5 && ocjena <= 10)
- _prihvaceno = true;
- }
- };
- class ZavrsniRad {
- char* _tema;
- vector<Poglavlje> _poglavljaRada;
- string _datumOdbrane;
- float _konacnaOcjena; //prosjek ocjena svih poglavlja u zavrsnom radu koja se izracunava u momentu zakazivanja odbrane
- public:
- friend bool operator==(const ZavrsniRad& obj1, const ZavrsniRad& obj2) {
- if (strcmp(obj1.GetNazivTeme(), obj2.GetNazivTeme()) == 0)
- {
- return true;
- }
- else return false;
- }
- /*funkcija OcijeniPoglavlje, na osnovu naziva poglavlja, dodjeljuje ocjenu poglavlju te ukoliko je ocjena pozitivna (6 - 10) onda poglavlje oznacava prihvacenim. U slucaju da ocjena nije validna ili poglavlje ne postoji, funkcija baca izuzetak sa odgovarajucom porukom*/
- //parametri:nazivPoglavlja, ocjena
- void OcijeniPoglavlje(string nazivPoglavlja, int ocjena) {
- if (ocjena < 6 || ocjena>10)
- {
- throw exception("Ocjena nije validna.\n");
- }
- for (int i = 0; i < _poglavljaRada.size(); i++)
- {
- if (strcmp(nazivPoglavlja.c_str(), _poglavljaRada[i].GetNaslov()) == 0)
- {
- _poglavljaRada[i].addOcjena(ocjena);
- return;
- }
- }
- throw exception("Poglavlje ne postoji.\n");
- }
- /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
- //parametri: nazivPoglavlja, sadrzajPoglavlja
- void DodajPoglavlje(string nazivPoglavlja, string sadrzajPoglavlja) {
- for (int i = 0; i < _poglavljaRada.size(); i++)
- {
- if (strcmp(nazivPoglavlja.c_str(), _poglavljaRada[i].GetNaslov()) == 0)
- {
- _poglavljaRada[i].addSadrzaj(sadrzajPoglavlja);
- return;
- }
- }
- Poglavlje objPoglavlje(nazivPoglavlja.c_str(), sadrzajPoglavlja.c_str());
- _poglavljaRada.push_back(objPoglavlje);
- }
- ZavrsniRad(const char* nazivTeme = nullptr) : _konacnaOcjena(0), _datumOdbrane(not_set) {
- _tema = AlocirajNizKaraktera(nazivTeme);
- }
- //const kopije
- ZavrsniRad(const ZavrsniRad& obj) {
- _tema = AlocirajNizKaraktera(obj._tema);
- _poglavljaRada = obj._poglavljaRada;
- _datumOdbrane = obj._datumOdbrane;
- _konacnaOcjena = obj._konacnaOcjena;
- }
- //operator =
- ZavrsniRad& operator=(const ZavrsniRad& obj) {
- if (this != &obj)
- {
- delete[]_tema;
- _tema = AlocirajNizKaraktera(obj._tema);
- _poglavljaRada = obj._poglavljaRada;
- _datumOdbrane = obj._datumOdbrane;
- _konacnaOcjena = obj._konacnaOcjena;
- }
- return*this;
- }
- ~ZavrsniRad() {
- delete[] _tema; _tema = nullptr;
- }
- char* GetNazivTeme()const { return _tema; }
- vector<Poglavlje>& GetPoglavlja() { return _poglavljaRada; };
- string GetDatumOdbrane()const { return _datumOdbrane; }
- float GetOcjena() { return _konacnaOcjena; }
- void SetDatumOdbrane(string datumOdbrane) { _datumOdbrane = datumOdbrane; }
- friend ostream& operator<<(ostream& COUT, ZavrsniRad& obj) {
- COUT << "Tema rada: " << obj._tema << endl;
- COUT << "Sadrzaj: " << endl;
- for (size_t i = 0; i < obj._poglavljaRada.size(); i++)
- COUT << obj._poglavljaRada[i] << endl;
- COUT << "Datum odbrane rada: " << obj._datumOdbrane << endl << " Ocjena: " << obj._konacnaOcjena << endl;
- return COUT;
- }
- };
- class Mentor {
- char* _imePrezime;
- //Parametar string predstavlja broj indeksa studenta koji prijavljuje zavrsni rad kod odredjenog Mentora
- Kolekcija<string, ZavrsniRad> _teme;
- public:
- /*funkcija DodajZavrsniRad ima zadatak da odredjenom Mentoru dodijeli mentorstvo na zavrsnom radu. zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
- sprijeciti dodavanje zavrsnih radova sa istom temom*/
- //parametri:brojIndeksa, zavrsniRad
- bool DodajZavrsniRad(string brojIndeksa, ZavrsniRad obj) {
- if (_teme.AddElement(brojIndeksa, obj) == true)
- {
- return true;
- }
- else return false;
- }
- friend ostream& operator<<(ostream& COUT, Mentor& obj) {
- COUT << "Ime i Prezime: " << obj._imePrezime << endl;
- COUT << "Teme: " << obj._teme << endl;
- return COUT;
- }
- Mentor(const char* imePrezime = nullptr) {
- _imePrezime = AlocirajNizKaraktera(imePrezime);
- }
- ~Mentor() {
- delete[] _imePrezime; _imePrezime = nullptr;
- }
- Kolekcija<string, ZavrsniRad>& GetTeme() { return _teme; };
- char* GetImePrezime() { return _imePrezime; }
- void Info() {
- cout << _imePrezime << endl << _teme << endl;
- }
- };
- int main() {
- cout << crt << "UPLOAD RADA OBAVEZNO IZVRSITI U ODGOVARAJUCI FOLDER NA FTP SERVERU" << endl;
- cout << "U slucaju da je Upload folder prazan pritisnite tipku F5" << crt;
- const int max = 4;
- Mentor* mentori[max];
- mentori[0] = new Mentor("Armina Hubana");
- mentori[1] = new Mentor("Zanin Vejzovic");
- mentori[2] = new Mentor("Jasmin Azemovic");
- mentori[3] = new Mentor("Emina Junuz");
- cout << *mentori[1];
- //parametri: naziv zavrsnog rada
- ZavrsniRad multimedijalni("Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
- ZavrsniRad podrsa_operaterima("Sistem za podršku rada kablovskog operatera");
- ZavrsniRad analiza_sigurnosti("Prakticna analiza sigurnosti bežičnih računarskih mreža");
- ZavrsniRad kriptografija("Primjena teorije informacija u procesu generisanja kriptografskih ključeva");
- /* cout << multimedijalni;*/
- /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
- //parametri: nazivPoglavlja, sadrzajPoglavlja
- multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
- multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
- multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
- multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistema, a neke od najznacajnijih su ...");
- multimedijalni.DodajPoglavlje("Teorija multimedije", "Sadrzaj koji bi trebao stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130011");
- multimedijalni.DodajPoglavlje("Zakljucak", "U ovom radu su predstavljeni osnovni koncepti i prakticna primjena...");
- cout << multimedijalni;
- try {
- /*funkcija OcijeniPoglavlje, na osnovu naziva poglavlja, dodjeljuje ocjenu poglavlju te ukoliko je ocjena pozitivna (6 - 10) onda poglavlje oznacava prihvacenim. U slucaju da ocjena nije validna ili poglavlje ne postoji, funkcija baca izuzetak sa odgovarajucom porukom*/
- //parametri:nazivPoglavlja, ocjena
- multimedijalni.OcijeniPoglavlje("Uvod", 8);
- multimedijalni.OcijeniPoglavlje("Vrste multimedijalnih sistema", 8);
- multimedijalni.OcijeniPoglavlje("Teorija multimedije", 9);
- multimedijalni.OcijeniPoglavlje("Zakljucak", 7);
- multimedijalni.OcijeniPoglavlje("Naziv poglavlja ne postoji", 8);
- }
- catch (exception& err) {
- cout << "Greska -> " << err.what() << endl;
- }
- cout << multimedijalni;
- /*funkcija DodajZavrsniRad ima zadatak da odredjenom Mentoru dodijeli mentorstvo na zavrsnom radu. zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
- sprijeciti dodavanje zavrsnih radova sa istom temom*/
- //parametri:brojIndeksa, zavrsniRad
- if (mentori[0]->DodajZavrsniRad("IB130011", multimedijalni))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (mentori[0]->DodajZavrsniRad("IB120051", podrsa_operaterima))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (!mentori[0]->DodajZavrsniRad("IB120056", podrsa_operaterima))//dupliranje rada
- cout << "Zavrsni rad nije dodat!" << endl;
- if (!mentori[0]->DodajZavrsniRad("IB120051", kriptografija)) //studentu vec dodijeljen rad
- cout << "Zavrsni rad nije dodat!" << endl;
- if (mentori[1]->DodajZavrsniRad("IB140102", analiza_sigurnosti))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (mentori[2]->DodajZavrsniRad("IB140002", kriptografija))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- cout << mentori[1];
- // /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva definisanje
- // datuma odbrane. odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio i pri tom su zadovoljeni sljedeci uslovi:
- // 1. zavrsni rad ima broj poglavlja veci od minimalnog
- // 2. svako poglavlje ima broj karaktera veci od minimalnog
- // 3. svako poglavlje je prihvaceno/odobreno
- // ukoliko su zadovoljeni prethodni kriteriji, izracunava se konacna ocjena rada (prosjek ocjena svih poglavlja), postavlja datum odbrane rada i vraca pokazivac na rad kome je zakazan odbrana.
- // u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija nije zadovoljen, funkcija vraca nullptr.
- //*/
- //
- ////parametri:brojIndeksa, datumOdbrane
- // ZavrsniRad* zr1 = mentori[0]->ZakaziOdbranuRada("IB130011", "25.09.2018");
- // if (zr1 != nullptr)
- // cout << *zr1 << endl;
- //
- // zr1 = mentori[0]->ZakaziOdbranuRada("IB130111", "25.09.2018");//student sa brojem indeksa IB130111 jos uvijek nije prijavio rad
- // if (zr1 != nullptr)
- // cout << *zr1 << endl;
- //
- //ispisuje sve podatke o Mentoru i njegovim mentorstvima
- mentori[0]->Info();
- for (int i = 0; i < max; i++) {
- delete mentori[i];
- mentori[i] = nullptr;
- }
- system("pause>0");
- return 0;
- }
- ---------------------------------------------------------------------------------------------------------------------------------------
- #include <iostream>
- #include <vector>
- using namespace std;
- /****************************************************************************
- 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
- 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR E BITI OZNACENO KAO "RE"
- 3. SPA AVAJTE PROJEKAT KAKO BI SE SPRIJE ILO GUBLJENJE URA ENOG ZADATKA
- 4. NAZIVI FUNKCIJA, TE BROJ I TIP PARAMETARA MORAJU BITI IDENTI NI ONIMA KOJI SU KORI TENI U TESTNOM CODE-U, OSIM U SLU AJU DA POSTOJI ADEKVATAN RAZLOG ZA NJIHOVU MODIFIKACIJU. OSTALE, POMO NE FUNKCIJE MO ETE IMENOVATI I DODAVATI PO ELJI.
- 5. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNA ENO.
- ****************************************************************************/
- const char* crt = "\n-------------------------------------------\n";
- const char* nedozvoljena_operacija = "Nedozvoljena operacija";
- const char* not_set = "NOT_SET";
- const int min_polgavlja = 3;
- const int min_karaktera_po_poglavlju = 30;
- char* AlocirajNizKaraktera(const char* sadrzaj) {
- if (sadrzaj == nullptr)
- return nullptr;
- int vel = strlen(sadrzaj) + 1;
- char* temp = new char[vel];
- strcpy_s(temp, vel, sadrzaj);
- return temp;
- }
- template<class T1, class T2>
- class Kolekcija {
- T1* _elementi1;
- T2* _elementi2;
- int* _trenutno;
- public:
- bool AddElement(T1 el1, T2 el2) {
- //napraviti provjeru da li se unutar _elementi1 ili _elementi2 vec nalaze el1 ii el2
- for (int i = 0; i < *_trenutno; i++)
- {
- if (_elementi1[i] == el1 || _elementi2[i] == el2)
- {
- return false;
- }
- }
- //napraviti privremene temp nizove koji ce imati _trenutno +1 broj elemenata
- T1* temp1 = new T1[*_trenutno + 1];
- T2* temp2 = new T2[*_trenutno + 1];
- // nizovi su prazni z temp nizove cemo prebaciti stare elemente
- for (int i = 0; i < *_trenutno; i++)
- {
- temp1[i] = _elementi1[i];
- temp2[i] = _elementi2[i];
- }
- temp1[*_trenutno] = el1;
- temp2[*_trenutno] = el2;
- delete[]_elementi1;
- delete[]_elementi2;
- _elementi1 = temp1;
- _elementi2 = temp2;
- (*_trenutno)++;
- return true;
- }
- Kolekcija() : _elementi1(nullptr), _elementi2(nullptr) {
- _trenutno = new int(0);
- }
- ~Kolekcija() {
- delete[] _elementi1; _elementi1 = nullptr;
- delete[] _elementi2; _elementi1 = nullptr;
- }
- T1* getElementi1Pok() { return _elementi1; }
- T2* getElementi2Pok() { return _elementi2; }
- T1& getElement1(int lokacija) { return _elementi1[lokacija]; }
- T2& getElement2(int lokacija) { return _elementi2[lokacija]; }
- int getTrenutno() { return _trenutno; }
- friend ostream& operator<<(ostream& COUT, Kolekcija<T1, T2>& obj) {
- for (size_t i = 0; i < *obj._trenutno; i++)
- COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
- return COUT;
- }
- };
- class Poglavlje {
- char* _naslov;
- char* _sadrzaj;
- bool _prihvaceno;
- int* _ocjena;//da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6 - 10
- public:
- void AddOcjena(int ocjena) {
- _ocjena = new int(ocjena);
- if (ocjena >= 6 && ocjena <= 10)
- {
- _prihvaceno = true;
- }
- }
- void addSadrzaj(string NoviSadrzaj) {
- char* temp = AlocirajNizKaraktera((string(_sadrzaj) + " " + NoviSadrzaj).c_str());
- delete[]_sadrzaj;
- _sadrzaj = temp;
- }
- //const koji prima dva parametra, naslov i sadrzaj
- Poglavlje(const char* naslov = nullptr, const char* sadrzaj = nullptr) {
- _naslov = AlocirajNizKaraktera(naslov);
- _sadrzaj = AlocirajNizKaraktera(sadrzaj);
- _prihvaceno = false;
- _ocjena = new int(0);
- }
- //const kopije
- Poglavlje& operator=(const Poglavlje& obj) {
- if (this != &obj)
- {
- delete[]_sadrzaj;
- delete[]_naslov;
- delete _ocjena;
- _naslov = AlocirajNizKaraktera(obj._naslov);
- _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
- _prihvaceno = obj._prihvaceno;
- _ocjena = new int(*obj._ocjena);
- }
- return *this;
- }
- Poglavlje(const Poglavlje& obj) {
- _naslov = AlocirajNizKaraktera(obj._naslov);
- _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
- _prihvaceno = obj._prihvaceno;
- _ocjena = new int(*obj._ocjena);
- }
- ~Poglavlje() {
- delete[] _naslov; _naslov = nullptr;
- delete[] _sadrzaj; _sadrzaj = nullptr;
- }
- friend ostream& operator<<(ostream& COUT, Poglavlje& obj) {
- if (obj._naslov == nullptr || obj._sadrzaj == nullptr)
- return COUT;
- COUT << endl << obj._naslov << endl << obj._sadrzaj << endl;
- if (obj._prihvaceno)
- COUT << "Ocjena: " << *obj._ocjena << endl;;
- return COUT;
- }
- char* GetNaslov() { return _naslov; }
- char* GetSadrzaj() { return _sadrzaj; }
- bool GetPrihvaceno() { return _prihvaceno; }
- int GetOcjena() { return *_ocjena; }
- void OcijeniPoglavlje(int ocjena) {
- _ocjena = new int(ocjena);
- if (*_ocjena > 5 && ocjena <= 10)
- _prihvaceno = true;
- }
- };
- class ZavrsniRad {
- char* _tema;
- vector<Poglavlje*> _poglavljaRada;
- string _datumOdbrane;
- float _konacnaOcjena; //prosjek ocjena svih poglavlja u zavrsnom radu koja se izracunava u momentu zakazivanja odbrane
- public:
- friend bool operator== (const ZavrsniRad& obj1, const ZavrsniRad& obj2) {
- if (strcmp(obj1.GetNazivTeme(), obj2.GetNazivTeme()) == 0) {
- return true;
- }
- else
- return false;
- }
- void OcijeniPoglavlje(string nazivPoglavlja, int ocjena) {
- if (ocjena < 5 || ocjena >10)
- {
- throw exception("Ocijena nije validna.\n");
- }
- for (int i = 0; i < _poglavljaRada.size(); i++)
- {
- if (strcmp(nazivPoglavlja.c_str(), _poglavljaRada[i]->GetNaslov()) == 0)
- {
- _poglavljaRada[i]->AddOcjena(ocjena);
- return;
- }
- }
- throw exception("Poglavlje ne postoji\.n");
- }
- /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
- //parametri: nazivPoglavlja, sadrzajPoglavlja
- void DodajPoglavlje(string nazivPoglavlja, string sadrzajPoglavlja) {
- for (int i = 0; i < _poglavljaRada.size(); i++)
- {
- if (strcmp(nazivPoglavlja.c_str(), _poglavljaRada[i]->GetNaslov()) == 0)
- {
- _poglavljaRada[i]->addSadrzaj(sadrzajPoglavlja);
- return;
- }
- }
- Poglavlje objPoglavlje(nazivPoglavlja.c_str(), sadrzajPoglavlja.c_str());
- _poglavljaRada.push_back(new Poglavlje(objPoglavlje));
- }
- ZavrsniRad(const char* nazivTeme = nullptr) : _konacnaOcjena(0), _datumOdbrane(not_set) {
- _tema = AlocirajNizKaraktera(nazivTeme);
- }
- // const kopije
- ZavrsniRad(const ZavrsniRad& obj) {
- _tema = AlocirajNizKaraktera(obj._tema);
- _datumOdbrane = obj._datumOdbrane;
- _konacnaOcjena = obj._konacnaOcjena;
- for (int i = 0; i < obj._poglavljaRada.size(); i++)
- {
- _poglavljaRada.push_back(new Poglavlje(*obj._poglavljaRada[i]));
- }
- }
- // operator dodjele
- ZavrsniRad& operator=(const ZavrsniRad& obj) {
- if (this != &obj)
- {
- delete[]_tema;
- for (int i = 0; i < _poglavljaRada.size(); i++)
- {
- delete _poglavljaRada[i];
- }
- _tema = AlocirajNizKaraktera(obj._tema);
- _datumOdbrane = obj._datumOdbrane;
- _konacnaOcjena = obj._konacnaOcjena;
- for (int i = 0; i < obj._poglavljaRada.size(); i++)
- {
- _poglavljaRada.push_back(new Poglavlje(*obj._poglavljaRada[i]));
- }
- }
- return *this;
- }
- ~ZavrsniRad() {
- delete[] _tema; _tema = nullptr;
- }
- char* GetNazivTeme()const { return _tema; }
- vector<Poglavlje*>& GetPoglavlja() { return _poglavljaRada; };
- string GetDatumOdbrane()const { return _datumOdbrane; }
- float GetOcjena() { return _konacnaOcjena; }
- void SetDatumOdbrane(string datumOdbrane) { _datumOdbrane = datumOdbrane; }
- friend ostream& operator<<(ostream& COUT, ZavrsniRad& obj) {
- COUT << "Tema rada: " << obj._tema << endl;
- COUT << "Sadrzaj: " << endl;
- for (size_t i = 0; i < obj._poglavljaRada.size(); i++)
- COUT << *obj._poglavljaRada[i] << endl;
- COUT << "Datum odbrane rada: " << obj._datumOdbrane << endl << " Ocjena: " << obj._konacnaOcjena << endl;
- return COUT;
- }
- };
- class Mentor {
- string _imePrezime;
- //Parametar string predstavlja broj indeksa studenta koji prijavljuje zavrsni rad kod odredjenog Mentora
- Kolekcija<string, ZavrsniRad>* _teme;
- public:
- bool DodajZavrsniRad(string brojIndeksa, ZavrsniRad obj) {
- if (_teme->AddElement(brojIndeksa, obj) == true)
- {
- return true;
- }
- else return false;
- }
- friend ostream& operator<<(ostream& COUT, Mentor& obj) {
- COUT << "Ime i Prezime: " << obj._imePrezime << endl;
- COUT << "Teme: " << *obj._teme << endl;
- return COUT;
- }
- Mentor(string imePrezime) :_imePrezime(imePrezime) {
- _teme = new Kolekcija<string, ZavrsniRad>();
- }
- Kolekcija<string, ZavrsniRad>& GetTeme() { return *_teme; };
- string GetImePrezime() { return _imePrezime; }
- void Info() {
- cout << _imePrezime << endl << *_teme << endl;
- }
- };
- int main() {
- cout << crt << "UPLOAD RADA OBAVEZNO IZVRSITI U ODGOVARAJUCI FOLDER NA FTP SERVERU" << endl;
- cout << "U slucaju da je Upload folder prazan pritisnite tipku F5" << crt;
- const int max = 4;
- Mentor* mentori[max];
- mentori[0] = new Mentor("Armina Hubana");
- mentori[1] = new Mentor("Zanin Vejzovic");
- mentori[2] = new Mentor("Jasmin Azemovic");
- mentori[3] = new Mentor("Emina Junuz");
- //cout << *mentori[1];
- //parametri: naziv zavrsnog rada
- ZavrsniRad multimedijalni("Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
- ZavrsniRad podrsa_operaterima("Sistem za podr ku rada kablovskog operatera");
- ZavrsniRad analiza_sigurnosti("Prakticna analiza sigurnosti be i nih ra unarskih mre a");
- ZavrsniRad kriptografija("Primjena teorije informacija u procesu generisanja kriptografskih klju eva");
- cout << multimedijalni;
- /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
- //parametri: nazivPoglavlja, sadrzajPoglavlja
- multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
- multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
- multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
- multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistema, a neke od najznacajnijih su ...");
- multimedijalni.DodajPoglavlje("Teorija multimedije", "Sadrzaj koji bi trebao stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130011");
- multimedijalni.DodajPoglavlje("Zakljucak", "U ovom radu su predstavljeni osnovni koncepti i prakticna primjena...");
- //cout << multimedijalni;
- try {
- /*funkcija OcijeniPoglavlje, na osnovu naziva poglavlja, dodjeljuje ocjenu poglavlju te ukoliko je ocjena pozitivna (6 - 10) onda poglavlje oznacava prihvacenim. U slucaju da ocjena nije validna ili poglavlje ne postoji, funkcija baca izuzetak sa odgovarajucom porukom*/
- //parametri:nazivPoglavlja, ocjena
- multimedijalni.OcijeniPoglavlje("Uvod", 8);
- multimedijalni.OcijeniPoglavlje("Vrste multimedijalnih sistema", 8);
- multimedijalni.OcijeniPoglavlje("Teorija multimedije", 9);
- multimedijalni.OcijeniPoglavlje("Zakljucak", 7);
- multimedijalni.OcijeniPoglavlje("Naziv poglavlja ne postoji", 8);
- }
- catch (exception& err) {
- cout << "Greska -> " << err.what() << endl;
- }
- cout << multimedijalni;
- /*funkcija DodajZavrsniRad ima zadatak da odredjenom Mentoru dodijeli mentorstvo na zavrsnom radu. zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
- sprijeciti dodavanje zavrsnih radova sa istom temom*/
- //parametri:brojIndeksa, zavrsniRad
- if (mentori[0]->DodajZavrsniRad("IB130011", multimedijalni))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (mentori[0]->DodajZavrsniRad("IB120051", podrsa_operaterima))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (!mentori[0]->DodajZavrsniRad("IB120056", podrsa_operaterima))//dupliranje rada
- cout << "Zavrsni rad nije dodat!" << endl;
- if (!mentori[0]->DodajZavrsniRad("IB120051", kriptografija)) //studentu vec dodijeljen rad
- cout << "Zavrsni rad nije dodat!" << endl;
- if (mentori[1]->DodajZavrsniRad("IB140102", analiza_sigurnosti))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (mentori[2]->DodajZavrsniRad("IB140002", kriptografija))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- cout << *mentori[1];
- //
- // /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva definisanje
- // datuma odbrane. odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio i pri tom su zadovoljeni sljedeci uslovi:
- // 1. zavrsni rad ima broj poglavlja veci od minimalnog
- // 2. svako poglavlje ima broj karaktera veci od minimalnog
- // 3. svako poglavlje je prihvaceno/odobreno
- // ukoliko su zadovoljeni prethodni kriteriji, izracunava se konacna ocjena rada (prosjek ocjena svih poglavlja), postavlja datum odbrane rada i vraca pokazivac na rad kome je zakazan odbrana.
- // u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija nije zadovoljen, funkcija vraca nullptr.
- //*/
- //
- ////parametri:brojIndeksa, datumOdbrane
- // ZavrsniRad* zr1 = mentori[0]->ZakaziOdbranuRada("IB130011", "25.09.2018");
- // if (zr1 != nullptr)
- // cout << *zr1 << endl;
- //
- // zr1 = mentori[0]->ZakaziOdbranuRada("IB130111", "25.09.2018");//student sa brojem indeksa IB130111 jos uvijek nije prijavio rad
- // if (zr1 != nullptr)
- // cout << *zr1 << endl;
- //
- //ispisuje sve podatke o Mentoru i njegovim mentorstvima
- mentori[0]->Info();
- for (int i = 0; i < max; i++) {
- delete mentori[i];
- mentori[i] = nullptr;
- }
- system("pause>0");
- return 0;
- }
- ---------------------------------------------------------------------------------------------------------------------------------------
- #include <iostream>
- #include <vector>
- using namespace std;
- /****************************************************************************
- 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
- 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR E BITI OZNACENO KAO "RE"
- 3. SPA AVAJTE PROJEKAT KAKO BI SE SPRIJE ILO GUBLJENJE URA ENOG ZADATKA
- 4. NAZIVI FUNKCIJA, TE BROJ I TIP PARAMETARA MORAJU BITI IDENTI NI ONIMA KOJI SU KORI TENI U TESTNOM CODE-U, OSIM U SLU AJU DA POSTOJI ADEKVATAN RAZLOG ZA NJIHOVU MODIFIKACIJU. OSTALE, POMO NE FUNKCIJE MO ETE IMENOVATI I DODAVATI PO ELJI.
- 5. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNA ENO.
- ****************************************************************************/
- const char* crt = "\n-------------------------------------------\n";
- const char* nedozvoljena_operacija = "Nedozvoljena operacija";
- const char* not_set = "NOT_SET";
- const int min_polgavlja = 3;
- const int min_karaktera_po_poglavlju = 30;
- char* AlocirajNizKaraktera(const char* sadrzaj) {
- if (sadrzaj == nullptr)
- return nullptr;
- int vel = strlen(sadrzaj) + 1;
- char* temp = new char[vel];
- strcpy_s(temp, vel, sadrzaj);
- return temp;
- }
- template<class T1, class T2>
- class Kolekcija {
- T1* _elementi1;
- T2* _elementi2;
- int* _trenutno;
- public:
- bool addElement(T1 el1, T2 el2) {
- for (int i = 0; i < *_trenutno; i++)
- {
- if (_elementi1[i] == el1 || _elementi2[i] == el2)
- {
- return false;
- }
- }
- T1* temp1 = new T1[*_trenutno + 1];
- T2* temp2 = new T2[*_trenutno + 1];
- for (int i = 0; i < *_trenutno; i++)
- {
- temp1[i] = _elementi1[i];
- temp2[i] = _elementi2[i];
- }
- temp1[*_trenutno] = el1;
- temp2[*_trenutno] = el2;
- delete[]_elementi1;
- delete[]_elementi2;
- _elementi1 = temp1;
- _elementi2 = temp2;
- (*_trenutno)++;
- return true;
- }
- //const
- Kolekcija() {
- _elementi1 = nullptr;
- _elementi2 = nullptr;
- _trenutno = new int(0);
- }
- ~Kolekcija() {
- delete[] _elementi1; _elementi1 = nullptr;
- delete[] _elementi2; _elementi1 = nullptr;
- delete[]_trenutno; _trenutno = nullptr;
- }
- T1* getElementi1Pok() { return _elementi1; }
- T2* getElementi2Pok() { return _elementi2; }
- T1& getElement1(int lokacija) { return _elementi1[lokacija]; }
- T2& getElement2(int lokacija) { return _elementi2[lokacija]; }
- int getTrenutno() { return _trenutno; }
- friend ostream& operator<<(ostream& COUT, Kolekcija<T1, T2>& obj) {
- for (size_t i = 0; i < *obj._trenutno; i++)
- COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
- return COUT;
- }
- };
- class Poglavlje {
- string* _naslov;
- char* _sadrzaj;
- bool _prihvaceno;
- int _ocjena;//da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6 - 10
- public:
- void addOcjena(int ocjena) {
- _ocjena = ocjena;
- if (ocjena >= 6 && ocjena <= 10)
- {
- _prihvaceno = true;
- }
- }
- void addSadrzaj(string noviSadrzaj) {
- char* temp = AlocirajNizKaraktera((string(_sadrzaj) + " " + noviSadrzaj).c_str());
- delete[]_sadrzaj;
- _sadrzaj = temp;
- }
- Poglavlje(const char* naslov = nullptr, const char* sadrzaj = nullptr)
- :_ocjena(0), _prihvaceno(false) {
- _naslov = new string(naslov);
- _sadrzaj = AlocirajNizKaraktera(sadrzaj);
- }
- //const kopije
- Poglavlje(const Poglavlje& obj) {
- _naslov = new string(*obj._naslov);
- _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
- _prihvaceno = obj._prihvaceno;
- _ocjena = obj._ocjena;
- }
- //operator dodjele
- Poglavlje& operator=(const Poglavlje& obj) {
- if (this != &obj)
- {
- delete _naslov;
- delete[]_sadrzaj;
- _naslov = new string(*obj._naslov);
- _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
- _prihvaceno = obj._prihvaceno;
- _ocjena = obj._ocjena;
- }
- return *this;
- }
- ~Poglavlje() {
- delete _naslov; _naslov = nullptr;
- delete[] _sadrzaj; _sadrzaj = nullptr;
- }
- friend ostream& operator<<(ostream& COUT, Poglavlje& obj) {
- if (obj._naslov == nullptr || obj._sadrzaj == nullptr)
- return COUT;
- COUT << endl << *obj._naslov << endl << obj._sadrzaj << endl;
- if (obj._prihvaceno)
- COUT << "Ocjena: " << obj._ocjena << endl;;
- return COUT;
- }
- string* GetNaslov() { return _naslov; }
- char* GetSadrzaj() { return _sadrzaj; }
- bool GetPrihvaceno() { return _prihvaceno; }
- int GetOcjena() { return _ocjena; }
- void OcijeniPoglavlje(int ocjena) {
- _ocjena = ocjena;
- if (_ocjena > 5 && ocjena <= 10)
- _prihvaceno = true;
- }
- };
- class ZavrsniRad {
- char* _tema;
- vector<Poglavlje*> _poglavljaRada;
- string* _datumOdbrane;
- float _konacnaOcjena; //prosjek ocjena svih poglavlja u zavrsnom radu koja se izracunava u momentu zakazivanja odbrane
- public:
- friend bool operator==(const ZavrsniRad& obj1, const ZavrsniRad& obj2) {
- if (strcmp(obj1.GetNazivTeme(), obj2.GetNazivTeme()) == 0)
- {
- return true;
- }
- else return false;
- }
- /*funkcija OcijeniPoglavlje, na osnovu naziva poglavlja, dodjeljuje ocjenu poglavlju te ukoliko je ocjena pozitivna (6 - 10) onda poglavlje oznacava prihvacenim. U slucaju da ocjena nije validna ili poglavlje ne postoji, funkcija baca izuzetak sa odgovarajucom porukom*/
- //parametri:nazivPoglavlja, ocjena
- void OcijeniPoglavlje(string nazivPoglavlja, int ocjena) {
- if (ocjena < 6 || ocjena>10)
- {
- throw exception("Ocjena nije validna.\n");
- }
- for (int i = 0; i < _poglavljaRada.size(); i++)
- {
- if (strcmp(nazivPoglavlja.c_str(), _poglavljaRada[i]->GetNaslov()->c_str()) == 0)
- //if (nazivPoglavlja==*_poglavljaRada[i]->GetNaslov())
- {
- _poglavljaRada[i]->addOcjena(ocjena);
- return;
- }
- }
- throw exception("Poglavlje ne postoji.\n");
- }
- /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
- //parametri: nazivPoglavlja, sadrzajPoglavlja
- void DodajPoglavlje(string nazivPoglavlja, string sadrzajPoglavlja) {
- for (int i = 0; i < _poglavljaRada.size(); i++)
- {
- if (strcmp(nazivPoglavlja.c_str(), _poglavljaRada[i]->GetNaslov()->c_str()) == 0)
- //if (nazivPoglavlja==*_poglavljaRada[i]->GetNaslov())
- {
- _poglavljaRada[i]->addSadrzaj(sadrzajPoglavlja);
- return;
- }
- }
- Poglavlje objPoglavlje(nazivPoglavlja.c_str(), sadrzajPoglavlja.c_str());
- _poglavljaRada.push_back(new Poglavlje(objPoglavlje));
- }
- ZavrsniRad(const char* nazivTeme = nullptr) : _konacnaOcjena(0), _datumOdbrane(new string(not_set)) {
- _tema = AlocirajNizKaraktera(nazivTeme);
- }
- //const kopije
- ZavrsniRad(const ZavrsniRad& obj) {
- _tema = AlocirajNizKaraktera(obj._tema);
- _datumOdbrane = new string(*obj._datumOdbrane);
- _konacnaOcjena = obj._konacnaOcjena;
- for (int i = 0; i < obj._poglavljaRada.size(); i++)
- {
- _poglavljaRada.push_back(new Poglavlje(*obj._poglavljaRada[i]));
- }
- }
- //operator =
- ZavrsniRad& operator=(const ZavrsniRad& obj) {
- if (this != &obj) {
- delete[]_tema;
- delete _datumOdbrane;
- for (int i = 0; i < _poglavljaRada.size(); i++)
- {
- delete _poglavljaRada[i];
- }
- _tema = AlocirajNizKaraktera(obj._tema);
- _datumOdbrane = new string(*obj._datumOdbrane);
- _konacnaOcjena = obj._konacnaOcjena;
- for (int i = 0; i < obj._poglavljaRada.size(); i++)
- {
- _poglavljaRada.push_back(new Poglavlje(*obj._poglavljaRada[i]));
- }
- }
- return*this;
- }
- ~ZavrsniRad() {
- delete[] _tema; _tema = nullptr;
- delete _datumOdbrane; _datumOdbrane = nullptr;
- for (int i = 0; i < _poglavljaRada.size(); i++)
- {
- delete _poglavljaRada[i];
- _poglavljaRada[i] = nullptr;
- }
- }
- char* GetNazivTeme()const { return _tema; }
- vector<Poglavlje*>& GetPoglavlja() { return _poglavljaRada; };
- string* GetDatumOdbrane()const { return _datumOdbrane; }
- float GetOcjena() { return _konacnaOcjena; }
- void SetDatumOdbrane(string datumOdbrane) { _datumOdbrane = new string(datumOdbrane); }
- friend ostream& operator<<(ostream& COUT, ZavrsniRad& obj) {
- COUT << "Tema rada: " << obj._tema << endl;
- COUT << "Sadrzaj: " << endl;
- for (size_t i = 0; i < obj._poglavljaRada.size(); i++)
- COUT << *obj._poglavljaRada[i] << endl;
- COUT << "Datum odbrane rada: " << *obj._datumOdbrane << endl << " Ocjena: " << obj._konacnaOcjena << endl;
- return COUT;
- }
- };
- class Mentor {
- char* _imePrezime;
- //Parametar string predstavlja broj indeksa studenta koji prijavljuje zavrsni rad kod odredjenog Mentora
- Kolekcija<string, ZavrsniRad> _teme;
- public:
- /*funkcija DodajZavrsniRad ima zadatak da odredjenom Mentoru dodijeli mentorstvo na zavrsnom radu. zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
- sprijeciti dodavanje zavrsnih radova sa istom temom*/
- //parametri:brojIndeksa, zavrsniRad
- bool DodajZavrsniRad(string brojIndeksa, ZavrsniRad obj) {
- if (_teme.addElement(brojIndeksa, obj) == true)
- {
- return true;
- }
- else return false;
- }
- friend ostream& operator<<(ostream& COUT, Mentor& obj) {
- COUT << "Ime i prezime: " << obj._imePrezime << endl;
- COUT << "Teme: " << obj._teme << endl;
- return COUT;
- }
- Mentor(string imePrezime) {
- _imePrezime = AlocirajNizKaraktera(imePrezime.c_str());
- }
- Kolekcija<string, ZavrsniRad>& GetTeme() { return _teme; };
- string GetImePrezime() { return _imePrezime; }
- void Info() {
- cout << _imePrezime << endl << _teme << endl;
- }
- };
- int main() {
- cout << crt << "UPLOAD RADA OBAVEZNO IZVRSITI U ODGOVARAJUCI FOLDER NA FTP SERVERU" << endl;
- cout << "U slucaju da je Upload folder prazan pritisnite tipku F5" << crt;
- const int max = 4;
- Mentor* mentori[max];
- mentori[0] = new Mentor("Armina Hubana");
- mentori[1] = new Mentor("Zanin Vejzovic");
- mentori[2] = new Mentor("Jasmin Azemovic");
- mentori[3] = new Mentor("Emina Junuz");
- /* cout << *mentori[1];*/
- //parametri: naziv zavrsnog rada
- ZavrsniRad multimedijalni("Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
- ZavrsniRad podrsa_operaterima("Sistem za podr ku rada kablovskog operatera");
- ZavrsniRad analiza_sigurnosti("Prakticna analiza sigurnosti be i nih ra unarskih mre a");
- ZavrsniRad kriptografija("Primjena teorije informacija u procesu generisanja kriptografskih klju eva");
- //cout << multimedijalni;
- /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
- //parametri: nazivPoglavlja, sadrzajPoglavlja
- multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
- multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
- multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
- multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistema, a neke od najznacajnijih su ...");
- multimedijalni.DodajPoglavlje("Teorija multimedije", "Sadrzaj koji bi trebao stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130011");
- multimedijalni.DodajPoglavlje("Zakljucak", "U ovom radu su predstavljeni osnovni koncepti i prakticna primjena...");
- cout << multimedijalni;
- try {
- /*funkcija OcijeniPoglavlje, na osnovu naziva poglavlja, dodjeljuje ocjenu poglavlju te ukoliko je ocjena pozitivna (6 - 10) onda poglavlje oznacava prihvacenim. U slucaju da ocjena nije validna ili poglavlje ne postoji, funkcija baca izuzetak sa odgovarajucom porukom*/
- //parametri:nazivPoglavlja, ocjena
- multimedijalni.OcijeniPoglavlje("Uvod", 8);
- multimedijalni.OcijeniPoglavlje("Vrste multimedijalnih sistema", 8);
- multimedijalni.OcijeniPoglavlje("Teorija multimedije", 9);
- multimedijalni.OcijeniPoglavlje("Zakljucak", 7);
- multimedijalni.OcijeniPoglavlje("Naziv poglavlja ne postoji", 8);
- }
- catch (exception& err) {
- cout << "Greska -> " << err.what() << endl;
- }
- cout << multimedijalni;
- /*funkcija DodajZavrsniRad ima zadatak da odredjenom Mentoru dodijeli mentorstvo na zavrsnom radu. zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
- sprijeciti dodavanje zavrsnih radova sa istom temom*/
- //parametri:brojIndeksa, zavrsniRad
- if (mentori[0]->DodajZavrsniRad("IB130011", multimedijalni))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (mentori[0]->DodajZavrsniRad("IB120051", podrsa_operaterima))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (!mentori[0]->DodajZavrsniRad("IB120056", podrsa_operaterima))//dupliranje rada
- cout << "Zavrsni rad nije dodat!" << endl;
- if (!mentori[0]->DodajZavrsniRad("IB120051", kriptografija)) //studentu vec dodijeljen rad
- cout << "Zavrsni rad nije dodat!" << endl;
- if (mentori[1]->DodajZavrsniRad("IB140102", analiza_sigurnosti))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (mentori[2]->DodajZavrsniRad("IB140002", kriptografija))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- cout << mentori[2];
- // /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva definisanje
- // datuma odbrane. odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio i pri tom su zadovoljeni sljedeci uslovi:
- // 1. zavrsni rad ima broj poglavlja veci od minimalnog
- // 2. svako poglavlje ima broj karaktera veci od minimalnog
- // 3. svako poglavlje je prihvaceno/odobreno
- // ukoliko su zadovoljeni prethodni kriteriji, izracunava se konacna ocjena rada (prosjek ocjena svih poglavlja), postavlja datum odbrane rada i vraca pokazivac na rad kome je zakazan odbrana.
- // u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija nije zadovoljen, funkcija vraca nullptr.
- //*/
- //
- ////parametri:brojIndeksa, datumOdbrane
- // ZavrsniRad* zr1 = mentori[0]->ZakaziOdbranuRada("IB130011", "25.09.2018");
- // if (zr1 != nullptr)
- // cout << *zr1 << endl;
- //
- // zr1 = mentori[0]->ZakaziOdbranuRada("IB130111", "25.09.2018");//student sa brojem indeksa IB130111 jos uvijek nije prijavio rad
- // if (zr1 != nullptr)
- // cout << *zr1 << endl;
- //
- //ispisuje sve podatke o Mentoru i njegovim mentorstvima
- mentori[0]->Info();
- for (int i = 0; i < max; i++) {
- delete mentori[i];
- mentori[i] = nullptr;
- }
- system("pause>0");
- return 0;
- }
- ---------------------------------------------------------------------------------------------------------------------------------------
- #include<iostream>
- #include<vector>
- using namespace std;
- //NC
- //RE=>kada nesto nije alocirano i dolazi do pucanja programa
- //TM=>task modified=> ne smijes mijenjati main
- /****************************************************************************
- 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
- 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR �E BITI OZNACENO KAO "RE"
- 3. SPA�AVAJTE PROJEKAT KAKO BI SE SPRIJE�ILO GUBLJENJE URA�ENOG ZADATKA
- 4. NAZIVI FUNKCIJA, TE BROJ I TIP PARAMETARA MORAJU BITI IDENTI�NI ONIMA KOJI SU KORI�TENI U TESTNOM CODE-U, OSIM U SLU�AJU DA POSTOJI ADEKVATAN RAZLOG ZA NJIHOVU MODIFIKACIJU. OSTALE, POMO�NE FUNKCIJE MO�ETE IMENOVATI I DODAVATI PO �ELJI.
- 5. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNA�ENO.
- ****************************************************************************/
- const char* crt = "\n-------------------------------------------\n";
- const char* nedozvoljena_operacija = "Nedozvoljena operacija";
- const char* not_set = "NOT_SET";
- const int min_polgavlja = 3;
- const int min_karaktera_po_poglavlju = 30;
- char* AlocirajNizKaraktera(const char* sadrzaj) {
- if (sadrzaj == nullptr)
- return nullptr;
- int vel = strlen(sadrzaj) + 1;
- char* temp = new char[vel];
- strcpy_s(temp, vel, sadrzaj);
- return temp;
- }
- template<class T1, class T2>
- class Kolekcija {
- T1* _elementi1;
- T2* _elementi2;
- int _trenutno;
- public:
- Kolekcija() :_trenutno(0), _elementi1(nullptr), _elementi2(nullptr) { }
- ~Kolekcija() {
- delete[] _elementi1; _elementi1 = nullptr;
- delete[] _elementi2; _elementi1 = nullptr;
- }
- T1* getElementi1Pok() { return _elementi1; }
- T2* getElementi2Pok() { return _elementi2; }
- T1& getElement1(int lokacija) { return _elementi1[lokacija]; }
- T2& getElement2(int lokacija) { return _elementi2[lokacija]; }
- int getTrenutno() { return _trenutno; }
- friend ostream& operator<<(ostream& COUT, Kolekcija<T1, T2>& obj) {
- for (size_t i = 0; i < obj._trenutno; i++)
- COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
- return COUT;
- }
- };
- class Poglavlje {
- char* _naslov;
- char* _sadrzaj;
- bool _prihvaceno;
- int _ocjena;//da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6 - 10
- public:
- void AddOcjena(int ocjena) {
- _ocjena = ocjena;
- if (ocjena >= 6 && ocjena <= 10) {
- _prihvaceno = true;
- }
- }
- //const char* nekaRecenica = "Ovo je recenica\0";
- //string nekaRecenicaString = "String recenica";
- void AddSadrzaj(string noviSadrzaj) {
- char* temp = AlocirajNizKaraktera((string(_sadrzaj) + " " + noviSadrzaj).c_str());
- delete[]_sadrzaj;
- _sadrzaj = temp; //temp ima vrijednost starog i novog sadrzaja
- }
- //operator dodjele
- Poglavlje& operator=(const Poglavlje& obj) {
- if (this != &obj)
- {
- delete[]_naslov;
- delete[]_sadrzaj;
- _naslov = AlocirajNizKaraktera(obj._naslov);
- _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
- _prihvaceno = obj._prihvaceno;
- _ocjena = obj._ocjena;
- }
- return *this;
- }
- //konstruktor kopije
- Poglavlje(const Poglavlje& obj) {
- _naslov = AlocirajNizKaraktera(obj._naslov);
- _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
- _prihvaceno = obj._prihvaceno;
- //_ocjena = new int (*obj._ocjena);
- _ocjena = obj._ocjena;
- }
- Poglavlje(const char* naslov = nullptr, const char* sadrzaj = nullptr)
- :_ocjena(0), _prihvaceno(false) {
- _naslov = AlocirajNizKaraktera(naslov);
- _sadrzaj = AlocirajNizKaraktera(sadrzaj);
- }
- ~Poglavlje() {
- delete[] _naslov; _naslov = nullptr;
- delete[] _sadrzaj; _sadrzaj = nullptr;
- }
- friend ostream& operator<<(ostream& COUT, Poglavlje& obj) {
- if (obj._naslov == nullptr || obj._sadrzaj == nullptr)
- return COUT;
- COUT << endl << obj._naslov << endl << obj._sadrzaj << endl;
- if (obj._prihvaceno)
- COUT << "Ocjena: " << obj._ocjena << endl;;
- return COUT;
- }
- char* GetNaslov() { return _naslov; }
- char* GetSadrzaj() { return _sadrzaj; }
- bool GetPrihvaceno() { return _prihvaceno; }
- int GetOcjena() { return _ocjena; }
- void OcijeniPoglavlje(int ocjena) {
- _ocjena = ocjena;
- if (_ocjena > 5 && ocjena <= 10)
- _prihvaceno = true;
- }
- };
- class ZavrsniRad {
- char* _tema;
- vector<Poglavlje> _poglavljaRada;
- string _datumOdbrane;
- float _konacnaOcjena; //prosjek ocjena svih poglavlja u zavrsnom radu koja se izracunava u momentu zakazivanja odbrane
- public:
- void OcijeniPoglavlje(string NaslovPoglavlja, int ocjena) {
- if (ocjena < 5 || ocjena>10) {
- throw exception("Ocjena nije validna.\n");
- }
- for (int i = 0; i < _poglavljaRada.size(); i++) {
- if (strcmp(NaslovPoglavlja.c_str(), _poglavljaRada[i].GetNaslov()) == 0)
- {
- _poglavljaRada[i].AddOcjena(ocjena);
- return;
- }
- }
- throw exception("Poglavlje ne postoji");
- }
- void DodajPoglavlje(string NaslovPoglavlja, string SadrzajPoglavlja) {
- //prvo provjeravamo da li naslov vec postoji unutar vektora _poglavljaRada
- //[0][1][2][3]
- for (int i = 0; i < _poglavljaRada.size(); i++) {
- if (strcmp(NaslovPoglavlja.c_str(), _poglavljaRada[i].GetNaslov()) == 0)
- {
- _poglavljaRada[i].AddSadrzaj(SadrzajPoglavlja);
- return;
- }
- }
- Poglavlje obj(NaslovPoglavlja.c_str(), SadrzajPoglavlja.c_str());
- _poglavljaRada.push_back(obj);
- }
- //operator=
- ZavrsniRad& operator=(const ZavrsniRad& obj) {
- if (this != &obj) {
- delete[]_tema;
- _tema = AlocirajNizKaraktera(obj._tema);
- _poglavljaRada = obj._poglavljaRada;
- _datumOdbrane = obj._datumOdbrane;
- _konacnaOcjena = obj._konacnaOcjena;
- }
- return *this;
- }
- //konstruktor kopije
- ZavrsniRad(const ZavrsniRad& obj) {
- _tema = AlocirajNizKaraktera(obj._tema);
- _poglavljaRada = obj._poglavljaRada;
- _datumOdbrane = obj._datumOdbrane;
- _konacnaOcjena = obj._konacnaOcjena;
- }
- ZavrsniRad(const char* nazivTeme = nullptr) : _konacnaOcjena(0), _datumOdbrane(not_set) {
- _tema = AlocirajNizKaraktera(nazivTeme);
- }
- //ZavrsniRad(const ZavrsniRad& org) : _poglavljaRada//(org._poglavljaRada), _konacnaOcjena(org._konacnaOcjena), //_datumOdbrane(org._datumOdbrane) {
- // _tema = AlocirajNizKaraktera(org._tema);
- //}
- ~ZavrsniRad() {
- delete[] _tema; _tema = nullptr;
- }
- char* GetNazivTeme()const { return _tema; }
- vector<Poglavlje>& GetPoglavlja() { return _poglavljaRada; };
- string GetDatumOdbrane()const { return _datumOdbrane; }
- float GetOcjena() { return _konacnaOcjena; }
- void SetDatumOdbrane(string datumOdbrane) { _datumOdbrane = datumOdbrane; }
- //ZavrsniRad& operator=(const ZavrsniRad& org) {
- // if (this != &org) {
- // delete[] _tema;
- // _tema = AlocirajNizKaraktera(org._tema);
- // _datumOdbrane = org._datumOdbrane;
- // _poglavljaRada = org._poglavljaRada;
- // _konacnaOcjena = org._konacnaOcjena;
- // }
- // return *this;
- //}
- friend ostream& operator<<(ostream& COUT, ZavrsniRad& obj) {
- COUT << "Tema rada: " << obj._tema << endl;
- COUT << "Sadrzaj: " << endl;
- for (size_t i = 0; i < obj._poglavljaRada.size(); i++)
- COUT << obj._poglavljaRada[i] << endl;
- COUT << "Datum odbrane rada: " << obj._datumOdbrane << endl << " Ocjena: " << obj._konacnaOcjena << endl;
- return COUT;
- }
- };
- class Mentor {
- string _imePrezime;
- //Parametar string predstavlja broj indeksa studenta koji prijavljuje zavrsni rad kod odredjenog Mentora
- Kolekcija<string, ZavrsniRad> _teme;
- public:
- friend ostream& operator<<(ostream& ISPIS, Mentor& obj) {
- ISPIS << "Ime prezime mentora : " << obj._imePrezime << endl;
- ISPIS << "Teme kod mentora : " << obj._teme << endl;
- return ISPIS;
- }
- //ako ti ne ispisuje ime i prezime mentora
- //provjeriti da li je pravilno dodijeljen u konstruktoru klase Mentor
- Mentor(string imePrezime) /*:_imePrezime(imePrezime)*/ {
- _imePrezime = imePrezime;
- }
- Kolekcija<string, ZavrsniRad>& GetTeme() { return _teme; };
- string GetImePrezime() { return _imePrezime; }
- void Info() {
- cout << _imePrezime << endl << _teme << endl;
- }
- };
- int main() {
- #pragma region ovaj dio nije u sklopu postavke.
- //Poglavlje obj1("naslov1", "sadrzaj1");
- // Poglavlje obj2(obj1);//ctor kopije
- // Poglavlje obj3("neki treci", "neki treci");
- //cout << obj1;
- // obj3 = obj2;//operator=
- #pragma endregion
- cout << crt << "UPLOAD RADA OBAVEZNO IZVRSITI U ODGOVARAJUCI FOLDER NA FTP SERVERU" << endl;
- cout << "U slucaju da je Upload folder prazan pritisnite tipku F5" << crt;
- //
- const int max = 4;
- Mentor* mentori[max];
- //
- mentori[0] = new Mentor("Armina Hubana");
- mentori[1] = new Mentor("Zanin Vejzovic");
- mentori[2] = new Mentor("Jasmin Azemovic");
- mentori[3] = new Mentor("Emina Junuz");
- //dereferencirati objekat kako bismo pristupili vrijednostima .
- //provjeriti da li je u operatoru<< pravilno definisano da se ispisuje ime i prezime
- //provjeriti da li je pravilno dodijeljen u konstruktoru klase Mentor
- cout << *mentori[2] << endl;
- // //parametri: naziv zavrsnog rada
- ZavrsniRad multimedijalni("Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
- ZavrsniRad podrsa_operaterima("Sistem za podr�ku rada kablovskog operatera");
- ZavrsniRad analiza_sigurnosti("Prakticna analiza sigurnosti be�i�nih ra�unarskih mre�a");
- ZavrsniRad kriptografija("Primjena teorije informacija u procesu generisanja kriptografskih klju�eva");
- //
- // /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
- // //parametri: nazivPoglavlja, sadrzajPoglavlja
- multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
- multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
- multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
- multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistema, a neke od najznacajnijih su ...");
- multimedijalni.DodajPoglavlje("Teorija multimedije", "Sadrzaj koji bi trebao stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130011");
- multimedijalni.DodajPoglavlje("Zakljucak", "U ovom radu su predstavljeni osnovni koncepti i prakticna primjena...");
- //
- try {
- /*funkcija OcijeniPoglavlje, na osnovu naziva poglavlja, dodjeljuje ocjenu poglavlju te ukoliko je ocjena pozitivna (6 - 10) onda poglavlje oznacava prihvacenim. U slucaju da ocjena nije validna ili poglavlje ne postoji, funkcija baca izuzetak sa odgovarajucom porukom*/
- //parametri:nazivPoglavlja, ocjena
- multimedijalni.OcijeniPoglavlje("Uvod", 8);
- multimedijalni.OcijeniPoglavlje("Vrste multimedijalnih sistema", 8);
- multimedijalni.OcijeniPoglavlje("Teorija multimedije", 9);
- multimedijalni.OcijeniPoglavlje("Zakljucak", 7);
- multimedijalni.OcijeniPoglavlje("Naziv poglavlja ne postoji", 8);
- }
- catch (exception& err) {
- cout << "Greska -> " << err.what() << endl;
- }
- cout << multimedijalni;
- // /*funkcija DodajZavrsniRad ima zadatak da odredjenom Mentoru dodijeli mentorstvo na zavrsnom radu. zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
- // sprijeciti dodavanje zavrsnih radova sa istom temom*/
- // //parametri:brojIndeksa, zavrsniRad
- // if (mentori[0]->DodajZavrsniRad("IB130011", multimedijalni))
- // cout << "Zavrsni rad uspjesno dodat!" << endl;
- // if (mentori[0]->DodajZavrsniRad("IB120051", podrsa_operaterima))
- // cout << "Zavrsni rad uspjesno dodat!" << endl;
- // if (!mentori[0]->DodajZavrsniRad("IB120056", podrsa_operaterima))//dupliranje rada
- // cout << "Zavrsni rad nije dodat!" << endl;
- // if (!mentori[0]->DodajZavrsniRad("IB120051", kriptografija)) //studentu vec dodijeljen rad
- // cout << "Zavrsni rad nije dodat!" << endl;
- // if (mentori[1]->DodajZavrsniRad("IB140102", analiza_sigurnosti))
- // cout << "Zavrsni rad uspjesno dodat!" << endl;
- // if (mentori[2]->DodajZavrsniRad("IB140002", kriptografija))
- // cout << "Zavrsni rad uspjesno dodat!" << endl;
- //
- // /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva definisanje
- // datuma odbrane. odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio i pri tom su zadovoljeni sljedeci uslovi:
- // 1. zavrsni rad ima broj poglavlja veci od minimalnog
- // 2. svako poglavlje ima broj karaktera veci od minimalnog
- // 3. svako poglavlje je prihvaceno/odobreno
- // ukoliko su zadovoljeni prethodni kriteriji, izracunava se konacna ocjena rada (prosjek ocjena svih poglavlja), postavlja datum odbrane rada i vraca pokazivac na rad kome je zakazan odbrana.
- // u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija nije zadovoljen, funkcija vraca nullptr.
- //*/
- //
- ////parametri:brojIndeksa, datumOdbrane
- // ZavrsniRad* zr1 = mentori[0]->ZakaziOdbranuRada("IB130011", "25.09.2018");
- // if (zr1 != nullptr)
- // cout << *zr1 << endl;
- //
- // zr1 = mentori[0]->ZakaziOdbranuRada("IB130111", "25.09.2018");//student sa brojem indeksa IB130111 jos uvijek nije prijavio rad
- // if (zr1 != nullptr)
- // cout << *zr1 << endl;
- //
- //ispisuje sve podatke o Mentoru i njegovim mentorstvima
- mentori[0]->Info();
- for (int i = 0; i < max; i++) {
- delete mentori[i];
- mentori[i] = nullptr;
- }
- system("pause>0");
- return 0;
- }
- ---------------------------------------------------------------------------------------------------------------------------------------
- #include<iostream>
- #include<string>
- #include<vector>
- #include <exception>
- using namespace std;
- /****************************************************************************
- 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
- 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ĆE BITI OZNACENO KAO "RE"
- 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEČILO GUBLJENJE URAĐENOG ZADATKA
- 4. NAZIVI FUNKCIJA, TE BROJ I TIP PARAMETARA MORAJU BITI IDENTIČNI ONIMA KOJI SU KORIŠTENI U TESTNOM CODE-U, OSIM U SLUČAJU DA POSTOJI ADEKVATAN RAZLOG ZA NJIHOVU MODIFIKACIJU. OSTALE, POMOĆNE FUNKCIJE MOŽETE IMENOVATI I DODAVATI PO ŽELJI.
- 5. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNAČENO.
- ****************************************************************************/
- const char* crt = "\n-------------------------------------------\n";
- const char* nedozvoljena_operacija = "Nedozvoljena operacija";
- const char* not_set = "NOT_SET";
- const int min_polgavlja = 3;
- const int min_karaktera_po_poglavlju = 30;
- char * AlocirajNizKaraktera(const char * sadrzaj) {
- if (sadrzaj == nullptr)
- return nullptr;
- int vel = strlen(sadrzaj) + 1;
- char * temp = new char[vel];
- strcpy_s(temp, vel, sadrzaj);
- return 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 (int i = 0; i < _trenutno; i++)
- {
- _elementi1[i] = obj._elementi1[i];
- _elementi2[i] = obj._elementi2[i];
- }
- }
- Kolekcija & operator=(const Kolekcija & obj)
- {
- if (this != &obj)
- {
- if (_trenutno != 0)
- {
- delete[]_elementi1;
- delete[]_elementi2;
- }
- _trenutno = obj._trenutno;
- _elementi1 = new T1[_trenutno];
- _elementi2 = new T2[_trenutno];
- for (int i = 0; i < _trenutno; i++)
- {
- _elementi1[i] = obj._elementi1[i];
- _elementi2[i] = obj._elementi2[i];
- }
- }
- return *this;
- }
- ~Kolekcija() {
- delete[] _elementi1; _elementi1 = nullptr;
- delete[] _elementi2; _elementi2 = nullptr;
- }
- T1 * getElementi1Pok() { return _elementi1; }
- T2 * getElementi2Pok() { return _elementi2; }
- T1 & getElement1(int lokacija) { return _elementi1[lokacija]; }
- T2 & getElement2(int lokacija) { return _elementi2[lokacija]; }
- int getTrenutno() { return _trenutno; }
- friend ostream & operator<<(ostream & COUT, Kolekcija<T1, T2> & obj) {
- for (size_t i = 0; i < obj._trenutno; i++)
- COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
- return COUT;
- }
- void AddElement(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];
- temp2[i] = _elementi2[i];
- }
- delete[]_elementi1;
- delete[]_elementi2;
- temp1[_trenutno] = el1;
- temp2[_trenutno] = el2;
- _elementi1 = temp1;
- _elementi2 = temp2;
- temp1 = nullptr;
- temp2 = nullptr;
- _trenutno++;
- }
- };
- class Poglavlje {
- char * _naslov;
- char * _sadrzaj;
- bool _prihvaceno;
- int _ocjena;//da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6 - 10
- public:
- Poglavlje(const char * naslov = nullptr, const char * sadrzaj = nullptr)
- :_ocjena(0), _prihvaceno(false) {
- _naslov = AlocirajNizKaraktera(naslov);
- _sadrzaj = AlocirajNizKaraktera(sadrzaj);
- }
- Poglavlje(const Poglavlje& obj)
- {
- _naslov = AlocirajNizKaraktera(obj._naslov);
- _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
- _prihvaceno = obj._prihvaceno;
- _ocjena = obj._ocjena;
- }
- Poglavlje& operator=(const Poglavlje& obj)
- {
- if (this != &obj)
- {
- if (_naslov != nullptr)
- delete[]_naslov;
- _naslov = AlocirajNizKaraktera(obj._naslov);
- if (_sadrzaj != nullptr)
- delete[]_sadrzaj;
- _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
- _prihvaceno = obj._prihvaceno;
- _ocjena = obj._ocjena;
- }
- return *this;
- }
- ~Poglavlje() {
- delete[] _naslov; _naslov = nullptr;
- delete[] _sadrzaj; _sadrzaj = nullptr;
- }
- friend ostream & operator<<(ostream & COUT, Poglavlje & obj) {
- if (obj._naslov == nullptr || obj._sadrzaj == nullptr)
- return COUT;
- COUT << endl << obj._naslov << endl << obj._sadrzaj << endl;
- if (obj._prihvaceno)
- COUT << "Ocjena: " << obj._ocjena << endl;;
- return COUT;
- }
- char * GetNaslov() { return _naslov; }
- char * GetSadrzaj() { return _sadrzaj; }
- bool GetPrihvaceno() { return _prihvaceno; }
- int GetOcjena() { return _ocjena; }
- void OcijeniPoglavlje(int ocjena) {
- _ocjena = ocjena;
- if (_ocjena > 5 && ocjena <= 10)
- _prihvaceno = true;
- }
- };
- class ZavrsniRad {
- char* _tema;
- vector<Poglavlje> _poglavljaRada;
- string _datumOdbrane;
- float _konacnaOcjena; //prosjek ocjena svih poglavlja u zavrsnom radu koja se izracunava u momentu zakazivanja odbrane
- int Postoji(string naziv)
- {
- for (int i = 0; i < _poglavljaRada.size(); i++)
- {
- if (strcmp(naziv.c_str(), _poglavljaRada[i].GetNaslov()) == 0)
- return i;
- }
- return -1;
- }
- public:
- ZavrsniRad(const char * nazivTeme = nullptr) : _konacnaOcjena(0), _datumOdbrane(not_set) {
- _tema = AlocirajNizKaraktera(nazivTeme);
- }
- ZavrsniRad(const ZavrsniRad& org) : _poglavljaRada(org._poglavljaRada), _konacnaOcjena(org._konacnaOcjena), _datumOdbrane(org._datumOdbrane) {
- _tema = AlocirajNizKaraktera(org._tema);
- }
- ~ZavrsniRad() {
- delete[] _tema; _tema = nullptr;
- }
- char* GetNazivTeme()const { return _tema; }
- vector<Poglavlje>& GetPoglavlja() { return _poglavljaRada; };
- string GetDatumOdbrane()const { return _datumOdbrane; }
- float GetOcjena() { return _konacnaOcjena; }
- void SetDatumOdbrane(string datumOdbrane) { _datumOdbrane = datumOdbrane; }
- float GetProsjek()
- {
- float prosjek = 0;
- for (int i = 0; i < _poglavljaRada.size(); i++)
- {
- prosjek += _poglavljaRada[i].GetOcjena();
- }
- return prosjek / _poglavljaRada.size();
- }
- void SetKonacnaOcjena(float prosjek)
- {
- _konacnaOcjena = prosjek;
- }
- ZavrsniRad& operator=(const ZavrsniRad& org) {
- if (this != &org) {
- delete[] _tema;
- _tema = AlocirajNizKaraktera(org._tema);
- _datumOdbrane = org._datumOdbrane;
- _poglavljaRada = org._poglavljaRada;
- _konacnaOcjena = org._konacnaOcjena;
- }
- return *this;
- }
- friend ostream& operator<<(ostream& COUT, ZavrsniRad& obj) {
- COUT << "Tema rada: " << obj._tema << endl;
- COUT << "Sadrzaj: " << endl;
- for (size_t i = 0; i < obj._poglavljaRada.size(); i++)
- COUT << obj._poglavljaRada[i] << endl;
- COUT << "Datum odbrane rada: " << obj._datumOdbrane << endl << " Ocjena: " << obj._konacnaOcjena << endl;
- return COUT;
- }
- void DodajPoglavlje(string nazivPoglavlja, string sadrzajPoglavlja)
- {
- if (Postoji(nazivPoglavlja) > -1)
- {
- string s = _poglavljaRada[Postoji(nazivPoglavlja)].GetSadrzaj();
- s += " " + sadrzajPoglavlja;
- }
- _poglavljaRada.push_back(Poglavlje(nazivPoglavlja.c_str(), sadrzajPoglavlja.c_str()));
- }
- void OcijeniPoglavlje(string nazivPoglavlja, int ocjena)
- {
- if (ocjena < 6 || ocjena>10)
- throw exception(nedozvoljena_operacija);
- if (Postoji(nazivPoglavlja) < 0)
- throw exception("Ne postoji poglavlje\n");
- _poglavljaRada[Postoji(nazivPoglavlja)].OcijeniPoglavlje(ocjena);
- }
- bool validno()
- {
- for (int i = 0; i < _poglavljaRada.size(); i++)
- {
- int v = strlen(_poglavljaRada[i].GetSadrzaj());
- if (v < min_karaktera_po_poglavlju || !_poglavljaRada[i].GetPrihvaceno())
- return false;
- }
- return true;
- }
- };
- class Mentor {
- string _imePrezime;
- //Parametar string predstavlja broj indeksa studenta koji prijavljuje zavrsni rad kod odredjenog Mentora
- Kolekcija<string, ZavrsniRad> _teme;
- bool istatema(string tema)
- {
- for (int i = 0; i < _teme.getTrenutno(); i++)
- {
- if (strcmp(_teme.getElement2(i).GetNazivTeme(), tema.c_str()) == 0)
- return true;
- }
- return false;
- }
- public:
- Mentor(string imePrezime) :_imePrezime(imePrezime) {}
- Mentor(const Mentor& obj)
- {
- _imePrezime = obj._imePrezime;
- _teme = obj._teme;
- }
- Mentor& operator=(const Mentor& obj)
- {
- if (this != &obj)
- {
- _imePrezime = obj._imePrezime;
- _teme = obj._teme;
- }
- return *this;
- }
- Kolekcija<string, ZavrsniRad>& GetTeme() { return _teme; };
- string GetImePrezime() { return _imePrezime; }
- void Info() {
- cout << _imePrezime << endl << _teme << endl;
- }
- bool DodajZavrsniRad(string brojIndeksa, ZavrsniRad zavrsniRad)
- {
- if (istatema(zavrsniRad.GetNazivTeme()) == true)
- return false;
- for (int i = 0; i < _teme.getTrenutno(); i++)
- {
- if (_teme.getElement1(i) != brojIndeksa)
- return false;
- }
- _teme.AddElement(brojIndeksa, zavrsniRad);
- return true;
- }
- ZavrsniRad*ZakaziOdbranuRada(string brojIndeksa,string datumOdbrane)
- {
- for (int i = 0; i < _teme.getTrenutno(); i++)
- {
- if (_teme.getElement2(i).GetPoglavlja().size() > min_polgavlja&&_teme.getElement2(i).validno())
- {
- _teme.getElement2(i).SetDatumOdbrane(datumOdbrane);
- _teme.getElement2(i).SetKonacnaOcjena(_teme.getElement2(i).GetProsjek());
- return &_teme.getElement2(i);
- }
- }
- return nullptr;
- }
- };
- int main() {
- cout << crt << "UPLOAD RADA OBAVEZNO IZVRSITI U ODGOVARAJUCI FOLDER NA FTP SERVERU" << endl;
- cout << "U slucaju da je Upload folder prazan pritisnite tipku F5" << crt;
- const int max = 4;
- Mentor* mentori[max];
- mentori[0] = new Mentor("Armina Hubana");
- mentori[1] = new Mentor("Zanin Vejzovic");
- mentori[2] = new Mentor("Jasmin Azemovic");
- mentori[3] = new Mentor("Emina Junuz");
- //parametri: naziv zavrsnog rada
- ZavrsniRad multimedijalni("Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
- ZavrsniRad podrsa_operaterima("Sistem za podršku rada kablovskog operatera");
- ZavrsniRad analiza_sigurnosti("Prakticna analiza sigurnosti bežičnih računarskih mreža");
- ZavrsniRad kriptografija("Primjena teorije informacija u procesu generisanja kriptografskih ključeva");
- /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
- //parametri: nazivPoglavlja, sadrzajPoglavlja
- multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
- multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
- multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
- multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistema, a neke od najznacajnijih su ...");
- multimedijalni.DodajPoglavlje("Teorija multimedije", "Sadrzaj koji bi trebao stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130011");
- multimedijalni.DodajPoglavlje("Zakljucak", "U ovom radu su predstavljeni osnovni koncepti i prakticna primjena...");
- //
- try {
- /*funkcija OcijeniPoglavlje, na osnovu naziva poglavlja, dodjeljuje ocjenu poglavlju te ukoliko je ocjena pozitivna (6 - 10) onda poglavlje oznacava prihvacenim. U slucaju da ocjena nije validna ili poglavlje ne postoji, funkcija baca izuzetak sa odgovarajucom porukom*/
- //parametri:nazivPoglavlja, ocjena
- multimedijalni.OcijeniPoglavlje("Uvod", 8);
- multimedijalni.OcijeniPoglavlje("Vrste multimedijalnih sistema", 8);
- multimedijalni.OcijeniPoglavlje("Teorija multimedije", 9);
- multimedijalni.OcijeniPoglavlje("Zakljucak", 7);
- multimedijalni.OcijeniPoglavlje("Naziv poglavlja ne postoji", 8);
- }
- catch (exception & err) {
- cout << "Greska -> " << err.what() << endl;
- }
- /*funkcija DodajZavrsniRad ima zadatak da odredjenom Mentoru dodijeli mentorstvo na zavrsnom radu. zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
- sprijeciti dodavanje zavrsnih radova sa istom temom*/
- //parametri:brojIndeksa, zavrsniRad
- if (mentori[0]->DodajZavrsniRad("IB130011", multimedijalni))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (mentori[0]->DodajZavrsniRad("IB120051", podrsa_operaterima))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (!mentori[0]->DodajZavrsniRad("IB120056", podrsa_operaterima))//dupliranje rada
- cout << "Zavrsni rad nije dodat!" << endl;
- if (!mentori[0]->DodajZavrsniRad("IB120051", kriptografija)) //studentu vec dodijeljen rad
- cout << "Zavrsni rad nije dodat!" << endl;
- if (mentori[1]->DodajZavrsniRad("IB140102", analiza_sigurnosti))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (mentori[2]->DodajZavrsniRad("IB140002", kriptografija))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva definisanje
- datuma odbrane. odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio i pri tom su zadovoljeni sljedeci uslovi:
- 1. zavrsni rad ima broj poglavlja veci od minimalnog
- 2. svako poglavlje ima broj karaktera veci od minimalnog
- 3. svako poglavlje je prihvaceno/odobreno
- ukoliko su zadovoljeni prethodni kriteriji, izracunava se konacna ocjena rada (prosjek ocjena svih poglavlja), postavlja datum odbrane rada i vraca pokazivac na rad kome je zakazan odbrana.
- u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija nije zadovoljen, funkcija vraca nullptr.
- */
- //parametri:brojIndeksa, datumOdbrane
- ZavrsniRad * zr1 = mentori[0]->ZakaziOdbranuRada("IB130011", "25.09.2018");
- if (zr1 != nullptr)
- cout << *zr1 << endl;
- zr1 = mentori[0]->ZakaziOdbranuRada("IB130111", "25.09.2018");//student sa brojem indeksa IB130111 jos uvijek nije prijavio rad
- if (zr1 != nullptr)
- cout << *zr1 << endl;
- //ispisuje sve podatke o Mentoru i njegovim mentorstvima
- mentori[0]->Info();
- for (int i = 0; i < max; i++) {
- delete mentori[i];
- mentori[i] = nullptr;
- }
- system("pause>0");
- return 0;
- }
- ---------------------------------------------------------------------------------------------------------------------------------------
- #include<iostream>
- #include<vector>
- #include<string>
- using namespace std;
- /****************************************************************************
- 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
- 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ÆE BITI OZNACENO KAO "RE"
- 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEÈILO GUBLJENJE URAÐENOG ZADATKA
- 4. NAZIVI FUNKCIJA, TE BROJ I TIP PARAMETARA MORAJU BITI IDENTIÈNI ONIMA KOJI SU KORIŠTENI U TESTNOM CODE-U, OSIM U SLUÈAJU DA POSTOJI ADEKVATAN RAZLOG ZA NJIHOVU MODIFIKACIJU. OSTALE, POMOÆNE FUNKCIJE MOŽETE IMENOVATI I DODAVATI PO ŽELJI.
- 5. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNAÈENO.
- ****************************************************************************/
- const char* crt = "\n-------------------------------------------\n";
- const char* nedozvoljena_operacija = "Nedozvoljena operacija";
- const char* not_set = "NOT_SET";
- const int min_polgavlja = 3;
- const int min_karaktera_po_poglavlju = 30;
- char* AlocirajNizKaraktera(const char* sadrzaj) {
- if (sadrzaj == nullptr)
- return nullptr;
- int vel = strlen(sadrzaj) + 1;
- char* temp = new char[vel];
- strcpy_s(temp, vel, sadrzaj);
- return temp;
- }
- template<class T1, class T2>
- class Kolekcija {
- T1* _elementi1;
- T2* _elementi2;
- int* _trenutno;
- public:
- Kolekcija() :_trenutno(nullptr), _elementi1(nullptr), _elementi2(nullptr) {
- _trenutno = new int(0);
- }
- Kolekcija(const Kolekcija& obj)
- {
- _trenutno = new int(*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& operator =(const Kolekcija& obj)
- {
- if (this!= &obj)
- {
- delete[] _elementi1;
- delete[] _elementi2;
- delete _trenutno;
- _trenutno = new int(*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];
- }
- }
- return *this;
- }
- void AddElement(T1& el1, T2& el2)
- {
- 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;
- _elementi1 = temp1;
- _elementi2 = temp2;
- temp1 = nullptr;
- temp2 = nullptr;
- _elementi1[*_trenutno] = el1;
- _elementi2[*_trenutno] = el2;
- (*_trenutno)++;
- }
- ~Kolekcija() {
- delete[] _elementi1;
- _elementi1 = nullptr;
- delete[] _elementi2;
- _elementi2 = nullptr;
- delete _trenutno;
- _trenutno = nullptr;
- }
- T1* getElementi1Pok() { return _elementi1; }
- T2* getElementi2Pok() { return _elementi2; }
- T1& getElement1(int lokacija) { return _elementi1[lokacija]; }
- T2& getElement2(int lokacija) { return _elementi2[lokacija]; }
- int getTrenutno() { return *_trenutno; }
- friend ostream& operator<<(ostream& COUT, Kolekcija<T1, T2>& obj) {
- for (size_t i = 0; i < *obj._trenutno; i++)
- COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
- return COUT;
- }
- };
- class Poglavlje {
- char* _naslov;
- char* _sadrzaj;
- bool _prihvaceno;
- int _ocjena;//da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6 - 10
- public:
- Poglavlje(const char* naslov = nullptr, const char* sadrzaj = nullptr)
- :_ocjena(0), _prihvaceno(false) {
- _naslov = AlocirajNizKaraktera (naslov);
- _sadrzaj = AlocirajNizKaraktera(sadrzaj);
- }
- Poglavlje(const Poglavlje& obj)
- {
- _naslov = AlocirajNizKaraktera(obj._naslov);
- _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
- _prihvaceno = obj._prihvaceno;
- _ocjena = obj._ocjena;
- }
- Poglavlje& operator =(const Poglavlje& obj)
- {
- if (this!=&obj)
- {
- delete[] _naslov;
- delete[] _sadrzaj;
- _naslov = AlocirajNizKaraktera(obj._naslov);
- _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
- _prihvaceno = obj._prihvaceno;
- _ocjena = obj._ocjena;
- }
- return *this;
- }
- ~Poglavlje() {
- delete[] _naslov; _naslov = nullptr;
- delete[] _sadrzaj; _sadrzaj = nullptr;
- }
- friend ostream& operator<<(ostream& COUT, Poglavlje& obj) {
- if (obj._naslov == nullptr || obj._sadrzaj == nullptr)
- return COUT;
- COUT << endl << obj._naslov << endl << obj._sadrzaj << endl;
- if (obj._prihvaceno)
- COUT << "Ocjena: " << obj._ocjena << endl;;
- return COUT;
- }
- char* GetNaslov() { return _naslov; }
- char* GetSadrzaj() { return _sadrzaj; }
- bool GetPrihvaceno() { return _prihvaceno; }
- int GetOcjena() { return _ocjena; }
- void DodajNoviSadrzaj(const char* noviSadrzaj)
- {
- int vel = strlen(_sadrzaj) + strlen(noviSadrzaj) + 2;
- char* temp = new char[vel];
- strcpy_s(temp, vel, _sadrzaj);
- strcat_s(temp, vel, " ");
- strcat_s(temp, vel, noviSadrzaj);
- delete[] _sadrzaj;
- _sadrzaj = temp;
- temp = nullptr;
- }
- void OcijeniPoglavlje(int ocjena) {
- _ocjena = ocjena;
- if (_ocjena > 5 && ocjena <= 10)
- _prihvaceno = true;
- }
- };
- class ZavrsniRad {
- char* _tema;
- vector<Poglavlje> _poglavljaRada;
- string _datumOdbrane;
- float _konacnaOcjena; //prosjek ocjena svih poglavlja u zavrsnom radu koja se izracunava u momentu zakazivanja odbrane
- public:
- ZavrsniRad(const char* nazivTeme = nullptr) : _konacnaOcjena(0), _datumOdbrane(not_set) {
- _tema = AlocirajNizKaraktera(nazivTeme);
- }
- ZavrsniRad(const ZavrsniRad& org) : _poglavljaRada(org._poglavljaRada), _konacnaOcjena(org._konacnaOcjena), _datumOdbrane(org._datumOdbrane) {
- _tema = AlocirajNizKaraktera(org._tema);
- }
- ~ZavrsniRad() {
- delete[] _tema; _tema = nullptr;
- }
- char* GetNazivTeme()const { return _tema; }
- vector<Poglavlje>& GetPoglavlja() { return _poglavljaRada; };
- string GetDatumOdbrane()const { return _datumOdbrane; }
- float GetOcjena() { return _konacnaOcjena; }
- void SetDatumOdbrane(string datumOdbrane) { _datumOdbrane = datumOdbrane; }
- ZavrsniRad& operator=(const ZavrsniRad& org) {
- if (this != &org) {
- delete[] _tema;
- _tema = AlocirajNizKaraktera(org._tema);
- _datumOdbrane = org._datumOdbrane;
- _poglavljaRada = org._poglavljaRada;
- _konacnaOcjena = org._konacnaOcjena;
- }
- return *this;
- }
- /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj.
- ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i
- pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
- //parametri: nazivPoglavlja, sadrzajPoglavlja
- void DodajPoglavlje(const char* nazivPoglavlja, const char* sadrzajPoglavlja)
- {
- for (size_t i = 0; i < _poglavljaRada.size(); i++)
- {
- if (strcmp(nazivPoglavlja,_poglavljaRada[i].GetNaslov())==0)
- {
- _poglavljaRada[i].DodajNoviSadrzaj(sadrzajPoglavlja);
- return;
- }
- }
- _poglavljaRada.push_back(Poglavlje(nazivPoglavlja, sadrzajPoglavlja));
- }
- /*funkcija OcijeniPoglavlje, na osnovu naziva poglavlja,
- dodjeljuje ocjenu poglavlju te ukoliko je ocjena pozitivna (6 - 10) onda poglavlje oznacava prihvacenim.
- U slucaju da ocjena nije validna ili poglavlje ne postoji, funkcija baca izuzetak sa odgovarajucom porukom*/
- //parametri:nazivPoglavlja, ocjena
- void OcijeniPoglavlje(const char* nazivPoglavlja, int ocjena)
- {
- if (ocjena < 6 || ocjena>10)
- throw(exception("nije validna ocjena"));
- for (size_t i = 0; i < _poglavljaRada.size(); i++)
- {
- if (strcmp(nazivPoglavlja, _poglavljaRada[i].GetNaslov()) == 0)
- {
- _poglavljaRada[i].OcijeniPoglavlje(ocjena);
- return;
- }
- }
- throw(exception("nismo pronasli poglavlje"));
- }
- friend ostream& operator<<(ostream& COUT, ZavrsniRad& obj) {
- COUT << "Tema rada: " << obj._tema << endl;
- COUT << "Sadrzaj: " << endl;
- for (size_t i = 0; i < obj._poglavljaRada.size(); i++)
- COUT << obj._poglavljaRada[i] << endl;
- COUT << "Datum odbrane rada: " << obj._datumOdbrane << endl << " Ocjena: " << obj._konacnaOcjena << endl;
- return COUT;
- }
- };
- class Mentor {
- string _imePrezime;
- //Parametar string predstavlja broj indeksa studenta koji prijavljuje zavrsni rad kod odredjenog Mentora
- Kolekcija<string, ZavrsniRad> _teme;
- public:
- Mentor(string imePrezime) :_imePrezime(imePrezime) {}
- Kolekcija<string, ZavrsniRad>& GetTeme() { return _teme; };
- string GetImePrezime() { return _imePrezime; }
- /*funkcija DodajZavrsniRad ima zadatak da odredjenom Mentoru dodijeli mentorstvo na zavrsnom radu.
- zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
- sprijeciti dodavanje zavrsnih radova sa istom temom*/
- //parametri:brojIndeksa, zavrsniRad
- bool DodajZavrsniRad(string brojIndeksa, ZavrsniRad zavrsniRad)
- {
- for (size_t i = 0; i < _teme.getTrenutno(); i++)
- {
- if (strcmp(zavrsniRad.GetNazivTeme(), _teme.getElement2(i).GetNazivTeme()) == 0)
- return false;
- }
- _teme.AddElement(brojIndeksa, zavrsniRad);
- return true;
- }
- void Info() {
- cout << _imePrezime << endl << _teme << endl;
- }
- };
- int main() {
- cout << crt << "UPLOAD RADA OBAVEZNO IZVRSITI U ODGOVARAJUCI FOLDER NA FTP SERVERU" << endl;
- cout << "U slucaju da je Upload folder prazan pritisnite tipku F5" << crt;
- const int max = 4;
- Mentor* mentori[max];
- mentori[0] = new Mentor("Armina Hubana");
- mentori[1] = new Mentor("Zanin Vejzovic");
- mentori[2] = new Mentor("Jasmin Azemovic");
- mentori[3] = new Mentor("Emina Junuz");
- //parametri: naziv zavrsnog rada
- ZavrsniRad multimedijalni("Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
- ZavrsniRad podrsa_operaterima("Sistem za podršku rada kablovskog operatera");
- ZavrsniRad analiza_sigurnosti("Prakticna analiza sigurnosti bežiènih raèunarskih mreža");
- ZavrsniRad kriptografija("Primjena teorije informacija u procesu generisanja kriptografskih kljuèeva");
- /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
- //parametri: nazivPoglavlja, sadrzajPoglavlja
- multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
- multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
- multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
- multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistema, a neke od najznacajnijih su ...");
- multimedijalni.DodajPoglavlje("Teorija multimedije", "Sadrzaj koji bi trebao stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130011");
- multimedijalni.DodajPoglavlje("Zakljucak", "U ovom radu su predstavljeni osnovni koncepti i prakticna primjena...");
- try {
- /*funkcija OcijeniPoglavlje, na osnovu naziva poglavlja, dodjeljuje ocjenu poglavlju te ukoliko je ocjena pozitivna (6 - 10) onda poglavlje oznacava prihvacenim. U slucaju da ocjena nije validna ili poglavlje ne postoji, funkcija baca izuzetak sa odgovarajucom porukom*/
- //parametri:nazivPoglavlja, ocjena
- multimedijalni.OcijeniPoglavlje("Uvod", 8);
- multimedijalni.OcijeniPoglavlje("Vrste multimedijalnih sistema", 8);
- multimedijalni.OcijeniPoglavlje("Teorija multimedije", 9);
- multimedijalni.OcijeniPoglavlje("Zakljucak", 7);
- multimedijalni.OcijeniPoglavlje("Naziv poglavlja ne postoji", 8);
- }
- catch (exception& err) {
- cout << "Greska -> " << err.what() << endl;
- }
- /*funkcija DodajZavrsniRad ima zadatak da odredjenom Mentoru dodijeli mentorstvo na zavrsnom radu. zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
- sprijeciti dodavanje zavrsnih radova sa istom temom*/
- //parametri:brojIndeksa, zavrsniRad
- if (mentori[0]->DodajZavrsniRad("IB130011", multimedijalni))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (mentori[0]->DodajZavrsniRad("IB120051", podrsa_operaterima))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (!mentori[0]->DodajZavrsniRad("IB120056", podrsa_operaterima))//dupliranje rada
- cout << "Zavrsni rad nije dodat!" << endl;
- if (!mentori[0]->DodajZavrsniRad("IB120051", kriptografija)) //studentu vec dodijeljen rad
- cout << "Zavrsni rad nije dodat!" << endl;
- if (mentori[1]->DodajZavrsniRad("IB140102", analiza_sigurnosti))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (mentori[2]->DodajZavrsniRad("IB140002", kriptografija))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- // /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva definisanje
- // datuma odbrane. odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio i pri tom su zadovoljeni sljedeci uslovi:
- // 1. zavrsni rad ima broj poglavlja veci od minimalnog
- // 2. svako poglavlje ima broj karaktera veci od minimalnog
- // 3. svako poglavlje je prihvaceno/odobreno
- // ukoliko su zadovoljeni prethodni kriteriji, izracunava se konacna ocjena rada (prosjek ocjena svih poglavlja), postavlja datum odbrane rada i vraca pokazivac na rad kome je zakazan odbrana.
- // u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija nije zadovoljen, funkcija vraca nullptr.
- //*/
- //
- ////parametri:brojIndeksa, datumOdbrane
- // ZavrsniRad* zr1 = mentori[0]->ZakaziOdbranuRada("IB130011", "25.09.2018");
- // if (zr1 != nullptr)
- // cout << *zr1 << endl;
- //
- // zr1 = mentori[0]->ZakaziOdbranuRada("IB130111", "25.09.2018");//student sa brojem indeksa IB130111 jos uvijek nije prijavio rad
- // if (zr1 != nullptr)
- // cout << *zr1 << endl;
- //ispisuje sve podatke o Mentoru i njegovim mentorstvima
- mentori[0]->Info();
- for (int i = 0; i < max; i++) {
- delete mentori[i];
- mentori[i] = nullptr;
- }
- system("pause>0");
- return 0;
- }
- ---------------------------------------------------------------------------------------------------------------------------------------
- #include <iostream>
- #include <string>
- #include <vector>
- #include <cstring>
- #include <exception>
- using namespace std;
- const char* crt = "\n-------------------------------------------\n";
- const char* nedozvoljena_operacija = "Nedozvoljena operacija";
- const char* not_set = "NOT_SET";
- const int min_polgavlja = 3;
- const int min_karaktera_po_poglavlju = 30;
- char* AlocirajNizKaraktera(const char* sadrzaj) {
- if (sadrzaj == nullptr)
- return nullptr;
- int vel = strlen(sadrzaj) + 1;
- char* temp = new char[vel];
- strcpy_s(temp, vel, sadrzaj);
- return 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& operator=(const Kolekcija& obj)
- {
- if (this != &obj)
- {
- delete[]_elementi1;
- delete[]_elementi2;
- _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];
- }
- }
- return *this;
- }
- void AddElement(T1& el1, T2& el2)
- {
- 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;
- _elementi1 = temp1;
- _elementi2 = temp2;
- _elementi1[_trenutno] = el1;
- _elementi2[_trenutno] = el2;
- _trenutno++;
- temp1 = nullptr;
- temp2 = nullptr;
- }
- ~Kolekcija() {
- delete[] _elementi1; _elementi1 = nullptr;
- delete[] _elementi2; _elementi1 = nullptr;
- }
- T1* getElementi1Pok() { return _elementi1; }
- T2* getElementi2Pok() { return _elementi2; }
- T1& getElement1(int lokacija) { return _elementi1[lokacija]; }
- T2& getElement2(int lokacija) { return _elementi2[lokacija]; }
- int getTrenutno() { return _trenutno; }
- friend ostream& operator<<(ostream& COUT, Kolekcija<T1, T2>& obj) {
- for (size_t i = 0; i < obj._trenutno; i++)
- COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
- return COUT;
- }
- };
- class Poglavlje {
- char* _naslov;
- char* _sadrzaj;
- bool _prihvaceno;
- int _ocjena; // da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6 - 10
- public:
- Poglavlje(const char* naslov = nullptr, const char* sadrzaj = nullptr)
- : _ocjena(0), _prihvaceno(false) {
- _naslov = AlocirajNizKaraktera(naslov);
- _sadrzaj = AlocirajNizKaraktera(sadrzaj);
- }
- Poglavlje(const Poglavlje& obj)
- : _prihvaceno(obj._prihvaceno), _ocjena(obj._ocjena) {
- _naslov = AlocirajNizKaraktera(obj._naslov);
- _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
- }
- Poglavlje& operator=(const Poglavlje& obj) {
- if (this != &obj) {
- delete[] _naslov;
- delete[] _sadrzaj;
- _naslov = AlocirajNizKaraktera(obj._naslov);
- _sadrzaj = AlocirajNizKaraktera(obj._sadrzaj);
- _prihvaceno = obj._prihvaceno;
- _ocjena = obj._ocjena;
- }
- return *this;
- }
- void DodajSadrzaj(const char* noviSadrzaj) {
- int velicina = strlen(_sadrzaj) + strlen(noviSadrzaj) + 2;
- char* temp = new char[velicina];
- strcpy_s(temp, velicina, _sadrzaj);
- strcat_s(temp, velicina, " ");
- strcat_s(temp, velicina, noviSadrzaj);
- delete[] _sadrzaj;
- _sadrzaj = temp;
- temp = nullptr;
- }
- ~Poglavlje() {
- delete[] _naslov; _naslov = nullptr;
- delete[] _sadrzaj; _sadrzaj = nullptr;
- }
- friend ostream& operator<<(ostream& COUT, Poglavlje& obj) {
- if (obj._naslov == nullptr || obj._sadrzaj == nullptr)
- return COUT;
- COUT << endl << obj._naslov << endl << obj._sadrzaj << endl;
- if (obj._prihvaceno)
- COUT << "Ocjena: " << obj._ocjena << endl;;
- return COUT;
- }
- char* GetNaslov() { return _naslov; }
- char* GetSadrzaj() { return _sadrzaj; }
- bool GetPrihvaceno() { return _prihvaceno; }
- int GetOcjena() { return _ocjena; }
- void OcijeniPoglavlje(int ocjena) {
- _ocjena = ocjena;
- if (_ocjena >= 6 && _ocjena <= 10)
- _prihvaceno = true;
- }
- };
- class ZavrsniRad {
- char* _tema;
- vector<Poglavlje> _poglavljaRada;
- string _datumOdbrane;
- float _konacnaOcjena; // prosjek ocjena svih poglavlja u zavrsnom radu koja se izracunava u momentu zakazivanja odbrane
- public:
- ZavrsniRad(const char* nazivTeme = nullptr)
- : _konacnaOcjena(0), _datumOdbrane(not_set) {
- _tema = AlocirajNizKaraktera(nazivTeme);
- }
- ZavrsniRad(const ZavrsniRad& org)
- : _poglavljaRada(org._poglavljaRada), _konacnaOcjena(org._konacnaOcjena), _datumOdbrane(org._datumOdbrane) {
- _tema = AlocirajNizKaraktera(org._tema);
- }
- ~ZavrsniRad() {
- delete[] _tema; _tema = nullptr;
- }
- char* GetNazivTeme() const { return _tema; }
- vector<Poglavlje>& GetPoglavlja() { return _poglavljaRada; };
- string GetDatumOdbrane() const { return _datumOdbrane; }
- float GetOcjena() { return _konacnaOcjena; }
- void SetDatumOdbrane(string datumOdbrane) { _datumOdbrane = datumOdbrane; }
- ZavrsniRad& operator=(const ZavrsniRad& org) {
- if (this != &org) {
- delete[] _tema;
- _tema = AlocirajNizKaraktera(org._tema);
- _datumOdbrane = org._datumOdbrane;
- _poglavljaRada = org._poglavljaRada;
- _konacnaOcjena = org._konacnaOcjena;
- }
- return *this;
- }
- void DodajPoglavlje(const char* nazivPoglavlja, const char* sadrzajPoglavlja) {
- for (size_t i = 0; i < _poglavljaRada.size(); i++) {
- if (strcmp(nazivPoglavlja, _poglavljaRada[i].GetNaslov()) == 0) {
- _poglavljaRada[i].DodajSadrzaj(sadrzajPoglavlja);
- return;
- }
- }
- _poglavljaRada.push_back(Poglavlje(nazivPoglavlja, sadrzajPoglavlja));
- }
- void OcijeniPoglavlje(const char* nazivPoglavlja, int ocjena) {
- if (ocjena < 6 || ocjena > 10)
- throw exception("Ocjena nije validna!");
- for (size_t i = 0; i < _poglavljaRada.size(); i++) {
- if (strcmp(nazivPoglavlja, _poglavljaRada[i].GetNaslov()) == 0) {
- _poglavljaRada[i].OcijeniPoglavlje(ocjena);
- return;
- }
- }
- throw exception("Poglavlje nije pronadjeno!");
- }
- void SetKonacnaOcjena() {
- float prosjek = 0.0f;
- for (size_t i = 0; i < _poglavljaRada.size(); i++) {
- prosjek += _poglavljaRada[i].GetOcjena();
- }
- _konacnaOcjena = prosjek / _poglavljaRada.size();
- }
- friend ostream& operator<<(ostream& COUT, ZavrsniRad& obj) {
- COUT << "Tema rada: " << obj._tema << endl;
- COUT << "Sadrzaj: " << endl;
- for (size_t i = 0; i < obj._poglavljaRada.size(); i++)
- COUT << obj._poglavljaRada[i] << endl;
- COUT << "Datum odbrane rada: " << obj._datumOdbrane << endl << " Ocjena: " << obj._konacnaOcjena << endl;
- return COUT;
- }
- };
- class Mentor {
- string _imePrezime;
- // Parametar string predstavlja broj indeksa studenta koji prijavljuje zavrsni rad kod odredjenog Mentora
- Kolekcija<string, ZavrsniRad> _teme;
- public:
- Mentor(string imePrezime) : _imePrezime(imePrezime) {}
- Kolekcija<string, ZavrsniRad>& GetTeme() { return _teme; };
- string GetImePrezime() { return _imePrezime; }
- void Info() {
- cout << _imePrezime << endl << _teme << endl;
- }
- bool DodajZavrsniRad(string brojIndeksa, ZavrsniRad zavrsniRad) {
- for (size_t i = 0; i < _teme.getTrenutno(); i++) {
- if (strcmp(zavrsniRad.GetNazivTeme(), _teme.getElement2(i).GetNazivTeme()) == 0) {
- return false;
- }
- }
- _teme.AddElement(brojIndeksa, zavrsniRad);
- return true;
- }
- ZavrsniRad* ZakaziOdbranuRada(string brojIndeksa, string datumOdbrane) {
- for (size_t i = 0; i < _teme.getTrenutno(); i++) {
- if (brojIndeksa == _teme.getElement1(i)) {
- if (_teme.getElement2(i).GetPoglavlja().size() > min_polgavlja) {
- for (size_t j = 0; j < _teme.getElement2(i).GetPoglavlja().size(); j++) {
- if (strlen(_teme.getElement2(i).GetPoglavlja()[j].GetSadrzaj()) <= min_karaktera_po_poglavlju ||
- !_teme.getElement2(i).GetPoglavlja()[j].GetPrihvaceno()) {
- return nullptr;
- }
- }
- _teme.getElement2(i).SetDatumOdbrane(datumOdbrane);
- _teme.getElement2(i).SetKonacnaOcjena();
- return &_teme.getElement2(i);
- }
- return nullptr;
- }
- }
- return nullptr;
- }
- };
- int main() {
- cout << crt << "UPLOAD RADA OBAVEZNO IZVRSITI U ODGOVARAJUCI FOLDER NA FTP SERVERU" << endl;
- cout << "U slucaju da je Upload folder prazan pritisnite tipku F5" << crt;
- const int max = 4;
- Mentor* mentori[max];
- mentori[0] = new Mentor("Armina Hubana");
- mentori[1] = new Mentor("Zanin Vejzovic");
- mentori[2] = new Mentor("Jasmin Azemovic");
- mentori[3] = new Mentor("Emina Junuz");
- //parametri: naziv zavrsnog rada
- ZavrsniRad multimedijalni("Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
- ZavrsniRad podrsa_operaterima("Sistem za podršku rada kablovskog operatera");
- ZavrsniRad analiza_sigurnosti("Prakticna analiza sigurnosti bežiènih raèunarskih mreža");
- ZavrsniRad kriptografija("Primjena teorije informacija u procesu generisanja kriptografskih kljuèeva");
- /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj.
- ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor).
- u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzaje*/
- //parametri: nazivPoglavlja, sadrzajPoglavlja
- multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
- multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
- multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
- multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistema, a neke od najznacajnijih su ...");
- multimedijalni.DodajPoglavlje("Teorija multimedije", "Sadrzaj koji bi trebao stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130011");
- multimedijalni.DodajPoglavlje("Zakljucak", "U ovom radu su predstavljeni osnovni koncepti i prakticna primjena...");
- try {
- /*funkcija OcijeniPoglavlje, na osnovu naziva poglavlja, dodjeljuje ocjenu poglavlju te ukoliko je ocjena pozitivna (6 - 10) onda poglavlje oznacava prihvacenim.
- U slucaju da ocjena nije validna ili poglavlje ne postoji, funkcija baca izuzetak sa odgovarajucom porukom*/
- //parametri:nazivPoglavlja, ocjena
- multimedijalni.OcijeniPoglavlje("Uvod", 8);
- multimedijalni.OcijeniPoglavlje("Vrste multimedijalnih sistema", 8);
- multimedijalni.OcijeniPoglavlje("Teorija multimedije", 9);
- multimedijalni.OcijeniPoglavlje("Zakljucak", 7);
- multimedijalni.OcijeniPoglavlje("Naziv poglavlja ne postoji", 8);
- }
- catch (exception& err) {
- cout << "Greska -> " << err.what() << endl;
- }
- /*funkcija DodajZavrsniRad ima zadatak da odredjenom Mentoru dodijeli mentorstvo na zavrsnom radu.
- zavrsni rad se dodaje studentu sa brojem indeksa proslijedjenim kao prvi parametar.
- sprijeciti dodavanje zavrsnih radova sa istom temom*/
- //parametri:brojIndeksa, zavrsniRad
- if (mentori[0]->DodajZavrsniRad("IB130011", multimedijalni))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (mentori[0]->DodajZavrsniRad("IB120051", podrsa_operaterima))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (!mentori[0]->DodajZavrsniRad("IB120056", podrsa_operaterima))//dupliranje rada
- cout << "Zavrsni rad nije dodat!" << endl;
- if (!mentori[0]->DodajZavrsniRad("IB120051", kriptografija)) //studentu vec dodijeljen rad
- cout << "Zavrsni rad nije dodat!" << endl;
- if (mentori[1]->DodajZavrsniRad("IB140102", analiza_sigurnosti))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (mentori[2]->DodajZavrsniRad("IB140002", kriptografija))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva definisanje
- datuma odbrane. odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio i pri tom su zadovoljeni sljedeci uslovi:
- 1. zavrsni rad ima broj poglavlja veci od minimalnog
- 2. svako poglavlje ima broj karaktera veci od minimalnog
- 3. svako poglavlje je prihvaceno/odobreno
- ukoliko su zadovoljeni prethodni kriteriji, izracunava se konacna ocjena rada (prosjek ocjena svih poglavlja)
- , postavlja datum odbrane rada i vraca pokazivac na rad kome je zakazan odbrana.
- u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija nije zadovoljen, funkcija vraca nullptr.
- */
- //parametri:brojIndeksa, datumOdbrane
- ZavrsniRad* zr1 = mentori[0]->ZakaziOdbranuRada("IB130011", "25.09.2018");
- if (zr1 != nullptr)
- cout << *zr1 << endl;
- zr1 = mentori[0]->ZakaziOdbranuRada("IB130111", "25.09.2018");//student sa brojem indeksa IB130111 jos uvijek nije prijavio rad
- if (zr1 != nullptr)
- cout << *zr1 << endl;
- //ispisuje sve podatke o Mentoru i njegovim mentorstvima
- mentori[0]->Info();
- for (int i = 0; i < max; i++) {
- delete mentori[i];
- mentori[i] = nullptr;
- }
- system("pause>0");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement