Advertisement
EnsarMeskovic

[PR III] Racun Artikli Kupac Kolekcija

Dec 9th, 2016
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.94 KB | None | 0 0
  1. #include<iostream>
  2. #include<iomanip>
  3. using namespace std;
  4.  
  5. char * crt = "\n----------------------------------------------------\n";
  6.  
  7. template<class T1, class T2>
  8. class Kolekcija {
  9.     T1 *_elementi1;
  10.     T2 *_elementi2;
  11.     int * _trenutno;
  12. public:
  13.     Kolekcija() {
  14.         _elementi1 = nullptr;
  15.         _elementi2 = nullptr;
  16.         _trenutno = new int(0);
  17.     }
  18.     //1. potrebne funkcije
  19.     Kolekcija(const Kolekcija &orginal) {
  20.         _trenutno = new int(*orginal._trenutno);
  21.         if (orginal._elementi1 != nullptr) {
  22.             _elementi1 = new T1[(*_trenutno)];
  23.             for (int i = 0; i < (*_trenutno); i++)
  24.                 _elementi1[i] = orginal._elementi1[i];
  25.         } else _elementi1 = nullptr;
  26.         if (orginal._elementi2 != nullptr) {
  27.             _elementi2 = new T2[(*_trenutno)];
  28.             for (int i = 0; i < (*_trenutno); i++)
  29.                 _elementi2[i] = orginal._elementi2[i];
  30.         } else _elementi2 = nullptr;
  31.     }
  32.     Kolekcija& operator= (const Kolekcija &orginal) {
  33.         if (this != &orginal) {
  34.             delete _trenutno;
  35.             _trenutno = new int(*orginal._trenutno);
  36.             if (orginal._elementi1 != nullptr) {
  37.                 delete[]_elementi1;
  38.                 _elementi1 = new T1[(*_trenutno)];
  39.                 for (int i = 0; i < (*_trenutno); i++)
  40.                     _elementi1[i] = orginal._elementi1[i];
  41.             } else _elementi1 = nullptr;
  42.             if (orginal._elementi2 != nullptr) {
  43.                 delete[]_elementi2;
  44.                 _elementi2 = new T2[(*_trenutno)];
  45.                 for (int i = 0; i < (*_trenutno); i++)
  46.                     _elementi2[i] = orginal._elementi2[i];
  47.             } else _elementi2 = nullptr;
  48.         } return *this;
  49.     }
  50.     ~Kolekcija() {
  51.         if (_elementi1 == nullptr) {
  52.             delete[]_elementi1; _elementi1 = nullptr;
  53.         } if (_elementi2 == nullptr) {
  54.             delete[]_elementi2; _elementi2 = nullptr;
  55.         }
  56.         delete _trenutno; _trenutno = nullptr;
  57.     }
  58.     void AddElement(T1 element1, T2 element2) {
  59.         if ((*_trenutno) == 0) {
  60.             _elementi1 = new T1(element1);
  61.             _elementi2 = new T2(element2);
  62.             (*_trenutno)++;
  63.         } else {
  64.             T1 *_temp1 = new T1[(*_trenutno)+1];
  65.             T2 *_temp2 = new T2[(*_trenutno)+1];
  66.             for (int i = 0; i < (*_trenutno); i++) {
  67.                 _temp1[i] = _elementi1[i];
  68.                 _temp2[i] = _elementi2[i];
  69.             }
  70.             _temp1[(*_trenutno)] = element1;
  71.             _temp2[(*_trenutno)++] = element2;
  72.             if ((*_trenutno) >= 2) { delete[]_elementi1; delete[]_elementi2; } else { delete _elementi1; delete _elementi2; }
  73.             _elementi1 = new T1[(*_trenutno)];
  74.             _elementi2 = new T2[(*_trenutno)];
  75.             for (int i = 0; i < (*_trenutno); i++) {
  76.                 _elementi1[i] = _temp1[i];
  77.                 _elementi2[i] = _temp2[i];
  78.             }
  79.             delete[]_temp1; delete[]_temp2;
  80.         }
  81.     }
  82.     T1 &getElement1(int indeks) {
  83.         //if (indeks < 0 || indeks >= (*_trenutno)) return nullptr;
  84.         return _elementi1[indeks];
  85.     }
  86.     T1 &setElement1(int indeks, T1 element1) {
  87.         _elementi1[indeks] = element1;
  88.         return _elementi1[indeks];
  89.     }
  90.     T2 &getElement2(int indeks) {
  91.         //if (indeks < 0 || indeks >= (*_trenutno)) return nullptr;
  92.         return _elementi2[indeks];
  93.     }
  94.     T2 &setElement2(int indeks, T2 element2) {
  95.         _elementi2[indeks] = element2;
  96.         return _elementi2[indeks];
  97.     }
  98.     int getTrenutno() { return *_trenutno; }
  99.     friend ostream& operator<< <> (ostream&, Kolekcija<T1, T2>&);
  100. };
  101. template<class T1, class T2>
  102. ostream& operator<< (ostream &cout, Kolekcija<T1, T2> &k) {
  103.     for (int i = 0; i < (*k._trenutno); i++)
  104.         cout << k._elementi1[i] << " - " << k._elementi2[i] << endl;
  105.     return cout;
  106. }
  107. class Datum {
  108.     int *_dan, *_mjesec, *_godina;
  109. public:
  110.     Datum(int dan = 1, int mjesec = 1, int godina = 2000) {
  111.         _dan = new int(dan);
  112.         _mjesec = new int(mjesec);
  113.         _godina = new int(godina);
  114.     }
  115.     Datum(const Datum &orginal) {
  116.         _dan = new int(*orginal._dan);
  117.         _mjesec = new int(*orginal._mjesec);
  118.         _godina = new int(*orginal._godina);
  119.     }
  120.     Datum& operator=(const Datum &orginal) {
  121.         if (this != &orginal) {
  122.             delete _dan; delete _mjesec; delete _godina;
  123.             _dan = new int(*orginal._dan);
  124.             _mjesec = new int(*orginal._mjesec);
  125.             _godina = new int(*orginal._godina);
  126.         } return *this;
  127.     }
  128.     ~Datum() {
  129.         delete _dan; _dan = nullptr;
  130.         delete _mjesec; _mjesec = nullptr;
  131.         delete _godina; _godina = nullptr;
  132.     }
  133.     friend ostream& operator<< (ostream &COUT, const Datum &obj);
  134.     friend bool operator== (const Datum &d1, const Datum &d2);
  135.     friend bool operator!= (const Datum &d1, const Datum &d2);
  136.     //1. potrebne funkcije
  137. };
  138. bool operator== (const Datum &d1, const Datum &d2) {
  139.     return *d1._dan == *d2._dan && *d1._mjesec == *d2._mjesec && *d1._godina == *d2._godina;
  140. }
  141. bool operator!= (const Datum &d1, const Datum &d2) {
  142.     return !(d1 == d2);
  143. }
  144. ostream& operator<< (ostream &COUT, const Datum &obj) {
  145.     COUT << *obj._dan << "/" << *obj._mjesec << "/" << *obj._godina;
  146.     return COUT;
  147. }
  148. class Osoba {
  149. protected:
  150.     char * _imePrezime;
  151.     Datum * _datumRodjenja;
  152. public:
  153.     Osoba(char * imePrezime = "", Datum datum = Datum()) {
  154.         _imePrezime = new char[strlen(imePrezime) + 1];
  155.         strcpy_s(_imePrezime, strlen(imePrezime) + 1, imePrezime);
  156.         _datumRodjenja = new Datum(datum);
  157.     }
  158.     Osoba(const Osoba & obj) {
  159.         _imePrezime = new char[strlen(obj._imePrezime) + 1];
  160.         strcpy_s(_imePrezime, strlen(obj._imePrezime) + 1, obj._imePrezime);
  161.         _datumRodjenja = new Datum(*obj._datumRodjenja);
  162.     }
  163.     Osoba& operator= (const Osoba &obj) {
  164.         if (this != &obj) {
  165.             delete[]_imePrezime;
  166.             delete _datumRodjenja;
  167.             //Osoba(obj);
  168.             _imePrezime = new char[strlen(obj._imePrezime) + 1];
  169.             strcpy_s(_imePrezime, strlen(obj._imePrezime) + 1, obj._imePrezime);
  170.             _datumRodjenja = new Datum(*obj._datumRodjenja);
  171.         } return *this;
  172.     }
  173.     ~Osoba() { delete[]_imePrezime; delete _datumRodjenja; _imePrezime = nullptr; _datumRodjenja = nullptr; }
  174.     //1. potrebne funkcije
  175.     friend ostream& operator<< (ostream &COUT, const Osoba &obj);
  176. };
  177. ostream& operator<< (ostream &COUT, const Osoba &obj) {
  178.     cout << "Ime i Prezime: " << obj._imePrezime << endl;
  179.     cout << "Datum rodjenja: " << *obj._datumRodjenja << endl;
  180.     return cout;
  181. }
  182. class Kupac: public Osoba {
  183.     //svaki kupac ima popust koji mu se zaracunava prilikom svake kupovine
  184.     //pocetni popust je 0.10%
  185.     //svaka kupovina u iznosu 100 - 500KM povecava iznos popusta za 0.15%
  186.     //svaka kupovina u iznosu 500 - 1000KM povecava iznos popusta za 0.25%
  187.     //svaka kupovina u iznosu vecem od 1000KM povecava iznos popusta za 0.30%
  188.     float _odobreniPopust;
  189. public:
  190.     Kupac(char *imePrezime = "", Datum datum = Datum(), float odobreniPopust = 0.1):Osoba(imePrezime, datum) {
  191.         _odobreniPopust = odobreniPopust;
  192.     }
  193.     Kupac(const Kupac &orginal):Osoba(orginal) {
  194.         _odobreniPopust = orginal._odobreniPopust;
  195.     }
  196.     Kupac& operator= (const Kupac &orginal) {
  197.         if (this != &orginal) {
  198.             _odobreniPopust = orginal._odobreniPopust;
  199.             Osoba::operator=(orginal);
  200.         } return *this;
  201.     }
  202.  
  203.     //1. potrebne funkcije
  204.     friend ostream& operator<< (ostream &COUT, const Kupac &obj);
  205.     float getPopust() { return _odobreniPopust; }
  206.     void setPopust(float popust) { _odobreniPopust = popust; }
  207. };
  208. ostream& operator<< (ostream &COUT, const Kupac &obj) {
  209.     cout << Osoba(obj);
  210.     cout << "Odobreni popust: " << obj._odobreniPopust << endl;
  211.     return cout;
  212. }
  213. class Artikal {
  214.     string _barCode;
  215.     char * _naziv;
  216.     float _cijena;
  217. public:
  218.     Artikal(char * naziv = "X", float cijena = 0.0, string barCode = "X") {
  219.         int vel = strlen(naziv) + 1;
  220.         _naziv = new char[vel];
  221.         strcpy_s(_naziv, vel, naziv);
  222.         _cijena = cijena;
  223.         _barCode = barCode;
  224.     }
  225.     Artikal(Artikal &orginal) {
  226.         int vel = strlen(orginal._naziv) + 1;
  227.         _naziv = new char[vel];
  228.         strcpy_s(_naziv, vel, orginal._naziv);
  229.         _cijena = orginal._cijena;
  230.         _barCode = orginal._barCode;
  231.     }
  232.     Artikal& operator= (const Artikal &orginal) {
  233.         if (this != &orginal) {
  234.             delete[]_naziv;
  235.             //Artikal(orginal);
  236.             int vel = strlen(orginal._naziv) + 1;
  237.             _naziv = new char[vel];
  238.             strcpy_s(_naziv, vel, orginal._naziv);
  239.             _cijena = orginal._cijena;
  240.             _barCode = orginal._barCode;
  241.         } return *this;
  242.     }
  243.     ~Artikal() { delete[]_naziv; _naziv = nullptr; }
  244.     friend ostream& operator<< (ostream &COUT, const Artikal &obj) { COUT << obj._naziv << " - " << obj._cijena << " KM "; return COUT; }
  245.     friend bool operator== (const Artikal &a1, const Artikal &a2);
  246.     //1. potrebne funkcije
  247.     float getCijena() { return _cijena; }
  248. };
  249. bool operator== (const Artikal &a1, const Artikal &a2) {
  250.     return a1._barCode == a2._barCode;
  251. }
  252. int brojRacuna = 1;
  253. char *GenerisiSljedeciBrojRacuna() {
  254.     char *_temp = new char[10];
  255.     strcpy_s(_temp, strlen("RN0000000")+1, "RN0000000");
  256.     int kopija = brojRacuna, brojac = 0;
  257.     do { kopija /= 10; brojac++; } while (kopija);
  258.     _itoa_s(brojRacuna++, _temp + strlen(_temp)-brojac, sizeof(_temp), 10);
  259.     return _temp;
  260. }
  261. class Racun {
  262.     //format broja racuna: RN6005491
  263.     //osigurati automatsko generisanje broja racuna pocevsi od RN0000001
  264.     char _brojRacuna[10];
  265.     Datum _datumKreiranja;
  266.     //prvi argument je Artikal, a drugi kolicina/broj artikala koju je kupac uzeo
  267.     Kolekcija<Artikal *, int> * _stavkeRacuna;
  268.     Kupac * _kupac;
  269. public:
  270.     Racun(char *brRacuna, Datum datum, Kupac *k) {
  271.         strcpy_s(_brojRacuna, strlen(brRacuna)+1, brRacuna);
  272.         _datumKreiranja = datum;
  273.         _kupac = new Kupac(*k);
  274.         _stavkeRacuna = new Kolekcija<Artikal*, int>();
  275.     }
  276.     ~Racun() {
  277.         delete _kupac; _kupac = nullptr;
  278.         if (_stavkeRacuna != nullptr) {
  279.             delete _stavkeRacuna; _stavkeRacuna = nullptr;
  280.         }
  281.     }
  282.     Racun(const Racun &orginal) {
  283.         strcpy_s(_brojRacuna, strlen(orginal._brojRacuna)+1, orginal._brojRacuna);
  284.         _datumKreiranja = orginal._datumKreiranja;
  285.         _kupac = new Kupac(*orginal._kupac);
  286.         if (orginal._stavkeRacuna != nullptr)
  287.             _stavkeRacuna = new Kolekcija<Artikal*, int>(*orginal._stavkeRacuna);
  288.         else _stavkeRacuna = nullptr;
  289.     }
  290.     Racun& operator= (const Racun &orginal) {
  291.         if (this != &orginal) {
  292.             strcpy_s(_brojRacuna, strlen(orginal._brojRacuna)+1, orginal._brojRacuna);
  293.             _datumKreiranja = orginal._datumKreiranja;
  294.             delete _kupac;
  295.             _kupac = new Kupac(*orginal._kupac);
  296.             if (orginal._stavkeRacuna != nullptr) {
  297.                 if (_stavkeRacuna != nullptr)
  298.                     delete _stavkeRacuna;
  299.                 _stavkeRacuna = new Kolekcija<Artikal*, int>(*orginal._stavkeRacuna);
  300.             } else _stavkeRacuna = nullptr;
  301.         } return *this;
  302.     }
  303.     friend ostream& operator<< (ostream& cout, Racun &obj);
  304.     void DodajArtikal(Artikal &artikal, int kolicina) {
  305.         for (int i = 0; i < _stavkeRacuna->getTrenutno(); i++) {
  306.             if (*_stavkeRacuna->getElement1(i) == artikal) {
  307.                 _stavkeRacuna->setElement2(i, _stavkeRacuna->getElement2(i)+kolicina); return;
  308.             }
  309.         }
  310.         _stavkeRacuna->AddElement(&artikal, kolicina);
  311.     }
  312.     void Sortiraj() {
  313.         float _prviArtikal = 0, _drugiArtikal = 0; int brojac;
  314.         for (int j = _stavkeRacuna->getTrenutno(); j > 0; j--) {
  315.             brojac = 0;
  316.             for (int i = 1; i < j; i++) {
  317.                 _prviArtikal = _stavkeRacuna->getElement1(i-1)->getCijena() * _stavkeRacuna->getElement2(i-1);
  318.                 _drugiArtikal = _stavkeRacuna->getElement1(i)->getCijena() * _stavkeRacuna->getElement2(i);
  319.                 if (_prviArtikal > _drugiArtikal) {
  320.                     Kolekcija<Artikal*, int>_temp;
  321.                     _temp.AddElement(_stavkeRacuna->getElement1(i), _stavkeRacuna->getElement2(i));
  322.                     _stavkeRacuna->setElement1(i, _stavkeRacuna->getElement1(i-1));
  323.                     _stavkeRacuna->setElement2(i, _stavkeRacuna->getElement2(i-1));
  324.                     _stavkeRacuna->setElement1(i-1, _temp.getElement1(0));
  325.                     _stavkeRacuna->setElement2(i-1, _temp.getElement2(0));
  326.                     brojac++;
  327.                 }
  328.             }
  329.             if (!brojac) return;
  330.         }
  331.     }
  332.     /*
  333.     1. potrebne (de)konstruktor i druge funkcije
  334.     2. DodajArtikal - dodaje novi artikal u listu artikala zajedno sa njegovom kolicinom. Onemoguciti ponavljanje artikala na nacin da se uvecava samo kolicina ukoliko korisnik vise puta pokusa dodati isti artikal.
  335.     3. operator<< - ispisuje racun u formatu prikazanom na slici(nije obavezno da bude identican, ali je svakako pozeljno).Nakon ispisa svakog racuna, ukoliko su ispunjeni definisani uslovi, kupcu se uvecava popust.
  336.     4. Sortiraj - sortira artikle (rastuci) po kolicini novca kojom ucestvuju u ukupnom iznosu racuna
  337.     */
  338. };
  339. float iznosPopusta(float cijena, float popust) {
  340.     return cijena - (cijena / 100 * popust);
  341. }
  342. ostream& operator<< (ostream& cout, Racun &obj) {
  343.     cout << "Broj racuna: " << obj._brojRacuna << endl;
  344.     cout << "Datum: " << obj._datumKreiranja << endl;
  345.     cout << "Podaci o kupcu:\n" << *obj._kupac << endl;
  346.     cout << "Stavke racuna:\n";
  347.     float konacnaCijena = 0;
  348.     for (int i = 0; i < obj._stavkeRacuna->getTrenutno(); i++) {
  349.         konacnaCijena += obj._stavkeRacuna->getElement1(i)->getCijena() * obj._stavkeRacuna->getElement2(i);
  350.         cout << *obj._stavkeRacuna->getElement1(i) << "- " << obj._stavkeRacuna->getElement2(i) << "x - " << obj._stavkeRacuna->getElement1(i)->getCijena() * obj._stavkeRacuna->getElement2(i) << " KM" << endl;
  351.     }
  352.     konacnaCijena = iznosPopusta(konacnaCijena, obj._kupac->getPopust());
  353.     if (konacnaCijena >= 100 && konacnaCijena < 500)
  354.         obj._kupac->setPopust(obj._kupac->getPopust()+0.15);
  355.     else if (konacnaCijena >= 500 && konacnaCijena < 1000)
  356.         obj._kupac->setPopust(obj._kupac->getPopust()+0.25);
  357.     else if (konacnaCijena >= 1000)
  358.         obj._kupac->setPopust(obj._kupac->getPopust()+0.30);
  359.     cout << "\nUkupna cijena: " << konacnaCijena << endl;
  360.     return cout;
  361. }
  362. void main() {
  363.  
  364.     /****************************************************************************
  365.     1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  366.     2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR CE BITI OZNACENO KAO "RE"
  367.     3. SPASAVAJTE PROJEKAT KAKO BI SE SPRIJECILO GUBLJENJE URADJENOG ZADATKA
  368.     4. PROGRAMSKI CODE SE TAKODJER NALAZI U FAJLU CODE_.TXT
  369.     5. NAZIV I LISTA PARAMETARA FUNKCIJA MORAJU BITI IDENTIČNI ONIMA KOJI SU KORIŠTENI U TESTNOM CODE-U.
  370.     6. NIJE POTREBNO BACATI IZUZETKE.
  371.     ****************************************************************************/
  372. #pragma region TestiranjeDatuma
  373.     Datum danas(26, 11, 2015);
  374.     Datum sutra(danas);
  375.     Datum prekosutra;
  376.     prekosutra = danas;
  377.     cout << danas << endl << sutra << endl << prekosutra << crt;
  378. #pragma endregion
  379. #pragma region TestiranjeKolekcije
  380.     Kolekcija<int, int> kolekcija1;
  381.     int brojElemenata = 15;
  382.     for (size_t i = 0; i < brojElemenata; i++)
  383.         kolekcija1.AddElement(i, i);
  384.     cout << kolekcija1.getElement1(0) << " " << kolekcija1.getElement2(0) << endl;
  385.     cout << kolekcija1 << endl;
  386.     Kolekcija<int, int> kolekcija2;
  387.     kolekcija2 = kolekcija1;
  388.     cout << kolekcija2 << crt;
  389.     if (kolekcija1.getTrenutno() == kolekcija2.getTrenutno())
  390.         cout << "ISTI BROJ ELEMENATA" << endl;
  391.     Kolekcija<int, int> kolekcija3(kolekcija2);
  392.     cout << kolekcija3 << crt;
  393. #pragma endregion
  394. #pragma region TestiranjeKupca
  395.     Kupac jasmin("Jasmin Azemovic", Datum(15, 2, 1980));
  396.     Kupac adel("Adel Handzic", Datum(15, 10, 1981));
  397.     Kupac jasmin2 = jasmin;
  398.     cout << jasmin << endl << jasmin2 << endl;
  399.     jasmin = jasmin2;
  400.     cout << jasmin << endl << jasmin2 << endl;
  401. #pragma endregion
  402. #pragma region TestiranjeArtikla
  403.     Artikal sokCppyNarandza("Cappy narandza", 2.10, "699511236545");
  404.     Artikal cokoladaMilkaMilkins("Milka Milkins", 2.55, "622445875463");
  405.     Artikal jogurtMeggle("Meggle jogurt", 2.55, "155338774458");
  406.     Artikal fastEnergy("Fast Energy", 1.20, "137332754418");
  407.     Artikal povrceMrkva("Mrkva", 0.80, "1843157418854");
  408.  
  409.     cout << sokCppyNarandza << cokoladaMilkaMilkins << jogurtMeggle << endl;
  410.     sokCppyNarandza = cokoladaMilkaMilkins;
  411.     cout << sokCppyNarandza << endl;
  412.     if (sokCppyNarandza == cokoladaMilkaMilkins)
  413.         cout << "Artikli su isti" << endl;
  414. #pragma endregion
  415. #pragma region TestiranjeRacuna
  416.     /*GenerisiSljedeciBrojRacuna - globalna funkcija koja generise i vraca naredni broj racuna u prethodno definisanom formatu*/
  417.     Racun racun1(GenerisiSljedeciBrojRacuna(), danas, &jasmin);
  418.  
  419.     racun1.DodajArtikal(cokoladaMilkaMilkins, 15);
  420.     racun1.DodajArtikal(sokCppyNarandza, 20);
  421.     racun1.DodajArtikal(jogurtMeggle, 20);
  422.  
  423.     cout << racun1 << endl;
  424.  
  425.     Racun racun2(GenerisiSljedeciBrojRacuna(), sutra, &jasmin);
  426.     racun2.DodajArtikal(cokoladaMilkaMilkins, 15);
  427.     racun2.DodajArtikal(sokCppyNarandza, 20);
  428.     racun2.DodajArtikal(jogurtMeggle, 170);
  429.     cout << racun2 << endl;
  430.  
  431.     Racun racun3(racun2);
  432.     cout << racun3 << endl;
  433.     racun3.DodajArtikal(fastEnergy, 10);
  434.     racun3.DodajArtikal(povrceMrkva, 3);
  435.     racun3.Sortiraj();
  436.     cout << racun3 << endl;
  437.     //#pragma endregion
  438.     system("pause");
  439. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement