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;
- }
- T1& getElement1(int i) { return _elementi1[i]; }
- T2& getElement2(int i) { return _elementi2[i]; }
- void setE2(int i, T2& kolicina) {
- _elementi2[i] += kolicina;
- }
- ~Kolekcija()
- {
- delete[] _elementi1;
- _elementi1 = nullptr;
- delete[] _elementi2;
- _elementi2 = nullptr;
- }
- Kolekcija& operator=(const Kolekcija& original) {
- _trenutno = original._trenutno;
- delete[] _elementi1;
- delete[] _elementi2;
- _elementi1 = new T1[_trenutno];
- _elementi2 = new T2[_trenutno];
- for (int i = 0; i < _trenutno; i++)
- {
- _elementi1[i] = original._elementi1[i];
- _elementi2[i] = original._elementi2[i];
- }
- return *this;
- }
- 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; }
- 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;
- }
- //U programu implementirati nasljeđivanje između odgovarajućih klasa
- //Klasu Osoba deklarisati kao apstraktnu.
- class Osoba
- {
- public:
- 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);
- }
- virtual ~Osoba()
- {
- delete[] _ime;
- _ime = nullptr;
- delete[] _prezime;
- _prezime = nullptr;
- delete[] _adresa;
- _adresa = nullptr;
- }
- void Info()
- {
- cout << "Ime i prezime: " << _ime << " " << _prezime << endl;
- cout << "Adresa: " << _adresa << endl;
- cout << "Telefon: " << _telefon << endl;
- }
- };
- class Proizvod
- {
- char* _naziv;
- char* _opis;
- double _cijena;
- public:
- double getCijena() { return _cijena; }
- Proizvod(char* naziv, 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;
- }
- bool operator==(const Proizvod& p) {
- return(strcmp(p._naziv, _naziv) == 0 && _cijena == p._cijena);
- }
- ~Proizvod()
- {
- delete[] _naziv;
- _naziv = nullptr;
- delete[] _opis;
- _opis = nullptr;
- }
- 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;
- }
- 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 = "28.2.1997.") {
- strncpy_s(_datum, 12, datum, _TRUNCATE);
- }
- Narudzba& operator=(const Narudzba& original) {
- strncpy_s(_datum, 12, original._datum, _TRUNCATE);
- _proizvodi = original._proizvodi;
- return *this;
- }
- void DodajProizvod(Proizvod* p, int kolicina) {
- for (int i = 0; i < _proizvodi.GetTrenutno(); i++)
- {
- if (*p == *_proizvodi.getElement1(i))//zasto ovdje treba dereferencirati element1
- {
- _proizvodi.setE2(i, kolicina);
- return;
- }
- }
- _proizvodi.DodajElemente(p, kolicina);
- }
- bool operator==(int mjesec) {
- char temp[7];
- strcpy_s(temp, 7, ".");
- _itoa_s(mjesec, temp + 1, 6, 10);
- strcat_s(temp, 7, ".");
- return (strstr(_datum, temp) != nullptr);
- }
- //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) {
- double suma = 0;
- for (int i = 0; i < _proizvodi.GetTrenutno(); i++)
- {
- suma += _proizvodi.getElement1(i)->getCijena()*_proizvodi.getElement2(i);
- }
- return suma - (suma*popust);
- }
- //Funkciju za ispis svih vrijednosti atributa klase.
- friend ostream& operator<<(ostream& cout, Narudzba& n);
- };
- ostream& operator<<(ostream& cout, Narudzba& n) {
- cout << "Datum:" << n._datum << endl;
- cout << "Narudzba" << n._proizvodi << endl;
- return cout;
- }
- class Klijent :public Osoba
- {
- protected:
- static int brojac;
- 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;
- _id = brojac++;
- int size = strlen(email) + 1;
- _email = new char[size];
- strcpy_s(_email, size, email);
- }
- ~Klijent() {
- if (_email != nullptr) {
- delete[] _email;
- _email = nullptr;
- }
- }
- //Funkciju za evidenciju nove narudžbe.
- void DodajNarudzbu(Narudzba n, double iznos) {
- _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) {
- double suma = 0;
- for (int i = 0; i < _narudzbe.GetTrenutno(); i++)
- {
- if (_narudzbe.getElement1(i) == mjesec)
- suma += _narudzbe.getElement2(i);
- }
- return(suma > potrosnja);
- }
- //Funkciju za izmjenu e-mail adrese.
- void ChangeEmail(char* novi) {
- delete[]_email;
- _email = new char[strlen(novi) + 1];
- strcpy_s(_email, strlen(novi) + 1, novi);
- }
- //Funkciju za ispis svih vrijednosti atributa klase.
- friend ostream& Klijent(ostream& cout, Klijent& kl) {
- Osoba *pok = static_cast<Osoba*>(&kl);
- pok->Info();
- cout << "ID:" << kl._id << endl;
- cout << "Email:" << kl._email << endl;
- cout << "Narudzbe:" << kl._narudzbe << endl;
- return cout;
- }
- };
- int Klijent::brojac = 1;
- class VIPKlijent
- {
- char* _parkingOznaka;
- double _popust;
- public:
- //Potrebne konstruktor i destruktor funkcije
- //Funkciju za evidenciju nove narudžbe sa zaračunatim popustom na sve proizvode.
- //Funkciju koja posljednjoj narudžbi klijenta dodaje gratis proizvod proslijeđen kao parametar.
- //Funkciju za ispis svih vrijednosti atributa klase
- };
- //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);
- //Pronaći sve VIP klijente, te im dodati gratis proizvod proslijeđen kao parametar.
- void UkljuciGratisProizvodVIPKlijentima(Osoba* niz[], int max, const Proizvod& p);
- //Svim klijentima postaviti mail adresu u formatu: ime.prezime@firma.ba.
- void GenerisiMailAdreseKlijentima(Osoba* niz[], int max);
- //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);
- void main()
- {
- //Testirati sve dostupne funkcionalnosti uz obaveznu provjeru globalnih funkcija.
- //VIP klijentima sve narudžbe kreirati uz zaračunati popust pozivom odgovarajuće funkcije.
- Proizvod p1("cokolada", "crna", 1.5);
- Proizvod p3("cokolada", "crna", 1.5);
- Proizvod p2("vino", "bijelo", 155);
- Narudzba n("5.5.2015.");
- n.DodajProizvod(&p1, 2);
- n.DodajProizvod(&p3, 2);
- cout << n.GetIznosNarudzbe();
- cout << n;
- Osoba *osobe[3];
- osobe[0] = new Klijent();
- system("pause>0");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement