Advertisement
JStefan

[Laboratoriski] Kamion

May 1st, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.25 KB | None | 0 0
  1. #include<iostream>
  2. #include<cstring>
  3.  
  4. using namespace std;
  5.  
  6. void string_copy(char* dest, const char* source, const int length) {
  7.     strncpy(dest, source, length);
  8.     dest[length] = 0;
  9. }
  10.  
  11. class ImaMasa {
  12. public:
  13.    virtual double vratiMasa() = 0;
  14.    virtual void pecati() = 0;
  15.    virtual ImaMasa* clone() = 0;
  16.    virtual ~ImaMasa() {}
  17. };
  18.  
  19. class PaketPijalok : public ImaMasa {
  20. private:
  21.    static const double gustina = 0.8;
  22.    static const double masa_ambalaza = 0.2;
  23. protected:
  24.    double volumenEden;
  25.    int kolicina;
  26. public:
  27.    PaketPijalok(const double volumenEden = 0, const int kolicina = 0) {
  28.       this->volumenEden = volumenEden;
  29.       this->kolicina = kolicina;
  30.    }
  31.  
  32.    static double getGustina() { return gustina; }
  33.    static double getMasaAmbalaza() { return masa_ambalaza; }
  34.  
  35.    const int getKolicina() const { return kolicina; }
  36.  
  37.    double vratiMasa() {
  38.       return ((volumenEden * getGustina()) + getMasaAmbalaza()) * kolicina;
  39.    }
  40.  
  41.    void pecati() {
  42.       cout << "kolicina " << kolicina << ", ";
  43.    }
  44.  
  45.    ImaMasa* clone() { return new PaketPijalok(*this); }
  46.  
  47.    virtual ~PaketPijalok() {}
  48. };
  49.  
  50. class PaketSok : public PaketPijalok {
  51. private:
  52.    bool daliGaziran;
  53. public:
  54.    PaketSok(const double volumenEden = 0, const int kolicina = 0, const bool daliGaziran = false)
  55.    : PaketPijalok(volumenEden, kolicina) {
  56.       this->daliGaziran = daliGaziran;
  57.    }
  58.  
  59.    const bool daliEGaziran() const { return daliGaziran; }
  60.  
  61.    double vratiMasa() {
  62.       return daliGaziran ? (PaketPijalok::vratiMasa() + (kolicina * 0.1)) : PaketPijalok::vratiMasa();
  63.    }
  64.  
  65.    void pecati() {
  66.       cout << "Paket sok" << endl;
  67.       PaketPijalok::pecati();
  68.       cout << "so po " << volumenEden*getGustina() << " l(dm3)" << endl;
  69.    }
  70.  
  71.    ImaMasa* clone() { return new PaketSok(*this); }
  72.  
  73.    ~PaketSok() {};
  74. };
  75.  
  76. class PaketVino : public PaketPijalok {
  77. private:
  78.    double procentAlkohol;
  79. public:
  80.    PaketVino(const double volumenEden = 0, const int kolicina = 0, const double procentAlkohol = 0)
  81.    : PaketPijalok(volumenEden, kolicina) {
  82.       this->procentAlkohol = procentAlkohol;
  83.    }
  84.  
  85.    const double getProcentAlkohol() const { return procentAlkohol; }
  86.  
  87.    double vratiMasa() {
  88.       return PaketPijalok::vratiMasa() * (0.9 + procentAlkohol);
  89.    }
  90.  
  91.    void pecati() {
  92.       cout << "Paket vino" << endl;
  93.       PaketPijalok::pecati();
  94.       cout << procentAlkohol*100 << "% alkohol od po " << volumenEden*getGustina() << " l(dm3)" << endl;
  95.    }
  96.  
  97.    ImaMasa* clone() { return new PaketVino(*this); }
  98.  
  99.    ~PaketVino() {};
  100. };
  101.  
  102. ImaMasa* paketSoNajgolemaMasa(ImaMasa** paketi, int n) {
  103.    int index = 0;
  104.    double naj_masa = paketi[0]->vratiMasa();
  105.    for(int i = 1; i < n; ++i) {
  106.       if(paketi[i]->vratiMasa() > naj_masa) {
  107.          index = i;
  108.          naj_masa = paketi[i]->vratiMasa();
  109.       }
  110.    }
  111.    return paketi[index];
  112. }
  113.  
  114. bool proveri_registracija(const char* reg) {
  115.    return isalpha(reg[0])&&isalpha(reg[1]) && isalpha(reg[6]) && isalpha(reg[7]);
  116. }
  117.  
  118. class Kamion {
  119.    char* vozac;
  120.    char* registracija;
  121.    ImaMasa** paketi;
  122.    int vk_paketi;
  123. public:
  124.    Kamion() { vk_paketi = 0; }
  125.    Kamion(const char* vozac) {
  126.       vk_paketi = 0;
  127.       this->vozac = new char[strlen(vozac)+1];
  128.       string_copy(this->vozac, vozac, strlen(vozac));
  129.    }
  130.    Kamion(const char* registracija, const char* vozac) {
  131.       vk_paketi = 0;
  132.       this->vozac = new char[strlen(vozac)+1];
  133.       string_copy(this->vozac, vozac, strlen(vozac));
  134.       if(!proveri_registracija(registracija)) throw 1;
  135.       this->registracija = new char[strlen(registracija)+1];
  136.       string_copy(this->registracija, registracija, strlen(registracija));
  137.    }
  138.  
  139.    void registriraj(char* reg) {
  140.       if(!proveri_registracija(reg)) throw 1;
  141.       this->registracija = new char[strlen(registracija)+1];
  142.       string_copy(this->registracija, registracija, strlen(registracija));
  143.    }
  144.  
  145.    void dodadiElement(ImaMasa* obj) {
  146.       ImaMasa** temp = new ImaMasa*[vk_paketi+1];
  147.       for(int i = 0; i < vk_paketi; ++i) {
  148.          temp[i] = paketi[i];
  149.       }
  150.       paketi = temp;
  151.       paketi[vk_paketi++] = obj;
  152.    }
  153.  
  154.    double vratiVkupnaMasa() {
  155.       double vk_masa = 3;
  156.       for(int i = 0; i < vk_paketi; ++i) {
  157.          vk_masa += paketi[i]->vratiMasa();
  158.       }
  159.       return vk_masa;
  160.    }
  161.  
  162.    void pecati() {
  163.       cout << "Kamion so registracija " << registracija << " i vozac " << vozac << " prenesuva: " << endl;
  164.       for(int i = 0; i < vk_paketi; ++i) {
  165.          paketi[i]->pecati();
  166.       }
  167.    }
  168.  
  169.    Kamion pretovar(char* reg, char* ime) {
  170.       Kamion k(reg, ime);
  171.       ImaMasa* paketSoNajMasa = paketSoNajgolemaMasa(paketi, vk_paketi);
  172.       for(int i = 0; i < vk_paketi; ++i) {
  173.          if(paketi[i] == paketSoNajMasa) continue;
  174.          k.dodadiElement(paketi[i]->clone());
  175.       }
  176.       return k;
  177.    }
  178.  
  179.    ~Kamion() {
  180.       delete [] vozac;
  181.       delete [] registracija;
  182.       for(int i = 0; i < vk_paketi; ++i) delete paketi[i];
  183.       delete [] paketi;
  184.    }
  185. };
  186.  
  187. int main()
  188. {
  189.     char ime[20], reg[9];
  190.     double vol;
  191.     int kol;
  192.     bool g;
  193.     double proc;
  194.     try {
  195.             cin>>reg;
  196.             cin>>ime;
  197.             Kamion A(reg, ime);
  198.             ImaMasa **d = new ImaMasa*[5];
  199.             cin>>vol>>kol;
  200.             cin>>g;
  201.             d[0] = new PaketSok(vol, kol, g);
  202.             cin>>vol>>kol;
  203.             cin>>proc;
  204.             d[1] = new PaketVino(vol, kol, proc);
  205.             cin>>vol>>kol;
  206.             cin>>proc;
  207.             d[2] = new PaketVino(vol, kol, proc);
  208.             cin>>vol>>kol;
  209.             cin>>g;
  210.             d[3] = new PaketSok(vol, kol, g);
  211.             cin>>vol>>kol;
  212.             cin>>proc;
  213.             d[4] = new PaketVino(vol, kol, proc);
  214.  
  215.             A.dodadiElement(d[0]);
  216.             A.dodadiElement(d[1]);
  217.             A.dodadiElement(d[2]);
  218.             A.dodadiElement(d[3]);
  219.             A.dodadiElement(d[4]);
  220.             A.pecati();
  221.             cout<<"Vkupna masa: "<<A.vratiVkupnaMasa()<<endl;
  222.             cin>>reg;
  223.             cin>>ime;
  224.             Kamion B = A.pretovar(reg, ime);
  225.             B.pecati();
  226.             cout<<"Vkupna masa: "<<B.vratiVkupnaMasa()<<endl;
  227.     } catch(int) {
  228.       cout << "Pogresno vnesena registracija";
  229.     }
  230.    return 0;
  231. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement