Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*POSTAVKA
- template<class T1, class T2>
- class Kolekcija{
- T1 _clan1[20];
- T2 _clan2[20];
- int _trenutnoClanova;
- public:
- //1. Potrebne konstruktor/destruktor funkcije
- //2. AddElement :: omogucava dodavanje novih elementa u kolekciju (u clan1 i clan2)
- //3. RemoveElement :: uklanja element na zahtijevanoj lokaciji.Prilikom uklanjanja elementa
- //izvrsiti potrebnu dealokaciju, te onemoguciti pojavljivanje neinicijaliziranih elemenata niza.
- //4. operator += :: na postojece elemente kolekcije (clanovi 1 i 2) dodati elemente druge //kolekcije (koja je primljena kao parametar). Tom prilikom voditi racuna o maksimalnom i //trenutnom broju clanova
- //5. operator << :: ispisuje vrijednosti svih clanova klase
- };
- class Osoba{
- protected:
- char * _imePrezime;
- public:
- //1. Potrebne konstruktor i destruktor funkcije
- //2. Deklarisati kao apstraktnu klasu
- };
- class Predmet{
- char * _naziv;
- char * _profesor;
- public:
- //1. Potrebne konstruktor/destruktor funkcije
- //2. operator << :: ispisuje vrijednosti svih atributa klase
- };
- class Student{
- const int _brojIndeksa;
- Kolekcija<Predmet *,int> _polozeni;
- vector<string> _seminarski; //naslovi seminarskih radova
- public:
- //1. Potrebne konstruktor/destruktor funkcije
- //2. DodajPolozeniPredmet :: omogucava dodavanje novopolozenog predmeta
- //3. DodajSeminarski :: omogucava dodavanje podataka o seminarskom radu. Onemoguciti dodavanja //dva istoimena seminarska rada. U zavisnosti od uspjesnosti obavljene operacije funkcija vraca //true/false
- //4. UkloniSeminarski :: uklanja podatke o seminarskom radu. U zavisnosti od uspjesnosti //obavljene operacije funkcija vraca true/false
- };
- void main(){
- //u dinamickoj memoriji kreirati dva objekta tipa student
- //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti
- //ukratko pojasniti i demonstrirati koncepciju polimorfizma
- }*/
- /*RJESENJE by rijads*/
- #include<iostream>
- #include<string>
- #include<vector>
- using namespace std;
- int bi = 0;//za uvecavanje broja indeksa svakog studenta
- template<class T1, class T2>
- class Kolekcija{
- T1 _clan1[20];
- T2 _clan2[20];
- int _trenutnoClanova;
- public:
- //1. Potrebne konstruktor/destruktor funkcije
- Kolekcija(){
- _trenutnoClanova = 0;
- }
- Kolekcija(Kolekcija<T1, T2>& obj){
- _trenutnoClanova = obj._trenutnoClanova;
- for (int i = 0; i < obj._trenutnoClanova; i++){
- _clan1[i] = obj._clan1[i];
- _clan2[i] = obj._clan2[i];
- }
- }
- //Ne treba destruktor jer ne kreiramo nista u dinamickoj memoriji
- //2. AddElement :: omogucava dodavanje novih elementa u kolekciju (u clan1 i clan2)
- void AddElement(T1& el1, T2& el2){
- _clan1[_trenutnoClanova] = el1;
- _clan2[_trenutnoClanova] = el2;
- _trenutnoClanova++;
- }
- //3. RemoveElement :: uklanja element na zahtijevanoj lokaciji.Prilikom uklanjanja elementa
- //izvrsiti potrebnu dealokaciju, te onemoguciti pojavljivanje neinicijaliziranih elemenata niza.
- void RemoveElement(int lok){
- if (lok < _trenutnoClanova){//provjerava da li lokacija postoji
- for (int i = lok; i < _trenutnoClanova-1; i++){
- _clan1[i] = _clan1[i + 1];
- _clan2[i] = _clan2[i + 1];
- }
- _trenutnoClanova--;//onemogucava pojavljivanje neinicijaliziranih elemenata niza.
- }
- }
- //4. operator += :: na postojece elemente kolekcije (clanovi 1 i 2) dodati elemente druge
- //kolekcije (koja je primljena kao parametar). Tom prilikom voditi racuna o maksimalnom i
- //trenutnom broju clanova
- Kolekcija<T1, T2>& operator+=(Kolekcija<T1, T2>&obj){
- int brojac = 0;
- int pocetak = _trenutnoClanova;
- int ukupno = _trenutnoClanova + obj._trenutnoClanova;
- if (ukupno < 20){//Provjerava da ne prelazi maklsimalni broj, u slucaju da prelazi nista se ne dodaje
- for (int i = pocetak; i < ukupno; i++){
- _clan1[i] = obj._clan1[brojac];
- _clan2[i] = obj._clan2[brojac];
- brojac++;
- _trenutnoClanova++;
- }
- }
- return *this;
- }
- //5. operator << :: ispisuje vrijednosti svih clanova klase
- friend ostream& operator<< <> (ostream&, Kolekcija<T1, T2>&);
- Kolekcija<T1, T2>& operator=(Kolekcija<T1, T2>& obj){
- _trenutnoClanova = obj._trenutnoClanova;
- for (int i = 0; i < _trenutnoClanova; i++){
- _clan1[i] = obj._clan1[1];
- _clan2[i] = obj._clan2[i];
- }
- return *this;
- }
- };
- template<class T1, class T2>
- ostream& operator<< <> (ostream& out, Kolekcija<T1, T2>& obj){
- for (int i = 0; i < obj._trenutnoClanova; i++){
- out << *(obj._clan1[i]) << ", Ocjena: " << obj._clan2[i] << endl;
- }
- return out;
- }
- class Osoba{
- protected:
- char * _imePrezime;
- public:
- //1. Potrebne konstruktor i destruktor funkcije
- Osoba(char* ime = "Nepoznato"){
- _imePrezime = new char[strlen(ime) + 1];
- strcpy_s(_imePrezime, strlen(ime) + 1, ime);
- }
- Osoba(Osoba& obj){
- if (this != &obj){
- _imePrezime = new char[strlen(obj._imePrezime) + 1];
- strcpy_s(_imePrezime, strlen(obj._imePrezime) + 1, obj._imePrezime);
- }
- }
- ~Osoba(){
- delete[] _imePrezime;
- _imePrezime = NULL;
- }
- //2. Deklarisati kao apstraktnu klasu
- virtual void info() = 0;
- };
- class Predmet{
- protected:
- char * _naziv;
- char * _profesor;
- public:
- //1. Potrebne konstruktor/destruktor funkcije
- Predmet(char* naziv="Nepoznat naziv",char* profesor="Nepoznat profesor"){
- _naziv = new char[strlen(naziv) + 1];
- strcpy_s(_naziv, strlen(naziv) + 1, naziv);
- _profesor = new char[strlen(profesor) + 1];
- strcpy_s(_profesor, strlen(profesor) + 1, profesor);
- }
- Predmet(Predmet& obj){
- if (this != &obj){
- _naziv = new char[strlen(obj._naziv) + 1];
- strcpy_s(_naziv, strlen(obj._naziv) + 1, obj._naziv);
- _profesor = new char[strlen(obj._profesor) + 1];
- strcpy_s(_profesor, strlen(obj._profesor) + 1, obj._profesor);
- }
- }
- ~Predmet(){
- delete[]_naziv;
- _naziv = NULL;
- delete[]_profesor;
- _profesor = NULL;
- }
- //2. operator << :: ispisuje vrijednosti svih atributa klase
- friend ostream &operator<<(ostream&, Predmet&);
- Predmet& operator=(Predmet& obj){
- delete[]_naziv;
- _naziv = new char[strlen(obj._naziv) + 1];
- strcpy_s(_naziv, strlen(obj._naziv) + 1, obj._naziv);
- delete[]_profesor;
- _profesor = new char[strlen(obj._profesor) + 1];
- strcpy_s(_profesor, strlen(obj._profesor) + 1, obj._profesor);
- }
- };
- ostream &operator<<(ostream&out, Predmet& obj){
- out << "Naziv predmeta: " << obj._naziv << endl << "Profesor: " << obj._profesor;
- return out;
- }
- class Student:public Osoba{
- protected:
- const int _brojIndeksa;
- Kolekcija<Predmet *, int> _polozeni;
- vector<string> _seminarski; //naslovi seminarskih radova
- public:
- //1. Potrebne konstruktor/destruktor funkcije
- Student(char *ime ="Nepoznato") :_brojIndeksa(++bi),Osoba(ime){
- }
- Student(Student& obj):_brojIndeksa(obj._brojIndeksa){
- _polozeni = obj._polozeni;
- _seminarski = obj._seminarski;
- }
- //Ne treba destruktor jer nema dinamicki alociranih elemenata.
- //2. DodajPolozeniPredmet :: omogucava dodavanje novopolozenog predmeta
- void DodajPolozeniPredmet(Predmet* pr, int o){
- _polozeni.AddElement(pr, o);
- }
- //3. DodajSeminarski :: omogucava dodavanje podataka o seminarskom radu. Onemoguciti dodavanja
- //dva istoimena seminarska rada. U zavisnosti od uspjesnosti obavljene operacije funkcija vraca
- //true/false
- bool DodajSeminarski(string sem){
- for (vector<string>::iterator it = _seminarski.begin(); it != _seminarski.end(); it++){//Onemogucava dodavanje 2 istoimena seminarska rada
- if (sem.compare(*it) == NULL)
- return false;
- }
- _seminarski.push_back(sem);
- return true;
- }
- //4. UkloniSeminarski :: uklanja podatke o seminarskom radu. U zavisnosti od uspjesnosti
- //obavljene operacije funkcija vraca true/false
- bool UkloniSeminarski(string sem){
- for (vector<string>::iterator it = _seminarski.begin(); it != _seminarski.end(); it++){//Onemogucava dodavanje 2 istoimena seminarska rada
- if (sem.compare(*it) == NULL){
- _seminarski.erase(it);//Brise seminarski na lokaciji gdje je pronadjen prosljedjeni
- return true;
- }
- }
- return false;
- }
- void info(){//Mora imati istu funkciju kao apstraktna klasa
- }
- friend ostream& operator<<(ostream&, Student&);
- };
- ostream& operator<<(ostream& out, Student& obj){
- out << "Ime i prezime studenta: " << obj._imePrezime<<endl;
- out << "Broj indeksa: " << obj._brojIndeksa << endl;
- out << "Polozeni predmeti: " <<endl<< obj._polozeni << endl;
- out << "Seminarski: " << endl;
- for (vector<string>::iterator it = obj._seminarski.begin(); it != obj._seminarski.end(); it++){
- out << *it << ", ";
- }
- out << endl;
- return out;
- }
- void main(){
- Predmet *pr1 = new Predmet();
- Predmet *pr2=new Predmet("Astronomija", "Nenad Cubic");
- cout << "Testiranje kolekcije:" << endl;
- Kolekcija<Predmet*, int> kol1;
- Kolekcija<Predmet*, int> kol2;
- int oc1 = 6;
- int oc2 = 8;
- kol1.AddElement(pr1, oc1);
- kol2.AddElement(pr1, oc2);
- kol2.AddElement(pr2, oc2);
- kol2.AddElement(pr2, oc1);
- kol1 += kol2;
- kol1.RemoveElement(2);
- cout << kol1;
- cout <<endl<< "Glavno testiranje: " << endl;
- //u dinamickoj memoriji kreirati dva objekta tipa student
- //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti
- //ukratko pojasniti i demonstrirati koncepciju polimorfizma
- Student* st1 = new Student();
- Student* st2 = new Student("Mike Smith"); //Kreirajuci klasu student, pozivamo konstruktor klase osoba i koristimo njene protected clanove u operatoru <<
- st2->DodajPolozeniPredmet(pr1, 7); //pri cemu ispisujemo ime studenta koje se ne nalazi u klasi Student vec u klasi Osoba
- st2->DodajPolozeniPredmet(pr2, 10);
- st2->DodajSeminarski("Nebuloze 1");
- st2->DodajSeminarski("Nebuloze 2");
- st2->DodajSeminarski("Nebuloze 1");
- st2->DodajSeminarski("Nebuloze 3");
- st2->UkloniSeminarski("Nebuloze 3");
- cout << *st1 << endl;
- cout << *st2;
- delete pr1;pr1 = NULL;
- delete pr2;pr2 = NULL;
- delete st1;st1 = NULL;
- delete st2;st2 = NULL;
- system("pause>0");
- }
Advertisement
Add Comment
Please, Sign In to add comment