Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <regex>
- #include <vector>
- #include <string>
- using namespace std;
- bool ProvjeriValidnostBrojaTelefona(string telefon){//globalna funkcija
- //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));
- }
- 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" };
- ostream & operator << (ostream & C, Predmeti predmet) {
- C << "Predmet: " << ispisPredmeti[(int)predmet];
- return C;
- }
- ostream & operator << (ostream & C, Razredi razred) {
- C << "Razred: " << ispisRazredi[(int)razred];
- return C;
- }
- char * crt = "\n------------\n\n";
- template<class T1, class T2>
- class Kolekcija {
- T1 * _elementi1;
- T2 * _elementi2;
- int _trenutno;
- public:
- Kolekcija()
- {
- _elementi1 = nullptr;
- _elementi2 = nullptr;
- _trenutno = 0;
- }
- ~Kolekcija()
- {
- delete[]_elementi1;
- delete[]_elementi2;
- }
- Kolekcija(Kolekcija & obj) {
- _elementi1 = new T1[obj._trenutno];
- _elementi2 = new T2[obj._trenutno];
- _trenutno = obj._trenutno;
- for (int i = 0; i < obj._trenutno; i++) {
- _elementi1[i] = obj._elementi1[i];
- _elementi2[i] = obj._elementi2[i];
- }
- }
- bool AddElement(T1 element1, T2 element2) {
- 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];
- }
- if (_trenutno != 0) {
- delete[] _elementi1;
- delete[] _elementi2;
- }
- _elementi1 = temp1;
- _elementi2 = temp2;
- _elementi1[_trenutno] = element1;
- _elementi2[_trenutno] = element2;
- _trenutno++;
- return true;
- }
- bool RemoveElement(int lokacija) {
- if (_trenutno == 0)
- return false;
- T1 * temp1 = new T1[_trenutno];
- T2 * temp2 = new T2[_trenutno];
- for (int i = 0, g = 0; i < _trenutno; i++, g++) {
- if (i == lokacija)
- g++;
- temp1[i] = _elementi1[g];
- temp2[i] = _elementi2[g];
- }
- delete[] _elementi1;
- delete[] _elementi2;
- _elementi1 = temp1;
- _elementi2 = temp2;
- _trenutno--;
- return true;
- }
- T1 GetElement1(int lokacija) { return _elementi1[lokacija]; }
- T2 GetElement2(int lokacija) { return _elementi2[lokacija]; }
- void operator = (Kolekcija & obj) {
- if (_trenutno != 0) {
- delete[] _elementi1;
- delete[] _elementi2;
- }
- for (int i = 0; i < obj._trenutno; i++) {
- AddElement(obj.GetElement1(i), obj.GetElement2(i));
- }
- }
- int GetTrenutno() { return _trenutno; }
- friend ostream & operator << <> (ostream & C, Kolekcija<T1, T2> & obj);
- };
- template<class T1, class T2>
- ostream & operator << <> (ostream & C, Kolekcija<T1, T2> & obj) {
- C << "Trenutno: " << obj._trenutno << endl;
- for (int i = 0; i < obj._trenutno; i++) {
- C << "Element1, lokacija: " << i << " je ";
- C << obj._elementi1[i];
- C << endl;
- C << "Element2, lokacija " << i << " je ";
- C << obj._elementi2[i];
- C << endl;
- }
- return C;
- }
- 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 = (Datum & obj) {
- *_dan = *obj._dan;
- *_mjesec = *obj._mjesec;
- *_godina = *obj._godina;
- return *this;
- }
- 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, 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);
- }
- virtual ~Osoba() { delete[]_imePrezime; delete _datumRodjenja; }
- bool setBrojTelefona(string brojTelefona){
- if (ProvjeriValidnostBrojaTelefona(brojTelefona)){
- _brojTelefona = brojTelefona;
- return true;
- }
- return false;
- }
- };
- class Nastavnik :public Osoba {
- Kolekcija<Predmeti, Razredi> * _predmetiRazredi;
- public:
- Nastavnik(char * imeprezime, Datum dat): Osoba(imeprezime, dat) {
- _predmetiRazredi = new Kolekcija < Predmeti, Razredi > ;
- }
- virtual ~Nastavnik() { delete _predmetiRazredi; _predmetiRazredi = nullptr; }
- Nastavnik(Nastavnik & obj): Osoba(obj) {
- _predmetiRazredi = new Kolekcija < Predmeti, Razredi >(*obj._predmetiRazredi);
- }
- bool AddPredmetRazred(Predmeti predmet, Razredi razred) {
- _predmetiRazredi->AddElement(predmet, razred);
- return true;
- }
- bool RemovePredmetRazred(Predmeti predmet) {
- bool removanbaremjedan = 0;
- for (int i = 0; i < _predmetiRazredi->GetTrenutno(); i++) {
- if (_predmetiRazredi->GetElement1(i) == predmet) {
- _predmetiRazredi->RemoveElement(i);
- removanbaremjedan = true;
- }
- }
- return removanbaremjedan;
- }
- Nastavnik & operator = (Nastavnik & 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);
- delete _predmetiRazredi;
- _predmetiRazredi = new Kolekcija<Predmeti, Razredi>(*obj._predmetiRazredi);
- return *this;
- }
- bool operator == (Nastavnik & obj) {
- if (strcmp(_imePrezime, obj._imePrezime) == 0)
- return true;
- return false;
- }
- bool JelImaRazred(Razredi razred) {
- for (int i = 0; i < _predmetiRazredi->GetTrenutno(); i++) {
- if (_predmetiRazredi->GetElement2(i) == razred)
- return true;
- }
- return false;
- }
- bool JelImaPredmet(Predmeti predmet) {
- for (int i = 0; i < _predmetiRazredi->GetTrenutno(); i++) {
- if (_predmetiRazredi->GetElement1(i) == predmet)
- return true;
- }
- return false;
- }
- Kolekcija<Predmeti,Razredi> & getPredmetiRazredi() { return *_predmetiRazredi; }
- friend ostream & operator << (ostream & C, Nastavnik & obj) {
- C << "Ime prezime nastavnika: " << obj._imePrezime << endl;
- C << "Datum rodjenja: " << *obj._datumRodjenja << endl;
- C << "Broj telefona: " << obj._brojTelefona << endl;
- C << "Predmeti koje predaje i razredi kojima predaje: " << endl;
- C << *obj._predmetiRazredi << endl;
- return C;
- }
- };
- class Ucenik : public Osoba {
- int _brojUDnevniku;
- Razredi _razred;
- vector<Nastavnik *> _nastavnici;
- Kolekcija<Predmeti, int> _predmetiOcjene;
- public:
- Ucenik(char * imeprezime, Datum dat, int dnevnik, Razredi razred) : Osoba(imeprezime, dat), _razred(razred){
- _brojUDnevniku = dnevnik;
- }
- //Ucenik(Ucenik & obj) : Osoba(obj) {}
- Ucenik & operator = (Ucenik & 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);
- _brojUDnevniku = obj._brojUDnevniku;
- _razred = obj._razred;
- _nastavnici = obj._nastavnici;
- _predmetiOcjene = obj._predmetiOcjene;
- return *this;
- }
- bool AddNastavnik(Nastavnik & obj) {
- for (int i = 0; i < _nastavnici.size(); i++) {
- if (*_nastavnici[i] == obj)
- return false;
- }
- if (obj.JelImaRazred(_razred)){ return false; }
- _nastavnici.push_back(&obj);
- return true;
- }
- bool AddPredmetOcjenu(Predmeti predmet, int ocjena) {
- for (int i = 0; i < _nastavnici.size(); i++){
- if (_nastavnici[i]->JelImaPredmet(predmet)) {
- _predmetiOcjene.AddElement(predmet, ocjena);
- return true;
- }
- }
- return false;
- }
- vector<Nastavnik *> & getNastavnici() { return _nastavnici; }
- Kolekcija<Predmeti, int> & getPredmetiOcjene() { return _predmetiOcjene; }
- float GetProsjekByNastavnik(char * imeprezime) {
- float prosjek = 0;
- int brojocjena = 0;
- bool pronadjen = false;
- Datum tempdat(10, 11, 12);
- Nastavnik temp(imeprezime, tempdat);
- for (int i = 0; i < _nastavnici.size(); i++) {
- if (temp == *_nastavnici[i]) {
- pronadjen = true;
- temp = *_nastavnici[i];
- }
- }
- if (!pronadjen)
- return prosjek;
- for (int i = 0; i < _predmetiOcjene.GetTrenutno(); i++) {
- for (int j = 0; j < temp.getPredmetiRazredi().GetTrenutno(); j++) {
- if (_predmetiOcjene.GetElement1(i) == temp.getPredmetiRazredi().GetElement1(j)) {
- prosjek += _predmetiOcjene.GetElement2(i);
- brojocjena++;
- }
- }
- }
- if (brojocjena == 0)
- return prosjek;
- return prosjek / brojocjena;
- }
- friend ostream & operator << (ostream & C, Ucenik & obj) {
- C << crt;
- C << "Ime prezime ucenika: " << obj._imePrezime << endl;
- C << "Datum rodjenja: " << *obj._datumRodjenja << endl;
- C << "Broj telefona: " << obj._brojTelefona << endl;
- C << "Broj u dnevniku: " << obj._brojUDnevniku << endl;
- C << obj._razred << endl;
- C << "\n***Nastavnici koji predaju uceniku: \n" << endl;
- for (int i = 0; i < obj._nastavnici.size(); i++) {
- C << *obj._nastavnici[i];
- }
- C << "***Predmeti koje ucenik slusa: " << endl;
- for (int i = 0; i < obj._predmetiOcjene.GetTrenutno(); i++){
- C << obj._predmetiOcjene.GetElement1(i) << endl;
- }
- return C;
- }
- };
- 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
- ****************************************************************************/
- //TestiranjeDatuma
- Datum danas(26, 11, 2015);
- Datum sutra(danas);
- Datum prekosutra;
- prekosutra = danas;
- cout << danas << endl << sutra << endl << prekosutra << crt;
- //TestiranjeKolekcije
- Kolekcija<int, int> kolekcija1;
- int brojElemenata = 15;
- for (size_t i = 0; i < brojElemenata; i++)
- kolekcija1.AddElement(i, i);
- kolekcija1.RemoveElement(0);//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;
- //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" << endl;
- if (jasmin.AddPredmetRazred(Geografia, I2))
- cout << "Predmeti dodan" << 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;
- //TestiranjeUcenika
- Ucenik denis("Denis Music", Datum(8, 10, 1990), 3, III1);
- 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;
- system("pause>0");
- }
Advertisement
Add Comment
Please, Sign In to add comment