ekrajchevska

Zicani instrumenti, Vozilo [Polimorfizam OOP Lab 7]

Apr 12th, 2016
1,150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.51 KB | None | 0 0
  1. /* Zicani instrumenti Problem 1 (1 / 1)
  2. Да се креира хиерархиjа на класи за репрезентациjа на жичани инструменти. За потребите на оваа хиерархиjа да се дефинира класа ZicanInstrument од коjа ќе бидат изведени двете класи Mandolina и Violina.
  3.  
  4. Во класата ZicanInstrument се чуваат податоци за:
  5.  
  6. името на инструментот (низа од 20 знаци)
  7. броjот на жици
  8. основната цена на инструментот.
  9. За класата Mandolina дополнително се чува неjзината форма (низа од 20 знаци).
  10.  
  11. За класата Violina дополнително се чува неjзината големина (децимален броj).
  12.  
  13. За секоjа изведените класи треба да се дефинираат соодветните конструктори и следните методи:
  14.  
  15. cena() за пресметување на цената на инструментот
  16. основната цена на мандолината се зголемува за 15% доколку таа има форма во Неаполитански стил (вредноста на променливата форма е “Neapolitan”)
  17. основната цена на виолината се зголемува за 10% ако неjзината големина има вредност 1/4 (0.25), односно за 20% ако неjзината големина има вредност 1 (1.00)
  18. проптоварување на операторот ==, коj ги споредува жичаните инструменти според броjот на жици што го имаат
  19. преоптоварување на операторот << за печатење на сите податоци за жичаните инструменти.
  20. Да се напише функциjа pecatiInstrumenti(ZicanInstrument &zi, ZicanInstrument **i, int n) коjа на влез прима жичан инструмент, низа од покажувачи кон жичани инструменти и броj на елементи во низата. Функциjата jа печати цената на сите жичани инструменти од низата кои имаат ист броj на жици како и инструментот проследен како прв аргумент на функциjата.
  21.  
  22. Sample input:
  23. Mandolina_1 10 5000 Nepoznata
  24. 2
  25. Mandolina_2 5 3000 Prava
  26. Mandolina_3 10 8000 Neapolitan
  27. Violina_1 10 4000 0.25
  28. Violina_2 10 6000 0.8
  29.  
  30. Sample output:
  31. 9200
  32. 4400
  33. 6000
  34. */
  35.  
  36. #include <iostream>
  37. #include<cstring>
  38. using namespace std;
  39.  
  40. class ZicanInstrument
  41. {
  42. protected:
  43.     char ime[20];
  44.     int br_zici;
  45.     float osnovna_cena;
  46.  
  47. public:
  48.     ZicanInstrument(char ime[20]="",int br_zici=0,float osnovna_cena=0.0)
  49.     {
  50.         strcpy(this->ime,ime);
  51.         this->br_zici=br_zici;
  52.         this->osnovna_cena=osnovna_cena;
  53.     }
  54.  
  55.     virtual float cena()
  56.     {
  57.         return this->osnovna_cena;
  58.     }
  59.  
  60.     virtual int getBr_zici()
  61.     {
  62.         return this->br_zici;
  63.     }
  64.  
  65.  
  66.     bool operator== (ZicanInstrument &z)
  67.     {
  68.         return this->br_zici == z.br_zici;
  69.     }
  70.  
  71.     friend ostream &operator<< (ostream &output, ZicanInstrument &z)
  72.     {
  73.         output<<z.ime<<" "<<z.br_zici<<" "<<z.osnovna_cena<<endl;
  74.  
  75.         return output;
  76.     }
  77.  
  78. };
  79.  
  80. class Mandolina : public ZicanInstrument
  81. {
  82. private:
  83.     char forma[20];
  84.  
  85. public:
  86.     Mandolina(char ime[20]="",int br_zici=0,float osnovna_cena=0.0,char forma[20]=""):ZicanInstrument(ime,br_zici,osnovna_cena)
  87.     {
  88.         strcpy(this->forma,forma);
  89.     }
  90.  
  91.     float cena()
  92.     {
  93.         if(strcmp(forma,"Neapolitan")==0)
  94.         {
  95.             return osnovna_cena+(osnovna_cena*0.15);
  96.         }
  97.         cout<<"cena: ";
  98.         return osnovna_cena;
  99.     }
  100.  
  101.     int getBr_zici()
  102.     {
  103.         return this->br_zici;
  104.     }
  105.  
  106.     bool operator==(Mandolina &m)
  107.     {
  108.         return (this->br_zici == m.br_zici);
  109.     }
  110.  
  111.     friend ostream &operator<< (ostream &output, Mandolina &m)
  112.     {
  113.         output<<m.ime<<" "<<m.br_zici<<" "<<m.osnovna_cena<<endl;
  114.  
  115.         return output;
  116.     }
  117. };
  118.  
  119. class Violina : public ZicanInstrument
  120. {
  121. private:
  122.     float golemina;
  123.  
  124. public:
  125.     Violina(char ime[20]="",int br_zici=0,float osnovna_cena=0.0,float golemina=0.0):ZicanInstrument(ime,br_zici,osnovna_cena)
  126.     {
  127.         this->golemina=golemina;
  128.     }
  129.     float cena()
  130.     {
  131.         if(golemina==0.25)
  132.             return osnovna_cena+(osnovna_cena*0.1);
  133.             else if(golemina==1)
  134.                 return osnovna_cena+(osnovna_cena*0.2);
  135.  
  136.         return osnovna_cena;
  137.     }
  138.  
  139.     int getBr_zici()
  140.     {
  141.         return this->br_zici;
  142.     }
  143.  
  144.     bool operator== (Violina &v)
  145.     {
  146.         return this->br_zici == v.br_zici;
  147.     }
  148.     friend ostream &operator<< (ostream &output, Violina &v)
  149.     {
  150.         output<<v.ime<<" "<<v.br_zici<<" "<<v.osnovna_cena<<endl;
  151.  
  152.         return output;
  153.     }
  154.  
  155. };
  156.  
  157. void pecatiInstrumenti(ZicanInstrument &zi, ZicanInstrument **i, int n)
  158. {
  159.     for(int k=0;k<n;k++)
  160.     {
  161.         if(i[k]->getBr_zici()==zi.getBr_zici())
  162.         {
  163.             cout<<i[k]->cena()<<endl;
  164.         }
  165.     }
  166. }
  167.  
  168. int main() {
  169.         char ime[20];
  170.         int brojZici;
  171.         float osnovna_cena;
  172.         char forma[20];
  173.         cin >> ime >> brojZici >> osnovna_cena >> forma;
  174.         Mandolina m(ime, brojZici, osnovna_cena, forma);
  175.         int n;
  176.         cin >> n;
  177.         ZicanInstrument **zi = new ZicanInstrument*[2 * n];
  178.         for(int i = 0; i < n; ++i) {
  179.                 cin >> ime >> brojZici >> osnovna_cena >> forma;
  180.                 zi[i] = new Mandolina(ime, brojZici, osnovna_cena, forma);
  181.         }
  182.         for(int i = 0; i < n; ++i) {
  183.                 float golemina;
  184.                 cin >> ime >> brojZici >> osnovna_cena >> golemina;
  185.                 zi[n + i] = new Violina(ime, brojZici, osnovna_cena, golemina);
  186.  
  187.     }
  188.  
  189.         pecatiInstrumenti(m, zi, 2 * n);
  190.         for(int i = 0; i < 2 * n; ++i) {
  191.                 delete zi[i];
  192.         }
  193.         delete [] zi;
  194.         return 0;
  195. }
  196.  
  197. /* Возило Problem 1 (0 / 0)
  198. Да се дефинира класа Vozilo која ќе содржи информација за неговата маса (децимален број), ширина и висина (цели броеви).
  199.  
  200. Од оваа класа да се изведе класата Автомобил во која како дополнителна информација се чува информацијата за бројот на врати (цел број).
  201.  
  202. Од класата возило да се изведе и класата Автобус во која се чуваат информации и за бројот на патници кои може да ги пренесува.
  203.  
  204. Од класата возило да се изведе класата Камион во која се чуваат информации и за максималната маса која може да се товари на него (децимална вредност).
  205.  
  206. За сите класи да се креираат погодни контруктори, како и set и get функции.
  207.  
  208. Да се дефинира класа ParkingPlac за која се чува динамичко алоцирано поле од покажувачи кон Vozilo, како и бројот на елементи во полето. Во оваа класа да се дефинираат:
  209.  
  210. конструктор
  211. деструктор
  212. операторот += за додавање на ново возило (аргументот е покажувач кон Vozilo)
  213. функција float presmetajVkupnaMasa() со која се пресметува вкупната маса на сите возила во паркинг плацот
  214. функција int brojVozilaPoshirokiOd(int l) со која се пресметува бројот на возила кои се пошироки од дадената вредност
  215. функција void pecati() со која се печати: Broot na avtomobili e X, brojot na avtobusi e Y i brojot na kamioni e Z.
  216. функција int pogolemaNosivostOd(Vozilo& v) во која се враќа бројот на сите камиони кои имаат носивост поголема од масата на возилото предадено како аргумент.
  217. Да се дефинира виртуелна функција int vratiDnevnaCena() во класата Vozilo и истата да се преоптовари во сите изведени класи. За секој автомобил со помалку од 5 врати дневната цена е 100, а инаку е 130 денари. За секој камион цената се пресметува со формулата: (masa+nosivost)*0.02. За секој автобус цената е 5 денати по лице кое може да се пренесува.
  218.  
  219. Во класата ParkingPlac да се додаде следната функција: - функција int vratiDnevnaZarabotka() со која се враќа дневната заработка од сите возила на паркингот.
  220.  
  221. Sample input
  222. 5
  223. 1 1300 3 2 3
  224. 2 4500 10 4 45
  225. 3 6000 8 5 2000
  226. 1 2100 3 3 5
  227. 2 4200 9 5 52
  228.  
  229. Sample output:
  230. Broot na avtomobili e 2, brojot na avtobusi e 2 i brojot na kamioni e 1.
  231.  
  232. Zarabotkata e 875
  233. Vkupnata masa e 18100
  234. Brojot poshiroki od 5 e 3
  235. Brojot na kamioni so nosivost pogolema od avtomobilot e 1
  236. */
  237.  
  238. #include <iostream>
  239. using namespace std;
  240.  
  241. class Vozilo
  242. {
  243. protected:
  244.     float masa;
  245.     int shirina;
  246.     int visina;
  247.  
  248. public:
  249.     Vozilo(float masa=0.0,int shirina=0,int visina=0)
  250.     {
  251.         this->masa=masa;
  252.         this->shirina=shirina;
  253.         this->visina=visina;
  254.     }
  255.     float getMasa() { return this->masa; }
  256.     int getShirina() { return this->shirina; }
  257.     int getVisina() { return this->visina; }
  258.  
  259.     void setMasa(float m) { this->masa=m; }
  260.     void setShirina(int s) { this->shirina=s; }
  261.     void setVisina(int v) { this->visina=v ;}
  262.  
  263.     virtual int vratiDnevnaCena()=0;
  264.  
  265.  
  266. };
  267. class Avtomobil : public Vozilo
  268. {
  269. protected:
  270.     int br_vrati;
  271.  
  272. public:
  273.     Avtomobil(float masa=0.0,int shirina=0,int visina=0,int br_vrati=0):Vozilo(masa,shirina,visina)
  274.     {
  275.         this->br_vrati=br_vrati;
  276.     }
  277.  
  278.     int vratiDnevnaCena()
  279.     {
  280.         if(this->br_vrati<5) return 100;
  281.  
  282.         return 130;
  283.     }
  284.  
  285. };
  286.  
  287. class Avtobus : public Vozilo
  288. {
  289. protected:
  290.     int br_patnici;
  291.  
  292. public:
  293.     Avtobus(float masa=0.0,int shirina=0,int visina=0,int br_patnici=0):Vozilo(masa,shirina,visina)
  294.     {
  295.         this->br_patnici=br_patnici;
  296.     }
  297.  
  298.     int vratiDnevnaCena()
  299.     {
  300.         return this->br_patnici*5;
  301.     }
  302.     int getBr_patnici()
  303.     {
  304.         return this->br_patnici;
  305.     }
  306. };
  307.  
  308. class Kamion : public Vozilo
  309. {
  310. protected:
  311.     float max_masa;
  312.  
  313. public:
  314.     Kamion(float masa=0.0,int shirina=0,int visina=0,float max_masa=0.0):Vozilo(masa,shirina,visina)
  315.     {
  316.         this->max_masa=max_masa;
  317.     }
  318.  
  319.     int vratiDnevnaCena()
  320.     {
  321.         return (masa+max_masa)*0.02;
  322.     }
  323.  
  324.     float getMax_masa() { return this->max_masa; }
  325.  
  326. };
  327.  
  328. class ParkingPlac
  329. {
  330. private:
  331.     Vozilo **vozila;
  332.     int n;
  333.  
  334. public:
  335.     ParkingPlac(Vozilo **vozilaa,int n)
  336.     {
  337.         this->n=n;
  338.         this->vozila=new Vozilo*[n];
  339.         for(int i=0;i<n;i++)
  340.         {
  341.             vozila[i]=vozilaa[i];
  342.         }
  343.     }
  344.  
  345.     ParkingPlac()
  346.     {
  347.         vozila=new Vozilo*[100];
  348.         n=0;
  349.     }
  350.  
  351.     ~ParkingPlac()
  352.     {
  353.         for(int i=0;i<n;i++)
  354.         {
  355.             delete vozila[i];
  356.         }
  357.         delete [] vozila;
  358.     }
  359.  
  360.     ParkingPlac &operator+=(Vozilo *v1)
  361.     {
  362.         vozila[n++]=v1;
  363.  
  364.         return *this;
  365.     }
  366.  
  367.     float presmetajVkupnaMasa()
  368.     {
  369.         float suma=0;
  370.         for(int i=0;i<n;i++)
  371.         {
  372.             suma+=vozila[i]->getMasa();
  373.         }
  374.         return suma;
  375.     }
  376.  
  377.     int brojVozilaPoshirokiOd(int l)
  378.     {
  379.         int brojac=0;
  380.         for(int i=0;i<n;i++)
  381.         {
  382.             if(vozila[i]->getShirina() > l)
  383.                 brojac++;
  384.         }
  385.         return brojac;
  386.     }
  387.  
  388.     int pogolemaNosivostOd(Vozilo& v)
  389.     {
  390.         int brojac=0;
  391.         for(int i=0;i<n;i++)
  392.         {
  393.             Kamion *k=dynamic_cast<Kamion*>(vozila[i]);
  394.             if(k!=0)
  395.             {
  396.                 if(v.getMasa()<vozila[i]->getMasa())
  397.                     brojac++;
  398.             }
  399.         }
  400.         return brojac;
  401.     }
  402.  
  403.     void pecati()
  404.     {
  405.         int avtomobili=0,avtobusi=0,kamioni=0;
  406.  
  407.         for(int i=0;i<n;i++)
  408.         {
  409.             Avtomobil *a=dynamic_cast<Avtomobil*>(vozila[i]);
  410.             if(a!=0) avtomobili++;
  411.  
  412.             Avtobus *s=dynamic_cast<Avtobus*>(vozila[i]);
  413.             if(s!=0) avtobusi++;
  414.  
  415.             Kamion *k=dynamic_cast<Kamion*>(vozila[i]);
  416.             if(k!=0) kamioni++;
  417.         }
  418.         cout << "Brojot na avtomobili e "<<avtomobili<<", brojot na avtobusi e "
  419.         <<avtobusi<<" i brojot na kamioni e "<<kamioni<<"."<<endl;
  420.  
  421.     }
  422.     int vratiDnevnaZarabotka()
  423.     {
  424.         int zarabotka=0;
  425.         for(int i=0;i<n;i++)
  426.         {
  427.             zarabotka+=vozila[i]->vratiDnevnaCena();
  428.         }
  429.  
  430.         return zarabotka;
  431.     }
  432.  
  433. };
  434.  
  435. int main(){
  436.     ParkingPlac p;
  437.  
  438.     int n;
  439.     cin>>n;
  440.     int shirina,visina, broj;
  441.     float masa,nosivost;
  442.     for (int i=0;i<n;i++){
  443.         int type;
  444.         cin>>type;
  445.         if(type==1){
  446.             cin>>masa>>shirina>>visina>>broj;
  447.             Avtomobil *a=new Avtomobil(masa,shirina,visina,broj);
  448.             p+=a;
  449.         }
  450.         if(type==2){
  451.             cin>>masa>>shirina>>visina>>broj;
  452.             p+=new Avtobus(masa,shirina,visina,broj);
  453.         }
  454.         if(type==3){
  455.             cin>>masa>>shirina>>visina>>nosivost;
  456.             p+=new Kamion(masa,shirina,visina,nosivost);
  457.         }
  458.     }
  459.     p.pecati();
  460.  
  461.     cout<<"\nZarabotkata e "<<p.vratiDnevnaZarabotka()<<endl;
  462.     cout<<"Vkupnata masa e "<<p.presmetajVkupnaMasa()<<endl;
  463.     cout<<"Brojot poshiroki od 5 e "<<p.brojVozilaPoshirokiOd(5)<<endl;
  464.     Avtomobil a(1200,4,3,5);
  465.     cout<<"Brojot na kamioni so nosivost pogolema od avtomobilot e "<<p.pogolemaNosivostOd(a)<<endl;
  466.     return 0;
  467. }
Advertisement
Add Comment
Please, Sign In to add comment