Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstring>
- #include <vector>
- #include <memory>
- using namespace std;
- class Pohrana {
- protected:
- string ime;
- double tezinaStvari;
- public:
- Pohrana(string ime, double tezina) : ime(ime), tezinaStvari(tezina) {};
- virtual Pohrana *DajKopiju() const = 0;
- virtual string dajIme() const = 0;
- virtual void dodajTezinu(double dodatna) = 0;
- virtual double dajTezinu() const = 0;
- virtual void Ispisi() const = 0;
- };
- class Sanduk : public Pohrana {
- double tezinaSanduka;
- int maxBrojPredmeta;
- public:
- Sanduk(string ime, double tezinaPredmeta) : Pohrana(ime, tezinaPredmeta) { tezinaSanduka += tezinaPredmeta; };
- double dajTezinuSanduka() const { return tezinaSanduka; }
- void dodajTezinu(double dodatna) override { tezinaStvari += dodatna; }
- double dajTezinu() const override { return tezinaStvari; }
- string dajIme() const override { return ime; }
- Pohrana *DajKopiju() const override { return new Sanduk(*this); }
- //Nemoj nikad metode u jednoj liniji pisati nije c++sovski a i ne doprinosi citljivosti
- void Ispisi() const override { cout << ime << " " << tezinaStvari << "KG\n"; }
- };
- class Bure : public Pohrana {
- double bureTezina;
- int maxPredmeta;
- public:
- explicit Bure(string ime, double tezinaTecnosti) : Pohrana(ime, tezinaTecnosti) { bureTezina += tezinaTecnosti; };
- double dajTezinuBureta() const { return bureTezina; }
- double dajTezinu() const override { return tezinaStvari; }
- void dodajTezinu(double dodatna) override { tezinaStvari += dodatna; }
- string dajIme() const override { return ime; }
- Pohrana *DajKopiju() const override { return new Bure(*this); }
- void Ispisi() const override { cout << ime << " " << tezinaStvari << " l\n"; }
- };
- class Skladiste {
- Pohrana **itemi;
- int maxBrojPredmeta, trenutnoStanje;
- public:
- explicit Skladiste(int brojPredmeta) : maxBrojPredmeta(brojPredmeta), trenutnoStanje(0),
- itemi(new Pohrana *[brojPredmeta]{}) {};
- ~Skladiste();
- Skladiste(const Skladiste &s);
- Skladiste &operator=(const Skladiste &s);
- Skladiste(Skladiste &&s) : itemi(s.itemi), maxBrojPredmeta(s.maxBrojPredmeta), trenutnoStanje(s.trenutnoStanje) {
- itemi = nullptr;
- trenutnoStanje = 0;
- }
- Skladiste &operator=(Skladiste &&s);
- Pohrana &NajteziPredmet();
- Pohrana &NajlaksiPredmet();
- Pohrana &operator[](int brojPredmeta);
- int DajBrojPredmeta() const { return trenutnoStanje; }
- int BrojPredmetaVeciOdZadanog(int granica);
- void DodajStvarStanduk(string ime, double tezinaPredmeta);
- void DodajStvarBure(string ime, double tezinaTecnosti);
- void IspisiStvariSkladiste() const;
- void IspisiSortirano() const;
- };
- Pohrana &Skladiste::operator[](int brojPredmeta) {
- if (brojPredmeta > trenutnoStanje)
- throw range_error("Prevelik broj predmeta!");
- return *itemi[brojPredmeta];
- }
- Pohrana &Skladiste::NajlaksiPredmet() {
- int indeksNajmanjeg = 0, najlaksi = 0;
- for (int i = 0; i < trenutnoStanje; i++) {
- if (itemi[i]->dajTezinu() < najlaksi) {
- najlaksi = itemi[i]->dajTezinu();
- indeksNajmanjeg = i;
- }
- }
- return *itemi[indeksNajmanjeg];
- }
- Pohrana &Skladiste::NajteziPredmet() {
- int indeksNajtezeg = 0, najtezi = 0;
- for (int i = 0; i < trenutnoStanje; i++) {
- if (itemi[i]->dajTezinu() > najtezi) {
- najtezi = itemi[i]->dajTezinu();
- indeksNajtezeg = i;
- }
- }
- return *itemi[indeksNajtezeg];
- }
- void Skladiste::IspisiSortirano() const {
- sort(itemi, itemi + trenutnoStanje,
- [](const Pohrana *p, const Pohrana *d) { return p->dajTezinu() > d->dajTezinu(); });
- for (int i = 0; i < trenutnoStanje; i++)
- itemi[i]->Ispisi();
- }
- //Ime metode jaaaako lose. Uopste ne otkriva sta metoda radi. Bolje ime je BrojPredmetaPrekoGranice
- int Skladiste::BrojPredmetaVeciOdZadanog(int granica) {
- int suma(0);
- for (int i = 0; i < trenutnoStanje; i++)
- if (itemi[i]->dajTezinu() > granica)
- suma++;
- return suma;
- }
- Skladiste &Skladiste::operator=(Skladiste &&s) {
- swap(itemi, s.itemi);
- swap(maxBrojPredmeta, s.maxBrojPredmeta);
- swap(trenutnoStanje, s.trenutnoStanje);
- return *this;
- }
- Skladiste::Skladiste(const Skladiste &s) : itemi(new Pohrana *[s.maxBrojPredmeta]), maxBrojPredmeta(s.maxBrojPredmeta),
- trenutnoStanje(s.trenutnoStanje) {
- try {
- //Ovo ti nece raditi, pasti ce ti program. Skontaj zasto.
- for (int i = 0; i < s.maxBrojPredmeta; i++)
- itemi[i] = s.itemi[i]->DajKopiju();
- }
- catch (...) {
- for (int i = 0; i < s.maxBrojPredmeta; i++)
- delete itemi[i];
- }
- }
- Skladiste &Skladiste::operator=(const Skladiste &s) {
- Pohrana **noviProstor(new Pohrana *[s.maxBrojPredmeta]{});
- try {
- //Ovo ti nece raditi, pasti ce ti program. Skontaj zasto.
- for (int i = 0; i < s.maxBrojPredmeta; i++)
- noviProstor[i] = s.itemi[i]->DajKopiju();
- }
- catch (...) {
- for (int i = 0; i < s.maxBrojPredmeta; i++)
- delete noviProstor[i];
- delete[] noviProstor;
- }
- for (int i = 0; i < maxBrojPredmeta; i++)
- delete itemi[i];
- delete[] itemi;
- itemi = noviProstor;
- return *this;
- }
- Skladiste::~Skladiste() {
- for (int i = 0; i < maxBrojPredmeta; i++)
- delete itemi[i];
- delete[] itemi;
- }
- void Skladiste::IspisiStvariSkladiste() const {
- for (int i = 0; i < trenutnoStanje; i++)
- itemi[i]->Ispisi();
- }
- //DodajSanduk ili DodajBure.
- void Skladiste::DodajStvarStanduk(string ime, double tezinaPredmeta) {
- int indeksPronadjenog;
- bool pronadjen(false);
- if (trenutnoStanje == maxBrojPredmeta)
- throw range_error("Sanduk je popunjen!");
- for (int i = 0; i < trenutnoStanje; i++) {
- if (ime == itemi[i]->dajIme()) {
- pronadjen = true;
- indeksPronadjenog = i;
- }
- }
- if (!pronadjen)
- itemi[trenutnoStanje++] = new Sanduk(ime, tezinaPredmeta);
- else
- itemi[indeksPronadjenog]->dodajTezinu(tezinaPredmeta);
- }
- void Skladiste::DodajStvarBure(string ime, double tezinaTecnosti) {
- int indeksPronadjenog;
- bool pronadjen(false);
- if (trenutnoStanje == maxBrojPredmeta)
- throw range_error("Bure je popunjeno!");
- for (int i = 0; i < trenutnoStanje; i++) {
- if (ime == itemi[i]->dajIme()) {
- pronadjen = true;
- indeksPronadjenog = i;
- }
- }
- if (!pronadjen)
- itemi[trenutnoStanje++] = new Bure(ime, tezinaTecnosti);
- else
- itemi[indeksPronadjenog]->dodajTezinu(tezinaTecnosti);
- }
- int main() {
- Skladiste skladiste1(5);
- skladiste1.DodajStvarBure("mlijeko", 10);
- skladiste1.DodajStvarBure("sok", 5);
- skladiste1.DodajStvarStanduk("banane", 2);
- skladiste1.DodajStvarStanduk("jabuke", 2);
- Skladiste skladiste2(skladiste1);
- Skladiste skladiste3(1);
- skladiste3 = skladiste2;
- cout << "Skladiste 1" << endl;
- skladiste1.IspisiSortirano();
- cout << "Skladiste 2" << endl;
- skladiste2.IspisiSortirano();
- cout << "Skladiste 3" << endl;
- skladiste3.IspisiSortirano();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement