#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.