Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<iomanip>
- using namespace std;
- char * crt = "\n----------------------------------------------------\n";
- template<class T1, class T2>
- class Kolekcija {
- T1 *_elementi1;
- T2 *_elementi2;
- int * _trenutno;
- public:
- Kolekcija() {
- _elementi1 = nullptr;
- _elementi2 = nullptr;
- _trenutno = new int(0);
- }
- //1. potrebne funkcije
- Kolekcija(const Kolekcija &orginal) {
- _trenutno = new int(*orginal._trenutno);
- if (orginal._elementi1 != nullptr) {
- _elementi1 = new T1[(*_trenutno)];
- for (int i = 0; i < (*_trenutno); i++)
- _elementi1[i] = orginal._elementi1[i];
- } else _elementi1 = nullptr;
- if (orginal._elementi2 != nullptr) {
- _elementi2 = new T2[(*_trenutno)];
- for (int i = 0; i < (*_trenutno); i++)
- _elementi2[i] = orginal._elementi2[i];
- } else _elementi2 = nullptr;
- }
- Kolekcija& operator= (const Kolekcija &orginal) {
- if (this != &orginal) {
- delete _trenutno;
- _trenutno = new int(*orginal._trenutno);
- if (orginal._elementi1 != nullptr) {
- delete[]_elementi1;
- _elementi1 = new T1[(*_trenutno)];
- for (int i = 0; i < (*_trenutno); i++)
- _elementi1[i] = orginal._elementi1[i];
- } else _elementi1 = nullptr;
- if (orginal._elementi2 != nullptr) {
- delete[]_elementi2;
- _elementi2 = new T2[(*_trenutno)];
- for (int i = 0; i < (*_trenutno); i++)
- _elementi2[i] = orginal._elementi2[i];
- } else _elementi2 = nullptr;
- } return *this;
- }
- ~Kolekcija() {
- if (_elementi1 == nullptr) {
- delete[]_elementi1; _elementi1 = nullptr;
- } if (_elementi2 == nullptr) {
- delete[]_elementi2; _elementi2 = nullptr;
- }
- delete _trenutno; _trenutno = nullptr;
- }
- void AddElement(T1 element1, T2 element2) {
- if ((*_trenutno) == 0) {
- _elementi1 = new T1(element1);
- _elementi2 = new T2(element2);
- (*_trenutno)++;
- } else {
- T1 *_temp1 = new T1[(*_trenutno)+1];
- T2 *_temp2 = new T2[(*_trenutno)+1];
- for (int i = 0; i < (*_trenutno); i++) {
- _temp1[i] = _elementi1[i];
- _temp2[i] = _elementi2[i];
- }
- _temp1[(*_trenutno)] = element1;
- _temp2[(*_trenutno)++] = element2;
- if ((*_trenutno) >= 2) { delete[]_elementi1; delete[]_elementi2; } else { delete _elementi1; delete _elementi2; }
- _elementi1 = new T1[(*_trenutno)];
- _elementi2 = new T2[(*_trenutno)];
- for (int i = 0; i < (*_trenutno); i++) {
- _elementi1[i] = _temp1[i];
- _elementi2[i] = _temp2[i];
- }
- delete[]_temp1; delete[]_temp2;
- }
- }
- T1 &getElement1(int indeks) {
- //if (indeks < 0 || indeks >= (*_trenutno)) return nullptr;
- return _elementi1[indeks];
- }
- T1 &setElement1(int indeks, T1 element1) {
- _elementi1[indeks] = element1;
- return _elementi1[indeks];
- }
- T2 &getElement2(int indeks) {
- //if (indeks < 0 || indeks >= (*_trenutno)) return nullptr;
- return _elementi2[indeks];
- }
- T2 &setElement2(int indeks, T2 element2) {
- _elementi2[indeks] = element2;
- return _elementi2[indeks];
- }
- int getTrenutno() { return *_trenutno; }
- friend ostream& operator<< <> (ostream&, Kolekcija<T1, T2>&);
- };
- template<class T1, class T2>
- ostream& operator<< (ostream &cout, Kolekcija<T1, T2> &k) {
- for (int i = 0; i < (*k._trenutno); i++)
- cout << k._elementi1[i] << " - " << k._elementi2[i] << endl;
- return cout;
- }
- class Datum {
- int *_dan, *_mjesec, *_godina;
- public:
- Datum(int dan = 1, int mjesec = 1, int godina = 2000) {
- _dan = new int(dan);
- _mjesec = new int(mjesec);
- _godina = new int(godina);
- }
- Datum(const Datum &orginal) {
- _dan = new int(*orginal._dan);
- _mjesec = new int(*orginal._mjesec);
- _godina = new int(*orginal._godina);
- }
- Datum& operator=(const Datum &orginal) {
- if (this != &orginal) {
- delete _dan; delete _mjesec; delete _godina;
- _dan = new int(*orginal._dan);
- _mjesec = new int(*orginal._mjesec);
- _godina = new int(*orginal._godina);
- } return *this;
- }
- ~Datum() {
- delete _dan; _dan = nullptr;
- delete _mjesec; _mjesec = nullptr;
- delete _godina; _godina = nullptr;
- }
- friend ostream& operator<< (ostream &COUT, const Datum &obj);
- friend bool operator== (const Datum &d1, const Datum &d2);
- friend bool operator!= (const Datum &d1, const Datum &d2);
- //1. potrebne funkcije
- };
- bool operator== (const Datum &d1, const Datum &d2) {
- return *d1._dan == *d2._dan && *d1._mjesec == *d2._mjesec && *d1._godina == *d2._godina;
- }
- bool operator!= (const Datum &d1, const Datum &d2) {
- return !(d1 == d2);
- }
- ostream& operator<< (ostream &COUT, const Datum &obj) {
- COUT << *obj._dan << "/" << *obj._mjesec << "/" << *obj._godina;
- return COUT;
- }
- class Osoba {
- protected:
- char * _imePrezime;
- Datum * _datumRodjenja;
- public:
- Osoba(char * imePrezime = "", Datum datum = Datum()) {
- _imePrezime = new char[strlen(imePrezime) + 1];
- strcpy_s(_imePrezime, strlen(imePrezime) + 1, imePrezime);
- _datumRodjenja = new Datum(datum);
- }
- Osoba(const Osoba & obj) {
- _imePrezime = new char[strlen(obj._imePrezime) + 1];
- strcpy_s(_imePrezime, strlen(obj._imePrezime) + 1, obj._imePrezime);
- _datumRodjenja = new Datum(*obj._datumRodjenja);
- }
- Osoba& operator= (const Osoba &obj) {
- if (this != &obj) {
- delete[]_imePrezime;
- delete _datumRodjenja;
- //Osoba(obj);
- _imePrezime = new char[strlen(obj._imePrezime) + 1];
- strcpy_s(_imePrezime, strlen(obj._imePrezime) + 1, obj._imePrezime);
- _datumRodjenja = new Datum(*obj._datumRodjenja);
- } return *this;
- }
- ~Osoba() { delete[]_imePrezime; delete _datumRodjenja; _imePrezime = nullptr; _datumRodjenja = nullptr; }
- //1. potrebne funkcije
- friend ostream& operator<< (ostream &COUT, const Osoba &obj);
- };
- ostream& operator<< (ostream &COUT, const Osoba &obj) {
- cout << "Ime i Prezime: " << obj._imePrezime << endl;
- cout << "Datum rodjenja: " << *obj._datumRodjenja << endl;
- return cout;
- }
- class Kupac: public Osoba {
- //svaki kupac ima popust koji mu se zaracunava prilikom svake kupovine
- //pocetni popust je 0.10%
- //svaka kupovina u iznosu 100 - 500KM povecava iznos popusta za 0.15%
- //svaka kupovina u iznosu 500 - 1000KM povecava iznos popusta za 0.25%
- //svaka kupovina u iznosu vecem od 1000KM povecava iznos popusta za 0.30%
- float _odobreniPopust;
- public:
- Kupac(char *imePrezime = "", Datum datum = Datum(), float odobreniPopust = 0.1):Osoba(imePrezime, datum) {
- _odobreniPopust = odobreniPopust;
- }
- Kupac(const Kupac &orginal):Osoba(orginal) {
- _odobreniPopust = orginal._odobreniPopust;
- }
- Kupac& operator= (const Kupac &orginal) {
- if (this != &orginal) {
- _odobreniPopust = orginal._odobreniPopust;
- Osoba::operator=(orginal);
- } return *this;
- }
- //1. potrebne funkcije
- friend ostream& operator<< (ostream &COUT, const Kupac &obj);
- float getPopust() { return _odobreniPopust; }
- void setPopust(float popust) { _odobreniPopust = popust; }
- };
- ostream& operator<< (ostream &COUT, const Kupac &obj) {
- cout << Osoba(obj);
- cout << "Odobreni popust: " << obj._odobreniPopust << endl;
- return cout;
- }
- class Artikal {
- string _barCode;
- char * _naziv;
- float _cijena;
- public:
- Artikal(char * naziv = "X", float cijena = 0.0, string barCode = "X") {
- int vel = strlen(naziv) + 1;
- _naziv = new char[vel];
- strcpy_s(_naziv, vel, naziv);
- _cijena = cijena;
- _barCode = barCode;
- }
- Artikal(Artikal &orginal) {
- int vel = strlen(orginal._naziv) + 1;
- _naziv = new char[vel];
- strcpy_s(_naziv, vel, orginal._naziv);
- _cijena = orginal._cijena;
- _barCode = orginal._barCode;
- }
- Artikal& operator= (const Artikal &orginal) {
- if (this != &orginal) {
- delete[]_naziv;
- //Artikal(orginal);
- int vel = strlen(orginal._naziv) + 1;
- _naziv = new char[vel];
- strcpy_s(_naziv, vel, orginal._naziv);
- _cijena = orginal._cijena;
- _barCode = orginal._barCode;
- } return *this;
- }
- ~Artikal() { delete[]_naziv; _naziv = nullptr; }
- friend ostream& operator<< (ostream &COUT, const Artikal &obj) { COUT << obj._naziv << " - " << obj._cijena << " KM "; return COUT; }
- friend bool operator== (const Artikal &a1, const Artikal &a2);
- //1. potrebne funkcije
- float getCijena() { return _cijena; }
- };
- bool operator== (const Artikal &a1, const Artikal &a2) {
- return a1._barCode == a2._barCode;
- }
- int brojRacuna = 1;
- char *GenerisiSljedeciBrojRacuna() {
- char *_temp = new char[10];
- strcpy_s(_temp, strlen("RN0000000")+1, "RN0000000");
- int kopija = brojRacuna, brojac = 0;
- do { kopija /= 10; brojac++; } while (kopija);
- _itoa_s(brojRacuna++, _temp + strlen(_temp)-brojac, sizeof(_temp), 10);
- return _temp;
- }
- class Racun {
- //format broja racuna: RN6005491
- //osigurati automatsko generisanje broja racuna pocevsi od RN0000001
- char _brojRacuna[10];
- Datum _datumKreiranja;
- //prvi argument je Artikal, a drugi kolicina/broj artikala koju je kupac uzeo
- Kolekcija<Artikal *, int> * _stavkeRacuna;
- Kupac * _kupac;
- public:
- Racun(char *brRacuna, Datum datum, Kupac *k) {
- strcpy_s(_brojRacuna, strlen(brRacuna)+1, brRacuna);
- _datumKreiranja = datum;
- _kupac = new Kupac(*k);
- _stavkeRacuna = new Kolekcija<Artikal*, int>();
- }
- ~Racun() {
- delete _kupac; _kupac = nullptr;
- if (_stavkeRacuna != nullptr) {
- delete _stavkeRacuna; _stavkeRacuna = nullptr;
- }
- }
- Racun(const Racun &orginal) {
- strcpy_s(_brojRacuna, strlen(orginal._brojRacuna)+1, orginal._brojRacuna);
- _datumKreiranja = orginal._datumKreiranja;
- _kupac = new Kupac(*orginal._kupac);
- if (orginal._stavkeRacuna != nullptr)
- _stavkeRacuna = new Kolekcija<Artikal*, int>(*orginal._stavkeRacuna);
- else _stavkeRacuna = nullptr;
- }
- Racun& operator= (const Racun &orginal) {
- if (this != &orginal) {
- strcpy_s(_brojRacuna, strlen(orginal._brojRacuna)+1, orginal._brojRacuna);
- _datumKreiranja = orginal._datumKreiranja;
- delete _kupac;
- _kupac = new Kupac(*orginal._kupac);
- if (orginal._stavkeRacuna != nullptr) {
- if (_stavkeRacuna != nullptr)
- delete _stavkeRacuna;
- _stavkeRacuna = new Kolekcija<Artikal*, int>(*orginal._stavkeRacuna);
- } else _stavkeRacuna = nullptr;
- } return *this;
- }
- friend ostream& operator<< (ostream& cout, Racun &obj);
- void DodajArtikal(Artikal &artikal, int kolicina) {
- for (int i = 0; i < _stavkeRacuna->getTrenutno(); i++) {
- if (*_stavkeRacuna->getElement1(i) == artikal) {
- _stavkeRacuna->setElement2(i, _stavkeRacuna->getElement2(i)+kolicina); return;
- }
- }
- _stavkeRacuna->AddElement(&artikal, kolicina);
- }
- void Sortiraj() {
- float _prviArtikal = 0, _drugiArtikal = 0; int brojac;
- for (int j = _stavkeRacuna->getTrenutno(); j > 0; j--) {
- brojac = 0;
- for (int i = 1; i < j; i++) {
- _prviArtikal = _stavkeRacuna->getElement1(i-1)->getCijena() * _stavkeRacuna->getElement2(i-1);
- _drugiArtikal = _stavkeRacuna->getElement1(i)->getCijena() * _stavkeRacuna->getElement2(i);
- if (_prviArtikal > _drugiArtikal) {
- Kolekcija<Artikal*, int>_temp;
- _temp.AddElement(_stavkeRacuna->getElement1(i), _stavkeRacuna->getElement2(i));
- _stavkeRacuna->setElement1(i, _stavkeRacuna->getElement1(i-1));
- _stavkeRacuna->setElement2(i, _stavkeRacuna->getElement2(i-1));
- _stavkeRacuna->setElement1(i-1, _temp.getElement1(0));
- _stavkeRacuna->setElement2(i-1, _temp.getElement2(0));
- brojac++;
- }
- }
- if (!brojac) return;
- }
- }
- /*
- 1. potrebne (de)konstruktor i druge funkcije
- 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.
- 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.
- 4. Sortiraj - sortira artikle (rastuci) po kolicini novca kojom ucestvuju u ukupnom iznosu racuna
- */
- };
- float iznosPopusta(float cijena, float popust) {
- return cijena - (cijena / 100 * popust);
- }
- ostream& operator<< (ostream& cout, Racun &obj) {
- cout << "Broj racuna: " << obj._brojRacuna << endl;
- cout << "Datum: " << obj._datumKreiranja << endl;
- cout << "Podaci o kupcu:\n" << *obj._kupac << endl;
- cout << "Stavke racuna:\n";
- float konacnaCijena = 0;
- for (int i = 0; i < obj._stavkeRacuna->getTrenutno(); i++) {
- konacnaCijena += obj._stavkeRacuna->getElement1(i)->getCijena() * obj._stavkeRacuna->getElement2(i);
- cout << *obj._stavkeRacuna->getElement1(i) << "- " << obj._stavkeRacuna->getElement2(i) << "x - " << obj._stavkeRacuna->getElement1(i)->getCijena() * obj._stavkeRacuna->getElement2(i) << " KM" << endl;
- }
- konacnaCijena = iznosPopusta(konacnaCijena, obj._kupac->getPopust());
- if (konacnaCijena >= 100 && konacnaCijena < 500)
- obj._kupac->setPopust(obj._kupac->getPopust()+0.15);
- else if (konacnaCijena >= 500 && konacnaCijena < 1000)
- obj._kupac->setPopust(obj._kupac->getPopust()+0.25);
- else if (konacnaCijena >= 1000)
- obj._kupac->setPopust(obj._kupac->getPopust()+0.30);
- cout << "\nUkupna cijena: " << konacnaCijena << endl;
- return cout;
- }
- void main() {
- /****************************************************************************
- 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
- 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR CE BITI OZNACENO KAO "RE"
- 3. SPASAVAJTE PROJEKAT KAKO BI SE SPRIJECILO GUBLJENJE URADJENOG ZADATKA
- 4. PROGRAMSKI CODE SE TAKODJER NALAZI U FAJLU CODE_.TXT
- 5. NAZIV I LISTA PARAMETARA FUNKCIJA MORAJU BITI IDENTIČNI ONIMA KOJI SU KORIŠTENI U TESTNOM CODE-U.
- 6. NIJE POTREBNO BACATI IZUZETKE.
- ****************************************************************************/
- #pragma region TestiranjeDatuma
- Datum danas(26, 11, 2015);
- Datum sutra(danas);
- Datum prekosutra;
- prekosutra = danas;
- cout << danas << endl << sutra << endl << prekosutra << crt;
- #pragma endregion
- #pragma region TestiranjeKolekcije
- Kolekcija<int, int> kolekcija1;
- int brojElemenata = 15;
- for (size_t i = 0; i < brojElemenata; i++)
- kolekcija1.AddElement(i, i);
- cout << kolekcija1.getElement1(0) << " " << kolekcija1.getElement2(0) << endl;
- cout << kolekcija1 << endl;
- Kolekcija<int, int> kolekcija2;
- kolekcija2 = kolekcija1;
- cout << kolekcija2 << crt;
- if (kolekcija1.getTrenutno() == kolekcija2.getTrenutno())
- cout << "ISTI BROJ ELEMENATA" << endl;
- Kolekcija<int, int> kolekcija3(kolekcija2);
- cout << kolekcija3 << crt;
- #pragma endregion
- #pragma region TestiranjeKupca
- Kupac jasmin("Jasmin Azemovic", Datum(15, 2, 1980));
- Kupac adel("Adel Handzic", Datum(15, 10, 1981));
- Kupac jasmin2 = jasmin;
- cout << jasmin << endl << jasmin2 << endl;
- jasmin = jasmin2;
- cout << jasmin << endl << jasmin2 << endl;
- #pragma endregion
- #pragma region TestiranjeArtikla
- Artikal sokCppyNarandza("Cappy narandza", 2.10, "699511236545");
- Artikal cokoladaMilkaMilkins("Milka Milkins", 2.55, "622445875463");
- Artikal jogurtMeggle("Meggle jogurt", 2.55, "155338774458");
- Artikal fastEnergy("Fast Energy", 1.20, "137332754418");
- Artikal povrceMrkva("Mrkva", 0.80, "1843157418854");
- cout << sokCppyNarandza << cokoladaMilkaMilkins << jogurtMeggle << endl;
- sokCppyNarandza = cokoladaMilkaMilkins;
- cout << sokCppyNarandza << endl;
- if (sokCppyNarandza == cokoladaMilkaMilkins)
- cout << "Artikli su isti" << endl;
- #pragma endregion
- #pragma region TestiranjeRacuna
- /*GenerisiSljedeciBrojRacuna - globalna funkcija koja generise i vraca naredni broj racuna u prethodno definisanom formatu*/
- Racun racun1(GenerisiSljedeciBrojRacuna(), danas, &jasmin);
- racun1.DodajArtikal(cokoladaMilkaMilkins, 15);
- racun1.DodajArtikal(sokCppyNarandza, 20);
- racun1.DodajArtikal(jogurtMeggle, 20);
- cout << racun1 << endl;
- Racun racun2(GenerisiSljedeciBrojRacuna(), sutra, &jasmin);
- racun2.DodajArtikal(cokoladaMilkaMilkins, 15);
- racun2.DodajArtikal(sokCppyNarandza, 20);
- racun2.DodajArtikal(jogurtMeggle, 170);
- cout << racun2 << endl;
- Racun racun3(racun2);
- cout << racun3 << endl;
- racun3.DodajArtikal(fastEnergy, 10);
- racun3.DodajArtikal(povrceMrkva, 3);
- racun3.Sortiraj();
- cout << racun3 << endl;
- //#pragma endregion
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement