Ispitni 2010

#include<vector> #include<string> #include<iterator> #include<exception> #include<algorithm> #include<regex> #include<iostream> using namespace std; class GreskaUProgramu :public exception{ private: char *_poruka; int _linija; public: GreskaUProgramu(char *poruka = "----", int linija = 0) :exception(poruka){ _linija = linija; } GreskaUProgramu(const GreskaUProgramu &obj) :exception(obj){ _linija = obj._linija; } void ErrorInfo(){ cout << "Greska >>" << what() << " Linija: " << _linija << endl; } }; template<class T1, class T2, int max> class Kolekcija{ private: T1 * _clan1[max]; T2 * _clan2[max]; int * _trenutnoClanova; public: //1. Potrebne konstruktor/destruktor funkcije Kolekcija(){ _trenutnoClanova = new int(0); } Kolekcija(const Kolekcija<T1, T2, max> &obj){ _trenutnoClanova = new int(*obj._trenutnoClanova); for (int i = 0; i < *_trenutnoClanova; i++){ _clan1[i] = new T1(*obj._clan1[i]); _clan2[i] = new T2(*obj._clan2[i]); } } ~Kolekcija(){ for (int i = 0; i < *_trenutnoClanova; i++){ delete _clan1[i]; delete _clan2[i]; _clan1[i] = nullptr; _clan2[i] = nullptr; } delete _trenutnoClanova; _trenutnoClanova = nullptr; } void operator=(const Kolekcija<T1, T2, max> &obj){ for (int i = 0; i < *_trenutnoClanova; i++){ delete _clan1[i]; delete _clan2[i]; _clan1[i] = nullptr; _clan2[i] = nullptr; } delete _trenutnoClanova; _trenutnoClanova = nullptr; _trenutnoClanova = new int(*obj._trenutnoClanova); for (int i = 0; i < *_trenutnoClanova; i++){ _clan1[i] = new T1(*obj._clan1[i]); _clan2[i] = new T2(*obj._clan2[i]); } } //2. AddElement :: omogucava dodavanje novih elementa u kolekciju (u clan1 i clan2).Onemoguciti //dodavanje dva identicna elementa u kolekciju bool AddElement(T1 obj1, T2 obj2){ for (int i = 0; i < *_trenutnoClanova; i++){ if (*_clan1[i] == obj1 && *_clan2[i] == obj2){ throw GreskaUProgramu("Iste elemente nije moguce dodati!", __LINE__); } } if (*_trenutnoClanova == max){ T1 *temp1 = new T1[*_trenutnoClanova + 5]; T2 *temp2 = new T2[*_trenutnoClanova + 5]; for (int i = 0; i < *_trenutnoClanova; i++){ temp1[i] = *_clan1[i]; temp2[i] = *_clan2[i]; } for (int i = 0; i < *_trenutnoClanova; i++){ delete _clan1[i]; delete _clan2[i]; _clan1[i] = nullptr; _clan2[i] = nullptr; } *_clan1 = temp1; *_clan2 = temp2; } _clan1[*_trenutnoClanova] = new T1(obj1); _clan2[*_trenutnoClanova] = new T2(obj2); (*_trenutnoClanova)++; cout << "Uspjesno ste dodali elemente!" << endl; return true; } //3. RemoveElement :: uklanja element na zahtijevanoj lokaciji.Prilikom uklanjanja elementa //izvrsiti potrebnu dealokaciju, te onemoguciti pojavljivanje neinicijaliziranih elemenata niza. bool RemoveElement(int poz){ for (int i = 0; i < *_trenutnoClanova; i++){ if (i == poz){ delete _clan1[i]; delete _clan2[i]; for (int j = i; j < (*_trenutnoClanova) - 1; j++){ _clan1[j] = new T1(*_clan1[j + 1]); _clan2[j] = new T2(*_clan2[j + 1]); } (*_trenutnoClanova)--; cout << "Uspjesno ste uklonili elemente!" << endl; return true; } } } //4. operator -= :: iz postojece kolekcije (clanovi 1 i 2) uklanja elemente koji su identicni //nekom od elemenata u kolekciji koja je primljena kao parametar. void operator-=(Kolekcija<T1, T2, max> &obj){ int index = 0; for (int i = 0; i < *_trenutnoClanova; i++){ for (int j = 0; j < *obj._trenutnoClanova; j++){ if (*_clan1[i] == *obj._clan1[j] && *_clan2[i] == *obj._clan2[j]){ delete _clan1[i]; delete _clan2[i]; for (int z = i; z < (*_trenutnoClanova) - 1; z++){ _clan1[z] = new T1(*_clan1[z + 1]); _clan2[z] = new T2(*_clan2[z + 1]); delete _clan1[z + 1]; delete _clan2[z + 1]; } } (*_trenutnoClanova)--; } } } void Info(){ cout << "Trenutno elemenata: " << *_trenutnoClanova << endl; for (int i = 0; i < *_trenutnoClanova; i++){ cout << *_clan1[i] << " " << *_clan2[i] << endl; } } int GetTrenutnoElemenata(){ return *_trenutnoClanova; } T1 GetClan1(int poz){ return *_clan1[poz]; } T2 GetClan2(int poz){ return *_clan2[poz]; } friend ostream &operator<<<>(ostream &ispis, Kolekcija<T1, T2, max> &obj); }; template<class T1, class T2, int max> ostream &operator<<(ostream &ispis, Kolekcija<T1, T2, max> &obj){ ispis << "Trenutno elemenata: " << *obj._trenutnoClanova << endl; for (int i = 0; i < *obj._trenutnoClanova; i++){ ispis << *obj._clan1[i] << " " << *obj._clan2[i] << endl; } return ispis; } class Osoba{ protected: char * _imePrezime; public: Osoba(char *imePrezime="----"){ int duzina = strlen(imePrezime) + 1; _imePrezime = new char[duzina]; strcpy_s(_imePrezime, duzina, imePrezime); } Osoba(const Osoba &obj){ int duzina = strlen(obj._imePrezime) + 1; _imePrezime = new char[duzina]; strcpy_s(_imePrezime, duzina, obj._imePrezime); } virtual ~Osoba(){ delete[] _imePrezime; _imePrezime = nullptr; } void operator=(const Osoba &obj){ int duzina = strlen(obj._imePrezime) + 1; _imePrezime = new char[duzina]; strcpy_s(_imePrezime, duzina, obj._imePrezime); } bool operator==(Osoba &obj){ return(strcmp(_imePrezime, obj._imePrezime) == NULL); } virtual void Info(){ cout << "Ime i prezime: " << _imePrezime << endl; } // Get funkcije char *GetImePrezime(){ return _imePrezime; } // Set funkcije void SetImePrezime(char *imePrezime){ delete[] _imePrezime; _imePrezime = nullptr; int duzina = strlen(imePrezime) + 1; _imePrezime = new char[duzina]; strcpy_s(_imePrezime, duzina, imePrezime); } //1. Potrebne konstruktor i destruktor funkcije //2. Deklarisati kao apstraktnu klasu }; class Predmet{ private: char * _naziv; char * _profesor; public: //1. Potrebne konstruktor/destruktor funkcije Predmet(char *naziv="----", char *profesor="----"){ int duzina = strlen(naziv) + 1; _naziv = new char[duzina]; strcpy_s(_naziv, duzina, naziv); duzina = strlen(profesor) + 1; _profesor = new char[duzina]; strcpy_s(_profesor, duzina, profesor); } Predmet(const Predmet &obj){ int duzina = strlen(obj._naziv) + 1; _naziv = new char[duzina]; strcpy_s(_naziv, duzina, obj._naziv); duzina = strlen(obj._profesor) + 1; _profesor = new char[duzina]; strcpy_s(_profesor, duzina, obj._profesor); } ~Predmet(){ delete[] _naziv; _naziv = nullptr; delete[] _profesor; _profesor = nullptr; } void operator=(const Predmet &obj){ delete[] _naziv; _naziv = nullptr; delete[] _profesor; _profesor = nullptr; int duzina = strlen(obj._naziv) + 1; _naziv = new char[duzina]; strcpy_s(_naziv, duzina, obj._naziv); duzina = strlen(obj._profesor) + 1; _profesor = new char[duzina]; strcpy_s(_profesor, duzina, obj._profesor); } bool operator==(Predmet &obj){ return(strcmp(_naziv, obj._naziv) == NULL); } // Get funkcije char *GetNaziv(){ return _naziv; } char *GetProfesor(){ return _profesor; } // Set funkcije void SetNaziv(char *naziv){ delete[] _naziv; _naziv = nullptr; int duzina = strlen(naziv) + 1; _naziv = new char[duzina]; strcpy_s(_naziv, duzina, naziv); } void SetProfesor(char *profesor){ delete[] _profesor; _profesor = nullptr; int duzina = strlen(profesor) + 1; _profesor = new char[duzina]; strcpy_s(_profesor, duzina, profesor); } void Info(){ cout << "Naziv predmeta: " << _naziv << endl; cout << "Profesor: " << _profesor << endl; } friend ostream &operator<<(ostream &ispis, Predmet &obj); }; ostream &operator<<(ostream &ispis, Predmet &obj){ ispis << "Naziv predmeta: " << obj._naziv << endl; ispis << "Profesor: " << obj._profesor << endl; return ispis; } class Student :public Osoba{ private: static int _brojacIndeksa; const int _brojIndeksa; Kolekcija<Predmet, int, 50> _polozeniPredmeti; vector<char *> _seminarski; //naslovi seminarskih radova public: //1. Potrebne konstruktor/destruktor funkcije Student(char *imePrezime = "----") :_brojIndeksa(_brojacIndeksa++), Osoba(imePrezime){ } Student(const Student &obj) :_brojIndeksa(obj._brojIndeksa), Osoba(obj){ _polozeniPredmeti = obj._polozeniPredmeti; _seminarski = obj._seminarski; } void operator=(const Student &obj){ Osoba::operator=(obj); _polozeniPredmeti = obj._polozeniPredmeti; _seminarski = obj._seminarski; // operatorom dodjele nije moguce promijeniti broj indeksa jer je const } //2. DodajPolozeniPredmet :: omogucava dodavanje novopolozenog predmeta.Onemoguciti dodavanje dva //istoimena predmeta bool DodajPolozeniPredmet(Predmet &obj, int ocjena){ for (int i = 0; i < _polozeniPredmeti.GetTrenutnoElemenata(); i++){ if (_polozeniPredmeti.GetClan1(i) == obj){ throw GreskaUProgramu("Iste polozene predmete nije moguce dodati!", __LINE__); } } _polozeniPredmeti.AddElement(obj, ocjena); cout << "Uspjesno ste evidentirali polozene predmete!" << endl; return true; } //3. UkloniPolozeniPredmet :: na osnovu naziva, uklanja predmet iz liste polozenih predmeta bool UkloniPolozeniPredmet(char *naziv){ for (int i = 0; i < _polozeniPredmeti.GetTrenutnoElemenata(); i++){ if (strcmp(_polozeniPredmeti.GetClan1(i).GetNaziv(), naziv) == NULL){ _polozeniPredmeti.RemoveElement(i); cout << "Uspjesno ste uklonili polozeni predmet!" << endl; return true; } } } //4. DodajSeminarski :: omogucava dodavanje podataka o seminarskom radu. Onemoguciti dodavanja //dva istoimena seminarska rada. U zavisnosti od uspjesnosti obavljene operacije funkcija vraca //true/false. Koristiti iteratore. bool DodajSeminarski(char *seminarski){ vector<char *>::iterator it; for (it = _seminarski.begin(); it != _seminarski.end(); it++){ if (*it == seminarski){ throw GreskaUProgramu("Seminarski rad je vec evidentiran!", __LINE__); } } _seminarski.push_back(seminarski); cout << "Uspjesnos ste evidentirali seminarski rad!" << endl; return true; } //5. UkloniSeminarski :: uklanja podatke o seminarskom radu. U zavisnosti od uspjesnosti //obavljene operacije funkcija vraca true/false. Koristiti iteratore. bool UkloniSeminarski(char *seminarski){ vector<char *>::iterator it; for (it = _seminarski.begin(); it != _seminarski.end(); it++){ if (*it == seminarski){ _seminarski.erase(it); cout << "Uspjesno ste uklonili seminarski rad!" << endl; return true; } } } void Info(){ cout << "Ime i prezime: " << _imePrezime << endl; cout << "\n============== POLOZENI PREDMETI ==============\n"; for (int i = 0; i < _polozeniPredmeti.GetTrenutnoElemenata(); i++){ cout << "Predmet: " << _polozeniPredmeti.GetClan1(i) << endl; cout << "Ocjena: " << _polozeniPredmeti.GetClan2(i) << endl; } cout << "\n============== SEMINARSKI RADOVI ==============\n"; vector<char *>::iterator it; for (it = _seminarski.begin(); it != _seminarski.end(); it++){ cout << *it << endl; } } //6. operator << :: ispisuje sve dostupne podatke o studentu friend ostream &operator<<(ostream &ispis, Student &obj); // Get funkcije int GetBroIndeksa(){ return _brojIndeksa; } Predmet GetPolozenPredmet(int poz){ if (poz > _polozeniPredmeti.GetTrenutnoElemenata()){ throw GreskaUProgramu("Pozicija je veca u odnosu na trenutni broj polozenih predmeta!", __LINE__); } else{ return _polozeniPredmeti.GetClan1(poz); } } char *GetSeminarskiRad(int poz){ return _seminarski.at(poz); } }; ostream &operator<<(ostream &ispis, Student &obj){ ispis << "Ime i prezime: " << obj._imePrezime << endl; ispis << "\n============== POLOZENI PREDMETI ==============\n"; for (int i = 0; i < obj._polozeniPredmeti.GetTrenutnoElemenata(); i++){ ispis << "Predmet: " << obj._polozeniPredmeti.GetClan1(i) << endl; ispis << "Ocjena: " << obj._polozeniPredmeti.GetClan2(i) << endl; } ispis << "\n============== SEMINARSKI RADOVI ==============\n"; vector<char *>::iterator it; for (it = obj._seminarski.begin(); it != obj._seminarski.end(); it++){ ispis << *it << endl; } return ispis; } int Student::_brojacIndeksa = 140000; char *crt = "\n--------------------------------------------------\n"; void main() { try{ //REGIONI olaksavaju organizaciju programskog code-a, te ih mozete ukloniti ukoliko vam otezavaju preglednost #pragma region TestiranjeKolekcije Kolekcija<int, double, 100> kolekcija1; kolekcija1.AddElement(1, 5); kolekcija1.AddElement(2, 6); kolekcija1.AddElement(3, 7); Kolekcija<int, double, 100> kolekcija2; kolekcija2.AddElement(1, 5); kolekcija2.AddElement(2, 6); kolekcija2.AddElement(3, 7); kolekcija1.operator-=(kolekcija2);//UMANJITI VELIČINU NIZA cout << kolekcija1 << crt; #pragma endregion #pragma region TestiranjePredmeta Predmet programiranje("PROGRAMIRANJE III", "Denis Music"); Predmet engleskijezik("ENGLESKI JEZIK II", "Edina Cumurija-Spago"); Predmet predmet; predmet = engleskijezik; cout << programiranje << endl; cout << engleskijezik << endl; cout << predmet << endl; #pragma endregion #pragma region TestiranjeOsobaStudent Osoba *osobe[5]; osobe[0] = new Osoba("Sejdalija Agic"); osobe[1] = new Osoba("Sejdalija Agicc"); osobe[2] = new Student("Sejdalija Agic"); Student student(*dynamic_cast<Student *>(osobe[2])); student.DodajPolozeniPredmet(programiranje, 9); student.DodajPolozeniPredmet(engleskijezik, 9); student.DodajSeminarski("Baze podataka I"); student.DodajSeminarski("Komunikacijske tehnologije"); student.UkloniPolozeniPredmet("PROGRAMIRANJE III"); student.UkloniPolozeniPredmet("ENGLESKI JEZIK II"); student.UkloniSeminarski("Baze podataka I"); student.UkloniSeminarski("Komunikacijske tehnologije"); cout << student << endl; #pragma endregion } catch (GreskaUProgramu obj){ obj.ErrorInfo(); } system("pause>0"); }

Be the first to comment

You can use [html][/html], [css][/css], [php][/php] and more to embed the code. Urls are automatically hyperlinked. Line breaks and paragraphs are automatically generated.