Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- TP 16/17 (Tutorijal 13, Zadatak 3)
- Autotestove pisala Ivona Ivkovic. Sva pitanja, sugestije, prijave gresaka
- slati na mail iivkovic2@etf.unsa.ba
- Vrsit ce se provjera na prepisivanje tutorijala (na kraju semestra)
- */
- #include <iostream>
- #include <string>
- #include <stdexcept>
- #include <vector>
- #include <algorithm>
- class ApstraktniStudent
- {
- std::string ime,prezime;
- int brindeksa,brpolozenih;
- double prosjecna;
- public:
- ApstraktniStudent(std::string ime,std::string prezime,int brindeksa): ime(ime),prezime(prezime),brindeksa(brindeksa),brpolozenih(0),prosjecna(5) {};
- std::string DajIme() const {
- return ime;
- }
- std::string DajPrezime() const {
- return prezime;
- }
- int DajBrojIndeksa() const {
- return brindeksa;
- }
- int DajBrojPolozenih() const {
- return brpolozenih;
- }
- double DajProsjek() const {
- return prosjecna;
- }
- void RegistrirajIspit(int oc) {
- if(oc<5 || oc>10) throw std::domain_error("Neispravna ocjena");
- if(oc!=5) {
- prosjecna=(prosjecna*brpolozenih+oc)/(brpolozenih+1);
- brpolozenih++;
- }
- }
- void PonistiOcjene() {
- brpolozenih=0;
- prosjecna=5;
- }
- virtual void IspisiPodatke() const=0;
- virtual ApstraktniStudent *DajKopiju() const=0;
- virtual ~ApstraktniStudent() {};
- };
- class StudentBachelor: public ApstraktniStudent
- {
- public:
- StudentBachelor(std::string ime,std::string prezime,int brindeksa): ApstraktniStudent(ime,prezime,brindeksa) {};
- void IspisiPodatke() const override {
- std::cout<<"Student bachelor studija "<<DajIme()<<" "<<DajPrezime()<<", sa brojem indeksa "<<DajBrojIndeksa()<<","<<std::endl<<"ima prosjek "<<DajProsjek()<<"."<<std::endl;
- }
- ApstraktniStudent *DajKopiju() const override {
- return new StudentBachelor(*this);
- }
- // ~StudentBachelor(){ delete this;}
- };
- class StudentMaster: public ApstraktniStudent
- {
- int godina;
- public:
- StudentMaster(std::string ime,std::string prezime,int brindeksa,int godina): ApstraktniStudent(ime,prezime,brindeksa), godina(godina) {};
- void IspisiPodatke() const override {
- std::cout<<"Student master studija "<<DajIme()<<" "<<DajPrezime()<<", sa brojem indeksa "<<DajBrojIndeksa()<<","<<std::endl<<"zavrsio bachelor studij godine "<<godina<<",ima prosjek "<<DajProsjek()<<"."<<std::endl;
- }
- ApstraktniStudent *DajKopiju() const override {
- return new StudentMaster(*this);
- }
- //~StudentMaster(){ delete this;}
- };
- class Fakultet
- {
- std::vector<ApstraktniStudent*> v;
- public:
- explicit Fakultet() : v(0) {};
- ~Fakultet();
- Fakultet(const Fakultet &f);
- Fakultet &operator=(const Fakultet &f);
- Fakultet(Fakultet &&f);
- Fakultet &operator=(Fakultet &&f);
- void UpisiStudenta(std::string ime, std::string prezime,int brindeksa);
- void UpisiStudenta(std::string ime, std::string prezime,int brindeksa, int godina);
- void ObrisiStudenta(int indeks);
- ApstraktniStudent &operator [](int brindeksa);
- ApstraktniStudent const &operator [](int brindeksa) const;
- void IspisiSveStudente() const;
- };
- void Fakultet::IspisiSveStudente() const
- {
- auto v(this->v);
- std::sort(v.begin(),v.end(),[](ApstraktniStudent*s1, ApstraktniStudent*s2){
- if(s1->DajProsjek()==s2->DajProsjek()) return s1->DajBrojIndeksa()<s2->DajBrojIndeksa();
- return s1->DajProsjek()>s2->DajProsjek();
- });
- for(auto x: v) x->IspisiPodatke();
- }
- ApstraktniStudent &Fakultet::operator [](int brindeksa) //->decltype(*(this->v[0]))
- {
- bool ima(false);
- for(int i(0); i<v.size(); i++) {
- if(v[i]->DajBrojIndeksa()==brindeksa) {
- ima=true;
- return *v[i];
- }
- }
- if(!ima) throw std::logic_error("Student sa zadanim brojem indeksa ne postoji");
- return *v[0];
- }
- ApstraktniStudent const &Fakultet::operator [](int brindeksa) const //->decltype(*(this->v[0]))
- {
- bool ima(false);
- for(int i(0); i<v.size(); i++) {
- if(v[i]->DajBrojIndeksa()==brindeksa) {
- ima=true;
- return *v[i];
- }
- }
- if(!ima) throw std::logic_error("Student sa zadanim brojem indeksa ne postoji");
- return *v[0];
- }
- void Fakultet:: UpisiStudenta(std::string ime, std::string prezime,int brindeksa)
- {
- for(auto x : v) if(x->DajBrojIndeksa()==brindeksa) throw std::logic_error("Student sa zadanim brojem indeksa vec postoji");
- v.push_back(new StudentBachelor(ime,prezime,brindeksa));
- }
- void Fakultet::UpisiStudenta(std::string ime, std::string prezime,int brindeksa,int godina)
- {
- for(auto x : v) if(x->DajBrojIndeksa()==brindeksa) throw std::logic_error("Student sa zadanim brojem indeksa vec postoji");
- v.push_back(new StudentMaster(ime,prezime,brindeksa,godina));
- }
- void Fakultet::ObrisiStudenta(int indeks)
- {
- bool ima(false);
- for(int i(0); i<v.size(); i++) {
- if(v[i]->DajBrojIndeksa()==indeks) {
- ima=true;
- delete v[i];
- v.erase(v.begin()+i);
- break;
- }
- }
- if(!ima) throw std::logic_error("Student sa zadanim brojem indeksa ne postoji");
- }
- Fakultet::~Fakultet()
- {
- for(int i(0);i<v.size();i++) delete v[i];
- }
- Fakultet::Fakultet(const Fakultet &f)
- {
- for(int i(0);i<v.size();i++) delete v[i];
- v.resize(0);
- try {
- for(auto x: f.v) v.push_back(x->DajKopiju());
- } catch(...) {
- for(auto x: v) delete x;
- }
- }
- Fakultet &Fakultet::operator=(const Fakultet &f)
- {
- for(int i(0);i<v.size();i++) delete v[i];
- v.resize(0);
- try {
- for(auto x: f.v) v.push_back(x->DajKopiju());
- } catch(...) {
- for(auto x: v) delete x;
- }
- return *this;
- }
- Fakultet::Fakultet(Fakultet &&f)
- {
- v=std::move(f.v);
- }
- Fakultet &Fakultet::operator=(Fakultet &&f)
- {
- for(int i(0);i<v.size();i++) delete v[i];
- v=std::move(f.v);
- return *this;
- }
- int main_()
- {
- Fakultet etf;
- etf.UpisiStudenta("Mujo","Mujic",18783);
- etf.UpisiStudenta("Suljo","Suljic",18784,2015);
- etf[18783].RegistrirajIspit(8);
- etf[18783].RegistrirajIspit(9);
- etf[18784].RegistrirajIspit(8);
- etf.IspisiSveStudente();
- etf.ObrisiStudenta(18784);
- etf.IspisiSveStudente();
- const Fakultet pmf(etf);
- etf[18783].IspisiPodatke();
- pmf[18783].IspisiPodatke();
- return 0;
- }
- int main()
- {
- //kopirajući operator i pomijerajući operator
- Fakultet f1; //3 studenta
- f1.UpisiStudenta("Meho", "Mehic", 3412);
- f1.UpisiStudenta("Ibro", "Ibric", 3124, 2015);
- f1.UpisiStudenta("Pero", "Peric", 1243);
- Fakultet f2; //2 studenta
- f2.UpisiStudenta("Meho", "Mehic", 1111);
- f2.UpisiStudenta("Ibro", "Ibric", 2222, 2015);
- f1 = f2; //dodjela manjeg većem, sadai f1 i f2 imaju 2 elementa
- std::cout << "KOPIRAJUCI OPERATOR DODJELE - manji većem" << std::endl;
- std::cout << "Original prije promjene: " << std::endl;
- std::cout << "----------------------" << std::endl;
- f1.IspisiSveStudente();
- std::cout << "Kopija prije promjene: " << std::endl;
- std::cout << "----------------------" << std::endl;
- f2.IspisiSveStudente();
- f2.ObrisiStudenta(1111); //f2 sada ima 1 element
- std::cout << "Original nakon promjene: " << std::endl;
- std::cout << "----------------------" << std::endl;
- f1.IspisiSveStudente();
- std::cout << "Kopija nakon promjene: " << std::endl;
- std::cout << "----------------------" << std::endl;
- f2.IspisiSveStudente();
- f2 = f1; //f2 sada opet ima 2 elementa
- std::cout << "KOPIRAJUCI OPERATOR DODJELE - veći manjem" << std::endl;
- std::cout << "Original prije promjene: " << std::endl;
- std::cout << "----------------------" << std::endl;
- f1.IspisiSveStudente();
- std::cout << "Kopija prije promjene: " << std::endl;
- std::cout << "----------------------" << std::endl;
- f2.IspisiSveStudente();
- f2.ObrisiStudenta(1111); //f2 ima 1 element
- std::cout << "Original nakon promjene: " << std::endl;
- std::cout << "----------------------" << std::endl;
- f1.IspisiSveStudente();
- std::cout << "Kopija nakon promjene: " << std::endl;
- std::cout << "----------------------" << std::endl;
- f2.IspisiSveStudente();
- Fakultet f3; //3 studenta
- f3.UpisiStudenta("Meho", "Mehic", 3412);
- f3.UpisiStudenta("Ibro", "Ibric", 3124, 2015);
- f3.UpisiStudenta("Pero", "Peric", 1243);
- Fakultet f4; //2 studenta
- f4.UpisiStudenta("Meho", "Mehic", 1111);
- f4.UpisiStudenta("Ibro", "Ibric", 2222, 2015);
- std::cout << std::endl << std::endl;
- f3 = std::move(f4); //dodjela manjeg većem, sada i f3 i f4 imaju 2 elementa
- std::cout << "POMIJERAJUCI OPERATOR DODJELE - manji većem" << std::endl;
- f4.IspisiSveStudente(); //f4 je prazno
- f4.UpisiStudenta("Meho", "Mehic", 3412);
- f4.UpisiStudenta("Ibro", "Ibric", 3124, 2015);
- f4.UpisiStudenta("Pero", "Peric", 1243);
- f3 = std::move(f4); //f3 je prazno
- f4.IspisiSveStudente();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement