daily pastebin goal
20%
SHARE
TWEET

Untitled

a guest Jan 12th, 2018 53 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. char *crt = "\n---------------------------------------\n";
  5.  
  6.  
  7.  
  8. class NedozvoljenaOperacija : public exception {
  9.     int linijaKoda;
  10. public:
  11.     NedozvoljenaOperacija(const char * poruka, int lin) :exception(poruka) {
  12.         linijaKoda = lin;
  13.     }
  14.     void ErrorInfo() { cout << "Greska: " << exception::what() << " Linija koda: " << linijaKoda << endl; }
  15. };
  16. char *UpisiString(char *tekst) {
  17.     int size = strlen(tekst) + 1;
  18.     char *temp = new char[size];
  19.     strcpy_s(temp, size, tekst);
  20.     return temp;
  21. }
  22.  
  23. //Kataloška prodaja
  24. class Proizvod
  25. {
  26. protected:
  27.     char _sifra[10];
  28.     char* _naziv;
  29.     double _cijena;
  30.     double _popust; //Izrazen procentualno
  31.     int _kolicina;//Dostupno proizvoda
  32. public:
  33.     //Konstruktor i destruktor funkcije
  34.  
  35.     Proizvod() { strcpy_s(_sifra, "---"); strcpy_s(_naziv, 6, "-----"); _cijena = 0; _popust = 0; }
  36.  
  37.     Proizvod(const char* sifra, const char* naziv, double cijena, int kolicina, double popust = 0)
  38.     {
  39.         //U slučaju nedozvoljenih vrijednosti za cijenu, popust i količinu baciti izuzetak
  40.  
  41.         strncpy_s(_sifra, sifra, _TRUNCATE);
  42.  
  43.         int size = strlen(naziv) + 1;
  44.         _naziv = new char[size];
  45.         strcpy_s(_naziv, size, naziv);
  46.  
  47.         _cijena = cijena;
  48.         _kolicina = kolicina;
  49.         _popust = popust;
  50.     }
  51.  
  52.     Proizvod(const Proizvod& obj) {
  53.         strncpy_s(_sifra, obj._sifra, _TRUNCATE);
  54.         _naziv = UpisiString(obj._naziv);
  55.         _cijena = obj._cijena;
  56.         _popust = obj._popust;
  57.         _kolicina = obj._kolicina;
  58.     }
  59.  
  60.     Proizvod &operator=(const Proizvod&obj) {
  61.         if (this != &obj) {
  62.             this->~Proizvod();
  63.             strncpy_s(_sifra, obj._sifra, _TRUNCATE);
  64.             _naziv = UpisiString(obj._naziv);
  65.             _cijena = obj._cijena;
  66.             _popust = obj._popust;
  67.             _kolicina = obj._kolicina;
  68.         }
  69.         return *this;
  70.     }
  71.     virtual ~Proizvod()
  72.     {
  73.         delete[] _naziv;
  74.         _naziv = nullptr;
  75.     }
  76.  
  77.     //Implementirati potrebne funkcije za rad sa klasom
  78.  
  79.     double GetCijena() { return _cijena; }
  80.     double GetPopust() { return _popust; }
  81.     char *GetNaziv() { return _naziv; }
  82.     int GetKolicina() { return _kolicina; }
  83.     char *GetSifra() { return _sifra; }
  84.  
  85.     void SetKolicina(int kolicina) {
  86.         if (kolicina > 0 && kolicina < _kolicina) {
  87.             _kolicina -= kolicina;
  88.         }
  89.     }
  90.     friend ostream& operator<<(ostream&, Proizvod&);
  91. };
  92.  
  93. ostream& operator<<(ostream& COUT, Proizvod& obj) {
  94.     COUT << "Sifra proizvoda: " << obj._sifra << endl;
  95.     COUT << "Naziv proizvoda: " << obj._naziv << endl;
  96.     COUT << "Cijena: " << obj._cijena << endl;
  97.     COUT << "Kolicina: " << obj._kolicina << endl;
  98.     COUT << "Popust: " << obj._popust << crt;
  99.  
  100.     return COUT;
  101.  
  102. }
  103. //Implementirati nasljeđivanje
  104. class Odjeca : public Proizvod
  105. {
  106.     char*_velicine;
  107.     char* _boje;
  108.     char _kategorija[50];
  109. public:
  110.     //Potrebne konstruktor i destruktor funkcije
  111.     Odjeca(char *sifra, char *naziv, double cijena, int kolicina, double popust, char *velicina, char *boje, char *kategorija) :Proizvod(sifra, naziv, cijena, kolicina, popust) {
  112.         _velicine = UpisiString(velicina);
  113.         _boje = UpisiString(boje);
  114.         strncpy_s(_kategorija, kategorija, _TRUNCATE);
  115.     }
  116.     Odjeca(const Odjeca &obj) :Proizvod(obj) {
  117.         _velicine = UpisiString(obj._velicine);
  118.         _boje = UpisiString(obj._boje);
  119.         strncpy_s(_kategorija, obj._kategorija, _TRUNCATE);
  120.     }
  121.  
  122.     Odjeca &operator=(const Odjeca& obj) {
  123.         if (this != &obj) {
  124.  
  125.             Proizvod::operator=(obj);
  126.             _velicine = UpisiString(obj._velicine);
  127.             _boje = UpisiString(obj._boje);
  128.             strncpy_s(_kategorija, obj._kategorija, _TRUNCATE);
  129.         }
  130.         return *this;
  131.     }
  132.  
  133.  
  134.     virtual ~Odjeca() {
  135.         delete[] _velicine;
  136.         delete[] _boje;
  137.         _velicine = nullptr;
  138.         _boje = nullptr;
  139.  
  140.     }
  141.     //Implementirati potrebne funkcije za rad sa klasom
  142.     char *GetVelicinu() { return _velicine; }
  143.     char *GetBoju() { return _boje; }
  144.     char *GetKategorije() { return _kategorija; }
  145.  
  146.  
  147. };
  148.  
  149. class Katalog
  150. {
  151.     char* _naslov;
  152.     char* _vrijediDo; //Datum u formatu dd.MM.yyyy
  153.     Proizvod* _proizvodi[100];
  154.     int _trenutnoProizvoda;
  155. public:
  156.     //Potrebne konstruktor i destruktor funkcije
  157.     Katalog(const char* naslov, char* vrijediDo)
  158.     {
  159.         //U slučaju da datum ne ispunjava zadati format baciti izuzetak
  160.         int size = strlen(naslov) + 1;
  161.         _naslov = new char[size];
  162.         strcpy_s(_naslov, size, naslov);
  163.  
  164.         size = strlen(vrijediDo) + 1;
  165.         _vrijediDo = new char[size];
  166.         strcpy_s(_vrijediDo, size, vrijediDo);
  167.  
  168.         for (size_t i = 0; i < 100; i++)
  169.         {
  170.             _proizvodi[i] = nullptr;
  171.         }
  172.  
  173.         _trenutnoProizvoda = 0;
  174.     }
  175.     Katalog(const Katalog& obj) {
  176.         _naslov = UpisiString(obj._naslov);
  177.         _vrijediDo = UpisiString(obj._vrijediDo);
  178.         _trenutnoProizvoda = obj._trenutnoProizvoda;
  179.         for (int i = 0; i < 100; i++) {
  180.             _proizvodi[i] = new Proizvod(*obj._proizvodi[i]);
  181.         }
  182.     }
  183.     Katalog &operator=(const Katalog& obj) {
  184.         if (this != &obj) {
  185.             _naslov = UpisiString(obj._naslov);
  186.             _vrijediDo = UpisiString(obj._vrijediDo);
  187.             _trenutnoProizvoda = obj._trenutnoProizvoda;
  188.             for (int i = 0; i < 100; i++) {
  189.                 _proizvodi[i] = new Proizvod(*obj._proizvodi[i]);
  190.             }
  191.         }
  192.         return *this;
  193.     }
  194.  
  195.     ~Katalog()
  196.     {
  197.         delete[] _naslov;
  198.         _naslov = nullptr;
  199.  
  200.         delete[] _vrijediDo;
  201.         _vrijediDo = nullptr;
  202.  
  203.         for (size_t i = 0; i < _trenutnoProizvoda; i++)
  204.         {
  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. Funkcija treba da ima povratnu vrijednost tipa bool.
  212.     //Onemogućiti dodavanje identičnih proizvoda u jedan katalog (proizvode razlikovati samo na osnovu šifre).
  213.  
  214.     bool AddProizvod(Proizvod *p) {
  215.  
  216.         Odjeca *temp = nullptr;
  217.         temp = dynamic_cast<Odjeca*>(p);
  218.         if (temp == nullptr)
  219.             cout << "Proizvod je tipa osnovne  klase!" << endl;
  220.         else
  221.             cout << "Proizvod je tipa izvedene klase !" << endl;
  222.  
  223.         for (int i = 0; i < _trenutnoProizvoda; i++) {
  224.             if (strcmp(_proizvodi[i]->GetSifra(), p->GetSifra()) == 0)
  225.                 return false;
  226.         }
  227.         _proizvodi[_trenutnoProizvoda++] = new Proizvod(*p);
  228.         return true;
  229.     }
  230.  
  231.     //Funkciju za uklanjanje proizvoda iz kataloga na osnovu šifre.
  232.     //Ukoliko se ne pronađe traženi proizvod baciti izuzetak.
  233.  
  234.  
  235.     void RemoveProizvod(char *sifra) {
  236.  
  237.         int lokacija = 0;
  238.         Proizvod *temp = new Proizvod[_trenutnoProizvoda - 1];
  239.  
  240.         for (int i = 0; i < _trenutnoProizvoda; i++) {
  241.             if (strcmp(_proizvodi[i]->GetSifra(), sifra) == 0)
  242.                 lokacija = i;
  243.         }
  244.  
  245.         for (int i = 0; i < _trenutnoProizvoda - 1; i++) {
  246.             if (i < lokacija)
  247.                 temp[i] = *_proizvodi[i];
  248.             else
  249.                 temp[i] = *_proizvodi[i + 1];
  250.         }
  251.  
  252.         for (int i = 0; i < _trenutnoProizvoda - 1; i++)
  253.             _proizvodi[i] = new Proizvod(temp[i]);
  254.  
  255.         _trenutnoProizvoda--;
  256.     }
  257.  
  258.     //Preklopiti operator za ispis kataloške ponude
  259.     friend ostream& operator<<(ostream&, Katalog& obj);
  260. };
  261.  
  262. ostream& operator<<(ostream& COUT, Katalog& obj) {
  263.     COUT << "Naslov kataloga: " << obj._naslov << endl;
  264.     COUT << "Ukupno proizvoda: " << obj._trenutnoProizvoda << endl;
  265.     COUT << "Vrijedi do: " << obj._vrijediDo << endl;
  266.     COUT << "\nIspis proizvoda:\n " << endl;
  267.     for (int i = 0; i < obj._trenutnoProizvoda; i++)
  268.         COUT << *obj._proizvodi[i] << endl;
  269.     return COUT;
  270. }
  271.  
  272. class Narudzba
  273. {
  274.     int _brojNarudzbe;
  275.     char* _datumIsporuke; //Datum u formatu dd.MM.yyyy
  276.     Proizvod* _naruceniProizvodi[100];
  277.     int _brojProizvoda;
  278.     bool otkazana;
  279. public:
  280.     //Potrebne konstruktor i destruktor funkcije
  281.     //U slučaju da datum ne ispunjava zadati format baciti izuzetak
  282.  
  283.  
  284.     Narudzba(int brNarudzbe, char *datumIsporuke, bool otkazana) {
  285.         _brojNarudzbe = brNarudzbe;
  286.         _datumIsporuke = UpisiString(datumIsporuke);
  287.         this->otkazana = otkazana;
  288.         _brojProizvoda = 0;
  289.     }
  290.  
  291.     Narudzba(const Narudzba& obj) {
  292.         _brojNarudzbe = obj._brojNarudzbe;
  293.         _datumIsporuke = UpisiString(obj._datumIsporuke);
  294.         _brojProizvoda = obj._brojProizvoda;
  295.         this->otkazana = obj.otkazana;
  296.         for (int i = 0; i < 100; i++) {
  297.             _naruceniProizvodi[i] = obj._naruceniProizvodi[i];
  298.         }
  299.     }
  300.     Narudzba& operator=(const Narudzba& obj) {
  301.         if (this != &obj) {
  302.             _brojNarudzbe = obj._brojNarudzbe;
  303.             _datumIsporuke = UpisiString(obj._datumIsporuke);
  304.             _brojProizvoda = obj._brojProizvoda;
  305.             this->otkazana = obj.otkazana;
  306.             for (int i = 0; i < 100; i++) {
  307.                 _naruceniProizvodi[i] = obj._naruceniProizvodi[i];
  308.             }
  309.         }
  310.         return *this;
  311.     }
  312.  
  313.     ~Narudzba() {
  314.         for (int i = 0; i < _brojProizvoda; i++) {
  315.             delete _naruceniProizvodi[i];
  316.             _naruceniProizvodi[i] = nullptr;
  317.         }
  318.  
  319.     }
  320.  
  321.     //Kreirati funkciju za dodavanje proizvoda narudžbe sa povratnom vrijednosti tipa bool.
  322.     //Ukoliko proizvod više nije dostupan baciti izuzetak.
  323.     //Dozvoliti dodavanje istog proizvoda više puta.
  324.  
  325.     bool AddProizvodNarudzba(Proizvod *p) {
  326.  
  327.         for (int i = 0; i < _brojProizvoda; i++) {
  328.             if (strcmp(_naruceniProizvodi[i]->GetNaziv(), p->GetNaziv()) == 0) {
  329.                 if (_naruceniProizvodi[i]->GetKolicina() == 0)
  330.                     return false;
  331.             }
  332.         }
  333.  
  334.  
  335.         _naruceniProizvodi[_brojProizvoda] = new Proizvod(*p);
  336.         _brojProizvoda++;
  337.  
  338.         for (int i = 0; i < _brojProizvoda; i++){
  339.             if (strcmp(_naruceniProizvodi[i]->GetNaziv(), p->GetNaziv()) == 0)
  340.                 _naruceniProizvodi[i]->SetKolicina(p->GetKolicina());
  341.         }
  342.         return true;
  343.     }
  344.  
  345.  
  346.  
  347.  
  348.     //Funkciju za uklanjanje određenog proizvoda iz narudžbe. Voditi računa da narudžba može
  349.     //imati više puta isti proizvod.
  350.  
  351.     //Dodati funkciju za proračun ukupne cijene narudžbe.
  352.     //Voditi računa o mogućnosti dodavanja više istih proizvoda (količina).
  353.     //Uračunati popust u slučaju da je definisan.
  354.  
  355.     //Preklopiti operator za ispis podataka o narudžbi zajedno sa cijenom.
  356.     friend ostream& operator<<(ostream& COUT, Narudzba& obj);
  357. };
  358.  
  359. ostream& operator<<(ostream& COUT, Narudzba& obj) {
  360.     COUT << crt;
  361.     COUT << "Broj narudzbe: " << obj._brojNarudzbe << endl;
  362.     COUT << "Datum isporuke: " << obj._datumIsporuke << endl;
  363.     COUT << "Ukupno proizvoda: " << obj._brojProizvoda << endl;
  364.     if (obj.otkazana == true) {
  365.         COUT << "Narudzba je otkazana." << endl << endl;;
  366.     }
  367.     else
  368.         COUT << "Narudzba nije otkazana. " << endl << endl;
  369.     for (int i = 0; i < obj._brojProizvoda; i++) {
  370.         COUT << *obj._naruceniProizvodi[i] << endl;
  371.     }
  372.  
  373.     return COUT;
  374. }
  375.  
  376.  
  377. //U posljednjoj klasi samostalno prepoznati izuzetne situacije
  378. class Prodavac
  379. {
  380.     char* _imePrezime;
  381.     Narudzba* _listaNarudzbi;
  382.     int _brojNarudzbi;
  383. public:
  384.     //Potrebne konstruktor i destruktor funkcije
  385.  
  386.     //Omogućiti dodavanje narudžbi za prodavača
  387.  
  388.     //Omogućiti otkazivanje narudžbe na osnovu njenog broja.
  389.  
  390.     //Ispis svih podataka o prodavaču i kratke informacije o
  391.     //svim narudžbama (datum, broj proizvoda i cijena). Posebno izdvojiti otkazane narudžbe.
  392.  
  393.     //Implementirati metodu koja u svim aktivnim narudžbama pronalazi proizvod koji se najviše prodavao
  394.     //sa informacijom o tome da li se radi o odjeći ili osnovnom proizvodu.
  395.  
  396. };
  397.  
  398.  
  399. int main()
  400. {
  401.     //Dodati minimalno 5 proizvoda u katalog.
  402.     //Ispisati ponudu kupcu
  403.     //Omogućiti kreiranje narudžbe za jednog prodavača na osnovu izbora kupca.
  404.  
  405.  
  406.  
  407.     Proizvod p1("AF9L38I", "Cokolada", 1.1, 1);
  408.     Proizvod p2("BM34NG9", "Sok", 2.2, 3);
  409.     Proizvod p3("FM114C0", "Sok", 2.2, 3);
  410.     Proizvod p4("SM7PVGO", "Sok", 2.2, 3);
  411.  
  412.     Katalog k("Katalog", "12.01.2018");
  413.  
  414.     Odjeca o("KFL2F4", "Farmerke", 15, 1, 1.1, "M", "Plave", "Tekstil");
  415.  
  416.     /*k.AddProizvod(&p1);
  417.     k.AddProizvod(&p2);
  418.     k.AddProizvod(&p3);
  419.     k.AddProizvod(&p4);
  420.     cout << k << endl;
  421.  
  422.     k.RemoveProizvod("SM7PVGO");
  423.     cout << k << endl;*/
  424.  
  425.     /*Odjeca *temp = &o;
  426.  
  427.     k.AddProizvod(&p1);
  428.     k.AddProizvod(temp);
  429.  
  430.     cout << k << endl;
  431.     k.RemoveProizvod("KFL2F4");
  432.     cout << k << endl;*/
  433.  
  434.  
  435.  
  436.     Narudzba n(134861, "12.01.2018", false);
  437.  
  438.     n.AddProizvodNarudzba(&p1);
  439.     n.AddProizvodNarudzba(&p1);
  440.     n.AddProizvodNarudzba(&p2);
  441.     cout << n << endl;
  442.  
  443.  
  444.     system("pause");
  445.  
  446.     return 0;
  447. }
RAW Paste Data
Top