Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- include<iostream>
- using namespace std;
- template<class T1, class T2>
- class Kolekcija
- {
- T1* _elementi1;
- T2* _elementi2;
- int _trenutno;
- public:
- Kolekcija()
- {
- _trenutno = 0;
- _elementi1 = nullptr;
- _elementi2 = nullptr;
- }
- ~Kolekcija()
- {
- delete[] _elementi1;
- _elementi1 = nullptr;
- delete[] _elementi2;
- _elementi2 = nullptr;
- }
- void DodajElemente( T1& el1, T2& el2)
- {
- T1* temp1 = new T1[_trenutno + 1]; //ovdje ce se praviti niz narudzbi, zato treba defalutni konstruktor //Proizvod** temp1 = new Proizvod*[t+1];
- T2* temp2 = new T2[_trenutno + 1];
- for (int i = 0; i < _trenutno; i++)
- {
- temp1[i] = _elementi1[i]; //proizvod** temp [i]= proizvod **elementi1[i]
- temp2[i] = _elementi2[i];
- }
- delete[] _elementi1;
- delete[] _elementi2;
- _elementi1 = temp1;
- _elementi2 = temp2;
- _elementi1[_trenutno] = el1;
- _elementi2[_trenutno] = el2;
- _trenutno++;
- }
- Kolekcija& operator=(Kolekcija& org)
- {
- if (this!=&org)
- {
- delete[] _elementi1;
- delete[] _elementi2;
- _trenutno = org._trenutno;
- _elementi1 = new T1[_trenutno];
- _elementi2 = new T2[_trenutno];
- for (int i = 0; i < _trenutno; i++)
- {
- _elementi1[i] = org._elementi1[i];
- _elementi2[i] = org._elementi2[i];
- }
- }
- return *this;
- }
- int GetTrenutno() const { return _trenutno; }
- T1& getPrviElement(int lokacija)const {
- if(lokacija>=0 && lokacija<_trenutno)
- return _elementi1[lokacija];
- }
- T2& getDrugiElement(int lokacija)const {
- if (lokacija >= 0 && lokacija < _trenutno)
- return _elementi2[lokacija];
- }
- friend ostream& operator<<<>(ostream&, const Kolekcija&);
- };
- template<class T1, class T2>
- ostream& operator<<<>(ostream& cout, const Kolekcija<T1, T2>& k)
- {
- for (int i = 0; i < k._trenutno; i++)
- cout << k._elementi1[i] << "\t" << k._elementi2[i] << endl;
- return cout;
- }
- class Proizvod
- {
- char* _naziv;
- char* _opis;
- double _cijena;
- public:
- Proizvod(const char* naziv, const char* opis, double cijena)
- {
- int vel = strlen(naziv) + 1;
- _naziv = new char[vel];
- strcpy_s(_naziv, vel, naziv);
- vel = strlen(opis) + 1;
- _opis = new char[vel];
- strcpy_s(_opis, vel, opis);
- _cijena = cijena;
- }
- ~Proizvod()
- {
- delete[] _naziv;
- _naziv = nullptr;
- delete[] _opis;
- _opis = nullptr;
- }
- //Proizvod& operator=(Proizvod& org)
- //{
- // if (this != &org)
- // {
- // delete[] _naziv;
- // delete[] _opis;
- // int vel = strlen(org._naziv) + 1;
- // _naziv = new char[vel];
- // strcpy_s(_naziv, vel, org._naziv);
- // vel = strlen(org._opis) + 1;
- // _opis = new char[vel];
- // strcpy_s(_opis, vel, org._opis);
- // _cijena = org._cijena;
- // }
- // return *this;
- //}
- double getCijenu()const { return _cijena; }
- const char* getNaziv()const { return _naziv; }
- friend ostream& operator<<(ostream&, const Proizvod&);
- };
- ostream& operator<<(ostream& cout, const Proizvod& p)
- {
- cout << "Naziv: " << p._naziv << endl;
- cout << "Opis: " << p._opis << endl;
- cout << "Cijena: " << p._cijena << endl;
- return cout;
- }
- //U programu implementirati nasljeđivanje između odgovarajućih klasa
- //Klasu Osoba deklarisati kao apstraktnu.
- class Osoba
- {
- char* _ime;
- char* _prezime;
- char* _adresa;
- char _telefon[15];
- public:
- //Klasu Osoba deklarisati kao apstraktnu.
- virtual void nekaFunkcija() = 0;
- Osoba(const char* ime, const char* prezime, const char* adresa, const char* telefon)
- {
- int vel = strlen(ime) + 1;
- _ime = new char[vel];
- strcpy_s(_ime, vel, ime);
- cout << "* Osoba " << _ime << " konstruktor *" << endl;
- vel = strlen(prezime) + 1;
- _prezime = new char[vel];
- strcpy_s(_prezime, vel, prezime);
- vel = strlen(adresa) + 1;
- _adresa = new char[vel];
- strcpy_s(_adresa, vel, adresa);
- strncpy_s(_telefon, 15, telefon,_TRUNCATE);
- }
- virtual ~Osoba() //dobra praksa
- {
- cout << "* Osoba " << _ime << " destruktor *" << endl;
- delete[] _ime;
- _ime = nullptr;
- delete[] _prezime;
- _prezime = nullptr;
- delete[] _adresa;
- _adresa = nullptr;
- }
- const char* getIme()const { return _ime; }
- const char* getPrezime()const { return _prezime; }
- virtual void Info(double popust = 0)
- {
- cout << "Ime i prezime: " << _ime << " " << _prezime << endl;
- cout << "Adresa: " << _adresa << endl;
- cout << "Telefon: " << _telefon << endl;
- }
- virtual void setEmail(const char* email) = 0;
- virtual bool IsPotrosnjaVeca(int mjesec, double potrosnja) = 0;
- virtual void DodajGratisProizvod( Proizvod * p) = 0;
- };
- class Narudzba {
- char _datum[12]; //Format: dd.MM.yyyy.
- Kolekcija<Proizvod*, int> _proizvodi; //Podaci o naručenim proizvodima i količinama
- public:
- int getMjesecNarudzbe() {
- char m[2];
- int b = 0;
- for (int i = 3; i < 5; i++)
- {
- m[b] = _datum[i];
- b++;
- }
- int mjesec = atoi(m);
- return mjesec;
- }
- //Potrebne osnovne funkcije za rad sa klasom
- Narudzba(const char* datum="---")
- {
- strncpy_s(_datum, 12, datum, _TRUNCATE);
- }
- //...
- void DodajProizvode(Proizvod * p, int kolicina) ///uzas
- {
- _proizvodi.DodajElemente(p, kolicina);
- }
- //Funkciju GetIznosNarudzbe koja vraća ukupan iznos narudžbe na osnovu
- //podataka o cijenama proizvoda i naručenim količinama. Funkcija prima neobavezni parametar popust
- //koji inicijalno ima vrijednost 0, što znači da ne postoji popust na postojeće cijene proizvoda.
- double GetIznosNarudzbe (double popust = 0) const
- {
- int v = _proizvodi.GetTrenutno();
- double suma = 0;
- for (int i = 0; i < v; i++)
- {
- suma += _proizvodi.getPrviElement(i)->getCijenu() * _proizvodi.getDrugiElement(i);
- }
- if (popust > 0) //pretpostavljam da je procent tj. da se salje kao 10 % a ne 0.1
- return suma - (suma * popust / 100);
- else
- return suma;
- }
- //Funkciju za ispis svih vrijednosti atributa klase.
- void Ispis() {
- cout << "--------------------------------------\n";
- cout << "Narudzba na dan: " << _datum << endl;
- int v = _proizvodi.GetTrenutno();
- for (int i = 0; i < v; i++)
- cout << _proizvodi.getPrviElement(i)->getNaziv() << " " << _proizvodi.getDrugiElement(i) << " kol * "<<_proizvodi.getPrviElement(i)->getCijenu()<<" KM "<< endl;
- /* cout << "Ukupno: \t\t" << GetIznosNarudzbe() <<" KM"<< endl;
- cout << "--------------------------------------\n";*/
- }
- };
- class Klijent : public Osoba
- {
- int _id;
- char* _email;
- Kolekcija<Narudzba, double> _narudzbe; //Podaci o narudžbama sa ukupnim utrošenim iznosom u KM
- public:
- void nekaFunkcija() override { cout << "nidje veze"; }
- //Potrebne konstruktor i destruktor funkcije.
- //Klijent(int ID = 0, const char* ime = "---", const char* prezime = "---", const char* adresa = "---", const char* telefon = "---", const char* email = "---")
- Klijent(int ID, const char* ime, const char* prezime , const char* adresa , const char* telefon, const char* email)
- : Osoba(ime, prezime, adresa, telefon)
- {
- cout << "** Klijent "<<getIme()<<" konstruktor **" << endl;
- int v = strlen(email) + 1;
- _email = new char[v];
- strcpy_s(_email, v, email);
- _id = ID;
- }
- ~Klijent() {
- cout << "** Klijent " << getIme() << " destruktor **" << endl;
- delete[]_email;
- _email = nullptr;
- }
- //Funkciju za evidenciju nove narudžbe.
- void EvidentirajNarudzbu( Narudzba& n, int popust=0)
- {
- double utroseno = n.GetIznosNarudzbe(popust);
- _narudzbe.DodajElemente(n, utroseno);
- }
- //Funkciju koja vraća logičku vrijednost true ukoliko je klijent za odabrani mjesec u godini imao
- //potrošnju veću od zadate. Prototip funkcije: bool IsPotrosnjaVeca(int mjesec, double potrosnja);
- //Za pronalazak potrosnje po mjesecima koristiti podatak o datumu narudžbe.
- bool IsPotrosnjaVeca(int mjesec, double potrosnja)
- {
- int v = _narudzbe.GetTrenutno();
- for (int i = 0; i < v; i++)
- {
- if (_narudzbe.getPrviElement(i).getMjesecNarudzbe() == mjesec &&
- _narudzbe.getDrugiElement(i) > potrosnja)
- return true;
- }
- return false;
- }
- //Funkciju za izmjenu e-mail adrese.
- void setEmail(const char* email)
- {
- delete[]_email;
- int v = strlen(email) + 1;
- _email = new char[v];
- strcpy_s(_email, v, email);
- }
- //Funkciju za ispis svih vrijednosti atributa klase.
- virtual void Info(double popust=0) override
- {
- cout << "ID: " << _id << endl;
- Osoba::Info();
- cout << "Email: " << _email << endl;
- int v = _narudzbe.GetTrenutno();
- for (int i = 0; i < v; i++)
- {
- _narudzbe.getPrviElement(i).Ispis();
- cout << "Ukupno: \t\t" << _narudzbe.getPrviElement(i).GetIznosNarudzbe(popust) << " KM" << endl;
- cout << "--------------------------------------\n";
- }
- }
- void DodajGratisProizvod( Proizvod* p)
- {
- int lok = _narudzbe.GetTrenutno()-1;
- if (lok < 0)
- return;
- _narudzbe.getPrviElement(lok).DodajProizvode(p, 1);
- }
- };
- class VIPKlijent : public Klijent
- {
- char* _parkingOznaka;
- double _popust;
- public:
- //Potrebne konstruktor i destruktor funkcije
- VIPKlijent(int ID, const char* ime, const char* prezime, const char* adresa, const char* telefon, const char* email, const char* parkingOznaka, double popust)
- : Klijent(ID, ime, prezime, adresa, telefon, email)
- {
- cout << "*** VIPKlijent " << getIme() << " konstruktor ***" << endl;
- int v = strlen(parkingOznaka) + 1;
- _parkingOznaka = new char[v];
- strcpy_s(_parkingOznaka, v, parkingOznaka);
- _popust = popust;
- }
- ~VIPKlijent() {
- cout << "*** VIPKlijent " << getIme() << " destruktor ***" << endl;
- delete[]_parkingOznaka;
- _parkingOznaka = nullptr;
- }
- //Funkciju za evidenciju nove narudžbe sa zaračunatim popustom na sve proizvode.
- void EvidentirajNarudzbu( Narudzba& n)
- {
- Klijent::EvidentirajNarudzbu(n, _popust);
- }
- //Funkciju koja posljednjoj narudžbi klijenta dodaje gratis proizvod proslijeđen kao parametar.
- void DodajGratisProizvod( Proizvod * p)
- {
- Klijent::DodajGratisProizvod(p);
- }
- //Funkciju za ispis svih vrijednosti atributa klase
- virtual void Info(double popust = 0) override
- {
- cout << endl;
- Klijent::Info(_popust);
- cout << "Popust: " << _popust << " % " << endl;
- cout << "Parking Oznaka: " << _parkingOznaka << endl << endl;
- }
- };
- //Funkcija treba da pronađe sve one klijente koji su za odabrani mjesec ostvarili potrošnju veću
- //od zadate. Ispisati njihove podatke i vratiti ukupan broj pronađenih klijenata.
- int PronadjiKlijentePoPotrosnji(Osoba* niz[], int max, double potrosnja, int mjesec) /// valjda trebam i tu zadatu potrosnju i mjesec proslijediti?
- {
- int prebrojKlijente = 0;
- for (int i = 0; i < max; i++)
- {
- if (niz[i]->IsPotrosnjaVeca(mjesec, potrosnja))
- {
- prebrojKlijente++;
- niz[i]->Info();
- }
- }
- return prebrojKlijente;
- }
- //Pronaći sve VIP klijente, te im dodati gratis proizvod proslijeđen kao parametar.
- void UkljuciGratisProizvodVIPKlijentima(Osoba* niz[], int max, const Proizvod& p)
- {
- for (int i = 0; i < max; i++)
- {
- niz[i]->DodajGratisProizvod(&const_cast<Proizvod&>(p));
- }
- }
- //Svim klijentima postaviti mail adresu u formatu: ime.prezime@firma.ba.
- void GenerisiMailAdreseKlijentima(Osoba* niz[], int max){
- for (int i = 0; i < max; i++)
- {
- int v= strlen(niz[i]->getIme()) + strlen(niz[i]->getPrezime()) + 11;
- char*mail = new char[v];
- strcpy_s(mail,v,niz[i]->getIme());
- strcat_s(mail, v, ".");
- strcat_s(mail, v, niz[i]->getPrezime());
- strcat_s(mail, v, "@firma.ba");
- niz[i]->setEmail(mail);
- delete[]mail;
- }
- }
- //Omogućiti pretragu klijenata po imenu ili prezimenu (ispisati informacije
- //o svim klijentima koji sadrže uneseni tekst u dijelu imena ili prezimena.
- void PronadjiKlijentePoImenuPrezimenu(Osoba* niz[], int max){
- cout << "Unesite ime ili prezime trazenog klijenta: " << endl;
- char pretraga[15];
- cin.getline(pretraga, 15);
- bool nadjen = false;
- for (int i = 0; i < max; i++)
- {
- if (strstr(niz[i]->getIme(), pretraga) != nullptr or
- strstr(niz[i]->getPrezime(), pretraga) != nullptr)
- {
- niz[i]->Info();
- nadjen = true;
- }
- }
- if (!nadjen)
- cout << "Ne postoji klijent sa tim imenom / prezimenom" << endl;
- }
- int main()
- {/*
- Proizvod* pokPiva=new Proizvod("Sarajevka", "uzas", 3.5);
- Proizvod* pokRakija = new Proizvod("Visnja", " : ) ", 1.5);
- Proizvod* pokKafa = new Proizvod("Ness", "uzasnija", 2.5);
- Proizvod* pokKisela = new Proizvod("Kiseljak", "blagi uzas", 1);*/
- Proizvod Piva ("Sarajevska", "uzas", 3.5);
- Proizvod Rakija ("Visnja", " : ) ", 1.5);
- Proizvod Kafa ("Ness", "uzasnija", 2.5);
- Proizvod Kisela("Kiseljak", "blagi uzas", 1);
- Narudzba prvaNar("28.07.2018.");
- prvaNar.DodajProizvode(&Piva,2);
- prvaNar.DodajProizvode(&Kafa, 2);
- prvaNar.Ispis();
- Narudzba drugaNar("29.08.2018.");
- drugaNar.DodajProizvode(&Kafa, 1);
- drugaNar.DodajProizvode(&Kisela, 1);
- drugaNar.Ispis();
- cout << "\nMjesec prve narudzbe: " << prvaNar.getMjesecNarudzbe() << endl;
- cout << "Mjesec druge narudzbe: " << drugaNar.getMjesecNarudzbe() << endl<<endl;
- Klijent pero (1, "Pero", "Peric", "Trg Pere 12", "061/456-789", "pero@mail.com");
- pero.EvidentirajNarudzbu(prvaNar);
- pero.EvidentirajNarudzbu(drugaNar);
- pero.Info();
- cout << "\nDa li je Pero u 7 mjesecu potrosio vise od 5 KM: " << boolalpha << pero.IsPotrosnjaVeca(7, 5) << endl << endl;
- //Klijent *nizKlijenata[3];
- //nizKlijenata[0] = new Klijent(20, "prvi", "klijent", "adresna", "1234", "mail");
- //nizKlijenata[0]->EvidentirajNarudzbu(prvaNar);
- //nizKlijenata[1] = new Klijent(21, "drugi", "klijent", "adresna", "5678", "mail");
- //nizKlijenata[1]->EvidentirajNarudzbu(prvaNar);
- //nizKlijenata[2] = new Klijent(22, "treci", "klijent", "adresna", "9012", "mail");
- //nizKlijenata[2]->EvidentirajNarudzbu(prvaNar);
- Klijent prvi (20, "prvi", "klijent", "adresna", "1234", "mail");
- prvi.EvidentirajNarudzbu(prvaNar);
- Klijent drugi (21, "drugi", "klijent", "adresna", "5678", "mail");
- //drugi.EvidentirajNarudzbu(prvaNar);
- Klijent treci(22, "treci", "klijent", "adresna", "9012", "mail");
- treci.EvidentirajNarudzbu(prvaNar);
- Osoba* nizKlijenata[3];
- nizKlijenata[0] = &prvi;
- nizKlijenata[1] = &drugi;
- nizKlijenata[2] = &treci;
- GenerisiMailAdreseKlijentima(nizKlijenata, 3);
- cout << "-------------------------------------------------------------------\n";
- cout <<"Pronadjeno "<< PronadjiKlijentePoPotrosnji(nizKlijenata, 3, 2, 7) <<" klijenata"<< endl;
- cout << "-------------------------------------------------------------------\n";
- VIPKlijent sero(2, "Sero", "Seric", "Trg Sere 13", "062/123-456", "sero@mail.com", "Pvip01", 30);
- sero.EvidentirajNarudzbu(drugaNar);
- sero.EvidentirajNarudzbu(prvaNar);
- sero.DodajGratisProizvod(&Rakija);
- sero.Info();
- VIPKlijent prviVip(30, "prviVIP", "klijent", "adresna", "1234", "mail", "pVip01", 10);
- prviVip.EvidentirajNarudzbu(prvaNar);
- prviVip.EvidentirajNarudzbu(drugaNar);
- VIPKlijent drugiVip(30, "drugiVIP", "klijent", "adresna", "4567", "mail", "pVip02", 20);
- VIPKlijent treciVip(30, "treciVIP", "klijent", "adresna", "8910", "mail", "pVip03", 30);
- treciVip.EvidentirajNarudzbu(prvaNar);
- Osoba* vipKlijenti[3];
- vipKlijenti[0] = &prviVip;
- vipKlijenti[1] = &drugiVip;
- vipKlijenti[2] = &treciVip;
- GenerisiMailAdreseKlijentima(vipKlijenti, 3);
- cout << "-------------------------------------------------------------------\n";
- cout << "Dodaj gratis proizvode " << endl;
- UkljuciGratisProizvodVIPKlijentima(vipKlijenti, 3, Rakija);
- for (int i = 0; i < 3; i++)
- {
- vipKlijenti[i]->Info();
- }
- cout << "-------------------------------------------------------------------\n";
- PronadjiKlijentePoImenuPrezimenu(vipKlijenti, 3);
- //Testirati sve dostupne funkcionalnosti uz obaveznu provjeru globalnih funkcija.
- //VIP klijentima sve narudžbe kreirati uz zaračunati popust pozivom odgovarajuće funkcije.
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement