Advertisement
simov

OOP Lab.7 - Полиморфизам

Apr 17th, 2014
1,237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.68 KB | None | 0 0
  1. /*
  2. Возило Problem 1 (0 / 0)
  3. Да се дефинира класа Vozilo која ќе содржи информација за неговата маса (децимален број), ширина и висина (цели броеви).
  4.  
  5. Од оваа класа да се изведе класата Автомобил во која како дополнителна информација се чува информацијата за бројот на врати (цел број).
  6.  
  7. Од класата возило да се изведе и класата Автобус во која се чуваат информации и за бројот на патници кои може да ги пренесува.
  8.  
  9. Од класата возило да се изведе класата Камион во која се чуваат информации и за максималната маса која може да се товари на него (децимална вредност).
  10.  
  11. За сите класи да се креираат погодни контруктори, како и set и get функции.
  12.  
  13. Да се дефинира класа ParkingPlac за која се чува динамичко алоцирано поле од покажувачи кон Vozilo, како и бројот на елементи во полето. Во оваа класа да се дефинираат:
  14.  
  15. конструктор
  16. деструктор
  17. операторот += за додавање на ново возило (аргументот е покажувач кон Vozilo)
  18. функција float presmetajVkupnaMasa() со која се пресметува вкупната маса на сите возила во паркинг плацот
  19. функција int brojVozilaPoshirokiOd(int l) со која се пресметува бројот на возила кои се пошироки од дадената вредност
  20. функција void pecati() со која се печати: Broot na avtomobili e X, brojot na avtobusi e Y i brojot na kamioni e Z.
  21. функција int pogolemaNosivostOd(Vozilo& v) во која се враќа бројот на сите камиони кои имаат носивост поголема од масата на возилото предадено како аргумент.
  22. Да се дефинира виртуелна функција int vratiDnevnaCena() во класата Vozilo и истата да се преоптовари во сите изведени класи. За секој автомобил со помалку од 5 врати дневната цена е 100, а инаку е 130 денари. За секој камион цената се пресметува со формулата: (masa+nosivost)*0.02. За секој автобус цената е 5 денати по лице кое може да се пренесува.
  23.  
  24. Во класата ParkingPlac да се додаде следната функција: - функција int vratiDnevnaZarabotka() со која се враќа дневната заработка од сите возила на паркингот.
  25.  
  26. Sample input
  27. 5
  28. 1 1300 3 2 3
  29. 2 4500 10 4 45
  30. 3 6000 8 5 2000
  31. 1 2100 3 3 5
  32. 2 4200 9 5 52
  33.  
  34. Sample output:
  35. Broot na avtomobili e 2, brojot na avtobusi e 2 i brojot na kamioni e 1.
  36.  
  37. Zarabotkata e 875
  38. Vkupnata masa e 18100
  39. Brojot poshiroki od 5 e 3
  40. Brojot na kamioni so nosivost pogolema od avtomobilot e 1
  41. */
  42.  
  43. #include <iostream>
  44. #include <string.h>
  45. using namespace std;
  46.  
  47.  
  48. class Vozilo{
  49. protected:
  50.     double masa;
  51.     int sirina,visina;
  52. public:
  53.     Vozilo(){}
  54.     Vozilo(double m,int s,int v){
  55.         masa=m;
  56.         sirina=s;
  57.         visina=v;
  58.     }
  59.     double get_masa(){return masa;}
  60.     int get_sirina(){ return sirina;}
  61.     int get_visina(){ return visina;}
  62.     void set_masa(double m){ masa=m;}
  63.     void set_sirina(int s){ sirina=s;}
  64.     void set_visina(int v){ visina=v;}
  65.  
  66.     virtual int vratiDnevnaCena()=0;};
  67.  
  68. class Avtobus:public Vozilo{
  69. protected:
  70.     double broj_patnici;
  71. public:
  72.     Avtobus(){}
  73.     Avtobus(double m,int s,int v,double b)
  74.     :Vozilo(m,s,v){ broj_patnici=b;}
  75.     double get_broj_patnici(){ return broj_patnici;}
  76.     int vratiDnevnaCena()    {
  77.         return broj_patnici*5;
  78.     }
  79. };
  80.  
  81. class Avtomobil:public Vozilo{
  82. protected:
  83.     int broj_vrati;
  84. public:
  85.     Avtomobil(){}
  86.     Avtomobil(double m,int s,int v,int b)
  87.     :Vozilo(m,s,v){ broj_vrati=b;}
  88.     int get_broj_vrati(){ return broj_vrati;}
  89.  
  90.     int vratiDnevnaCena(){
  91.         if(broj_vrati<5)
  92.             return 100;
  93.         return 130;
  94.     }
  95. };
  96.  
  97. class Kamion: public Vozilo{
  98. protected:
  99.     double maks_tezina;
  100. public:
  101.     Kamion(){}
  102.     Kamion(double m,int s,int v,double mt)
  103.     :Vozilo(m,s,v){ maks_tezina=mt;}
  104.     double get_maks_tezina(){ return maks_tezina;}
  105.     int vratiDnevnaCena()    {
  106.         return (masa+maks_tezina)*0.02;
  107.     }
  108. };
  109.  
  110. class ParkingPlac{
  111. private:
  112.     Vozilo **v;
  113.     int broj;
  114. public:
  115.     ParkingPlac(){
  116.         v=new Vozilo*[100];
  117.         broj=0;
  118.     }
  119.     ParkingPlac(Vozilo **vv, int b){
  120.         broj=b;
  121.         v=new Vozilo*[broj];
  122.         for(int i=0;i<broj;i++)
  123.             v[i]=vv[i];
  124.     }
  125.     ~ParkingPlac(){
  126.         for(int i=0;i<broj;i++)
  127.             delete v[i];
  128.     }
  129.     ParkingPlac &operator+=(Vozilo *v1){
  130.         v[broj++]=v1;
  131.         return *this;
  132.     }
  133.     float presmetajVkupnaMasa(){
  134.         float n=0.0;
  135.         for(int i=0;i<broj;i++)
  136.             n+=v[i]->get_masa();
  137.         return n;
  138.     }
  139.     float brojVozilaPoshirokiOd(int n){
  140.         int c=0;
  141.         for(int i=0;i<broj;i++)
  142.             if(v[i]->get_sirina()>n)
  143.                 c++;
  144.         return c;
  145.     }
  146.     int vratiDnevnaZarabotka(){
  147.         int c=0;
  148.         for(int i=0;i<broj;i++)
  149.             c+=v[i]->vratiDnevnaCena();
  150.         return c;
  151.     }
  152.     void pecati(){
  153.             int x=0,y=0,z=0;
  154.             for(int i=0;i<broj;i++){
  155.                 Avtomobil *a=dynamic_cast<Avtomobil*>(v[i]);
  156.                 if(a!=0)
  157.                     x++;
  158.                 Avtobus *s=dynamic_cast<Avtobus*>(v[i]);
  159.                 if(s!=0)
  160.                     y++;
  161.                 Kamion *b=dynamic_cast<Kamion*>(v[i]);
  162.                 if(b!=0)
  163.                     z++;
  164.             }
  165.             cout << "Broot na avtomobili e "<< x <<", brojot na avtobusi e "<<y<<" i brojot na kamioni e "<<z<<"."<<endl;
  166.         }
  167.     int pogolemaNosivostOd(Vozilo& m){
  168.         int c=0;
  169.         for(int i=0;i<broj;i++){
  170.             Kamion *b=dynamic_cast<Kamion*>(v[i]);
  171.                 if(b!=0)
  172.                     if(m.get_masa()<v[i]->get_masa())
  173.                         c++;
  174.         }
  175.         return c;
  176.     }
  177.  
  178. };
  179.  
  180.  
  181. int main(){
  182.     ParkingPlac p;
  183.  
  184.     int n;
  185.     cin>>n;
  186.     int shirina,visina, broj;
  187.     float masa,nosivost;
  188.     for (int i=0;i<n;i++){
  189.         int type;
  190.         cin>>type;
  191.         if(type==1){
  192.             cin>>masa>>shirina>>visina>>broj;
  193.             Avtomobil *a=new Avtomobil(masa,shirina,visina,broj);
  194.             p+=a;
  195.         }
  196.         if(type==2){
  197.             cin>>masa>>shirina>>visina>>broj;
  198.             p+=new Avtobus(masa,shirina,visina,broj);
  199.         }
  200.         if(type==3){
  201.             cin>>masa>>shirina>>visina>>nosivost;
  202.             p+=new Kamion(masa,shirina,visina,nosivost);
  203.         }
  204.     }
  205.     p.pecati();
  206.  
  207.     cout<<"\nZarabotkata e "<<p.vratiDnevnaZarabotka()<<endl;
  208.     cout<<"Vkupnata masa e "<<p.presmetajVkupnaMasa()<<endl;
  209.     cout<<"Brojot poshiroki od 5 e "<<p.brojVozilaPoshirokiOd(5)<<endl;
  210.     Avtomobil a(1200,4,3,5);
  211.     cout<<"Brojot na kamioni so nosivost pogolema od avtomobilot e "<<p.pogolemaNosivostOd(a)<<endl;
  212.     return 0;
  213. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement