Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<string>
- #include<vector>
- #include<regex>
- using namespace std;
- enum Predmeti { Matematika, Historija, Geografia, Hemija, Biologija, Engleski, Muzicko, Fizicko };
- enum Razredi { I1, I2, I3, II1, II2, II3, III1, III2, III3, IV1, IV2, IV3 };
- char * ispisPredmeti[] = { "Matematika", "Historija", "Geografia", "Hemija", "Biologija", "Engleski", "Muzicko", "Fizicko" };
- char * ispisRazredi[] = { "I1", "I2", "I3", "II1", "II2", "II3", "III1", "III2", "III3", "IV1", "IV2", "IV3" };
- bool ProvjeriValidnostBrojaTelefona(string telefon)
- {
- /*
- broj telefona treba biti u formatu: +387(61)-222-333
- */
- string pravilo = "(\\+\\d{3})(\\(\\d{2}\\))-(\\d{3})-(\\d{3})";
- return regex_match(telefon, regex(pravilo));
- }
- template<class T1, class T2>
- class Kolekcija
- {
- T1 * _elementi1;
- T2 * _elementi2;
- int _trenutno;
- public:
- Kolekcija()
- {
- _elementi1 = nullptr;
- _elementi2 = nullptr;
- _trenutno = 0;
- }
- ~Kolekcija()
- {
- delete[] _elementi1; _elementi1 = nullptr;
- delete[] _elementi2; _elementi2 = nullptr;
- }
- Kolekcija(Kolekcija<T1, T2>& obj)
- {
- for (int i = 0; i < obj.GetTrenutno(); i++)
- AddElement(obj.GetElement1(i), obj.GetElement2(i));
- }
- Kolekcija& operator=(Kolekcija<T1, T2>& obj)
- {
- if (this != &obj)
- {
- delete[] _elementi1;
- delete[] _elementi2;
- for (int i = 0; i < obj._trenutno; i++)
- AddElement(obj.GetElement1(i), obj.GetElement2(i));
- }
- return *this;
- }
- bool operator==(Kolekcija<T1, T2>& obj)
- {
- if (_trenutno != obj._trenutno)
- return false;
- for (int i = 0; i < _trenutno; i++)
- if (_elementi1[i] != obj._elementi1[i] || _elementi2[i] != obj._elementi2[i])
- return false;
- return true;
- }
- friend ostream& operator<< <>(ostream&, Kolekcija<T1, T2>&);
- bool AddElement(const T1& e1, const T2& e2)
- {
- T1* _temp1 = new T1[_trenutno + 1];
- T2* _temp2 = new T2[_trenutno + 1];
- for (int i = 0; i < _trenutno; i++){
- if (_elementi1[i] == e1 && _elementi2[i] == e2)
- return false;
- _temp1[i] = _elementi1[i];
- _temp2[i] = _elementi2[i];
- }
- delete[] _elementi1;
- delete[] _elementi2;
- _elementi1 = _temp1;
- _elementi2 = _temp2;
- _elementi1[_trenutno] = e1;
- _elementi2[_trenutno] = e2;
- _trenutno++;
- return true;
- }
- bool RemoveElement(int indeks)
- {
- if (indeks < 0 || indeks >= _trenutno)
- return false;
- for (int i = 0; i < _trenutno; i++)
- {
- if (i == indeks)
- {
- for (int j = i; j < _trenutno - 1; j++)
- {
- _elementi1[j] = _elementi1[j + 1];
- _elementi2[j] = _elementi2[j + 1];
- }
- }
- }
- _trenutno--;
- T1* _temp1 = new T1[_trenutno];
- T2* _temp2 = new T2[_trenutno];
- for (int i = 0; i < _trenutno; i++)
- {
- _temp1[i] = _elementi1[i];
- _temp2[i] = _elementi2[i];
- }
- delete[] _elementi1;
- delete[] _elementi2;
- _elementi1 = _temp1;
- _elementi2 = _temp2;
- return true;
- }
- int GetTrenutno(){ return _trenutno; }
- T1& GetElement1(int indeks){ return _elementi1[indeks]; }
- T2& GetElement2(int indeks){ return _elementi2[indeks]; }
- };
- template<class T1, class T2>
- ostream& operator<< <>(ostream& COUT, Kolekcija<T1, T2>& obj)
- {
- for (int i = 0; i < obj.GetTrenutno(); i++)
- COUT << obj.GetElement1(i) << "-" << obj.GetElement2(i) << endl;
- return COUT;
- }
- class Datum
- {
- int *_dan, *_mjesec, *_godina;
- public:
- Datum(int dan = 1, int mjesec = 1, int godina = 2000) {
- _dan = new int(dan);
- _mjesec = new int(mjesec);
- _godina = new int(godina);
- }
- Datum(const Datum&obj) {
- _dan = new int(*obj._dan);
- _mjesec = new int(*obj._mjesec);
- _godina = new int(*obj._godina);
- }
- ~Datum() {
- delete _dan; _dan = nullptr;
- delete _mjesec; _mjesec = nullptr;
- delete _godina; _godina = nullptr;
- }
- Datum& operator=(const Datum& obj)
- {
- if (this != &obj)
- {
- _dan = new int(*obj._dan);
- _mjesec = new int(*obj._mjesec);
- _godina = new int(*obj._godina);
- }
- return *this;
- }
- bool operator==(const Datum& obj)
- {
- return (*_dan == *obj._dan && *_mjesec == *obj._mjesec && *_godina == *obj._godina);
- }
- friend ostream& operator<< (ostream &COUT, const Datum &obj) {
- COUT << *obj._dan << " " << *obj._mjesec << " " << *obj._godina;
- return COUT;
- }
- };
- class Osoba
- {
- protected:
- char * _imePrezime;
- Datum * _datumRodjenja;
- string _brojTelefona;
- public:
- Osoba(char * imePrezime = "<ime prezime>", Datum datum = Datum())
- {
- _imePrezime = new char[strlen(imePrezime) + 1];
- strcpy_s(_imePrezime, strlen(imePrezime) + 1, imePrezime);
- _datumRodjenja = new Datum(datum);
- _brojTelefona = "";
- }
- Osoba(const Osoba& obj) :_brojTelefona(obj._brojTelefona)
- {
- _imePrezime = new char[strlen(obj._imePrezime) + 1];
- strcpy_s(_imePrezime, strlen(obj._imePrezime) + 1, obj._imePrezime);
- _datumRodjenja = new Datum(*obj._datumRodjenja);
- }
- Osoba& operator=(const Osoba& obj)
- {
- if (this != &obj)
- {
- int size = strlen(obj._imePrezime) + 1;
- delete[] _imePrezime;
- _imePrezime = new char[size];
- strcpy_s(_imePrezime, size, obj._imePrezime);
- _datumRodjenja = new Datum(*obj._datumRodjenja);
- _brojTelefona = obj._brojTelefona;
- }
- return *this;
- }
- ~Osoba() {
- delete[]_imePrezime; _imePrezime = nullptr;
- delete _datumRodjenja; _datumRodjenja = nullptr;
- }
- bool operator==(const Osoba& obj)
- {
- return (strcmp(_imePrezime, obj._imePrezime) == 0 && *_datumRodjenja == *obj._datumRodjenja && _brojTelefona == obj._brojTelefona);
- }
- friend ostream& operator<<(ostream&, const Osoba&);
- bool setBrojTelefona(string brojTelefona)
- {
- if (ProvjeriValidnostBrojaTelefona(brojTelefona))
- {
- _brojTelefona = brojTelefona;
- return true;
- }
- return false;
- }
- char* GetImePrezime(){ return _imePrezime; }
- };
- ostream& operator<<(ostream& COUT, const Osoba& obj)
- {
- COUT << "Ime i prezime: " << obj._imePrezime << endl;
- COUT << "Datum rodjenja: " << *obj._datumRodjenja << endl;
- COUT << "Broj telefona: " << obj._brojTelefona << endl;
- COUT << "-------------------------------------\n";
- return COUT;
- }
- class Nastavnik :public Osoba
- {
- Kolekcija<Predmeti, Razredi> * _predmetiRazredi;
- public:
- Nastavnik(char* ip = "<ime prezime>", Datum date = Datum()) :Osoba(ip, date)
- {
- _predmetiRazredi = new Kolekcija<Predmeti, Razredi>;
- }
- ~Nastavnik(){ delete _predmetiRazredi; _predmetiRazredi = nullptr; }
- Nastavnik(const Nastavnik& obj) :Osoba(obj)
- {
- _predmetiRazredi = new Kolekcija<Predmeti, Razredi>(*obj._predmetiRazredi);
- }
- Nastavnik& operator=(const Nastavnik& obj)
- {
- if (this != &obj)
- {
- this->Osoba::operator=(obj);
- delete _predmetiRazredi;
- _predmetiRazredi = new Kolekcija<Predmeti, Razredi>(*obj._predmetiRazredi);
- }
- return *this;
- }
- bool operator==(const Nastavnik& obj)
- {
- return (this->Osoba::operator==(obj) && *_predmetiRazredi == *obj._predmetiRazredi);
- }
- bool AddPredmetRazred(const Predmeti& e1, const Razredi& e2)
- {
- // nastavniku se moze dodati isti predmet, ali najvise 2 puta
- // pri cemu moraju biti u razlicitim odjeljenjima na razlicitim godinama
- int brojac = 0;
- for (int i = 0; i < _predmetiRazredi->GetTrenutno(); i++){
- // predmet je isti. Funkcija AddElement() kolekcije ce svakako sprijeciti
- // pokusaj dodavanja kada je i razred (e2) isti
- if (_predmetiRazredi->GetElement1(i) == e1){
- brojac++;
- // u nizu predmeta, sto se godina tice imamo indekse:
- // Ir: 0-1-2, IIr: 3-4-5, IIIr: 6-7-8, IVr: 9-10-11
- string unos = to_string(e2);
- string pravila[4] = { "[0-2]", "[3-5]", "[6-8]", "9|10|11" };
- // ako se ovdje poklopi element niza pravila sa varijablom "i", znaci da se radi o istoj godini
- // i tom slucaju necemo dodati ovaj predmet (koji se ponavlja) ovom nastavniku
- for (int i = 1; i <= 4; i++)
- // utvrdjujemo na kojoj poziciji "i" (odgovara razredu 1-4) je dati (indeks) razreda
- if (regex_match(unos, regex(pravila[i - 1])))
- // ista provjera ali za razred postojeceg predmeta;
- // ako se takodje slaze, tj. spada u istu godinu, izlazimo
- if (regex_match(to_string(_predmetiRazredi->GetElement2(i)), regex(pravila[i - 1])))
- return false;
- }
- }
- // debug
- //cout << "Nastavniku " << _imePrezime << " dodan predmet " << ispisPredmeti[e1] << " u odjeljenju " << ispisRazredi[e2] << endl;
- return (brojac < 2) ? _predmetiRazredi->AddElement(e1, e2) : false;
- }
- bool RemovePredmetRazred(const Predmeti& predmet)
- {
- for (int i = 0; i < _predmetiRazredi->GetTrenutno(); i++)
- {
- if (_predmetiRazredi->GetElement1(i) == predmet)
- return _predmetiRazredi->RemoveElement(i);
- }
- return false;
- }
- Kolekcija<Predmeti, Razredi>& getPredmetiRazredi(){ return *_predmetiRazredi; };
- };
- class Ucenik : public Osoba
- {
- int _brojUDnevniku;
- Razredi _razred;
- vector<Nastavnik *> _nastavnici;
- Kolekcija<Predmeti, int> _predmetiOcjene;
- public:
- // Ucenik denis("Denis Music", Datum(8, 10, 1990), 3, III1);
- Ucenik(
- char* ip = "<ime prezime>", Datum date = Datum(),
- int dnevnikBr = -1, Razredi razred = (Razredi)0)
- :Osoba(ip, date), _razred(razred), _predmetiOcjene()
- {
- _brojUDnevniku = dnevnikBr;
- }
- Ucenik(Ucenik& obj) :Osoba(obj), _razred(obj._razred), _predmetiOcjene(obj._predmetiOcjene)
- {
- cout << "Razred obj: " << obj._razred << endl;
- _brojUDnevniku = obj._brojUDnevniku;
- }
- bool AddNastavnik(Nastavnik& nastavnik)
- {
- for (size_t i = 0; i < _nastavnici.size(); i++)
- {
- if (*_nastavnici[i] == nastavnik){
- cout << "Ovaj nastavnik je vec dodan ovom uceniku!" << endl;
- return false;
- }
- }
- for (int i = 0; i < nastavnik.getPredmetiRazredi().GetTrenutno(); i++)
- if (nastavnik.getPredmetiRazredi().GetElement2(i) == _razred)
- {
- _nastavnici.push_back(&nastavnik);
- return true;
- }
- return false;
- }
- bool AddPredmetOcjenu(const Predmeti& predmet, int ocjena)
- {
- /* ucenik mora imati nastavnika u _nastavnici koji
- * predaje predmet (_predmetiRazredi) koji pokusavam dodati
- */
- for (size_t i = 0; i < _nastavnici.size(); i++)
- {
- for (int j = 0; j < _nastavnici[i]->getPredmetiRazredi().GetTrenutno(); j++)
- {
- if (predmet == _nastavnici[i]->getPredmetiRazredi().GetElement1(j)){
- _predmetiOcjene.AddElement(predmet, ocjena);
- return true;
- }
- }
- }
- return false;
- }
- friend ostream& operator<<(ostream&, const Ucenik&);
- int GetBrUDnevniku(){ return _brojUDnevniku; }
- Razredi& GetRazred(){ return _razred; }
- vector<Nastavnik*>& getNastavnici(){ return _nastavnici; }
- Kolekcija<Predmeti, int>& getPredmetiOcjene(){ return _predmetiOcjene; }
- double GetProsjekByNastavnik(char* imePrezimeNastavnika)
- {
- int suma = 0, brPredmetaPoNastavniku = 0;
- for (size_t i = 0; i < _nastavnici.size(); i++)
- {
- if (strcmp(_nastavnici[i]->GetImePrezime(), imePrezimeNastavnika) == 0)
- {
- for (int j = 0; j < _nastavnici[i]->getPredmetiRazredi().GetTrenutno(); j++)
- {
- for (int k = 0; k < _predmetiOcjene.GetTrenutno(); k++)
- {
- if (_nastavnici[i]->getPredmetiRazredi().GetElement1(j) == _predmetiOcjene.GetElement1(k)){
- suma += _predmetiOcjene.GetElement2(k);
- brPredmetaPoNastavniku++;
- }
- }
- }
- }
- }
- return (double)suma / brPredmetaPoNastavniku;
- }
- };
- ostream& operator<<(ostream& COUT, Ucenik& obj)
- {
- COUT << static_cast<const Osoba&>(obj) << endl;
- COUT << "Broj u dnevniku: " << obj.GetBrUDnevniku() << endl;
- COUT << "Odjeljenje: " << ispisRazredi[obj.GetRazred()] << endl;
- COUT << "\tPredmeti i ocjene" << endl;
- COUT << obj.getPredmetiOcjene() << endl;
- return COUT;
- }
- char* crt = "\n==============================\n";
- void main()
- {
- /****************************************************************************
- 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
- 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR CE BITI OZNACENO KAO "RE"
- 3. SPASAVAJTE PROJEKAT KAKO BI SE SPRIJECILO GUBLJENJE URADJENOG ZADATKA
- 4. PROGRAMSKI CODE SE TAKODJER NALAZI U FAJLU CODE_.TXT
- 5. NAZIV I LISTA PARAMETARA FUNKCIJA MORAJU BITI IDENTIČNI ONIMA KOJI SU KORIŠTENI U TESTNOM CODE-U.
- 6. NIJE POTREBNO BACATI IZUZETKE. SVE FUNKCIJE VRACAJU TRUE ILI FALSE
- ****************************************************************************/
- #pragma region TestiranjeDatuma
- Datum danas(26, 11, 2015);
- Datum sutra(danas);
- Datum prekosutra;
- prekosutra = danas;
- cout << danas << endl << sutra << endl << prekosutra << crt;
- #pragma endregion
- #pragma region TestiranjeKolekcije
- //Kolekcija<int, int> kolekcija1;
- //int brojElemenata = 15;
- //for (size_t i = 0; i < brojElemenata; i++)
- // kolekcija1.AddElement(i, i);
- //kolekcija1.RemoveElement(2);//uklanja element na osnovu lokacije
- //cout << kolekcija1.GetElement1(0) << " " << kolekcija1.GetElement2(0) << endl;
- //cout << kolekcija1 << endl;
- //Kolekcija<int, int> kolekcija2;
- //kolekcija2 = kolekcija1;
- //cout << kolekcija2 << crt;
- //if (kolekcija1.GetTrenutno() == kolekcija2.GetTrenutno())
- // cout << "ISTI BROJ ELEMENATA" << endl;
- //Kolekcija<int, int> kolekcija3(kolekcija2);
- //cout << kolekcija3 << crt;
- #pragma endregion
- #pragma region TestiranjeNastavnika
- Nastavnik jasmin("Jasmin Azemovic", Datum(15, 2, 1980));
- Nastavnik adel("Adel Handzic", Datum(15, 10, 1981));
- ///*NASTAVNIK MOZE PREDAVATI ISTI PREDMET, ALI TO MORA BITI U RAZLICITIM ODJELJENJIMA I NAJVISE U DVA RAZREDA (NA DVIJE RAZLICITE GODINE)*/
- if (jasmin.AddPredmetRazred(Matematika, I1))
- cout << "Predmeti dodan" << endl;
- if (jasmin.AddPredmetRazred(Historija, I1))
- cout << "Predmeti dodan" << endl;
- if (jasmin.AddPredmetRazred(Geografia, I1))
- cout << "Predmeti dodan " << ispisRazredi[I1] << endl;
- if (jasmin.AddPredmetRazred(Geografia, II2))
- cout << "Predmeti dodan " << ispisRazredi[II2] << endl;
- if (jasmin.AddPredmetRazred(Geografia, IV2))
- cout << "Predmeti dodan " << ispisRazredi[IV2] << endl;
- if (adel.AddPredmetRazred(Historija, III1))
- cout << "Predmeti dodan" << endl;
- if (adel.RemovePredmetRazred(Historija))
- cout << "Predmet uklonjen!" << endl;
- Nastavnik goran(adel);
- if (goran == adel)
- cout << "Nastavnici identicni" << endl;
- goran = jasmin;
- if (goran == jasmin)
- cout << "Nastavnici identicni" << endl;
- Kolekcija<Predmeti, Razredi> & predmetiRazredi = jasmin.getPredmetiRazredi();
- if (!jasmin.setBrojTelefona("+38761111222"))
- cout << "Broj telefona nije dodan!" << endl;
- if (!jasmin.setBrojTelefona("+387-61-111-222"))
- cout << "Broj telefona nije dodan!" << endl;
- if (jasmin.setBrojTelefona("+387(61)-111-222"))
- cout << "Broj telefona uspjesno dodan!" << endl;
- #pragma endregion
- #pragma region TestiranjeUcenika
- Ucenik denis("Denis Music", Datum(8, 10, 1990), 3, I1); // izmijenio sam odjeljenje (III1 => I1)
- Ucenik elmin("Elmin Sudic", Datum(15, 6, 1993), 1, I1);
- Ucenik adil("Adil Joldic", Datum(13, 8, 1992), 2, II1);
- ///*VODITI RACUNA DA SE DODAJU REFERENCE NA NASTAVNIKE KAKO BI SVI UCENICI DIJELILI ISTE INFORMACIJE O NASTAVNICIMA U SLUCAJU DA SE NASTAVNIKU DODA NEKI PREDMET*/
- ///*ZA USPJESNO DODAVANJE, NASTAVNIK MORA POSJEDOVATI (PREDAVATI) NAJMANJE JEDAN PREDMET U TOM RAZREDU */
- if (denis.AddNastavnik(jasmin))
- cout << "Nastavnik uspjesno dodan" << endl;
- /*ONEMOGUCITI DODAVANJE ISTIH NASTAVNIKA; POJAM ISTI PODRAZUMIJEVA IDENTICNE VRIJEDNOSTI SVIH ATRIBUTA*/
- if (denis.AddNastavnik(adel))
- cout << "Nastavnik uspjesno dodan" << endl;
- /*DA BI SE DODALA OCJENA ZA ODREDJENI PREDMET UCENIK MORA POSJEDOVATI NASTAVNIKA KOJI PREDAJE TAJ PREDMET*/
- if (denis.AddPredmetOcjenu(Matematika, 3))
- cout << "Ocjena uspjesno dodana" << endl;
- if (denis.AddPredmetOcjenu(Historija, 4))
- cout << "Ocjena uspjesno dodana" << endl;
- vector<Nastavnik*> & nastavnici = denis.getNastavnici();
- cout << "Ucenik Denis ima dodijeljena " << nastavnici.size() << " nastavnika" << endl;
- Kolekcija<Predmeti, int> & uspjeh = denis.getPredmetiOcjene();
- cout << "Denis ima " << uspjeh.GetTrenutno() << " polozenih predmeta" << endl;
- cout << "Prosjecna ocjena kod nastavnika Jasmin Azemovic je " << denis.GetProsjekByNastavnik("Jasmin Azemovic") << endl;
- Ucenik denis2(denis);
- cout << denis2 << endl;
- #pragma endregion
- //system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement