Advertisement
developer10

Zadatak :: KataloskaProdaja :: v1.0

Jan 11th, 2016
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include<iostream>
  2. #include<exception>
  3.  
  4. using namespace std;
  5.  
  6.  
  7.  
  8. class NedozvoljenaOperacija :public exception
  9. {
  10.     char* poruka;
  11.     int linijaKoda;
  12. public:
  13.     //Konstruktor sa dva parametra (poruka i linija koda u kojoj je greška nastala)
  14.     NedozvoljenaOperacija(char* poruka="<poruka>", int lin=-1)
  15.     {
  16.         int size = strlen(poruka) + 1;
  17.         this->poruka = new char[size];
  18.         strcpy_s(this->poruka, size, poruka);
  19.  
  20.         linijaKoda = lin;
  21.     }
  22.  
  23.     //Funkcija za ispis informacija o nastaloj grešci
  24.     void ErrorInfo()
  25.     {
  26.         cout << "GRESKA >>> " << poruka << " -- linija >>> " << linijaKoda << endl << endl;
  27.     }
  28. };
  29.  
  30. //KATALOŠKA PRODAJA
  31. class Proizvod
  32. {
  33.     char _sifra[10];
  34.     char* _naziv;
  35.     double _cijena;
  36.     double _popust;
  37. public:
  38.     //Potrebne konstruktor i destruktor funkcije
  39.     //U slučaju nedozvoljenih vrijednosti za cijenu i popust baciti izuzetak
  40.     Proizvod(char* sifra = "<sif>", char* naziv = "<naz>", double cijena=-1, double popust=-1)
  41.     {
  42.         //Dopuniti dato rješenje
  43.         strncpy_s(_sifra, sifra, _TRUNCATE);
  44.  
  45.         int vel = strlen(naziv) + 1;
  46.         _naziv = new char[vel];
  47.         strcpy_s(_naziv, vel, naziv);
  48.  
  49.         _cijena = cijena;
  50.         _popust = popust;
  51.     }
  52.  
  53.     virtual ~Proizvod()
  54.     {
  55.         delete[] _naziv; _naziv = NULL;
  56.     }
  57.  
  58.     Proizvod(const Proizvod& orig)
  59.     {
  60.         strncpy_s(_sifra, orig._sifra, _TRUNCATE);
  61.  
  62.         int vel = strlen(orig._naziv) + 1;
  63.         _naziv = new char[vel];
  64.         strcpy_s(_naziv, vel, orig._naziv);
  65.  
  66.         _cijena = orig._cijena;
  67.         _popust = orig._popust;
  68.     }
  69.  
  70.  
  71.     Proizvod& operator=(const Proizvod& orig)
  72.     {
  73.         if (this == &orig)
  74.             return *this;
  75.        
  76.         strncpy_s(_sifra, orig._sifra, _TRUNCATE);
  77.  
  78.         delete[] _naziv;
  79.  
  80.         int vel = strlen(orig._naziv) + 1;
  81.         _naziv = new char[vel];
  82.         strcpy_s(_naziv, vel, orig._naziv);
  83.  
  84.         _cijena = orig._cijena;
  85.         _popust = orig._popust;
  86.  
  87.         return *this;
  88.     }
  89.  
  90.  
  91.     //Funkciju Info
  92.     virtual void Info()
  93.     {
  94.         cout << "Sifra: " << _sifra << endl;
  95.         cout << "Naziv: \t" << _naziv << endl;
  96.         cout << "Cijena: " << _cijena << endl;
  97.         cout << "Popust: " << _popust << endl;
  98.     }
  99.  
  100.     char* GetSifra()const
  101.     {
  102.         int size = strlen(_sifra) + 1;
  103.         char* sifra = new char[size];
  104.         strcpy_s(sifra, size, _sifra);
  105.  
  106.         return sifra;
  107.     }
  108.  
  109.     double GetCijena()const { return _cijena; }
  110.     double GetPopust()const { return _popust; }
  111.  
  112.     friend ostream& operator<<(ostream&, const Proizvod&);
  113. };
  114.  
  115. ostream& operator<<(ostream& COUT, const Proizvod& obj)
  116. {
  117.     cout << "Sifraa: " << obj._sifra << endl;
  118.     cout << "Nazivv: \t" << obj._naziv << endl;
  119.     cout << "Cijenaa: " << obj._cijena << endl;
  120.     cout << "Popustt: " << obj._popust << endl;
  121.  
  122.     return COUT;
  123. }
  124.  
  125. //Implementirati nasljeđivanje
  126. class Odjeca :public Proizvod
  127. {
  128.     char* _velicine;        // 34, 36, 38 ili XS, S, M...
  129.     char* _boje;            // crna, bijela, siva
  130. public:
  131.     //Potrebne konstruktor i destruktor funkcije   
  132.  
  133.     Odjeca(char* sifra = "<sif>", char* naziv = "<naz>", double cijena = -1,
  134.         double popust = -1, char* velicine = "<vel>", char* boje = "<boj>") :Proizvod(sifra, naziv, cijena, popust)
  135.     {
  136.         int vel = strlen(velicine) + 1;
  137.         _velicine = new char[vel];
  138.         strcpy_s(_velicine, vel, velicine);
  139.  
  140.         vel = strlen(boje) + 1;
  141.         _boje = new char[vel];
  142.         strcpy_s(_boje, vel, boje);
  143.     }
  144.  
  145.     ~Odjeca() { delete[] _velicine, _boje; _velicine = _boje = NULL; }
  146.  
  147.     Odjeca(const Odjeca& orig) :Proizvod(orig)
  148.     {
  149.         int vel = strlen(orig._velicine) + 1;
  150.         _velicine = new char[vel];
  151.         strcpy_s(_velicine, vel, orig._velicine);
  152.  
  153.         vel = strlen(orig._boje) + 1;
  154.         _boje = new char[vel];
  155.         strcpy_s(_boje, vel, orig._boje);
  156.     }
  157.  
  158.     //Funkciju Info
  159.     void Info()
  160.     {
  161.         Proizvod::Info();
  162.         cout << "Velicine: " << _velicine << endl;
  163.         cout << "Boje: " << _boje << endl;
  164.     }
  165.  
  166.     friend ostream& operator<<(ostream&, Odjeca&);
  167. };
  168.  
  169. ostream& operator<<(ostream& COUT, Odjeca& obj)
  170. {
  171.     obj.Info();
  172.     cout << "Velicine: " << obj._velicine << endl;
  173.     cout << "Boje: " << obj._boje << endl;
  174.  
  175.     return COUT;
  176. }
  177.  
  178. class Katalog
  179. {
  180.     char* _naslov;
  181.     char* _vrijediDo;   //Datum
  182.     Proizvod* _proizvodi[100];
  183.     int _trenutnoProizvoda;
  184. public:
  185.     //Potrebne konstruktor i destruktor funkcije
  186.     Katalog(char* naslov="<nas>", char* vrijediDo="<vri>")
  187.     {
  188.         int size = strlen(naslov) + 1;
  189.         _naslov = new char[size];
  190.         strcpy_s(_naslov, size, naslov);
  191.  
  192.         size = strlen(vrijediDo) + 1;
  193.         _vrijediDo = new char[size];
  194.         strcpy_s(_vrijediDo, size, vrijediDo);
  195.  
  196.         for (int i = 0; i < 100; i++)
  197.             _proizvodi[i] = NULL;
  198.  
  199.         _trenutnoProizvoda = 0;
  200.     }
  201.     ~Katalog()
  202.     {
  203.         delete[] _naslov, _vrijediDo;
  204.         for (int i = 0; _proizvodi[i] != NULL; i++){
  205.             delete _proizvodi[i];
  206.             _proizvodi[i] = nullptr;
  207.         }
  208.     }
  209.  
  210.     // Kreirati funkciju za dodavanje proizvoda u katalog i pri tome provjeriti da li se radi
  211.     //      o objektu izvedene ili osnovne klase (rezervisati memoriju za odgovarajući tip).
  212.     // U slučaju prekoračenja baciti izuzetak
  213.     // Onemogućiti dodavanje identičnih proizvoda u jedan katalog
  214.     // Proizvode razlikovati po šifri
  215.     bool DodajUKatalog(Proizvod& obj)
  216.     {
  217.         if (_trenutnoProizvoda == 100)
  218.             throw NedozvoljenaOperacija("Mjesta za proizvode su popunjena.", __LINE__);
  219.        
  220.         //bool isJedinstven = true;
  221.  
  222.         for (int i = 0; i < _trenutnoProizvoda; i++)
  223.             if (strcmp(_proizvodi[i]->GetSifra(), obj.GetSifra()) == 0)
  224.                 return false;
  225.  
  226.  
  227.         Odjeca* pok = NULL;
  228.         pok = dynamic_cast<Odjeca*>(&obj);
  229.  
  230.         if (pok != NULL)
  231.             _proizvodi[_trenutnoProizvoda++] = new Odjeca(*pok);
  232.         else
  233.             _proizvodi[_trenutnoProizvoda++] = new Proizvod(obj);
  234.  
  235.  
  236.         return true;
  237.     }
  238.  
  239.     //bool UporediSifre(char* s1, char* s2)
  240.     //{
  241.     //  return (strcmp(s1, s2) == 0);
  242.     //}
  243.  
  244.     // Funkciju za uklanjanje proizvoda iz kataloga na osnovu sifre
  245.     // Ukoliko se ne pronađe traženi proizvod baciti izuzetak
  246.     bool UkloniIzKataloga(char* sifra)
  247.     {
  248.         for (int i = 0; i < _trenutnoProizvoda; i++)
  249.         {
  250.             if (strcmp(_proizvodi[i]->GetSifra(), sifra) == 0)
  251.             {
  252.                 for (int j = i; j < _trenutnoProizvoda - 1; j++)
  253.                     _proizvodi[j] = _proizvodi[j + 1];
  254.                
  255.                 _trenutnoProizvoda--;
  256.                 _proizvodi[_trenutnoProizvoda] = new Proizvod;
  257.  
  258.                 return true;
  259.             }
  260.         }
  261.  
  262.         return false;
  263.     }
  264.  
  265.  
  266.     //Preklopiti operator za ispis kataloške ponude
  267.     friend ostream& operator<<(ostream&, const Katalog&);
  268. };
  269.  
  270. ostream& operator<<(ostream& COUT, const Katalog& obj)
  271. {
  272.     COUT << "\tKATALOG " << obj._naslov << " <vrijedi do: " << obj._vrijediDo << ">" << endl;
  273.     COUT << "=========================================\n" << endl;
  274.  
  275.     for (int i = 0; i < obj._trenutnoProizvoda; i++)
  276.     {
  277.         COUT << i << ". ";
  278.         obj._proizvodi[i]->Info();
  279.         COUT << "-------------------------------------" << endl;
  280.     }
  281.  
  282.     return COUT;
  283. }
  284.  
  285.  
  286. //Sve funkcije implementirati van klase
  287. //Baciti izuzetak po potrebi
  288. template<class T>
  289. class Stack
  290. {
  291.     int _size;
  292.     int _top;
  293.     T* _elements;
  294. public:
  295.     //Konstruktor postavlja početne vrijednosti i alocira dinamički niz elemenata tipa T
  296.     Stack(int vel);
  297.     ~Stack();
  298.  
  299.     //Provjeravaju stanje na stack-u, prazan ili popunjen
  300.     //Iskoristiti prilikom implementacije funkcija Push i Pop
  301.     bool IsEmpty()const;
  302.     bool IsFull()const;
  303.  
  304.     //Dodaje novi element na stack
  305.     void Push(const T& element);
  306.  
  307.     //Uzima posljednji element sa stack-a
  308.     T Pop();
  309.  
  310.  
  311.     //Vraća broj elemenata na stack-u
  312.     int GetSize()const;
  313.  
  314.     //Vraća element sa stack-a na poziciji indeks (pozicije počinju od 1)
  315.     T operator[](int indeks)const;
  316.  
  317.     //Operator za ispis elemenata na stack-u
  318.     void Info();
  319.  
  320.     friend ostream& operator<< <>(ostream& COUT, Stack<T>& obj)
  321.     {
  322.         Odjeca* pok = NULL;
  323.  
  324.         for (int i = 0; i < obj.GetSize(); i++)
  325.         {
  326.             //cout << i << ". " << &obj._elements[i] << endl;
  327.  
  328.             pok = dynamic_cast<Odjeca*>( &(obj._elements[i]) );
  329.  
  330.             if (pok != NULL){
  331.                 cout << "Odjeca called" << endl;
  332.                 pok->Info();
  333.             }
  334.             else{
  335.                
  336.                 COUT << obj._elements[i] << endl;
  337.             }
  338.         }
  339.         return COUT;
  340.     }
  341.  
  342.  
  343.     friend ostream& operator<< <>(ostream& COUT, Stack<Odjeca>& obj)
  344.     {
  345.         COUT << "Test odjeca" << endl;
  346.  
  347.         return COUT;
  348.     }
  349.  
  350.     T GetElements(){ return _elements[2]; }
  351.  
  352. };
  353.  
  354. template<class T>
  355. Stack<T>::Stack(int vel = 20)
  356. {
  357.     _size = vel;
  358.     _top = 0;
  359.     _elements = new T[_size];
  360. }
  361.  
  362. template<class T>
  363. Stack<T>::~Stack(){ delete _elements; _elements = nullptr; }
  364.  
  365. //template<class T>
  366. //Stack<T>::Stack(const Stack<T>& orig)
  367. //{
  368. //  _size = orig._size;
  369. //  _top = orig._top;
  370. //  _elements = new T[_size];
  371. //  for (int i = 0; i < _size; i++)
  372. //      _elements[i] = orig._elements[i];
  373. //}
  374.  
  375. /** ==================================================== **/
  376.  
  377. template<class T>
  378. void Stack<T>::Push(const T& e)
  379. {
  380.     if (IsFull())
  381.         throw NedozvoljenaOperacija("Stack je pun, nije moguce dodati novi element", __LINE__);
  382.    
  383.     _elements[_top++] = e;
  384. }
  385.  
  386. template<class T>
  387. T Stack<T>::Pop()
  388. {
  389.     if (IsEmpty())
  390.         throw NedozvoljenaOperacija("Stack je prazan, nije moguce ukloniti element.", __LINE__);
  391.  
  392.     return _elements[_top--];
  393. }
  394.  
  395. /** ==================================================== **/
  396.  
  397. template<class T>
  398. T Stack<T>::operator[](int indeks)const
  399. {
  400.     if (indeks < 0 || indeks > _size || indeks > _top)
  401.         throw NedozvoljenaOperacija("Nije moguce dohvatanje s te pozicije!", __LINE__);
  402.    
  403.     return _elements[indeks];
  404. }
  405.  
  406. /** ==================================================== **/
  407.  
  408. template<class T>
  409. bool Stack<T>::IsEmpty()const { return _top == 0; }
  410.  
  411. template<class T>
  412. bool Stack<T>::IsFull()const { return _top == _size; }
  413.  
  414. template<class T>
  415. int Stack<T>::GetSize()const { return _top; }
  416.  
  417.  
  418. template<class T>
  419. void Stack<T>::Info()
  420. {
  421.     for (int i = 0; i < _top; i++)
  422.         cout << _elements[i] << endl;
  423. }
  424.  
  425. /** ==================== S T A C K ================== **/
  426.  
  427.  
  428. class Uposlenik
  429. {
  430.     char* _imePrezime;
  431.     char* _radnoMjesto;
  432. public:
  433.     //Potrebne konstruktor i destruktor funkcije
  434.     Uposlenik(char* imePrezime="<ime prezime>", char* radnoMjesto="<radno mjesto>")
  435.     {
  436.         int vel = strlen(imePrezime) + 1;
  437.         _imePrezime = new char[vel];
  438.         strcpy_s(_imePrezime, vel, imePrezime);
  439.  
  440.         vel = strlen(radnoMjesto) + 1;
  441.         _radnoMjesto = new char[vel];
  442.         strcpy_s(_radnoMjesto, vel, radnoMjesto);
  443.     }
  444.  
  445.     ~Uposlenik() { delete[] _imePrezime, _radnoMjesto; _imePrezime = _radnoMjesto = NULL; }
  446.  
  447.     Uposlenik(const Uposlenik& orig)
  448.     {
  449.         int vel = strlen(orig._imePrezime) + 1;
  450.         _imePrezime = new char[vel];
  451.         strcpy_s(_imePrezime, vel, orig._imePrezime);
  452.  
  453.         vel = strlen(orig._radnoMjesto) + 1;
  454.         _radnoMjesto = new char[vel];
  455.         strcpy_s(_radnoMjesto, vel, orig._radnoMjesto);
  456.     }
  457.  
  458.     char* GetRadnoMjesto()const { return _radnoMjesto; }
  459.  
  460. };
  461.  
  462. class Narudzba
  463. {
  464.     int _brojNarudzbe;
  465.     char* _datumIsporuke;
  466.     Uposlenik* _uposlenik;
  467.     Stack<Proizvod>* _proizvodi;
  468.     int _brojProizvoda;
  469. public:
  470.     //Potrebne konstruktor i destruktor funkcije
  471.     //Narudžbu može izdati samo uposlenik sa radnim mjestom "Prodavač".
  472.     //  U suprotnom baciti izuzetak.
  473.     Narudzba(int brNarudz = -1, char* datumIsporuke = "<datum isporuke>", Uposlenik uposlenik=Uposlenik())
  474.     {
  475.         if (!strcmp(uposlenik.GetRadnoMjesto(), "Prodavac") == 0)
  476.             throw NedozvoljenaOperacija("Narudzba ne moze biti kreirana!", __LINE__);
  477.  
  478.         _brojNarudzbe = brNarudz;
  479.        
  480.         int size = strlen(datumIsporuke) + 1;
  481.         _datumIsporuke = new char[size];
  482.         strcpy_s(_datumIsporuke, size, datumIsporuke);
  483.  
  484.         _uposlenik = new Uposlenik(uposlenik);
  485.  
  486.         _proizvodi = new Stack<Proizvod>(100);
  487.  
  488.         _brojProizvoda = 0;
  489.     }
  490.  
  491.     Stack<Proizvod>* GetProizvodi(){ return _proizvodi; }
  492.  
  493.     // Kreirati funkciju za dodavanje proizvoda narudžbe
  494.     //  Ukoliko proizvod više nije dostupan baciti izuzetak.
  495.     //  Dozvoliti dodavanje istog proizvoda više puta (po potrebi dopuniti atribute odgovarajuće klase)
  496.     void NaruciProizvod(const Proizvod& obj)
  497.     {
  498.         _proizvodi->Push(obj);
  499.         _brojProizvoda++;
  500.     }
  501.  
  502.     // Funkciju za uklanjanje proizvoda iz narudžbe
  503.  
  504.  
  505.     // Dodati funkciju za proračun ukupne cijene narudžbe
  506.     //  Voditi računa o mogućnosti dodavanja više istih proizvoda
  507.     //  Uračunati popust u slučaju da je definisan
  508.     double Obracunaj()
  509.     {
  510.         double cijena = 0, popust = 0, ukupnoSPopustom = 0;
  511.  
  512.         for (int i = 0; i < _brojProizvoda; i++)
  513.         {
  514.             cijena = (*_proizvodi)[i].GetCijena();
  515.             popust = (*_proizvodi)[i].GetPopust();
  516.             ukupnoSPopustom += cijena - (cijena * popust);
  517.         }
  518.  
  519.         return ukupnoSPopustom;
  520.     }
  521.  
  522.     // Preklopiti operator za ispis podataka o narudžbi zajedno sa cijenom
  523.     friend ostream& operator<<(ostream&, Narudzba&);
  524. };
  525.  
  526. ostream& operator<<(ostream& COUT, Narudzba& obj)
  527. {
  528.     COUT << "Br. narudzbe: " << obj._brojNarudzbe << endl;
  529.     COUT << "Narudzbu izdao: " << obj._uposlenik->GetRadnoMjesto() << endl;
  530.     COUT << "Isporuciti na dan: " << obj._datumIsporuke << endl;
  531.     COUT << "Ukupno proizvoda: " << obj._brojProizvoda << endl << endl;
  532.     COUT << "===== PROIZVODI U NARUDZBI =====" << endl;
  533.  
  534.     //obj._proizvodi->Info();
  535.     COUT << *obj._proizvodi;
  536.  
  537.     COUT << "UKUPNO S OBRACUNATIM POPUSTOM: " << obj.Obracunaj() << endl;
  538.  
  539.     return COUT;
  540. }
  541.  
  542. void main()
  543. {
  544.     try{
  545.  
  546.  
  547.         Katalog kat("\"LJETO 2016\"", "30.04.2016");
  548.  
  549.         Proizvod p1("gz214", "Stolna lampa", 49, 0.03);
  550.         Proizvod p2("rd874", "Stolica kuhinjska", 74, 0.04);
  551.         Odjeca o1("od765", "Dukserica", 45, 0.15, "XS, S, M, XL", "crna, crvena, bijela");
  552.         Proizvod p3("iu852", "Vjesalica zidna", 8, 0.12);
  553.         Odjeca o2("od112", "Majica", 35, 0.05, "M, S, X, XL, XXL", "crna, plava, zelena, bijela");
  554.  
  555.         // Dodati minimalno 5 proizvoda u katalog
  556.         kat.DodajUKatalog(p1);
  557.         kat.DodajUKatalog(p2);
  558.         kat.DodajUKatalog(p3);
  559.         //kat.DodajUKatalog(o2);
  560.         //kat.DodajUKatalog(o1);
  561.  
  562.         kat.UkloniIzKataloga("rd874");
  563.  
  564.         // Ispisati ponudu kupcu
  565.         cout << kat << endl;
  566.  
  567.  
  568.  
  569.         Uposlenik u("Denis Kajdic", "Prodavac");
  570.  
  571.         Narudzba narudzba(1, "11.3.2016", u);
  572.  
  573.         narudzba.NaruciProizvod(p1);
  574.         narudzba.NaruciProizvod(p3);
  575.         narudzba.NaruciProizvod(o2);
  576.  
  577.         Stack<Proizvod>* foo = narudzba.GetProizvodi();
  578.  
  579.         cout << "===========================" << endl;
  580.         cout << foo->GetElements() << endl;
  581.         cout << "===========================" << endl;
  582.  
  583.         cout << narudzba << endl;
  584.  
  585.         cout << "\n";
  586.  
  587.     }
  588.     catch(NedozvoljenaOperacija& err){
  589.         err.ErrorInfo();
  590.     }
  591.  
  592.     cout << endl;
  593.  
  594.    
  595.    
  596.     // Omogućiti kreiranje narudžbe na osnovu izbora kupca
  597. }
  598.  
  599.  
  600.  
  601. /*
  602. Stack<double> stek(4);
  603. stek.Push(3.14);
  604. stek.Push(287.00);
  605. stek.Push(54.08);
  606. stek.Push(22.74);
  607. stek.Push(11.02);
  608. stek.Info();
  609. stek.Push(8.89);
  610. stek.Info();
  611.  
  612.  
  613. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement