Advertisement
neogz

Polimorfizam W8

Feb 6th, 2015
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.82 KB | None | 0 0
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. char crt[] = { "--------------------------------------------\n" };
  5. class Osoba{
  6. protected:
  7.     char* _ime;
  8.     char* _prezime;
  9.     char* _adresa;
  10.     char _telefon[15];
  11. public:
  12.     Osoba(char* ime, char* prezime, char* adresa, char* telefon)
  13.     {
  14.         int vel = strlen(ime) + 1;
  15.         _ime = new char[vel];
  16.         strcpy_s(_ime, vel, ime);
  17.  
  18.         vel = strlen(prezime) + 1;
  19.         _prezime = new char[vel];
  20.         strcpy_s(_prezime, vel, prezime);
  21.  
  22.         vel = strlen(adresa) + 1;
  23.         _adresa = new char[vel];
  24.         strcpy_s(_adresa, vel, adresa);
  25.  
  26.         strcpy_s(_telefon, 15, telefon);
  27.     }
  28.     Osoba(Osoba & obj){
  29.         int vel = strlen(obj._ime) + 1;
  30.         _ime = new char[vel];
  31.         strcpy_s(_ime, vel, obj._ime);
  32.  
  33.         vel = strlen(obj._prezime) + 1;
  34.         _prezime = new char[vel];
  35.         strcpy_s(_prezime, vel, obj._prezime);
  36.  
  37.         vel = strlen(obj._adresa) + 1;
  38.         _adresa = new char[vel];
  39.         strcpy_s(_adresa, vel, obj._adresa);
  40.  
  41.         strcpy_s(_telefon, 15, obj._telefon);
  42.     }
  43.     virtual ~Osoba()
  44.     {
  45.         delete[] _ime;
  46.         _ime = NULL;
  47.         delete[] _prezime;
  48.         _prezime = NULL;
  49.         delete[] _adresa;
  50.         _adresa = NULL;
  51.     }
  52.     // virtualna funkcija, sada je klasa osoba abstract
  53.     virtual void info() = 0;
  54.     char * getIme()const {
  55.         return _ime;
  56.     }
  57.     char * getPrezime()const{
  58.         return _prezime;
  59.     }
  60. };
  61. //////////////////////////////////////////////////////////////////////////////////////////
  62. class Klijent:public Osoba{
  63. protected: 
  64.     int _id;
  65.     double _mjesecnaPotrosnja;
  66.     char* _email;
  67. public:
  68.     Klijent(char* ime, char* prezime, char* adresa, char* telefon, int id, double mjesecnaPotrosnja, char * email) :Osoba(ime, prezime, adresa, telefon){
  69.         _id = id;
  70.         _mjesecnaPotrosnja = mjesecnaPotrosnja;
  71.  
  72.         int vel = strlen(email) + 1;
  73.         _email = new char[vel];
  74.         strcpy_s(_email, vel, email);
  75.     }
  76.     Klijent(Klijent & obj) :Osoba(obj){
  77.         _id = obj._id;
  78.         _mjesecnaPotrosnja = obj._mjesecnaPotrosnja;
  79.  
  80.         int vel = strlen(obj._email) + 1;
  81.         _email = new char[vel];
  82.         strcpy_s(_email, vel, obj._email);
  83.     }
  84.     virtual ~Klijent(){
  85.         delete[]_email;
  86.         _email = nullptr;
  87.     };
  88.     ////////////////////////////////////////////////////////////////////////////////////
  89.     //                          preklopljeni operatori
  90.     ////////////////////////////////////////////////////////////////////////////////////
  91.     friend ostream & operator << (ostream & cout, Klijent & obj);
  92.     friend bool operator > (const Klijent & a, const Klijent & b);
  93.     ////////////////////////////////////////////////////////////////////////////////////
  94.     void izmjeniMail(char * email){
  95.         delete[] _email;
  96.         int vel = strlen(email) + 1;
  97.         _email = new char[vel];
  98.         strcpy_s(_email, vel, email);
  99.     }
  100.     virtual void info(){
  101.         cout << crt << "\tKLIJENT" << endl << crt;
  102.         cout << "Ime i prezime: " << _ime << " " << _prezime << endl;
  103.         cout << "Adresa: " << _adresa << endl;
  104.         cout << "Telefon: " << _telefon << endl;
  105.         cout << "ID: " << _id << endl;
  106.         cout << "Mjesecna potrosnja: " << _mjesecnaPotrosnja << endl;
  107.         cout << "e-mail: " << _email << endl;
  108.     }
  109.     bool uporediPotrosnju(double potrosnja){
  110.         if (this->_mjesecnaPotrosnja > potrosnja)
  111.             return true;
  112.         return false;
  113.     }
  114. };
  115. bool operator > (const Klijent & a, const Klijent & b){
  116.     //Preklopiti operator > koji će porediti klijenta sa zadatom potrošnjom i
  117.     //vratiti true u slučaju da je klijent imao veću mjesečnu potrošnju.
  118.     //Implementirati kao friend funkciju.
  119.     if (&a == &b) return false;
  120.     if (a._mjesecnaPotrosnja > b._mjesecnaPotrosnja) return true;
  121.     return false;
  122.  
  123. }
  124. ostream & operator << (ostream & cout, Klijent & obj){
  125.     // ne koristim ovaj operator imam info funkcije
  126.     cout << "Ime i prezime: " << obj._ime << " " << obj._prezime << endl;
  127.     cout << "Adresa: " << obj._adresa << endl;
  128.     cout << "Telefon: " << obj._telefon << endl;
  129.     cout << "ID: " << obj._id << endl;
  130.     cout << "Mjesecna potrosnja: " << obj._mjesecnaPotrosnja << endl;
  131.     cout << "e-mail: " << obj._email << endl;
  132.  
  133.     return cout;
  134. }
  135. //////////////////////////////////////////////////////////////////////////////////////////
  136. class Zaposlenik: public Osoba {
  137.     char _radnoMjesto[30];
  138.     int _godineStaza;
  139. public:
  140.     Zaposlenik(char* ime, char* prezime, char* adresa, char* telefon, char *radnoMjesto, int godineStaza) :Osoba(ime, prezime, adresa, telefon){
  141.         strcpy_s(_radnoMjesto, 30, radnoMjesto);
  142.         _godineStaza = godineStaza;
  143.     }
  144.     ~Zaposlenik(){
  145.         // ne treba nam destruktor
  146.     }
  147.  
  148.     void info(){
  149.         cout << crt << "\tZAPOSLENIK" << endl << crt;
  150.  
  151.         cout << "Ime i prezime: " << _ime << " " << _prezime << endl;
  152.         cout << "Adresa: " << _adresa << endl;
  153.         cout << "Telefon: " << _telefon << endl;
  154.         cout << "Radno mjesto: " << _radnoMjesto << endl;
  155.         cout << "Godine staza: " << _godineStaza << endl;
  156.     }
  157.     char * getRadnoMjesto(){
  158.         return _radnoMjesto;
  159.     }
  160. };
  161. //////////////////////////////////////////////////////////////////////////////////////////
  162. class VIPKlijent : public Klijent {
  163.     double _popust;
  164.     char* _parkingOznaka;
  165. public:
  166.     VIPKlijent(char* ime, char* prezime, char* adresa, char* telefon, int id, double mjesecnaPotrosnja, char * email,double popust, char * parkingOznaka):Klijent(ime,prezime,adresa,telefon,id,mjesecnaPotrosnja,email){
  167.         _popust = popust;
  168.        
  169.         int vel = strlen(parkingOznaka) + 1;
  170.         _parkingOznaka = new char[vel];
  171.         strcpy_s(_parkingOznaka, vel, parkingOznaka);
  172.     }
  173.     VIPKlijent(VIPKlijent & obj):Klijent(obj){
  174.         _popust = obj._popust;
  175.         int vel = strlen(obj._parkingOznaka) + 1;
  176.         _parkingOznaka = new char[vel];
  177.         strcpy_s(_parkingOznaka, vel, obj._parkingOznaka);
  178.  
  179.     }
  180.     //////////////////////////////////////////////////////////////////////////////////////////
  181.     void izmjeniMjesecnu(){
  182.         //Funkciju koja treba da izmijeni vrijednost mjesečne potrošnje na način da se
  183.         //uračuna popust (prosječna potrošnja treba da se umanji)
  184.         _mjesecnaPotrosnja -= _popust;
  185.     }
  186.     void info(){
  187.         cout << crt << "\tVIP KLIJENT" << endl << crt;
  188.  
  189.         cout << "Ime i prezime: " << _ime << " " << _prezime << endl;
  190.         cout << "Adresa: " << _adresa << endl;
  191.         cout << "Telefon: " << _telefon << endl;
  192.         cout << "ID: " << _id << endl;
  193.         cout << "Mjesecna potrosnja: " << _mjesecnaPotrosnja << endl;
  194.         cout << "e-mail: " << _email << endl;
  195.         cout << "Popust: " << _popust << endl;
  196.         cout << "Parking oznaka: " << _parkingOznaka << endl;
  197.     }
  198. };
  199. //////////////////////////////////////////////////////////////////////////////////////////
  200. int pretragaPotrosnjeKlijenata(Osoba* niz[], int max){
  201.     //Funkcija treba da pronađe sve one klijente koji su ostvarili mjesečnu potrošnju veće
  202.     //od zadate. Ispisati podatke i vratiti ukupan broj pronađenih klijenata.
  203.     int sumKlijenata = 0;
  204.     double iznos = 0;
  205.     cout << "Unesite iznos mjesecne potrosnje za koji zelite izvrstiti pretragu: " << endl;
  206.     cin >> iznos;
  207.  
  208.     Klijent * pok = NULL;
  209.     for (int i = 0; i < max; i++){
  210.         pok = (dynamic_cast<Klijent*>(niz[i]));     // castira pokazivac niz[i] na klijenta
  211.         if (pok != NULL){                           // ako je element Klijent
  212.             if (pok->uporediPotrosnju(iznos)){      // upoređuje potrosnju i potrosnju koju je korisnik unio
  213.                 sumKlijenata++;                     // dodaje 1
  214.                 pok->info();                        // ispisuje podatke
  215.             }
  216.         }
  217.     }
  218.     return sumKlijenata;
  219.  
  220. }
  221. void pretragaVIPKlijenata(Osoba* niz[], int max){
  222.     //Pronaći sve VIP klijente, te im zaračunati popust na kupljene artikle i ispisati
  223.     //informacije o onima koji su ostvarili potrošnju veću od 50 KM mjesečno.
  224.     VIPKlijent * pok = NULL;
  225.     for (int i = 0; i < max; i++){
  226.         pok = dynamic_cast<VIPKlijent*>(niz[i]);
  227.         if (pok != NULL){
  228.             pok->izmjeniMjesecnu();                 // uracunavamo popust
  229.             if (pok->uporediPotrosnju(50)){         // poredimo potrosnju, funkcija vraca true ako je vece od argumenta(50)
  230.                 pok->info();                        // ispis
  231.             }
  232.         }
  233.     }
  234. }
  235. void generisiMailAdrese(Osoba* niz[], int max){
  236.     //Svim klijentima postaviti mail adresu u formatu: ime.prezime@firma.ba
  237.     Klijent * pok = NULL;
  238.     for (int i = 0; i < max; i++){
  239.         pok = dynamic_cast<Klijent *> (niz[i]);
  240.         if (pok != NULL){
  241.             char * ime = pok->getIme();
  242.             char * prezime = pok->getPrezime();
  243.             // mjerimo i alociramo
  244.             int vel = strlen(ime) + strlen(prezime) + 1 + 10; // null terminirajući  +  .@firma.ba
  245.             char * temp = new char[vel];
  246.             strncpy_s(temp,vel, ime, strlen(ime));              // kopira ime
  247.             strncat_s(temp, vel, ".", 1);                       // dodaje .
  248.             strncat_s(temp, vel, prezime, strlen(prezime));     // dodaje prezime
  249.             strncat_s(temp, vel, "@firma.ba", 10);              // dodaje @firma.ba
  250.             //strncat_s(temp, vel, '\0', 1);                        // dodaje null terminating
  251.  
  252.             pok->izmjeniMail(temp);
  253.    
  254.         }
  255.     }
  256. }
  257. void pretragaKlijenataPoImenu(Osoba* niz[], int max){
  258.     //Omogućiti pretragu klijenata po imenu ili prezimenu (ispisati informacije
  259.     //o svima koji sadrže uneseni tekst u dijelu imena ili prezimena.
  260.     bool pronadjen = false;
  261.     char * tempIme = new char[250];
  262.     char * tempPrezime = new char[250];
  263.     cout <<crt<< "Unesite ime klijenta: ";
  264.     cin >> tempIme;
  265.     cout << "Unesite prezime klijenta: ";
  266.     cin >> tempPrezime;
  267.  
  268.     Klijent * pok = NULL;
  269.     for (int i = 0; i < max; i++){
  270.         pok = dynamic_cast <Klijent *> (niz[i]);
  271.         if (pok != NULL){
  272.             if (strstr(niz[i]->getIme(), tempIme) != NULL || strstr(niz[i]->getIme(), tempPrezime) != NULL){
  273.                 pok->info();
  274.                 pronadjen = true;
  275.             }
  276.         }
  277.     }
  278.     cout << crt;
  279.     if (!pronadjen) cout << "Trazeni radnik nije pronadjen!!!" << endl <<crt;
  280.  
  281.     delete[] tempIme;
  282.     delete[] tempPrezime;
  283. }
  284. void pretragaZaposlenika(Osoba* niz[], int max){
  285.     //Omogućiti pretragu zaposlenika na osnovu radnog mjesta koje definiše korisnik.
  286.     bool pronadjen = false;
  287.     char * tempMjesto = new char[30];
  288.     cout <<crt<< "Unesite radno mjesto: ";
  289.     cin >> tempMjesto;
  290.    
  291.  
  292.     Zaposlenik * pok = NULL;
  293.     for (int i = 0; i < max; i++){
  294.         pok = dynamic_cast<Zaposlenik *>(niz[i]);
  295.         if (pok != NULL){
  296.             if (strcmp(tempMjesto, pok->getRadnoMjesto()) == 0){
  297.                 pok->info();
  298.                 pronadjen = true;
  299.             }
  300.         }
  301.     }
  302.     cout << crt;
  303.     if (!pronadjen) cout << "Trazeno radno mjesto nije pronadjeno!!!" << endl << crt;
  304.     delete[]tempMjesto;
  305. }
  306. //////////////////////////////////////////////////////////////////////////////////////////
  307.  
  308. int main(){
  309.    
  310.     Osoba * niz[5];
  311.     niz[0] = new Klijent("Nedim", "Fejzic", "Gorazde", "062-195-xxx", 1, 195, "nema");
  312.     niz[1] = new Klijent("Faja", "Sadrvan", "Gorazde", "062-666-999", 2, 14, "faja@mejl.ba");
  313.     niz[2] = new VIPKlijent("Tigar", "IzKladnja", "Kladanj", "jesiLUD",3, 69, "tigar_iz_kladnja@pusenje.ba", 12, "F");
  314.     niz[3] = new Zaposlenik("Esma", "TheCleaningLady", "Bajci", "799-921", "Cistacica", 32);
  315.     niz[4] = new Zaposlenik("Rasim", "Mevkov", "Vinarici", "nezz", "Segrt", 1);
  316.  
  317.     for (int i = 0; i < 5; i++){
  318.         niz[i]->info();
  319.     }
  320.     //test funkcija
  321.      /*pretragaVIPKlijenata(niz, 5);
  322.      pretragaKlijenataPoImenu(niz, 5);
  323.      pretragaZaposlenika(niz, 5);*/
  324.    
  325.     // testiranje mail adresa
  326.     /*generisiMailAdrese(niz, 5);
  327.     cout << "\n\n\n" << crt << "EMAIL ADRESE POSLIJE PROMJENE" << endl;
  328.     for (int i = 0; i < 5; i++){
  329.         niz[i]->info();
  330.     }*/
  331.  
  332.    
  333.     system("pause >null");
  334.     return 0;
  335. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement