Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- using namespace std;
- char * upisiTekst(const char * tekst) {
- if (tekst == nullptr)
- return nullptr;
- int size = strlen(tekst) + 1;
- char * temp = new char[size];
- strcpy_s(temp, size, tekst);
- return temp;
- }
- //Klasa čuva podatke o jednom prodajnom artiklu
- class Artikal
- {
- char* _sifra;
- char* _naziv;
- double _cijena; //U cijenu nije uračunat PDV
- int _kolicina; //Stanje na skladištu
- public:
- Artikal() {
- _sifra = nullptr;
- _naziv = nullptr;
- _cijena = 0;
- _kolicina = 0;
- }
- //Potrebne konstruktor i destruktor funkcije
- Artikal(const char * sifra, const char * naziv, double cijena, int kolicina) {
- _sifra = upisiTekst(sifra);
- _naziv = upisiTekst(naziv);
- _cijena = cijena;
- _kolicina = kolicina;
- }
- Artikal(const Artikal & obj) {
- _sifra = upisiTekst(obj._sifra);
- _naziv = upisiTekst(obj._naziv);
- _cijena = obj._cijena;
- _kolicina = obj._kolicina;
- }
- Artikal operator=(const Artikal & obj) {
- if (this == &obj)
- return *this;
- delete[]_sifra;
- delete[]_naziv;
- _sifra = upisiTekst(obj._sifra);
- _naziv = upisiTekst(obj._naziv);
- _cijena = obj._cijena;
- _kolicina = obj._kolicina;
- return *this;
- }
- ~Artikal() {
- delete[]_sifra;
- delete[]_naziv;
- }
- //Preklopiti operator-= na način da se stanje na skladištu artikla umanji za
- //proslijeđenu vrijednost.
- Artikal& operator-=(int kolicina) {
- this->_kolicina -= kolicina;
- return *this;
- }
- //Preklopiti operator ++ na način da se količina artikala na stanju uveća za 1.
- Artikal& operator++() {
- this->_kolicina++;
- return *this;
- }
- //Preklopiti operator -- na način da se količina artikala na stanju umanji za 1.
- Artikal& operator--() {
- this->_kolicina--;
- return *this;
- }
- //Preklopiti operator== koji treba da uporedi artikle na osnovu njihove šifre.
- bool operator==(Artikal & obj) {
- return strcmp(this->_sifra, obj._sifra) == 0;
- }
- //Preklopiti operator za ispis podataka o artiklu.
- friend ostream& operator<<(ostream& COUT, Artikal obj) {
- COUT << obj._sifra << " - " << obj._naziv << " - " << obj._cijena << "KM" << " - ";
- return COUT;
- }
- bool ImaNaStanju(int kolicina) {
- return this->_kolicina >= kolicina;
- }
- double GetCijena() {
- return _cijena;
- }
- bool jeIsti(const char * sifra) {
- if (sifra == nullptr && _sifra == nullptr)
- return true;
- else if (sifra != nullptr && _sifra != nullptr)
- return strcmp(_sifra, sifra) == 0;
- else
- return false;
- }
- int GetKolicina() {
- return _kolicina;
- }
- };
- class StavkaRacuna
- {
- Artikal _artikal;
- int* _kolicina;
- public:
- StavkaRacuna() {
- _kolicina = nullptr;
- }
- //Potrebne konstruktor i destruktor funkcije
- StavkaRacuna(Artikal artikal, int kolicina) : _artikal(artikal) {
- _kolicina = new int(kolicina);
- }
- StavkaRacuna(const StavkaRacuna& obj) : _artikal(obj._artikal) {
- _kolicina = new int(*obj._kolicina);
- }
- StavkaRacuna& operator=(const StavkaRacuna& obj) {
- if (this == &obj)
- return *this;
- delete _kolicina;
- _artikal = obj._artikal;
- _kolicina = new int(*obj._kolicina);
- return *this;
- }
- ~StavkaRacuna() {
- delete _kolicina;
- }
- bool jeIstiArtikal(Artikal a) {
- return this->_artikal == a;
- }
- bool jeIstiArtikal(const char * sifra) {
- return _artikal.jeIsti(sifra);
- }
- //Preklopiti odgovarajuće operatore na osnovu potreba zadatka
- void UvecajKolicinu(int kolicina) {
- *_kolicina += kolicina;
- }
- double GetCijena() {
- return _artikal.GetCijena();
- }
- int GetKolicina() {
- return *_kolicina;
- }
- Artikal GetArtikal() {
- return _artikal;
- }
- void Ispis() {
- cout << _artikal <<*_kolicina <<"KOM"<<endl;
- }
- };
- class Racun
- {
- int _brojRacuna;
- StavkaRacuna _stavke[100];
- int _brojStavki;
- double _iznosBezPDV;
- double _iznosSaPDV;
- bool _izdato;
- public:
- Racun(int brojRacuna) {
- _brojRacuna = brojRacuna;
- _brojStavki = 0;
- _iznosBezPDV = 0;
- _iznosSaPDV = 0;
- _izdato = false;
- }
- //Operator() - Dodaje nove artikle u stavke računa (ulazni parametri su artikal i količina), količina nije obavezni parametar;
- //Voditi računa o tome da li je račun već naplaćen;
- //Ukoliko nema dovoljno artikala na stanju, potrebno ispisati odgovarajuću poruku;
- //Ukoliko artikal već postoji potrebno je samo uvećati količinu za odgovarajuću stavku;
- //Prilikom svakog dodavanja novog artikla ažurirati vrijednosti atributa _iznosBezPDV i _iznosSaPDV.
- void azurirajCijenu(double cijena, int kolicina) {
- double ukupnacijena = cijena * kolicina;
- _iznosBezPDV += ukupnacijena;
- _iznosSaPDV += (ukupnacijena) + 0.17*ukupnacijena;
- }
- void operator()(Artikal artikal, int kolicina = 1) {
- if (_izdato) {
- cout << "Racun je vec naplacen" << endl;
- return;
- }
- if (! artikal.ImaNaStanju(kolicina)) {
- cout << "Nemate dovoljno artikala na stanju" << endl;
- return;
- }
- azurirajCijenu(artikal.GetCijena(), kolicina);
- for (int i = 0; i < _brojStavki; i++)
- {
- if (_stavke[i].jeIstiArtikal(artikal))
- {
- _stavke[i].UvecajKolicinu(kolicina);
- return;
- }
- }
- StavkaRacuna stavka(artikal, kolicina);
- _stavke[_brojStavki] = stavka;
- _brojStavki++;
- }
- int lokacijaArtikla(const char * sifra) {
- for (size_t i = 0; i < _brojStavki; i++)
- {
- if (_stavke[i].jeIstiArtikal(sifra)) {
- return i;
- }
- }
- return -1;
- }
- //Operator-= - Uklanja artikal sa računa na osnovu njegove šifre.
- void operator-=(const char *sifra) {
- int lokacija = lokacijaArtikla(sifra);
- if (lokacija == -1)
- return;
- azurirajCijenu(_stavke[lokacija].GetCijena(), _stavke[lokacija].GetKolicina() * -1);
- for (int i = lokacija; i < _brojStavki-1; i++)
- {
- _stavke[i] = _stavke[i + 1];
- }
- _brojStavki--;
- }
- //Operator[] - Vraća stavku računa na osnovu šifre artikla
- StavkaRacuna operator[](const char * sifra) {
- int lokacija = lokacijaArtikla(sifra);
- return _stavke[lokacija];
- }
- //Operator/ - Zaračunava definisani popust na kompletan račun
- double operator/(float popust_u_postotku) {
- return _iznosBezPDV * popust_u_postotku;
- }
- //Operator+ - Formira jedan račun na osnovu računa koji učestvuju u operaciji +.
- //Pri tome se u slučaju ponavljanja artikala mijenja samo količina;
- //Operator implementirati kao globalnu funkciju.
- friend Racun operator+(Racun obj1, Racun obj2) {
- Racun rezultat(obj1);
- for (size_t i = 0; i < obj2._brojStavki; i++)
- {
- Artikal a = obj2._stavke[i].GetArtikal();
- int kolicina =obj2._stavke[i].GetKolicina();
- rezultat(a,kolicina);
- }
- return rezultat;
- }
- //Funkcija PrintRacun treba ispisati sve stavke računa zajedno sa iznosom za plaćanje;
- //Omogućiti da se unese iznos novca koji je klijent platio, a kao povratnu vrijednost funkcije vratiti iznos kusura.
- double PrintRacun() {
- for (int i = 0; i < _brojStavki; i++)
- {
- _stavke[i].Ispis();
- }
- return 0;
- }
- };
- void main()
- {
- Artikal mlijeko("mlijeko", "Mlijeko", 1.5, 10);
- Artikal sok("sok", "Sok Sprite", 2.5, 15);
- Artikal kruh("kruh", "Kruh bijeli", 1.5,15);
- Racun racun(53);
- racun(mlijeko, 5);
- racun(mlijeko, 5);
- racun(sok, 5);
- racun(sok, 3);
- racun(kruh, 15);
- racun -= "mlijeko";
- racun.PrintRacun();
- //Testirati sve dostupne funkcionalnosti
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement