Advertisement
blavorov_list

Untitled

Aug 21st, 2017
520
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.26 KB | None | 0 0
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. #pragma warning(disable:4996)
  5.  
  6. char * crt = "\n---------------------------------------\n";
  7.  
  8. template<class T1, class T2>
  9. class Kolekcija
  10. {
  11.     T1* _elementi1;
  12.     T2* _elementi2;
  13.     int _trenutno;
  14. public:
  15.     Kolekcija()
  16.     {
  17.         _trenutno = 0;
  18.         _elementi1 = nullptr;
  19.         _elementi2 = nullptr;
  20.     }
  21.     Kolekcija(Kolekcija & k){
  22.         _trenutno = k._trenutno;
  23.         _elementi1 = new T1[k._trenutno];
  24.         _elementi2 = new T2[k._trenutno];
  25.         for (int i = 0; i < _trenutno; i++){
  26.             _elementi1[i] = k._elementi1[i];
  27.             _elementi2[i] = k._elementi2;
  28.         }
  29.     }
  30.     Kolekcija & operator=(Kolekcija & k){
  31.         if (this != &k){
  32.             delete[]_elementi1;
  33.             delete[]_elementi2;
  34.             _trenutno = k._trenutno;
  35.             _elementi1 = new T1[k._trenutno];
  36.             _elementi2 = new T2[k._trenutno];
  37.             for (int i = 0; i < _trenutno; i++){
  38.                 _elementi1[i] = k._elementi1[i];
  39.                 _elementi2[i] = k._elementi2[i];
  40.             }
  41.         }
  42.         return *this;
  43.     }
  44.     ~Kolekcija()
  45.     {
  46.         delete[] _elementi1;
  47.         _elementi1 = nullptr;
  48.  
  49.         delete[] _elementi2;
  50.         _elementi2 = nullptr;
  51.     }
  52.  
  53.     void DodajElemente(T1& el1, T2& el2)
  54.     {
  55.         T1* temp1 = new T1[_trenutno + 1];
  56.         T2* temp2 = new T2[_trenutno + 1];
  57.  
  58.         for (int i = 0; i < _trenutno; i++)
  59.         {
  60.             temp1[i] = _elementi1[i];
  61.             temp2[i] = _elementi2[i];
  62.         }
  63.  
  64.         delete[] _elementi1;
  65.         delete[] _elementi2;
  66.  
  67.         _elementi1 = temp1;
  68.         _elementi2 = temp2;
  69.  
  70.         _elementi1[_trenutno] = el1;
  71.         _elementi2[_trenutno] = el2;
  72.         _trenutno++;
  73.     }
  74.  
  75.     int GetTrenutno() const{ return _trenutno; }
  76.     T1 & GetElement1(int lokacija){ return _elementi1[lokacija]; }
  77.     T2 & GetElement2(int lokacija){ return _elementi2[lokacija]; }
  78.     T1 & operator[](int lokacija){return _elementi1[lokacija]; }
  79.  
  80.     friend ostream& operator<<<>(ostream&, const Kolekcija&);
  81. };
  82.  
  83. //U programu implementirati nasljeđivanje između odgovarajućih klasa
  84. //Klasu Osoba deklarisati kao apstraktnu.
  85. class Osoba
  86. {
  87. protected:
  88.     char* _ime;
  89.     char* _prezime;
  90.     char* _adresa;
  91.     char _telefon[15];
  92. public:
  93.  
  94.     Osoba(char* ime = "", char* prezime="", char* adresa="", char* telefon="")
  95.     {
  96.         int vel = strlen(ime) + 1;
  97.         _ime = new char[vel];
  98.         strcpy_s(_ime, vel, ime);
  99.  
  100.         vel = strlen(prezime) + 1;
  101.         _prezime = new char[vel];
  102.         strcpy_s(_prezime, vel, prezime);
  103.  
  104.         vel = strlen(adresa) + 1;
  105.         _adresa = new char[vel];
  106.         strcpy_s(_adresa, vel, adresa);
  107.  
  108.         strcpy_s(_telefon, 15, telefon);
  109.     }
  110.     Osoba(Osoba & o){
  111.         _ime = new char[strlen(o._ime) + 1];
  112.         _prezime = new char[strlen(o._prezime) + 1];
  113.         _adresa = new char[strlen(o._adresa) + 1];
  114.         strcpy_s(_ime, strlen(o._ime) + 1, o._ime);
  115.         strcpy_s(_prezime, strlen(o._prezime) + 1, o._prezime);
  116.         strcpy_s(_adresa, strlen(o._adresa) + 1, o._adresa);
  117.         strncpy_s(_telefon, 15, o._telefon, _TRUNCATE);
  118.     }
  119.     Osoba & operator=(Osoba & o){
  120.         if (this != &o){
  121.             delete[]_ime;
  122.             delete[]_prezime;
  123.             delete[]_adresa;
  124.             _ime = new char[strlen(o._ime) + 1];
  125.             _prezime = new char[strlen(o._prezime) + 1];
  126.             _adresa = new char[strlen(o._adresa) + 1];
  127.             strcpy_s(_ime, strlen(o._ime) + 1, o._ime);
  128.             strcpy_s(_prezime, strlen(o._prezime) + 1, o._prezime);
  129.             strcpy_s(_adresa, strlen(o._adresa) + 1, o._adresa);
  130.             strncpy_s(_telefon, 15, o._telefon, _TRUNCATE);
  131.         }
  132.         return *this;
  133.     }
  134.     virtual ~Osoba()
  135.     {
  136.         delete[] _ime;
  137.         _ime = nullptr;
  138.         delete[] _prezime;
  139.         _prezime = nullptr;
  140.         delete[] _adresa;
  141.         _adresa = nullptr;
  142.     }
  143.     char * getIme(){ return _ime; }
  144.     char * getPrezime(){ return _prezime; }
  145.     virtual void Info() = 0;
  146.    
  147. };
  148.  
  149. class Proizvod
  150. {
  151.     char* _naziv;
  152.     char* _opis;
  153.     double _cijena;
  154. public:
  155.     Proizvod(char* naziv = "", char* opis="", double cijena=0)
  156.     {
  157.         int vel = strlen(naziv) + 1;
  158.         _naziv = new char[vel];
  159.         strcpy_s(_naziv, vel, naziv);
  160.  
  161.         vel = strlen(opis) + 1;
  162.         _opis = new char[vel];
  163.         strcpy_s(_opis, vel, opis);
  164.  
  165.         _cijena = cijena;
  166.     }
  167.     Proizvod(Proizvod & p){
  168.         _naziv = new char[strlen(p._naziv) + 1];
  169.         _opis = new char[strlen(p._opis) + 1];
  170.         strcpy_s(_naziv, strlen(p._naziv) + 1, p._naziv);
  171.         strcpy_s(_opis, strlen(p._opis) + 1, p._opis);
  172.         _cijena = p._cijena;
  173.     }
  174.     Proizvod & operator=(Proizvod & p){
  175.         if (this != &p){
  176.             delete[]_naziv;
  177.             delete[]_opis;
  178.             _naziv = new char[strlen(p._naziv) + 1];
  179.             _opis = new char[strlen(p._opis) + 1];
  180.             strcpy_s(_naziv, strlen(p._naziv) + 1, p._naziv);
  181.             strcpy_s(_opis, strlen(p._opis) + 1, p._opis);
  182.             _cijena = p._cijena;
  183.         }
  184.         return *this;
  185.     }
  186.     ~Proizvod()
  187.     {
  188.         delete[] _naziv;
  189.         _naziv = nullptr;
  190.  
  191.         delete[] _opis;
  192.         _opis = nullptr;
  193.     }
  194.     double GetCijena(){ return _cijena; }
  195.     friend ostream& operator<<(ostream&, const Proizvod&);
  196.    
  197. };
  198. class Narudzba {
  199.     char _datum[12]; //Format: dd.MM.yyyy.
  200.     Kolekcija<Proizvod*, int> _proizvodi; //Podaci o naručenim proizvodima i količinama
  201. public:
  202.     //Potrebne osnovne funkcije za rad sa klasom
  203.     Narudzba(char * datum = ""){
  204.         strncpy_s(_datum, 12, datum, _TRUNCATE);
  205.     }
  206.     Narudzba(Narudzba & n){
  207.         strncpy_s(_datum, 12, n._datum, _TRUNCATE);
  208.         _proizvodi = n._proizvodi;
  209.            
  210.     }
  211.     Narudzba & operator=(Narudzba & n){
  212.         if (this != &n){
  213.             strncpy_s(_datum, 12, n._datum, _TRUNCATE);
  214.             _proizvodi = n._proizvodi;
  215.         }
  216.         return *this;
  217.     }
  218.     void operator()(Proizvod p, int k=1){
  219.         Proizvod * temp = new Proizvod(p);
  220.         _proizvodi.DodajElemente(temp, k);
  221.     }
  222.     //Funkciju GetIznosNarudzbe koja vraća ukupan iznos narudžbe na osnovu
  223.     //podataka o cijenama proizvoda i naručenim količinama. Funkcija prima neobavezni parametar popust
  224.     //koji inicijalno ima vrijednost 0, što znači da ne postoji popust na postojeće cijene proizvoda.
  225.     double GetIznosNarudzbe(int popust = 0){
  226.         double suma = 0;
  227.         for (int i = 0; i < _proizvodi.GetTrenutno(); i++)
  228.             suma += _proizvodi.GetElement1(i)->GetCijena() * _proizvodi.GetElement2(i);
  229.         suma -= suma*popust;
  230.         return suma;
  231.     }
  232.     //Funkciju za ispis svih vrijednosti atributa klase.
  233.     friend ostream & operator<<(ostream & cout, Narudzba & n){
  234.         cout << "Datum: " << n._datum << endl;
  235.         cout << "Proizvodi: " << endl;
  236.         for (int i = 0; i < n._proizvodi.GetTrenutno(); i++)
  237.             cout << *n._proizvodi.GetElement1(i) << "\t" << n._proizvodi.GetElement2(i)<<endl;
  238.         return cout;
  239.     }
  240.     int GetMjesec(){
  241.         char mj[3] = { _datum[3], _datum[4], '\0' };
  242.         return atoi(mj);
  243.     }
  244. };
  245.  
  246. template<class T1, class T2>
  247. ostream& operator<<<>(ostream& cout, const Kolekcija<T1, T2>& k)
  248. {
  249.     for (int i = 0; i < k._trenutno; i++)
  250.     {
  251.         cout << k._elementi1[i] << "\t" << k._elementi2[i] << endl;
  252.     }
  253.  
  254.     return cout;
  255. }
  256.  
  257. ostream& operator<<(ostream& cout, const Proizvod& p)
  258. {
  259.     cout << "Naziv: " << p._naziv << endl;
  260.     cout << "Opis: " << p._opis << endl;
  261.     cout << "Cijena: " << p._cijena << endl;
  262.  
  263.     return cout;
  264. }
  265.  
  266. class Klijent : public Osoba
  267. {
  268. protected:
  269.     int _id;
  270.     static int id;
  271.     char* _email;
  272.     Kolekcija<Narudzba, double> _narudzbe; //Podaci o narudžbama sa ukupnim utrošenim iznosom u KM
  273. public:
  274.     //Potrebne konstruktor i destruktor funkcije.
  275.     Klijent(char * ime="", char * prezime="", char * adresa="", char * telefon="",char * email = "") : Osoba(ime, prezime, adresa, telefon){
  276.         _id = id++;
  277.         _email = new char[strlen(email)+1];
  278.         strcpy_s(_email, strlen(email) + 1, email);
  279.     }
  280.     Klijent(Klijent & k) : Osoba(k),_id(id++){
  281.         _email = new char[strlen(k._email) + 1];
  282.         strcpy_s(k._email, strlen(k._email) + 1, k._email);
  283.         _narudzbe = k._narudzbe;
  284.     }
  285.     Klijent & operator=(Klijent & k){
  286.         if (this != &k){
  287.             delete[]_email;
  288.             _id = k._id;
  289.             _narudzbe = k._narudzbe;
  290.             _email = new char[strlen(k._email) + 1];
  291.             strcpy_s(k._email, strlen(k._email) + 1, k._email);
  292.         }
  293.         return *this;
  294.     }
  295.     //Funkciju za evidenciju nove narudžbe.
  296.     virtual void EvidentirajNarudzbu(Narudzba n){
  297.         double iznos = n.GetIznosNarudzbe();
  298.         _narudzbe.DodajElemente(n, iznos);
  299.     }
  300.     //Funkciju koja vraća logičku vrijednost true ukoliko je klijent za odabrani mjesec u godini imao
  301.     //potrošnju veću od zadate. Prototip funkcije: bool IsPotrosnjaVeca(int mjesec, double potrosnja);
  302.     //Za pronalazak potrosnje po mjesecima koristiti podatak o datumu narudžbe.
  303.     bool IsPotrosnjaVeca(int mjesec, double potrosnja){
  304.         for (int i = 0; i < _narudzbe.GetTrenutno(); i++){
  305.             double pot = 0;
  306.             if (_narudzbe.GetElement1(i).GetMjesec() == mjesec){
  307.                 cout << "Mjesec je: " << _narudzbe.GetElement1(i).GetMjesec() << endl;
  308.                 return (_narudzbe.GetElement1(i).GetIznosNarudzbe()>potrosnja);
  309.             }
  310.         }
  311.     }
  312.  
  313.     //Funkciju za izmjenu e-mail adrese.
  314.     void izmjenaMaila(char * email){
  315.         delete[]_email;
  316.         _email = new char[strlen(email) + 1];
  317.         strcpy_s(_email, strlen(email) + 1, email);
  318.     }
  319.     //Funkciju za ispis svih vrijednosti atributa klase.
  320.     virtual void Info(){
  321.        
  322.         cout << "Ime i prezime: " << _ime << " " << _prezime << endl;
  323.         cout << "Adresa: " << _adresa << endl;
  324.         cout << "Telefon: " << _telefon << endl;
  325.         cout << "ID: " << _id << endl;
  326.         cout << "Email: " << _email << endl;
  327.         cout << "Narudzbe: " << _narudzbe;
  328.         cout << _narudzbe << endl;
  329.     }
  330.     void SetEmail(char * ime, char * prezime){
  331.         int vel = strlen(ime) + strlen(prezime) + strlen("@firma.ba") + 2;
  332.         char * temp = new char[vel];
  333.         strcpy_s(temp, vel, ime);
  334.         strcat(temp, ".");
  335.         strcat(temp, prezime);
  336.         strcat(temp, "@firma.ba");
  337.         delete[]_email;
  338.         _email = temp;
  339.     }
  340. };
  341.  
  342. int Klijent::id = 1;
  343.  
  344. class VIPKlijent : public Klijent
  345. {
  346.     char* _parkingOznaka;
  347.     double _popust;
  348. public:
  349.     VIPKlijent(char * ime, char * prezime, char * adresa, char * telefon, char * email, char * pOznaka, double popust) :Klijent(ime, prezime, adresa, telefon, email){
  350.         _parkingOznaka = new char[strlen(pOznaka) + 1];
  351.         strcpy_s(_parkingOznaka, strlen(pOznaka) + 1, pOznaka);
  352.         _popust = popust;
  353.     }
  354.     VIPKlijent(VIPKlijent & vk) : Klijent(vk){
  355.         _parkingOznaka = new char[strlen(vk._parkingOznaka) + 1];
  356.         strcpy_s(_parkingOznaka, strlen(vk._parkingOznaka) + 1, vk._parkingOznaka);
  357.         _popust = vk._popust;
  358.     }
  359.     VIPKlijent & operator=(VIPKlijent & vk){
  360.         if (this != &vk){
  361.             Klijent::operator=(vk);
  362.             _parkingOznaka = new char[strlen(vk._parkingOznaka) + 1];
  363.             strcpy_s(_parkingOznaka, strlen(vk._parkingOznaka) + 1, vk._parkingOznaka);
  364.             _popust = vk._popust;
  365.         }
  366.         return *this;
  367.     }
  368.     //Potrebne konstruktor i destruktor funkcije
  369.     ~VIPKlijent(){
  370.         delete[]_parkingOznaka;
  371.         _parkingOznaka = nullptr;
  372.     }
  373.     //Funkciju za evidenciju nove narudžbe sa zaračunatim popustom na sve proizvode.
  374.     void EvidentirajNarudzbu(Narudzba n){
  375.         double iznos = n.GetIznosNarudzbe();
  376.         _narudzbe.DodajElemente(n, iznos);
  377.     }
  378.     //Funkciju koja posljednjoj narudžbi klijenta dodaje gratis proizvod proslijeđen kao parametar.
  379.     void addGratis(Proizvod p){
  380.         int lokacija = _narudzbe.GetTrenutno() - 1;
  381.         _narudzbe[lokacija](p);
  382.     }
  383.     //Funkciju za ispis svih vrijednosti atributa klase
  384.     void Info(){
  385.         Klijent::Info();
  386.         cout << "Parking oznaka: " << _parkingOznaka << endl;
  387.         cout << "Popust: " << _popust << endl;
  388.     }
  389. };
  390.  
  391. //Funkcija treba da pronađe sve one klijente koji su za odabrani mjesec ostvarili potrošnju veću
  392. //od zadate. Ispisati njihove podatke i vratiti ukupan broj pronađenih klijenata.
  393. int PronadjiKlijentePoPotrosnji(Osoba* niz[], int max){
  394.     int mjesec = 0, brojacKlijenata = 0;
  395.     double potrosnja = 0;
  396.     cout << "Unesi mjesec: ";
  397.     cin >> mjesec;
  398.     cout << "Unesi potrosnju: ";
  399.     cin >> potrosnja;
  400.     Klijent * k = nullptr;
  401.     for (int i = 0; i < max; i++){
  402.         k = dynamic_cast<Klijent *>(niz[i]);
  403.         if (k != nullptr){
  404.             if (k->IsPotrosnjaVeca(mjesec, potrosnja)){
  405.                 k->Info();
  406.                 brojacKlijenata++;
  407.             }
  408.         }
  409.     }
  410.     return brojacKlijenata;
  411. }
  412.  
  413. //Pronaći sve VIP klijente, te im dodati gratis proizvod proslijeđen kao parametar.
  414. void UkljuciGratisProizvodVIPKlijentima(Osoba* niz[], int max, Proizvod& p){
  415.     VIPKlijent * vp = nullptr;
  416.     for (int i = 0; i < max; i++){
  417.         vp = dynamic_cast<VIPKlijent*>(niz[i]);
  418.         if (vp != nullptr){
  419.             vp->addGratis(p);
  420.         }
  421.     }
  422. }
  423.  
  424. //Svim klijentima postaviti mail adresu u formatu: ime.prezime@firma.ba.
  425. void GenerisiMailAdreseKlijentima(Osoba* niz[], int max){
  426.     Klijent * k = nullptr;
  427.     for (int i = 0; i < max; i++){
  428.         k = dynamic_cast<Klijent *>(niz[i]);
  429.         if (k != nullptr){
  430.             k->SetEmail(k->getIme(), k->getPrezime());
  431.         }
  432.     }
  433. }
  434.  
  435. //Omogućiti pretragu klijenata po imenu ili prezimenu (ispisati informacije
  436. //o svim klijentima koji sadrže uneseni tekst u dijelu imena ili prezimena.
  437. void PronadjiKlijentePoImenuPrezimenu(Osoba* niz[], int max){
  438.     char ime[50];
  439.     char prezime[50];
  440.     cout << "Unesite ime i prezime: ";
  441.     cin >> ime >> prezime;
  442.  
  443.     Klijent * k = nullptr;
  444.  
  445.     for (int i = 0; i < max; i++){
  446.         k = dynamic_cast<Klijent*>(niz[i]);
  447.         if (k != nullptr){
  448.             if (strcmp(ime, k->getIme()) == 0 && strcmp(prezime, k->getPrezime()) == 0)
  449.                 k->Info();
  450.         }
  451.     }
  452. }
  453.  
  454. int main()
  455. {
  456.     //Testirati sve dostupne funkcionalnosti uz obaveznu provjeru globalnih funkcija.
  457.     //VIP klijentima sve narudžbe kreirati uz zaračunati popust pozivom odgovarajuće funkcije.
  458.  
  459.     const int length = 5;
  460.     Osoba * niz[length];
  461.     niz[0] = new Klijent("Nisvet", "Mujkic", "Ahmeta Fetahagica bb", "060/302-5434", "nisvet.mujkic@edu.fit.ba");
  462.     niz[1] = new Klijent("Eman", "Basic", "Ulica Marsala Tita 14", "061/551-3421", "eman.basic@tu.au");
  463.     niz[2] = new Klijent("Johnny", "Bravo", "Ulica Dzemala Bijedica", "065/652-5984", "johnny.bravo@gov.us");
  464.     niz[3] = new VIPKlijent("Mirnes", "Cerimovic", "Tuzlanska bb", "061/777-3333", "mirnes.cerimovic@untz.ba", "MC_1", 50);
  465.     niz[4] = new VIPKlijent("Haris", "Kudic", "Ilidza 12", "062/919-8732", "haris.kudic@edu.burch.ba", "HK_2", 0.1);
  466.  
  467.     Proizvod sok("Cappy", "Tropsko voce", 1.3);
  468.     Proizvod cokolada("Milka", "Cokolada sa nougatom", 1.7);
  469.     Proizvod cips("Frank Chips XXL", "Slani cips", 2.4);
  470.     Proizvod sladoled("Macho", "Vanilija", 1.5);
  471.  
  472.     Narudzba order_1("11/12/2016");
  473.  
  474.     order_1(sok, 10);
  475.     order_1(cokolada);
  476.     order_1(cokolada);
  477.  
  478.     Narudzba order_2("04/7/2016");
  479.  
  480.     order_2(cips, 15);
  481.     order_2(sok, 4);
  482.  
  483.     Klijent * k1 = dynamic_cast<Klijent*>(niz[0]);
  484.     if (k1 != nullptr)
  485.         k1->EvidentirajNarudzbu(order_1);
  486.  
  487.     VIPKlijent * k2 = dynamic_cast<VIPKlijent*>(niz[3]);
  488.     if (k2 != nullptr)
  489.         k2->EvidentirajNarudzbu(order_1);
  490.  
  491.     VIPKlijent * k3 = dynamic_cast<VIPKlijent*>(niz[3]);
  492.     k3->addGratis(cips);
  493.  
  494.  
  495.     GenerisiMailAdreseKlijentima(niz, length);
  496.  
  497.     //UkljuciGratisProizvodVIPKlijentima(niz, length, cips);
  498.  
  499.     PronadjiKlijentePoImenuPrezimenu(niz, length);
  500.  
  501.     PronadjiKlijentePoPotrosnji(niz, length);
  502.  
  503.     system("pause");
  504.     return 0;
  505. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement