Advertisement
Guest User

Ispravka - Namite

a guest
Apr 24th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.40 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3. #include <vector>
  4. #include <memory>
  5.  
  6. using namespace std;
  7.  
  8. class Pohrana {
  9. protected:
  10.     string ime;
  11.     double tezinaStvari;
  12. public:
  13.     Pohrana(string ime, double tezina) : ime(ime), tezinaStvari(tezina) {};
  14.  
  15.     virtual Pohrana *DajKopiju() const = 0;
  16.  
  17.     virtual string dajIme() const = 0;
  18.  
  19.     virtual void dodajTezinu(double dodatna) = 0;
  20.  
  21.     virtual double dajTezinu() const = 0;
  22.  
  23.     virtual void Ispisi() const = 0;
  24. };
  25.  
  26. class Sanduk : public Pohrana {
  27.     double tezinaSanduka;
  28.     int maxBrojPredmeta;
  29. public:
  30.     Sanduk(string ime, double tezinaPredmeta) : Pohrana(ime, tezinaPredmeta) { tezinaSanduka += tezinaPredmeta; };
  31.  
  32.     double dajTezinuSanduka() const { return tezinaSanduka; }
  33.  
  34.     void dodajTezinu(double dodatna) override { tezinaStvari += dodatna; }
  35.  
  36.     double dajTezinu() const override { return tezinaStvari; }
  37.  
  38.     string dajIme() const override { return ime; }
  39.  
  40.     Pohrana *DajKopiju() const override { return new Sanduk(*this); }
  41.  
  42.     //Nemoj nikad metode u jednoj liniji pisati nije c++sovski a i ne doprinosi citljivosti
  43.     void Ispisi() const override { cout << ime << " " << tezinaStvari << "KG\n"; }
  44. };
  45.  
  46. class Bure : public Pohrana {
  47.     double bureTezina;
  48.     int maxPredmeta;
  49. public:
  50.     explicit Bure(string ime, double tezinaTecnosti) : Pohrana(ime, tezinaTecnosti) { bureTezina += tezinaTecnosti; };
  51.  
  52.     double dajTezinuBureta() const { return bureTezina; }
  53.  
  54.     double dajTezinu() const override { return tezinaStvari; }
  55.  
  56.     void dodajTezinu(double dodatna) override { tezinaStvari += dodatna; }
  57.  
  58.     string dajIme() const override { return ime; }
  59.  
  60.     Pohrana *DajKopiju() const override { return new Bure(*this); }
  61.  
  62.     void Ispisi() const override { cout << ime << " " << tezinaStvari << " l\n"; }
  63. };
  64.  
  65. class Skladiste {
  66.     Pohrana **itemi;
  67.     int maxBrojPredmeta, trenutnoStanje;
  68. public:
  69.     explicit Skladiste(int brojPredmeta) : maxBrojPredmeta(brojPredmeta), trenutnoStanje(0),
  70.                                            itemi(new Pohrana *[brojPredmeta]{}) {};
  71.  
  72.     ~Skladiste();
  73.  
  74.     Skladiste(const Skladiste &s);
  75.  
  76.     Skladiste &operator=(const Skladiste &s);
  77.  
  78.     Skladiste(Skladiste &&s) : itemi(s.itemi), maxBrojPredmeta(s.maxBrojPredmeta), trenutnoStanje(s.trenutnoStanje) {
  79.         itemi = nullptr;
  80.         trenutnoStanje = 0;
  81.     }
  82.  
  83.     Skladiste &operator=(Skladiste &&s);
  84.  
  85.     Pohrana &NajteziPredmet();
  86.  
  87.     Pohrana &NajlaksiPredmet();
  88.  
  89.     Pohrana &operator[](int brojPredmeta);
  90.  
  91.     int DajBrojPredmeta() const { return trenutnoStanje; }
  92.  
  93.     int BrojPredmetaVeciOdZadanog(int granica);
  94.  
  95.     void DodajStvarStanduk(string ime, double tezinaPredmeta);
  96.  
  97.     void DodajStvarBure(string ime, double tezinaTecnosti);
  98.  
  99.     void IspisiStvariSkladiste() const;
  100.  
  101.     void IspisiSortirano() const;
  102. };
  103.  
  104. Pohrana &Skladiste::operator[](int brojPredmeta) {
  105.     if (brojPredmeta > trenutnoStanje)
  106.         throw range_error("Prevelik broj predmeta!");
  107.     return *itemi[brojPredmeta];
  108. }
  109.  
  110. Pohrana &Skladiste::NajlaksiPredmet() {
  111.     int indeksNajmanjeg = 0, najlaksi = 0;
  112.     for (int i = 0; i < trenutnoStanje; i++) {
  113.         if (itemi[i]->dajTezinu() < najlaksi) {
  114.             najlaksi = itemi[i]->dajTezinu();
  115.             indeksNajmanjeg = i;
  116.         }
  117.     }
  118.     return *itemi[indeksNajmanjeg];
  119. }
  120.  
  121. Pohrana &Skladiste::NajteziPredmet() {
  122.     int indeksNajtezeg = 0, najtezi = 0;
  123.     for (int i = 0; i < trenutnoStanje; i++) {
  124.         if (itemi[i]->dajTezinu() > najtezi) {
  125.             najtezi = itemi[i]->dajTezinu();
  126.             indeksNajtezeg = i;
  127.         }
  128.     }
  129.     return *itemi[indeksNajtezeg];
  130. }
  131.  
  132.  
  133. void Skladiste::IspisiSortirano() const {
  134.     sort(itemi, itemi + trenutnoStanje,
  135.          [](const Pohrana *p, const Pohrana *d) { return p->dajTezinu() > d->dajTezinu(); });
  136.     for (int i = 0; i < trenutnoStanje; i++)
  137.         itemi[i]->Ispisi();
  138. }
  139.  
  140. //Ime metode jaaaako lose. Uopste ne otkriva sta metoda radi. Bolje ime je BrojPredmetaPrekoGranice
  141. int Skladiste::BrojPredmetaVeciOdZadanog(int granica) {
  142.     int suma(0);
  143.     for (int i = 0; i < trenutnoStanje; i++)
  144.         if (itemi[i]->dajTezinu() > granica)
  145.             suma++;
  146.     return suma;
  147. }
  148.  
  149.  
  150. Skladiste &Skladiste::operator=(Skladiste &&s) {
  151.     swap(itemi, s.itemi);
  152.     swap(maxBrojPredmeta, s.maxBrojPredmeta);
  153.     swap(trenutnoStanje, s.trenutnoStanje);
  154.     return *this;
  155. }
  156.  
  157. Skladiste::Skladiste(const Skladiste &s) : itemi(new Pohrana *[s.maxBrojPredmeta]), maxBrojPredmeta(s.maxBrojPredmeta),
  158.                                            trenutnoStanje(s.trenutnoStanje) {
  159.     try {
  160.         //Ovo ti nece raditi, pasti ce ti program. Skontaj zasto.
  161.         for (int i = 0; i < s.maxBrojPredmeta; i++)
  162.             itemi[i] = s.itemi[i]->DajKopiju();
  163.     }
  164.     catch (...) {
  165.         for (int i = 0; i < s.maxBrojPredmeta; i++)
  166.             delete itemi[i];
  167.     }
  168. }
  169.  
  170. Skladiste &Skladiste::operator=(const Skladiste &s) {
  171.     Pohrana **noviProstor(new Pohrana *[s.maxBrojPredmeta]{});
  172.     try {
  173.         //Ovo ti nece raditi, pasti ce ti program. Skontaj zasto.
  174.         for (int i = 0; i < s.maxBrojPredmeta; i++)
  175.             noviProstor[i] = s.itemi[i]->DajKopiju();
  176.     }
  177.     catch (...) {
  178.         for (int i = 0; i < s.maxBrojPredmeta; i++)
  179.             delete noviProstor[i];
  180.         delete[] noviProstor;
  181.     }
  182.     for (int i = 0; i < maxBrojPredmeta; i++)
  183.         delete itemi[i];
  184.     delete[] itemi;
  185.     itemi = noviProstor;
  186.     return *this;
  187. }
  188.  
  189. Skladiste::~Skladiste() {
  190.     for (int i = 0; i < maxBrojPredmeta; i++)
  191.         delete itemi[i];
  192.     delete[] itemi;
  193. }
  194.  
  195. void Skladiste::IspisiStvariSkladiste() const {
  196.     for (int i = 0; i < trenutnoStanje; i++)
  197.         itemi[i]->Ispisi();
  198. }
  199.  
  200. //DodajSanduk ili DodajBure.
  201. void Skladiste::DodajStvarStanduk(string ime, double tezinaPredmeta) {
  202.     int indeksPronadjenog;
  203.     bool pronadjen(false);
  204.     if (trenutnoStanje == maxBrojPredmeta)
  205.         throw range_error("Sanduk je popunjen!");
  206.     for (int i = 0; i < trenutnoStanje; i++) {
  207.         if (ime == itemi[i]->dajIme()) {
  208.             pronadjen = true;
  209.             indeksPronadjenog = i;
  210.         }
  211.     }
  212.     if (!pronadjen)
  213.         itemi[trenutnoStanje++] = new Sanduk(ime, tezinaPredmeta);
  214.     else
  215.         itemi[indeksPronadjenog]->dodajTezinu(tezinaPredmeta);
  216. }
  217.  
  218. void Skladiste::DodajStvarBure(string ime, double tezinaTecnosti) {
  219.     int indeksPronadjenog;
  220.     bool pronadjen(false);
  221.     if (trenutnoStanje == maxBrojPredmeta)
  222.         throw range_error("Bure je popunjeno!");
  223.     for (int i = 0; i < trenutnoStanje; i++) {
  224.         if (ime == itemi[i]->dajIme()) {
  225.             pronadjen = true;
  226.             indeksPronadjenog = i;
  227.         }
  228.     }
  229.     if (!pronadjen)
  230.         itemi[trenutnoStanje++] = new Bure(ime, tezinaTecnosti);
  231.     else
  232.         itemi[indeksPronadjenog]->dodajTezinu(tezinaTecnosti);
  233. }
  234.  
  235. int main() {
  236.     Skladiste skladiste1(5);
  237.     skladiste1.DodajStvarBure("mlijeko", 10);
  238.     skladiste1.DodajStvarBure("sok", 5);
  239.     skladiste1.DodajStvarStanduk("banane", 2);
  240.     skladiste1.DodajStvarStanduk("jabuke", 2);
  241.  
  242.     Skladiste skladiste2(skladiste1);
  243.  
  244.     Skladiste skladiste3(1);
  245.     skladiste3 = skladiste2;
  246.  
  247.     cout << "Skladiste 1" << endl;
  248.     skladiste1.IspisiSortirano();
  249.     cout << "Skladiste 2" << endl;
  250.     skladiste2.IspisiSortirano();
  251.     cout << "Skladiste 3" << endl;
  252.     skladiste3.IspisiSortirano();
  253.  
  254.     return 0;
  255. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement