Advertisement
Guest User

Untitled

a guest
Aug 18th, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.02 KB | None | 0 0
  1. /*
  2.     TP 16/17 (Tutorijal 13, Zadatak 3)
  3.     Autotestove pisala Ivona Ivkovic. Sva pitanja, sugestije, prijave gresaka
  4.     slati na mail iivkovic2@etf.unsa.ba
  5.    
  6.     Vrsit ce se provjera na prepisivanje tutorijala (na kraju semestra)
  7. */
  8. #include <iostream>
  9. #include <string>
  10. #include <stdexcept>
  11. #include <vector>
  12. #include <algorithm>
  13.  
  14. class ApstraktniStudent
  15. {
  16.     std::string ime,prezime;
  17.     int brindeksa,brpolozenih;
  18.     double prosjecna;
  19. public:
  20.     ApstraktniStudent(std::string ime,std::string prezime,int brindeksa): ime(ime),prezime(prezime),brindeksa(brindeksa),brpolozenih(0),prosjecna(5) {};
  21.     std::string DajIme() const {
  22.         return ime;
  23.     }
  24.     std::string DajPrezime() const {
  25.         return prezime;
  26.     }
  27.     int DajBrojIndeksa() const {
  28.         return brindeksa;
  29.     }
  30.     int DajBrojPolozenih() const {
  31.         return brpolozenih;
  32.     }
  33.     double DajProsjek() const {
  34.         return prosjecna;
  35.     }
  36.     void RegistrirajIspit(int oc) {
  37.         if(oc<5 || oc>10) throw std::domain_error("Neispravna ocjena");
  38.         if(oc!=5) {
  39.             prosjecna=(prosjecna*brpolozenih+oc)/(brpolozenih+1);
  40.             brpolozenih++;
  41.         }
  42.     }
  43.     void PonistiOcjene() {
  44.         brpolozenih=0;
  45.         prosjecna=5;
  46.     }
  47.     virtual void IspisiPodatke() const=0;
  48.     virtual ApstraktniStudent *DajKopiju() const=0;
  49.     virtual ~ApstraktniStudent() {};
  50. };
  51.  
  52. class StudentBachelor: public ApstraktniStudent
  53. {
  54. public:
  55.     StudentBachelor(std::string ime,std::string prezime,int brindeksa): ApstraktniStudent(ime,prezime,brindeksa) {};
  56.     void IspisiPodatke() const override {
  57.         std::cout<<"Student bachelor studija "<<DajIme()<<" "<<DajPrezime()<<", sa brojem indeksa "<<DajBrojIndeksa()<<","<<std::endl<<"ima prosjek "<<DajProsjek()<<"."<<std::endl;
  58.     }
  59.     ApstraktniStudent *DajKopiju() const override {
  60.         return new StudentBachelor(*this);
  61.     }
  62. //  ~StudentBachelor(){ delete this;}
  63. };
  64.  
  65. class StudentMaster: public ApstraktniStudent
  66. {
  67.     int godina;
  68. public:
  69.     StudentMaster(std::string ime,std::string prezime,int brindeksa,int godina): ApstraktniStudent(ime,prezime,brindeksa), godina(godina) {};
  70.     void IspisiPodatke() const override {
  71.         std::cout<<"Student master studija "<<DajIme()<<" "<<DajPrezime()<<", sa brojem indeksa "<<DajBrojIndeksa()<<","<<std::endl<<"zavrsio bachelor studij godine "<<godina<<",ima prosjek "<<DajProsjek()<<"."<<std::endl;
  72.     }
  73.     ApstraktniStudent *DajKopiju() const override {
  74.         return new StudentMaster(*this);
  75.     }
  76.     //~StudentMaster(){ delete this;}
  77. };
  78.  
  79. class Fakultet
  80. {
  81.     std::vector<ApstraktniStudent*> v;
  82. public:
  83.     explicit Fakultet() : v(0) {};
  84.     ~Fakultet();
  85.     Fakultet(const Fakultet &f);
  86.     Fakultet &operator=(const Fakultet &f);
  87.     Fakultet(Fakultet &&f);
  88.     Fakultet &operator=(Fakultet &&f);
  89.     void UpisiStudenta(std::string ime, std::string prezime,int brindeksa);
  90.     void UpisiStudenta(std::string ime, std::string prezime,int brindeksa, int godina);
  91.     void ObrisiStudenta(int indeks);
  92.     ApstraktniStudent &operator [](int brindeksa);
  93.     ApstraktniStudent const &operator [](int brindeksa) const;
  94.     void IspisiSveStudente() const;
  95.  
  96. };
  97.  
  98. void Fakultet::IspisiSveStudente() const
  99. {
  100.  
  101.     auto v(this->v);
  102.    
  103.         std::sort(v.begin(),v.end(),[](ApstraktniStudent*s1, ApstraktniStudent*s2){
  104.             if(s1->DajProsjek()==s2->DajProsjek()) return s1->DajBrojIndeksa()<s2->DajBrojIndeksa();
  105.             return s1->DajProsjek()>s2->DajProsjek();
  106.         });
  107.     for(auto x: v) x->IspisiPodatke();
  108.    
  109. }
  110.  
  111. ApstraktniStudent &Fakultet::operator [](int brindeksa) //->decltype(*(this->v[0]))
  112. {
  113.     bool ima(false);
  114.     for(int i(0); i<v.size(); i++) {
  115.         if(v[i]->DajBrojIndeksa()==brindeksa) {
  116.             ima=true;
  117.             return *v[i];
  118.         }
  119.     }
  120.     if(!ima) throw std::logic_error("Student sa zadanim brojem indeksa ne postoji");
  121.     return *v[0];
  122. }
  123.  
  124. ApstraktniStudent const &Fakultet::operator [](int brindeksa) const //->decltype(*(this->v[0]))
  125. {
  126.     bool ima(false);
  127.     for(int i(0); i<v.size(); i++) {
  128.         if(v[i]->DajBrojIndeksa()==brindeksa) {
  129.             ima=true;
  130.             return *v[i];
  131.         }
  132.     }
  133.     if(!ima) throw std::logic_error("Student sa zadanim brojem indeksa ne postoji");
  134.     return *v[0];
  135. }
  136.  
  137. void Fakultet:: UpisiStudenta(std::string ime, std::string prezime,int brindeksa)
  138. {
  139.     for(auto x : v) if(x->DajBrojIndeksa()==brindeksa) throw std::logic_error("Student sa zadanim brojem indeksa vec postoji");
  140.     v.push_back(new StudentBachelor(ime,prezime,brindeksa));
  141. }
  142.  
  143. void Fakultet::UpisiStudenta(std::string ime, std::string prezime,int brindeksa,int godina)
  144. {
  145.     for(auto x : v) if(x->DajBrojIndeksa()==brindeksa) throw std::logic_error("Student sa zadanim brojem indeksa vec postoji");
  146.     v.push_back(new StudentMaster(ime,prezime,brindeksa,godina));
  147. }
  148.  
  149. void Fakultet::ObrisiStudenta(int indeks)
  150. {
  151.     bool ima(false);
  152.     for(int i(0); i<v.size(); i++) {
  153.         if(v[i]->DajBrojIndeksa()==indeks) {
  154.             ima=true;
  155.             delete v[i];
  156.             v.erase(v.begin()+i);
  157.             break;
  158.         }
  159.     }
  160.     if(!ima) throw std::logic_error("Student sa zadanim brojem indeksa ne postoji");
  161. }
  162.  
  163. Fakultet::~Fakultet()
  164. {
  165.     for(int i(0);i<v.size();i++) delete v[i];
  166. }
  167.  
  168. Fakultet::Fakultet(const Fakultet &f)
  169. {
  170.     for(int i(0);i<v.size();i++) delete v[i];
  171.     v.resize(0);
  172.     try {
  173.         for(auto x: f.v) v.push_back(x->DajKopiju());
  174.     } catch(...) {
  175.         for(auto x: v) delete x;
  176.     }
  177. }
  178.  
  179. Fakultet &Fakultet::operator=(const Fakultet &f)
  180. {
  181.     for(int i(0);i<v.size();i++) delete v[i];
  182.     v.resize(0);
  183.     try {
  184.         for(auto x: f.v) v.push_back(x->DajKopiju());
  185.     } catch(...) {
  186.         for(auto x: v) delete x;
  187.     }
  188.     return *this;
  189. }
  190.  
  191. Fakultet::Fakultet(Fakultet &&f)
  192. {
  193.     v=std::move(f.v);
  194. }
  195.  
  196. Fakultet &Fakultet::operator=(Fakultet &&f)
  197. {
  198.     for(int i(0);i<v.size();i++) delete v[i];
  199.     v=std::move(f.v);
  200.     return *this;
  201. }
  202.  
  203.  
  204.  
  205. int main_()
  206. {
  207.     Fakultet etf;
  208.     etf.UpisiStudenta("Mujo","Mujic",18783);
  209.         etf.UpisiStudenta("Suljo","Suljic",18784,2015);
  210.     etf[18783].RegistrirajIspit(8);
  211.     etf[18783].RegistrirajIspit(9);
  212.     etf[18784].RegistrirajIspit(8);
  213.     etf.IspisiSveStudente();
  214.     etf.ObrisiStudenta(18784);
  215.     etf.IspisiSveStudente();
  216.     const Fakultet pmf(etf);
  217.     etf[18783].IspisiPodatke();
  218.     pmf[18783].IspisiPodatke();
  219.     return 0;
  220. }
  221.  
  222. int main()
  223. {
  224.     //kopirajući operator i pomijerajući operator
  225.   Fakultet f1; //3 studenta
  226.   f1.UpisiStudenta("Meho", "Mehic", 3412);
  227.   f1.UpisiStudenta("Ibro", "Ibric", 3124, 2015);
  228.   f1.UpisiStudenta("Pero", "Peric", 1243);
  229.  
  230.   Fakultet f2;  //2 studenta
  231.   f2.UpisiStudenta("Meho", "Mehic", 1111);
  232.   f2.UpisiStudenta("Ibro", "Ibric", 2222, 2015);
  233.  
  234.   f1 = f2;  //dodjela manjeg većem, sadai f1 i f2 imaju 2 elementa
  235.   std::cout << "KOPIRAJUCI OPERATOR DODJELE - manji većem" << std::endl;
  236.   std::cout << "Original prije promjene: " << std::endl;
  237.   std::cout << "----------------------" << std::endl;
  238.   f1.IspisiSveStudente();
  239.   std::cout << "Kopija prije promjene: " << std::endl;
  240.   std::cout << "----------------------" << std::endl;
  241.   f2.IspisiSveStudente();
  242.  
  243.   f2.ObrisiStudenta(1111);  //f2 sada ima 1 element
  244.   std::cout << "Original nakon promjene: " << std::endl;
  245.   std::cout << "----------------------" << std::endl;
  246.   f1.IspisiSveStudente();
  247.   std::cout << "Kopija nakon promjene: " << std::endl;
  248.   std::cout << "----------------------" << std::endl;
  249.   f2.IspisiSveStudente();
  250.  
  251.  
  252.   f2 = f1;  //f2 sada opet ima 2 elementa
  253.     std::cout << "KOPIRAJUCI OPERATOR DODJELE - veći manjem" << std::endl;
  254.   std::cout << "Original prije promjene: " << std::endl;
  255.   std::cout << "----------------------" << std::endl;
  256.   f1.IspisiSveStudente();
  257.   std::cout << "Kopija prije promjene: " << std::endl;
  258.   std::cout << "----------------------" << std::endl;
  259.   f2.IspisiSveStudente();
  260.  
  261.   f2.ObrisiStudenta(1111); //f2 ima 1 element
  262.   std::cout << "Original nakon promjene: " << std::endl;
  263.   std::cout << "----------------------" << std::endl;
  264.   f1.IspisiSveStudente();
  265.   std::cout << "Kopija nakon promjene: " << std::endl;
  266.   std::cout << "----------------------" << std::endl;
  267.   f2.IspisiSveStudente();
  268.  
  269.  
  270.   Fakultet f3; //3 studenta
  271.   f3.UpisiStudenta("Meho", "Mehic", 3412);
  272.   f3.UpisiStudenta("Ibro", "Ibric", 3124, 2015);
  273.   f3.UpisiStudenta("Pero", "Peric", 1243);
  274.  
  275.   Fakultet f4;  //2 studenta
  276.   f4.UpisiStudenta("Meho", "Mehic", 1111);
  277.   f4.UpisiStudenta("Ibro", "Ibric", 2222, 2015);
  278.  
  279.   std::cout << std::endl << std::endl;
  280.   f3 = std::move(f4);  //dodjela manjeg većem, sada i f3 i f4 imaju 2 elementa
  281.   std::cout << "POMIJERAJUCI OPERATOR DODJELE - manji većem" << std::endl;
  282.   f4.IspisiSveStudente(); //f4 je prazno
  283.  
  284.   f4.UpisiStudenta("Meho", "Mehic", 3412);
  285.   f4.UpisiStudenta("Ibro", "Ibric", 3124, 2015);
  286.   f4.UpisiStudenta("Pero", "Peric", 1243);
  287.   f3 = std::move(f4);  //f3 je prazno
  288.   f4.IspisiSveStudente();
  289.  
  290.   return 0;
  291. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement