Advertisement
adnanj

PR2 - W9 - Zadatak

Dec 26th, 2014
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.99 KB | None | 0 0
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. char * crtice = "\n===================================================\n";
  5.  
  6. class NedozvoljenaOperacija : public exception{
  7.     int linijaKoda;
  8. public:
  9.  
  10.     //Konstruktor sa dva parametra (poruka i linija koda u kojoj je greška nastala)
  11.     NedozvoljenaOperacija(char * poruka, int lin) : exception(poruka)
  12.     {
  13.         linijaKoda = lin;
  14.     }
  15.  
  16.     //Funkcija za ispis informacija o nastaloj grešci
  17.     void ErrorInfo()
  18.     {
  19.         cout << "Greska: " << what() << " u liniji " << linijaKoda << "." << endl;
  20.     }
  21. };
  22.  
  23. //KATALOŠKA PRODAJA
  24. class Proizvod
  25. {
  26.     char _sifra[10];
  27.     char* _naziv;
  28.     double _cijena;
  29.     double _popust;
  30.     int _stanje;
  31. public:
  32.     //Potrebne konstruktor i destruktor funkcije
  33.     //U slučaju nedozvoljenih vrijednosti za cijenu i popust baciti izuzetak
  34.     Proizvod(char* sifra = "---", char* naziv = "---", double cijena = 0, double popust = 0, int stanje = 0)
  35.     {
  36.         //Dopuniti dato rješenje
  37.         if(cijena < 0)
  38.             throw NedozvoljenaOperacija("Cijena je negativna", __LINE__);
  39.         if(popust < 0 || popust > 100)
  40.             throw NedozvoljenaOperacija("Popust nije validan (raspon 0 - 100)", __LINE__);
  41.  
  42.         strncpy_s(_sifra, sifra, 10);
  43.  
  44.         int vel = strlen(naziv) + 1;
  45.         _naziv = new char[vel];
  46.         strcpy_s(_naziv, vel, naziv);
  47.  
  48.         _cijena = cijena;
  49.         _popust = popust;
  50.  
  51.         _stanje = stanje;
  52.     }
  53.     Proizvod (const Proizvod & original)
  54.     {
  55.         strncpy_s(_sifra, original._sifra, 10);
  56.  
  57.         int vel = strlen(original._naziv) + 1;
  58.         _naziv = new char[vel];
  59.         strcpy_s(_naziv, vel, original._naziv);
  60.  
  61.         _cijena = original._cijena;
  62.         _popust = original._popust;
  63.  
  64.         _stanje = original._stanje;
  65.  
  66.     }
  67.  
  68.     virtual ~Proizvod()
  69.     {
  70.         delete[] _naziv;
  71.         _naziv = NULL;
  72.     }
  73.  
  74.     char *  getSifra() { return _sifra; }
  75.     int getStanje() { return _stanje; }
  76.     double getCijena() { return _cijena; }
  77.     double getPopust() { return _popust; }
  78.  
  79.     Proizvod & operator -= (int kolicina)
  80.     {
  81.         _stanje -= kolicina;
  82.         return *this;
  83.     }
  84.  
  85.     Proizvod & operator =(const Proizvod & obj)
  86.     {
  87.         if(this != &obj)
  88.         {
  89.             strncpy_s(_sifra, obj._sifra, 10);
  90.  
  91.             delete[] _naziv;
  92.             int vel = strlen(obj._naziv) + 1;
  93.             _naziv = new char[vel];
  94.             strcpy_s(_naziv, vel, obj._naziv);
  95.  
  96.             _cijena = obj._cijena;
  97.             _popust = obj._popust;
  98.         }
  99.         return *this;
  100.     }
  101.     bool operator==(Proizvod & p)
  102.     {
  103.         if(strcmp(_sifra, p._sifra) == 0)
  104.             return true;
  105.         return false;
  106.     }
  107.     //Funkciju Info
  108.     virtual void Info()
  109.     {
  110.         cout << "Sifra: " << _sifra << endl;
  111.         cout << "Naziv: " << _naziv << endl;
  112.         cout << "Cijena: " << _cijena << " KM" << endl;
  113.         cout << "Popust: " << _popust << "%" << endl;
  114.     }
  115. };
  116.  
  117. //Implementirati nasljeđivanje
  118. class Odjeca : public Proizvod
  119. {
  120.     char* _velicine; //34, 36, 38 ili XS, S, M...
  121.     char* _boje; //crna, bijela, siva
  122. public:
  123.     //Potrebne konstruktor i destruktor funkcije
  124.     Odjeca(char* sifra = "---", char* naziv = "---", double cijena = 0, double popust = 0, int stanje = 0, char * velicine = "---", char * boje = "---")
  125.         : Proizvod(sifra, naziv, cijena, popust, stanje)
  126.     {
  127.         int vel = strlen(velicine) + 1;
  128.         _velicine = new char[vel];
  129.         strcpy_s(_velicine, vel, velicine);
  130.  
  131.         vel = strlen(boje) + 1;
  132.         _boje = new char[vel];
  133.         strcpy_s(_boje, vel, boje);
  134.  
  135.     }
  136.  
  137.     Odjeca(const Odjeca & original) : Proizvod(original)
  138.     {
  139.         int vel = strlen(original._velicine) + 1;
  140.         _velicine = new char[vel];
  141.         strcpy_s(_velicine, vel, original._velicine);
  142.  
  143.         vel = strlen(original._boje) + 1;
  144.         _boje = new char[vel];
  145.         strcpy_s(_boje, vel, original._boje);
  146.  
  147.     }
  148.     ~Odjeca()
  149.     {
  150.         delete[] _velicine;
  151.         _velicine = NULL;
  152.         delete[] _boje;
  153.         _boje = NULL;
  154.     }
  155.  
  156.     //Funkciju Info
  157.     void Info()
  158.     {
  159.         Proizvod::Info();
  160.         cout << "Velicine: " << _velicine << endl;
  161.         cout << "Boje: " << _boje << endl;
  162.     }
  163. };
  164.  
  165.  
  166. class Katalog
  167. {
  168.     char* _naslov;
  169.     //Datum
  170.     char* _vrijediDo;
  171.     Proizvod* _proizvodi[100];
  172.     int _trenutnoProizvoda;
  173. public:
  174.     //Potrebne konstruktor i destruktor funkcije
  175.     Katalog(char * naslov, char * vrijediDo)
  176.     {
  177.         int vel = strlen(naslov) + 1;
  178.         _naslov = new char[vel];
  179.         strcpy_s(_naslov, vel, naslov);
  180.  
  181.         vel = strlen(vrijediDo) + 1;
  182.         _vrijediDo = new char[vel];
  183.         strcpy_s(_vrijediDo, vel, vrijediDo);
  184.  
  185.         _trenutnoProizvoda = 0;
  186.     }
  187.  
  188.     ~Katalog()
  189.     {
  190.         delete[] _naslov;
  191.         _naslov = NULL;
  192.         delete[] _vrijediDo;
  193.         _vrijediDo = NULL;
  194.         for(int i = 0; i < _trenutnoProizvoda; i++) {
  195.             delete _proizvodi[i];
  196.             _proizvodi[i] = NULL;
  197.         }
  198.     }
  199.     //Kreirati funkciju za dodavanje proizvoda u katalog i pri tome provjeriti da li se radi
  200.     //o objektu izvedene ili osnovne klase (rezervisati memoriju za odgovarajući tip).
  201.     //U slučaju prekoračenja baciti izuzetak
  202.     //Onemogućiti dodavanje identičnih proizvoda u jedan katalog
  203.     //Proizvode razlikovati po šifri
  204.  
  205.     void DodajProizvod(Proizvod & p)
  206.     {
  207.         if(_trenutnoProizvoda == 100)
  208.             throw NedozvoljenaOperacija("Niz je popunjen", __LINE__);
  209.         for(int i = 0; i < _trenutnoProizvoda; i++)
  210.             if(p == *_proizvodi[i])
  211.                 throw NedozvoljenaOperacija("Proizvod vec postoji", __LINE__);
  212.         Odjeca * pok;
  213.         pok = dynamic_cast<Odjeca*>(&p);
  214.         if(pok != NULL)
  215.             _proizvodi[_trenutnoProizvoda++] = new Odjeca(*pok);
  216.         else
  217.             _proizvodi[_trenutnoProizvoda++] = new Proizvod(p);
  218.     }
  219.  
  220.     //Funkciju za uklanjanje proizvoda iz kataloga na osnovu sifre
  221.     //Ukoliko se ne pronađe traženi proizvod baciti izuzetak
  222.     void UkloniProizvod(char* sifra)
  223.     {
  224.         for(int i = 0; i < _trenutnoProizvoda; i++)
  225.         {
  226.             if(strcmp(_proizvodi[i]->getSifra(), sifra) == 0) {
  227.                 delete _proizvodi[i];
  228.                 for(int j = i;  j < _trenutnoProizvoda - 1; j++) {
  229.                     _proizvodi[j] = _proizvodi[j + 1];
  230.                 }
  231.                 _trenutnoProizvoda--;
  232.                 return;
  233.             }
  234.         }
  235.         throw NedozvoljenaOperacija("Proizvod s navedenom sifrom nije nadjen", __LINE__);
  236.     }
  237.     //Preklopiti operator za ispis kataloške ponude
  238.     friend ostream & operator<< (ostream &, Katalog &);
  239. };
  240. ostream & operator<< (ostream & cout, Katalog & k)
  241. {
  242.     cout << "Naslov: " << k._naslov << endl;
  243.     cout << "Vrijedi do: " << k._vrijediDo << endl;
  244.     cout << crtice << "\t .:: Proizvodi u katalogu ::." << crtice;
  245.     if(k._trenutnoProizvoda == 0)
  246.         cout << "Nema proizvoda!" << endl;
  247.     else
  248.         for(int i = 0; i < k._trenutnoProizvoda; i++) {
  249.             k._proizvodi[i]->Info();
  250.             cout << "---------------------------" << endl;
  251.         }
  252.         return cout;
  253. }
  254.  
  255.  
  256. //Sve funkcije implementirati van klase
  257. //Baciti izuzetak po potrebi
  258. template<class T>
  259. class Stack
  260. {
  261.     int _size;
  262.     int _top;
  263.     T* _elements;
  264. public:
  265.     //Konstruktor postavlja početne vrijednosti i alocira dinamički niz elemenata tipa T
  266.     Stack(int max)
  267.     {
  268.         _size = max;
  269.         _top = 0;
  270.         _elements = new T[_size];
  271.     }
  272.     ~Stack()
  273.     {
  274.         delete [] _elements;
  275.         _elements = NULL;
  276.     }
  277.  
  278.  
  279.     //Provjeravaju stanje na stack-u, prazan ili popunjen
  280.     //Iskoristiti prilikom implementacije funkcija Push i Pop
  281.     bool IsEmpty()const
  282.     {
  283.         return _top == 0;
  284.     }
  285.     bool IsFull()const
  286.     {
  287.         return _top == _size;
  288.     }
  289.     //Dodaje novi element na stack
  290.     void Push(const T& element)
  291.     {
  292.         if(IsFull())
  293.             throw NedozvoljenaOperacija("Stack je pun", __LINE__);
  294.         _elements[_top++] = element;
  295.     }
  296.  
  297.     //Uzima posljednji element sa stack-a
  298.     T Pop(){
  299.         if(IsEmpty())
  300.             throw NedozvoljenaOperacija("Stack je prazan", __LINE__);
  301.         return _elements[--_top];
  302.     }
  303.  
  304.     //Vraća broj elemenata na stack-u
  305.     int GetSize()const {
  306.         return _top;
  307.     }
  308.  
  309.     //Vraća element sa stack-a na poziciji indeks (pozicije počinju od 1)
  310.     T operator[](int indeks)const{
  311.         if(indeks < 1 || indeks > _top)
  312.             throw NedozvoljenaOperacija("Nije validan indeks", __LINE__);
  313.         return _elements[indeks - 1];
  314.     }
  315.  
  316.     //Operator za ispis elemenata na stack-u
  317.     friend ostream& operator <<<>(ostream &, Stack<T> &);
  318. };
  319.  
  320. template<class T>
  321. ostream& operator << (ostream &, Stack<T> & s)
  322. {
  323.     for(int i = 0; i < _top; i++) {
  324.         cout << _elements[i];
  325.         cout << "----------------------";
  326.     }
  327.     return cout;
  328. }
  329.  
  330. class Uposlenik
  331. {
  332.     char* _imePrezime;
  333.     char* _radnoMjesto;
  334. public:
  335.     //Potrebne konstruktor i destruktor funkcije
  336.     Uposlenik(char* imePrezime, char* radnoMjesto)
  337.     {
  338.         int vel = strlen(imePrezime) + 1;
  339.         _imePrezime = new char[vel];
  340.         strcpy_s(_imePrezime, vel, imePrezime);
  341.  
  342.         vel = strlen(radnoMjesto) + 1;
  343.         _radnoMjesto = new char[vel];
  344.         strcpy_s(_radnoMjesto, vel, radnoMjesto);
  345.     }
  346.  
  347.     Uposlenik(const Uposlenik& original)
  348.     {
  349.         int vel = strlen(original._imePrezime) + 1;
  350.         _imePrezime = new char[vel];
  351.         strcpy_s(_imePrezime, vel, original._imePrezime);
  352.  
  353.         vel = strlen(original._radnoMjesto) + 1;
  354.         _radnoMjesto = new char[vel];
  355.         strcpy_s(_radnoMjesto, vel, original._radnoMjesto);
  356.     }
  357.  
  358.     char * getRadnoMjesto() const { return _radnoMjesto; }
  359.  
  360.     ~Uposlenik()
  361.     {
  362.         delete[] _imePrezime;
  363.         _imePrezime = NULL;
  364.         delete[] _radnoMjesto;
  365.         _radnoMjesto = NULL;
  366.     }
  367.     friend ostream& operator << (ostream&, Uposlenik&);
  368. };
  369.  
  370. ostream& operator << (ostream& cout, Uposlenik& obj)
  371. {
  372.     cout << obj._imePrezime << " - " << obj._radnoMjesto << endl;
  373.     return cout;
  374.  
  375. }
  376. class Narudzba
  377. {
  378.     int _brojNarudzbe;
  379.     char* _datumIsporuke;
  380.     Uposlenik* _uposlenik;
  381.     Stack<Proizvod>* _proizvodi;
  382.     int * _kolicineProizvoda;
  383.     int _brojProizvoda;
  384. public:
  385.     //Potrebne konstruktor i destruktor funkcije
  386.     //Narudžbu može izdati samo uposlenik sa radnim mjestom "Prodavač". U suprotnom baciti izuzetak.
  387.     Narudzba(int brojNarudzbe, char * datumIsporuke, Uposlenik & u, int brojProizvoda)
  388.     {
  389.         if(strcmp(u.getRadnoMjesto(), "Prodavac") != 0)
  390.             throw NedozvoljenaOperacija("Radnik mora biti 'Prodavac'", __LINE__);
  391.         if(brojProizvoda < 1)
  392.             throw NedozvoljenaOperacija("Broj proizvoda po narudzbi mora biti najmanje 1", __LINE__);
  393.        
  394.         _brojNarudzbe = brojNarudzbe;
  395.  
  396.         int vel = strlen(datumIsporuke) + 1;
  397.         _datumIsporuke = new char[vel];
  398.         strcpy_s(_datumIsporuke, vel, datumIsporuke);
  399.  
  400.         _brojProizvoda = brojProizvoda;
  401.  
  402.         _uposlenik = new Uposlenik(u);
  403.         _proizvodi = new Stack<Proizvod>(_brojProizvoda);
  404.         _kolicineProizvoda = new int[_brojProizvoda];
  405.     }
  406.     //Kreirati funkciju za dodavanje proizvoda narudžbe
  407.     //Ukoliko proizvod više nije dostupan baciti izuzetak.
  408.     //Dozvoliti dodavanje istog proizvoda više puta (po potrebi dopuniti atribute odgovarajuće klase)
  409.  
  410.     void DodajProizvod(Proizvod &p, int kolicina = 1)
  411.     {
  412.         if(p.getStanje() < kolicina)
  413.             throw NedozvoljenaOperacija("Nema dovoljno na stanju", __LINE__);
  414.         for(int i = 1; i <= _proizvodi->GetSize(); i++)
  415.             if((*_proizvodi)[i] == p) {
  416.                 _kolicineProizvoda[i-1] += kolicina;
  417.                 return;
  418.             }
  419.             _proizvodi->Push(p);
  420.             _kolicineProizvoda[_proizvodi->GetSize() - 1] = kolicina;
  421.             p -= kolicina;
  422.     }
  423.  
  424.     //Funkciju za uklanjanje proizvoda iz narudžbe
  425.     void UkloniProizvod()
  426.     {
  427.         _proizvodi->Pop();
  428.     }
  429.     //Dodati funkciju za proračun ukupne cijene narudžbe
  430.     //Voditi računa o mogućnosti dodavanja više istih proizvoda
  431.     //Uračunati popust u slučaju da je definisan
  432.     double getUkupno()
  433.     {
  434.         double ukupno = 0, popust = 0;
  435.         for(int i = 1; i <= _proizvodi->GetSize(); i++) {
  436.             if((*_proizvodi)[i].getPopust() > 0) {
  437.                 popust = (*_proizvodi)[i].getCijena() * (*_proizvodi)[i].getPopust()/100;
  438.                 ukupno += ((*_proizvodi)[i].getCijena() * _kolicineProizvoda[i-1]) - popust * _kolicineProizvoda[i-1];
  439.             }
  440.             else
  441.                 ukupno += (*_proizvodi)[i].getCijena() * _kolicineProizvoda[i-1];
  442.         }
  443.         return ukupno;
  444.     }
  445.  
  446.  
  447.     //Preklopiti operator za ispis podataka o narudžbi zajedno sa cijenom
  448.     friend ostream& operator << (ostream&, Narudzba&);
  449. };
  450.  
  451. ostream& operator << (ostream& cout, Narudzba& obj)
  452. {
  453.     cout << "Broj narudzbe: " << obj._brojNarudzbe << endl;
  454.     cout << "Datum isporuke: " << obj._datumIsporuke << endl;
  455.     cout << "Uposlenik: " << *obj._uposlenik<< endl;
  456.     cout << crtice << "\t .:: Proizvodi ::." << crtice;
  457.     for(int i = 1; i <= obj._proizvodi->GetSize(); i++)
  458.     {
  459.         (*obj._proizvodi)[i].Info();
  460.         cout << "Kolicina: " << obj._kolicineProizvoda[i-1] << endl;
  461.         cout <<"---------------------------" << endl;
  462.     }
  463.     cout << crtice << "Ukupan iznos: " << obj.getUkupno() <<" KM." << endl;
  464.     return cout;
  465. }
  466.  
  467. void main()
  468. {
  469.     //Dodati minimalno 5 proizvoda u katalog
  470.     //Ispisati ponudu kupcu
  471.     //Omogućiti kreiranje narudžbe na osnovu izbora kupca
  472.  
  473.     Katalog k("Mepas Daily Shopping", "15.1.2015. god.");
  474.     Proizvod p1("1111", "Milka", 2.20, 0, 30);
  475.     Proizvod p2("2222", "Juice", 2.80, 0, 50);
  476.     Proizvod p3("3333", "Pizza", 6, 0, 30);
  477.     Odjeca o1("4444", "Majica", 35, 10, 20, "S, M, L", "crna, bijela");
  478.     Odjeca o2("5555", "Hlace", 60, 10, 15, "39/40, 41/42", "crna, siva");
  479.     Odjeca o3("6666","Zimska jakna", 90, 0, 20,"L, XL, XXL", "crna, plava");
  480.     Odjeca o4("7777","Kosulja", 55, 0, 30,"M, L, XL", "crvena, siva");
  481.  
  482.     k.DodajProizvod(p1);
  483.     k.DodajProizvod(p2);
  484.     k.DodajProizvod(p3);
  485.     k.DodajProizvod(o1);
  486.     k.DodajProizvod(o2);
  487.     k.UkloniProizvod("4444");
  488.     k.DodajProizvod(o3);
  489.     k.DodajProizvod(o4);
  490.  
  491.     cout << k << endl;
  492.  
  493.     try {
  494.         //Ovdje nece biti uhvacen izuzetak osim ako se ne doda vise elemenata
  495.         //nego sto u stek moze stati (max = 6 u ovom slucaju), a dodali smo 4
  496.         //jer smo jedan obrisali, za testiranje ispisa greske smanjite max na 3
  497.         //ili nize
  498.  
  499.         Narudzba n(1, "30.12.2014. god.", Uposlenik("Igor B.", "Prodavac"), 6);
  500.  
  501.         n.DodajProizvod(p1, 5);
  502.         n.DodajProizvod(p1, 5);
  503.         n.DodajProizvod(p3, 10);
  504.         n.DodajProizvod(o2, 10); // do ovog artikla iznos je: 622 KM
  505.         n.DodajProizvod(o4, 1); // do ovog artikla iznos je: 677 KM
  506.         n.UkloniProizvod();
  507.  
  508.         cout << n << endl; // ukupno 622 KM jer smo uklonili zadnji proizvod
  509.  
  510.     }
  511.     catch(NedozvoljenaOperacija & n)
  512.     {
  513.         n.ErrorInfo();
  514.     }
  515.  
  516.     cout << crtice << "Hvatanje izuzetaka..." << crtice;
  517.     try
  518.     {
  519.         //Cijena ne smije biti negativna
  520.         Proizvod test("1234", "Test", -20, 0, 5);
  521.     }
  522.     catch(NedozvoljenaOperacija& n)
  523.     {
  524.         n.ErrorInfo();
  525.     }
  526.  
  527.     try
  528.     {
  529.         //Proizvod ne smije imati popust veci od 100 (u ovom slucaju 120)
  530.         //niti manji od 0
  531.         Proizvod testP("1234", "Test", 20, 120, 5);
  532.     }
  533.     catch(NedozvoljenaOperacija& n)
  534.     {
  535.         n.ErrorInfo();
  536.     }
  537.  
  538.     try
  539.     {
  540.         //Radnik mora biti prodavac da bi narudzba bila kreirana
  541.         Narudzba testN(2, "22.1.2015. god.", Uposlenik("Almin L.", "Menadzer"),20);
  542.     }
  543.     catch(NedozvoljenaOperacija& n)
  544.     {
  545.         n.ErrorInfo();
  546.     }
  547.  
  548. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement