Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- using namespace std;
- #pragma warning(disable:4996)
- char * crt = "\n---------------------------------------\n";
- template<class T1, class T2>
- class Kolekcija
- {
- T1* _elementi1;
- T2* _elementi2;
- int _trenutno;
- public:
- Kolekcija()
- {
- _trenutno = 0;
- _elementi1 = nullptr;
- _elementi2 = nullptr;
- }
- Kolekcija(Kolekcija & k){
- _trenutno = k._trenutno;
- _elementi1 = new T1[k._trenutno];
- _elementi2 = new T2[k._trenutno];
- for (int i = 0; i < _trenutno; i++){
- _elementi1[i] = k._elementi1[i];
- _elementi2[i] = k._elementi2;
- }
- }
- Kolekcija & operator=(Kolekcija & k){
- if (this != &k){
- delete[]_elementi1;
- delete[]_elementi2;
- _trenutno = k._trenutno;
- _elementi1 = new T1[k._trenutno];
- _elementi2 = new T2[k._trenutno];
- for (int i = 0; i < _trenutno; i++){
- _elementi1[i] = k._elementi1[i];
- _elementi2[i] = k._elementi2[i];
- }
- }
- return *this;
- }
- ~Kolekcija()
- {
- delete[] _elementi1;
- _elementi1 = nullptr;
- delete[] _elementi2;
- _elementi2 = nullptr;
- }
- void DodajElemente(T1& el1, T2& el2)
- {
- 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];
- }
- delete[] _elementi1;
- delete[] _elementi2;
- _elementi1 = temp1;
- _elementi2 = temp2;
- _elementi1[_trenutno] = el1;
- _elementi2[_trenutno] = el2;
- _trenutno++;
- }
- int GetTrenutno() const{ return _trenutno; }
- T1 & GetElement1(int lokacija){ return _elementi1[lokacija]; }
- T2 & GetElement2(int lokacija){ return _elementi2[lokacija]; }
- T1 & operator[](int lokacija){return _elementi1[lokacija]; }
- friend ostream& operator<<<>(ostream&, const Kolekcija&);
- };
- //U programu implementirati nasljeđivanje između odgovarajućih klasa
- //Klasu Osoba deklarisati kao apstraktnu.
- class Osoba
- {
- protected:
- char* _ime;
- char* _prezime;
- char* _adresa;
- char _telefon[15];
- public:
- Osoba(char* ime = "", char* prezime="", char* adresa="", char* telefon="")
- {
- int vel = strlen(ime) + 1;
- _ime = new char[vel];
- strcpy_s(_ime, vel, ime);
- 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);
- strcpy_s(_telefon, 15, telefon);
- }
- Osoba(Osoba & o){
- _ime = new char[strlen(o._ime) + 1];
- _prezime = new char[strlen(o._prezime) + 1];
- _adresa = new char[strlen(o._adresa) + 1];
- strcpy_s(_ime, strlen(o._ime) + 1, o._ime);
- strcpy_s(_prezime, strlen(o._prezime) + 1, o._prezime);
- strcpy_s(_adresa, strlen(o._adresa) + 1, o._adresa);
- strncpy_s(_telefon, 15, o._telefon, _TRUNCATE);
- }
- Osoba & operator=(Osoba & o){
- if (this != &o){
- delete[]_ime;
- delete[]_prezime;
- delete[]_adresa;
- _ime = new char[strlen(o._ime) + 1];
- _prezime = new char[strlen(o._prezime) + 1];
- _adresa = new char[strlen(o._adresa) + 1];
- strcpy_s(_ime, strlen(o._ime) + 1, o._ime);
- strcpy_s(_prezime, strlen(o._prezime) + 1, o._prezime);
- strcpy_s(_adresa, strlen(o._adresa) + 1, o._adresa);
- strncpy_s(_telefon, 15, o._telefon, _TRUNCATE);
- }
- return *this;
- }
- virtual ~Osoba()
- {
- delete[] _ime;
- _ime = nullptr;
- delete[] _prezime;
- _prezime = nullptr;
- delete[] _adresa;
- _adresa = nullptr;
- }
- char * getIme(){ return _ime; }
- char * getPrezime(){ return _prezime; }
- virtual void Info() = 0;
- };
- class Proizvod
- {
- char* _naziv;
- char* _opis;
- double _cijena;
- public:
- Proizvod(char* naziv = "", char* opis="", double cijena=0)
- {
- 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(Proizvod & p){
- _naziv = new char[strlen(p._naziv) + 1];
- _opis = new char[strlen(p._opis) + 1];
- strcpy_s(_naziv, strlen(p._naziv) + 1, p._naziv);
- strcpy_s(_opis, strlen(p._opis) + 1, p._opis);
- _cijena = p._cijena;
- }
- Proizvod & operator=(Proizvod & p){
- if (this != &p){
- delete[]_naziv;
- delete[]_opis;
- _naziv = new char[strlen(p._naziv) + 1];
- _opis = new char[strlen(p._opis) + 1];
- strcpy_s(_naziv, strlen(p._naziv) + 1, p._naziv);
- strcpy_s(_opis, strlen(p._opis) + 1, p._opis);
- _cijena = p._cijena;
- }
- return *this;
- }
- ~Proizvod()
- {
- delete[] _naziv;
- _naziv = nullptr;
- delete[] _opis;
- _opis = nullptr;
- }
- double GetCijena(){ return _cijena; }
- friend ostream& operator<<(ostream&, const Proizvod&);
- };
- class Narudzba {
- char _datum[12]; //Format: dd.MM.yyyy.
- Kolekcija<Proizvod*, int> _proizvodi; //Podaci o naručenim proizvodima i količinama
- public:
- //Potrebne osnovne funkcije za rad sa klasom
- Narudzba(char * datum = ""){
- strncpy_s(_datum, 12, datum, _TRUNCATE);
- }
- Narudzba(Narudzba & n){
- strncpy_s(_datum, 12, n._datum, _TRUNCATE);
- _proizvodi = n._proizvodi;
- }
- Narudzba & operator=(Narudzba & n){
- if (this != &n){
- strncpy_s(_datum, 12, n._datum, _TRUNCATE);
- _proizvodi = n._proizvodi;
- }
- return *this;
- }
- void operator()(Proizvod p, int k=1){
- Proizvod * temp = new Proizvod(p);
- _proizvodi.DodajElemente(temp, k);
- }
- //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(int popust = 0){
- double suma = 0;
- for (int i = 0; i < _proizvodi.GetTrenutno(); i++)
- suma += _proizvodi.GetElement1(i)->GetCijena() * _proizvodi.GetElement2(i);
- suma -= suma*popust;
- return suma;
- }
- //Funkciju za ispis svih vrijednosti atributa klase.
- friend ostream & operator<<(ostream & cout, Narudzba & n){
- cout << "Datum: " << n._datum << endl;
- cout << "Proizvodi: " << endl;
- for (int i = 0; i < n._proizvodi.GetTrenutno(); i++)
- cout << *n._proizvodi.GetElement1(i) << "\t" << n._proizvodi.GetElement2(i)<<endl;
- return cout;
- }
- int GetMjesec(){
- char mj[3] = { _datum[3], _datum[4], '\0' };
- return atoi(mj);
- }
- };
- 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;
- }
- ostream& operator<<(ostream& cout, const Proizvod& p)
- {
- cout << "Naziv: " << p._naziv << endl;
- cout << "Opis: " << p._opis << endl;
- cout << "Cijena: " << p._cijena << endl;
- return cout;
- }
- class Klijent : public Osoba
- {
- protected:
- int _id;
- static int id;
- char* _email;
- Kolekcija<Narudzba, double> _narudzbe; //Podaci o narudžbama sa ukupnim utrošenim iznosom u KM
- public:
- //Potrebne konstruktor i destruktor funkcije.
- Klijent(char * ime="", char * prezime="", char * adresa="", char * telefon="",char * email = "") : Osoba(ime, prezime, adresa, telefon){
- _id = id++;
- _email = new char[strlen(email)+1];
- strcpy_s(_email, strlen(email) + 1, email);
- }
- Klijent(Klijent & k) : Osoba(k),_id(id++){
- _email = new char[strlen(k._email) + 1];
- strcpy_s(k._email, strlen(k._email) + 1, k._email);
- _narudzbe = k._narudzbe;
- }
- Klijent & operator=(Klijent & k){
- if (this != &k){
- delete[]_email;
- _id = k._id;
- _narudzbe = k._narudzbe;
- _email = new char[strlen(k._email) + 1];
- strcpy_s(k._email, strlen(k._email) + 1, k._email);
- }
- return *this;
- }
- //Funkciju za evidenciju nove narudžbe.
- virtual void EvidentirajNarudzbu(Narudzba n){
- double iznos = n.GetIznosNarudzbe();
- _narudzbe.DodajElemente(n, iznos);
- }
- //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){
- for (int i = 0; i < _narudzbe.GetTrenutno(); i++){
- double pot = 0;
- if (_narudzbe.GetElement1(i).GetMjesec() == mjesec){
- cout << "Mjesec je: " << _narudzbe.GetElement1(i).GetMjesec() << endl;
- return (_narudzbe.GetElement1(i).GetIznosNarudzbe()>potrosnja);
- }
- }
- }
- //Funkciju za izmjenu e-mail adrese.
- void izmjenaMaila(char * email){
- delete[]_email;
- _email = new char[strlen(email) + 1];
- strcpy_s(_email, strlen(email) + 1, email);
- }
- //Funkciju za ispis svih vrijednosti atributa klase.
- virtual void Info(){
- cout << "Ime i prezime: " << _ime << " " << _prezime << endl;
- cout << "Adresa: " << _adresa << endl;
- cout << "Telefon: " << _telefon << endl;
- cout << "ID: " << _id << endl;
- cout << "Email: " << _email << endl;
- cout << "Narudzbe: " << _narudzbe;
- cout << _narudzbe << endl;
- }
- void SetEmail(char * ime, char * prezime){
- int vel = strlen(ime) + strlen(prezime) + strlen("@firma.ba") + 2;
- char * temp = new char[vel];
- strcpy_s(temp, vel, ime);
- strcat(temp, ".");
- strcat(temp, prezime);
- strcat(temp, "@firma.ba");
- delete[]_email;
- _email = temp;
- }
- };
- int Klijent::id = 1;
- class VIPKlijent : public Klijent
- {
- char* _parkingOznaka;
- double _popust;
- public:
- VIPKlijent(char * ime, char * prezime, char * adresa, char * telefon, char * email, char * pOznaka, double popust) :Klijent(ime, prezime, adresa, telefon, email){
- _parkingOznaka = new char[strlen(pOznaka) + 1];
- strcpy_s(_parkingOznaka, strlen(pOznaka) + 1, pOznaka);
- _popust = popust;
- }
- VIPKlijent(VIPKlijent & vk) : Klijent(vk){
- _parkingOznaka = new char[strlen(vk._parkingOznaka) + 1];
- strcpy_s(_parkingOznaka, strlen(vk._parkingOznaka) + 1, vk._parkingOznaka);
- _popust = vk._popust;
- }
- VIPKlijent & operator=(VIPKlijent & vk){
- if (this != &vk){
- Klijent::operator=(vk);
- _parkingOznaka = new char[strlen(vk._parkingOznaka) + 1];
- strcpy_s(_parkingOznaka, strlen(vk._parkingOznaka) + 1, vk._parkingOznaka);
- _popust = vk._popust;
- }
- return *this;
- }
- //Potrebne konstruktor i destruktor funkcije
- ~VIPKlijent(){
- delete[]_parkingOznaka;
- _parkingOznaka = nullptr;
- }
- //Funkciju za evidenciju nove narudžbe sa zaračunatim popustom na sve proizvode.
- void EvidentirajNarudzbu(Narudzba n){
- double iznos = n.GetIznosNarudzbe();
- _narudzbe.DodajElemente(n, iznos);
- }
- //Funkciju koja posljednjoj narudžbi klijenta dodaje gratis proizvod proslijeđen kao parametar.
- void addGratis(Proizvod p){
- int lokacija = _narudzbe.GetTrenutno() - 1;
- _narudzbe[lokacija](p);
- }
- //Funkciju za ispis svih vrijednosti atributa klase
- void Info(){
- Klijent::Info();
- cout << "Parking oznaka: " << _parkingOznaka << endl;
- cout << "Popust: " << _popust << 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){
- int mjesec = 0, brojacKlijenata = 0;
- double potrosnja = 0;
- cout << "Unesi mjesec: ";
- cin >> mjesec;
- cout << "Unesi potrosnju: ";
- cin >> potrosnja;
- Klijent * k = nullptr;
- for (int i = 0; i < max; i++){
- k = dynamic_cast<Klijent *>(niz[i]);
- if (k != nullptr){
- if (k->IsPotrosnjaVeca(mjesec, potrosnja)){
- k->Info();
- brojacKlijenata++;
- }
- }
- }
- return brojacKlijenata;
- }
- //Pronaći sve VIP klijente, te im dodati gratis proizvod proslijeđen kao parametar.
- void UkljuciGratisProizvodVIPKlijentima(Osoba* niz[], int max, Proizvod& p){
- VIPKlijent * vp = nullptr;
- for (int i = 0; i < max; i++){
- vp = dynamic_cast<VIPKlijent*>(niz[i]);
- if (vp != nullptr){
- vp->addGratis(p);
- }
- }
- }
- //Svim klijentima postaviti mail adresu u formatu: ime.prezime@firma.ba.
- void GenerisiMailAdreseKlijentima(Osoba* niz[], int max){
- Klijent * k = nullptr;
- for (int i = 0; i < max; i++){
- k = dynamic_cast<Klijent *>(niz[i]);
- if (k != nullptr){
- k->SetEmail(k->getIme(), k->getPrezime());
- }
- }
- }
- //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){
- char ime[50];
- char prezime[50];
- cout << "Unesite ime i prezime: ";
- cin >> ime >> prezime;
- Klijent * k = nullptr;
- for (int i = 0; i < max; i++){
- k = dynamic_cast<Klijent*>(niz[i]);
- if (k != nullptr){
- if (strcmp(ime, k->getIme()) == 0 && strcmp(prezime, k->getPrezime()) == 0)
- k->Info();
- }
- }
- }
- int main()
- {
- //Testirati sve dostupne funkcionalnosti uz obaveznu provjeru globalnih funkcija.
- //VIP klijentima sve narudžbe kreirati uz zaračunati popust pozivom odgovarajuće funkcije.
- const int length = 5;
- Osoba * niz[length];
- niz[0] = new Klijent("Nisvet", "Mujkic", "Ahmeta Fetahagica bb", "060/302-5434", "nisvet.mujkic@edu.fit.ba");
- niz[1] = new Klijent("Eman", "Basic", "Ulica Marsala Tita 14", "061/551-3421", "eman.basic@tu.au");
- niz[2] = new Klijent("Johnny", "Bravo", "Ulica Dzemala Bijedica", "065/652-5984", "johnny.bravo@gov.us");
- niz[3] = new VIPKlijent("Mirnes", "Cerimovic", "Tuzlanska bb", "061/777-3333", "mirnes.cerimovic@untz.ba", "MC_1", 50);
- niz[4] = new VIPKlijent("Haris", "Kudic", "Ilidza 12", "062/919-8732", "haris.kudic@edu.burch.ba", "HK_2", 0.1);
- Proizvod sok("Cappy", "Tropsko voce", 1.3);
- Proizvod cokolada("Milka", "Cokolada sa nougatom", 1.7);
- Proizvod cips("Frank Chips XXL", "Slani cips", 2.4);
- Proizvod sladoled("Macho", "Vanilija", 1.5);
- Narudzba order_1("11/12/2016");
- order_1(sok, 10);
- order_1(cokolada);
- order_1(cokolada);
- Narudzba order_2("04/7/2016");
- order_2(cips, 15);
- order_2(sok, 4);
- Klijent * k1 = dynamic_cast<Klijent*>(niz[0]);
- if (k1 != nullptr)
- k1->EvidentirajNarudzbu(order_1);
- VIPKlijent * k2 = dynamic_cast<VIPKlijent*>(niz[3]);
- if (k2 != nullptr)
- k2->EvidentirajNarudzbu(order_1);
- VIPKlijent * k3 = dynamic_cast<VIPKlijent*>(niz[3]);
- k3->addGratis(cips);
- GenerisiMailAdreseKlijentima(niz, length);
- //UkljuciGratisProizvodVIPKlijentima(niz, length, cips);
- PronadjiKlijentePoImenuPrezimenu(niz, length);
- PronadjiKlijentePoPotrosnji(niz, length);
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement