rijads

PR2_23.1.2010_rjesen

Sep 14th, 2014
335
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.70 KB | None | 0 0
  1. /*POSTAVKA
  2. template<class T1, class T2>
  3. class Kolekcija{
  4. T1 _clan1[20];
  5. T2 _clan2[20];
  6. int _trenutnoClanova;
  7. public:
  8. //1. Potrebne konstruktor/destruktor funkcije
  9. //2. AddElement :: omogucava dodavanje novih elementa u kolekciju (u clan1 i clan2)
  10. //3. RemoveElement :: uklanja element na zahtijevanoj lokaciji.Prilikom uklanjanja elementa
  11. //izvrsiti potrebnu dealokaciju, te onemoguciti pojavljivanje neinicijaliziranih elemenata niza.
  12. //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
  13. //5. operator << :: ispisuje vrijednosti svih clanova klase
  14. };
  15. class Osoba{
  16. protected:
  17. char * _imePrezime;
  18. public:
  19. //1. Potrebne konstruktor i destruktor funkcije
  20. //2. Deklarisati kao apstraktnu klasu
  21. };
  22. class Predmet{
  23. char * _naziv;
  24. char * _profesor;
  25. public:
  26. //1. Potrebne konstruktor/destruktor funkcije
  27. //2. operator << :: ispisuje vrijednosti svih atributa klase
  28. };
  29. class Student{
  30. const int _brojIndeksa;
  31. Kolekcija<Predmet *,int> _polozeni;
  32. vector<string> _seminarski; //naslovi seminarskih radova
  33. public:
  34. //1. Potrebne konstruktor/destruktor funkcije
  35. //2. DodajPolozeniPredmet :: omogucava dodavanje novopolozenog predmeta
  36. //3. DodajSeminarski :: omogucava dodavanje podataka o seminarskom radu. Onemoguciti dodavanja //dva istoimena seminarska rada. U zavisnosti od uspjesnosti obavljene operacije funkcija vraca //true/false
  37. //4. UkloniSeminarski :: uklanja podatke o seminarskom radu. U zavisnosti od uspjesnosti //obavljene operacije funkcija vraca true/false
  38. };
  39. void main(){
  40. //u dinamickoj memoriji kreirati dva objekta tipa student
  41. //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti
  42. //ukratko pojasniti i demonstrirati koncepciju polimorfizma
  43. }*/
  44. /*RJESENJE by rijads*/
  45. #include<iostream>
  46. #include<string>
  47. #include<vector>
  48.  
  49. using namespace std;
  50. int bi = 0;//za uvecavanje broja indeksa svakog studenta
  51. template<class T1, class T2>
  52. class Kolekcija{
  53.     T1 _clan1[20];
  54.     T2 _clan2[20];
  55.     int _trenutnoClanova;
  56. public:
  57.     //1. Potrebne konstruktor/destruktor funkcije
  58.     Kolekcija(){
  59.         _trenutnoClanova = 0;
  60.     }
  61.     Kolekcija(Kolekcija<T1, T2>& obj){
  62.         _trenutnoClanova = obj._trenutnoClanova;
  63.         for (int i = 0; i < obj._trenutnoClanova; i++){
  64.             _clan1[i] = obj._clan1[i];
  65.             _clan2[i] = obj._clan2[i];
  66.         }
  67.     }
  68.     //Ne treba destruktor jer ne kreiramo nista u dinamickoj memoriji
  69.  
  70.     //2. AddElement :: omogucava dodavanje novih elementa u kolekciju (u clan1 i clan2)
  71.     void AddElement(T1& el1, T2& el2){
  72.         _clan1[_trenutnoClanova] = el1;
  73.         _clan2[_trenutnoClanova] = el2;
  74.         _trenutnoClanova++;
  75.     }
  76.     //3. RemoveElement :: uklanja element na zahtijevanoj lokaciji.Prilikom uklanjanja elementa
  77.     //izvrsiti potrebnu dealokaciju, te onemoguciti pojavljivanje neinicijaliziranih elemenata niza.
  78.     void RemoveElement(int lok){
  79.         if (lok < _trenutnoClanova){//provjerava da li lokacija postoji
  80.             for (int i = lok; i < _trenutnoClanova-1; i++){
  81.                 _clan1[i] = _clan1[i + 1];
  82.                 _clan2[i] = _clan2[i + 1];
  83.             }
  84.             _trenutnoClanova--;//onemogucava pojavljivanje neinicijaliziranih elemenata niza.
  85.         }
  86.     }
  87.     //4. operator += :: na postojece elemente kolekcije (clanovi 1 i 2) dodati elemente druge
  88.     //kolekcije (koja je primljena kao parametar). Tom prilikom voditi racuna o maksimalnom i
  89.     //trenutnom broju clanova
  90.     Kolekcija<T1, T2>& operator+=(Kolekcija<T1, T2>&obj){
  91.         int brojac = 0;
  92.         int pocetak = _trenutnoClanova;
  93.         int ukupno = _trenutnoClanova + obj._trenutnoClanova;
  94.         if (ukupno < 20){//Provjerava da ne prelazi maklsimalni broj, u slucaju da prelazi nista se ne dodaje
  95.             for (int i = pocetak; i < ukupno; i++){
  96.                 _clan1[i] = obj._clan1[brojac];
  97.                 _clan2[i] = obj._clan2[brojac];
  98.                 brojac++;
  99.                 _trenutnoClanova++;
  100.             }
  101.         }
  102.         return *this;
  103.     }
  104.     //5. operator << :: ispisuje vrijednosti svih clanova klase
  105.     friend ostream& operator<< <> (ostream&, Kolekcija<T1, T2>&);
  106.  
  107.     Kolekcija<T1, T2>& operator=(Kolekcija<T1, T2>& obj){
  108.         _trenutnoClanova = obj._trenutnoClanova;
  109.         for (int i = 0; i < _trenutnoClanova; i++){
  110.             _clan1[i] = obj._clan1[1];
  111.             _clan2[i] = obj._clan2[i];
  112.         }
  113.         return *this;
  114.     }
  115. };
  116. template<class T1, class T2>
  117. ostream& operator<< <> (ostream& out, Kolekcija<T1, T2>& obj){
  118.     for (int i = 0; i < obj._trenutnoClanova; i++){
  119.         out << *(obj._clan1[i]) << ", Ocjena: " << obj._clan2[i] << endl;
  120.     }
  121.     return out;
  122. }
  123. class Osoba{
  124. protected:
  125.     char * _imePrezime;
  126. public:
  127.     //1. Potrebne konstruktor i destruktor funkcije
  128.     Osoba(char* ime = "Nepoznato"){
  129.         _imePrezime = new char[strlen(ime) + 1];
  130.         strcpy_s(_imePrezime, strlen(ime) + 1, ime);
  131.     }
  132.     Osoba(Osoba& obj){
  133.         if (this != &obj){
  134.             _imePrezime = new char[strlen(obj._imePrezime) + 1];
  135.             strcpy_s(_imePrezime, strlen(obj._imePrezime) + 1, obj._imePrezime);
  136.         }
  137.     }
  138.     ~Osoba(){
  139.         delete[] _imePrezime;
  140.         _imePrezime = NULL;
  141.     }
  142.     //2. Deklarisati kao apstraktnu klasu
  143.     virtual void info() = 0;
  144. };
  145. class Predmet{
  146. protected:
  147.     char * _naziv;
  148.     char * _profesor;
  149. public:
  150.     //1. Potrebne konstruktor/destruktor funkcije
  151.     Predmet(char* naziv="Nepoznat naziv",char* profesor="Nepoznat profesor"){
  152.         _naziv = new char[strlen(naziv) + 1];
  153.         strcpy_s(_naziv, strlen(naziv) + 1, naziv);
  154.         _profesor = new char[strlen(profesor) + 1];
  155.         strcpy_s(_profesor, strlen(profesor) + 1, profesor);
  156.     }
  157.     Predmet(Predmet& obj){
  158.         if (this != &obj){
  159.             _naziv = new char[strlen(obj._naziv) + 1];
  160.             strcpy_s(_naziv, strlen(obj._naziv) + 1, obj._naziv);
  161.             _profesor = new char[strlen(obj._profesor) + 1];
  162.             strcpy_s(_profesor, strlen(obj._profesor) + 1, obj._profesor);
  163.         }
  164.     }
  165.     ~Predmet(){
  166.         delete[]_naziv;
  167.         _naziv = NULL;
  168.         delete[]_profesor;
  169.         _profesor = NULL;
  170.     }
  171.     //2. operator << :: ispisuje vrijednosti svih atributa klase
  172.     friend ostream &operator<<(ostream&, Predmet&);
  173.     Predmet& operator=(Predmet& obj){
  174.         delete[]_naziv;
  175.         _naziv = new char[strlen(obj._naziv) + 1];
  176.         strcpy_s(_naziv, strlen(obj._naziv) + 1, obj._naziv);
  177.         delete[]_profesor;
  178.         _profesor = new char[strlen(obj._profesor) + 1];
  179.         strcpy_s(_profesor, strlen(obj._profesor) + 1, obj._profesor);
  180.     }
  181. };
  182. ostream &operator<<(ostream&out, Predmet& obj){
  183.     out << "Naziv predmeta: " << obj._naziv << endl << "Profesor: " << obj._profesor;
  184.     return out;
  185. }
  186. class Student:public Osoba{
  187. protected:
  188.     const int _brojIndeksa;
  189.     Kolekcija<Predmet *, int> _polozeni;
  190.     vector<string> _seminarski; //naslovi seminarskih radova
  191. public:
  192.     //1. Potrebne konstruktor/destruktor funkcije
  193.     Student(char *ime ="Nepoznato") :_brojIndeksa(++bi),Osoba(ime){
  194.     }
  195.     Student(Student& obj):_brojIndeksa(obj._brojIndeksa){
  196.         _polozeni = obj._polozeni;
  197.         _seminarski = obj._seminarski;
  198.     }
  199.     //Ne treba destruktor jer nema dinamicki alociranih elemenata.
  200.  
  201.     //2. DodajPolozeniPredmet :: omogucava dodavanje novopolozenog predmeta
  202.     void DodajPolozeniPredmet(Predmet* pr, int o){
  203.         _polozeni.AddElement(pr, o);
  204.     }
  205.     //3. DodajSeminarski :: omogucava dodavanje podataka o seminarskom radu. Onemoguciti dodavanja
  206.     //dva istoimena seminarska rada. U zavisnosti od uspjesnosti obavljene operacije funkcija vraca
  207.     //true/false
  208.     bool DodajSeminarski(string sem){
  209.         for (vector<string>::iterator it = _seminarski.begin(); it != _seminarski.end(); it++){//Onemogucava dodavanje 2 istoimena seminarska rada
  210.             if (sem.compare(*it) == NULL)
  211.                 return false;
  212.         }
  213.         _seminarski.push_back(sem);
  214.         return true;
  215.     }
  216.  
  217.     //4. UkloniSeminarski :: uklanja podatke o seminarskom radu. U zavisnosti od uspjesnosti
  218.     //obavljene operacije funkcija vraca true/false
  219.     bool UkloniSeminarski(string sem){
  220.         for (vector<string>::iterator it = _seminarski.begin(); it != _seminarski.end(); it++){//Onemogucava dodavanje 2 istoimena seminarska rada
  221.             if (sem.compare(*it) == NULL){
  222.                 _seminarski.erase(it);//Brise seminarski na lokaciji gdje je pronadjen prosljedjeni
  223.                 return true;
  224.             }
  225.         }
  226.         return false;
  227.     }
  228.     void info(){//Mora imati istu funkciju kao apstraktna klasa
  229.  
  230.     }
  231.     friend ostream& operator<<(ostream&, Student&);
  232. };
  233. ostream& operator<<(ostream& out, Student& obj){
  234.     out << "Ime i prezime studenta: " << obj._imePrezime<<endl;
  235.     out << "Broj indeksa: " << obj._brojIndeksa << endl;
  236.     out << "Polozeni predmeti: " <<endl<< obj._polozeni << endl;
  237.     out << "Seminarski: " << endl;
  238.     for (vector<string>::iterator it = obj._seminarski.begin(); it != obj._seminarski.end(); it++){
  239.         out << *it << ", ";
  240.     }
  241.     out << endl;
  242.     return out;
  243. }
  244. void main(){
  245.     Predmet *pr1 = new Predmet();
  246.     Predmet *pr2=new Predmet("Astronomija", "Nenad Cubic");
  247.     cout << "Testiranje kolekcije:" << endl;
  248.     Kolekcija<Predmet*, int> kol1;
  249.     Kolekcija<Predmet*, int> kol2;
  250.     int oc1 = 6;
  251.     int oc2 = 8;
  252.     kol1.AddElement(pr1, oc1);
  253.     kol2.AddElement(pr1, oc2);
  254.     kol2.AddElement(pr2, oc2);
  255.     kol2.AddElement(pr2, oc1);
  256.     kol1 += kol2;
  257.     kol1.RemoveElement(2);
  258.     cout << kol1;
  259.     cout <<endl<< "Glavno testiranje: " << endl;
  260.     //u dinamickoj memoriji kreirati dva objekta tipa student
  261.     //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti
  262.     //ukratko pojasniti i demonstrirati koncepciju polimorfizma
  263.     Student* st1 = new Student();
  264.     Student* st2 = new Student("Mike Smith");   //Kreirajuci klasu student, pozivamo konstruktor klase osoba i koristimo njene protected clanove u operatoru <<
  265.     st2->DodajPolozeniPredmet(pr1, 7);          //pri cemu ispisujemo ime studenta koje se ne nalazi u klasi Student vec u klasi Osoba
  266.     st2->DodajPolozeniPredmet(pr2, 10);
  267.     st2->DodajSeminarski("Nebuloze 1");
  268.     st2->DodajSeminarski("Nebuloze 2");
  269.     st2->DodajSeminarski("Nebuloze 1");
  270.     st2->DodajSeminarski("Nebuloze 3");
  271.     st2->UkloniSeminarski("Nebuloze 3");
  272.     cout << *st1 << endl;
  273.     cout << *st2;
  274.     delete pr1;pr1 = NULL;
  275.     delete pr2;pr2 = NULL;
  276.     delete st1;st1 = NULL;
  277.     delete st2;st2 = NULL;
  278.     system("pause>0");
  279. }
Advertisement
Add Comment
Please, Sign In to add comment