Advertisement
Filip_Markoski

Truck

May 4th, 2017
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.61 KB | None | 0 0
  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4.  
  5. class ImaMasa {
  6. public:
  7.     virtual double vratiMasa() = 0;
  8.     virtual void pecati() = 0;
  9.     virtual ~ImaMasa() {}
  10. };
  11.  
  12. class PaketPijalok : public ImaMasa {
  13.     /*because there is inheritence we make it protected*/
  14. protected:
  15.     double volumenEden;
  16.     int kolicina;
  17.     const static double density;
  18.     const static double productMass;
  19. public:
  20.     PaketPijalok(double vE = 0.0, int k = 0) { volumenEden = vE; kolicina = k;}
  21.     inline double vratiMasa() { return (volumenEden * density + productMass) * kolicina; }
  22.     void pecati() { cout << "kolicina "<< kolicina; }
  23.     int getKolicina() { return kolicina; }
  24.     ~PaketPijalok(){}
  25. };
  26.  
  27. class PaketSok : public PaketPijalok {
  28. private:
  29.     bool daliGaziran;
  30. public:
  31.     PaketSok(double vE = 0.0, int k = 0, bool dG = false) : PaketPijalok(vE, k) { volumenEden = vE; kolicina = k; daliGaziran = dG;}
  32.     double vratiMasa() { return daliGaziran ? PaketPijalok::vratiMasa() : (PaketPijalok::vratiMasa() + (0.1 * kolicina));}
  33.     void pecati() { cout << "Paket sok" << endl; PaketPijalok::pecati(); cout << ", so po " << volumenEden*density << " l(dm3)" << endl;}
  34.     ~PaketSok(){}
  35. };
  36.  
  37. /* Initialization of the Static Members */
  38. const double PaketPijalok::density = 0.8;
  39. const double PaketPijalok::productMass = 0.2;
  40.  
  41. class PaketVino : public PaketPijalok {
  42. private:
  43.     double procentAlkohol;
  44. public:
  45.     PaketVino(double vE = 0, int k = 0, double p = 0.0) : PaketPijalok(vE, k) {
  46.         volumenEden = vE; kolicina = k; procentAlkohol = p;
  47.         try {
  48.             if(p < 0 || p > 1) {
  49.                 throw (double) 1.0;
  50.             }
  51.         } catch (double) {
  52.             cerr << "Pogresno vnesen procent na alkohol!" << endl;
  53.             procentAlkohol = 0;
  54.         }
  55.        
  56.     }
  57.     double vratiMasa() { return PaketPijalok::vratiMasa() * (0.9 + procentAlkohol);}
  58.     void pecati() { cout << "Paket vino" << endl; PaketPijalok::pecati(); cout << ", " << 100*procentAlkohol << "% alkohol od po " << volumenEden*density << " l(dm3)" << endl; }
  59.     double getProcentAlkohol() { return procentAlkohol; }
  60.     ~PaketVino(){}
  61. };
  62.  
  63. class Kamion {
  64. private:
  65.     char *reg;
  66.     char *driver;
  67.     ImaMasa **packets; // Array of pointers
  68.     int len; // length of the array
  69. public:
  70.     Kamion () { reg = NULL; driver = NULL; packets = NULL; len = 0; }
  71.     Kamion (char *r, char *d) {
  72.         /* Throw exception if bad registration */
  73.         if(!(isalpha(r[0]) && isalpha(r[1]) && isalpha(r[6]) && isalpha(r[7])))
  74.             throw (int) 1;
  75.        
  76.         reg = new char[strlen(r)+1]; strcpy(reg, r);
  77.         driver = new char[strlen(d)+1]; strcpy(driver, d);
  78.         packets = new ImaMasa*[0]; // Just creates it with 0 pointers
  79.         len = 0;
  80.     }
  81.     // Since we're working with dynamic allocation..
  82.     Kamion (const Kamion &k) {
  83.         len = k.len;
  84.         reg = new char[strlen(k.reg)+1]; strcpy(reg, k.reg);
  85.         driver = new char[strlen(k.driver)+1]; strcpy(driver, k.driver);
  86.         packets = new ImaMasa*[k.len];
  87.         for (int i = 0; i < len; ++i){ packets[i] = k.packets[i]; }
  88.     }
  89.     Kamion &operator = (const Kamion &k){
  90.         if (this == &k) { return *this; }
  91.         delete[] packets;
  92.         /* Delete just the array not the objects themselves */
  93.         len = k.len;
  94.         reg = new char[strlen(k.reg)+1]; strcpy(reg, k.reg);
  95.         driver = new char[strlen(k.driver)+1]; strcpy(driver, k.driver);
  96.         packets = new ImaMasa*[k.len];
  97.         for (int i = 0; i < len; ++i){ packets[i] = k.packets[i]; }
  98.         return *this;
  99.     }
  100.     ~Kamion() {
  101.         delete[] reg; delete[] driver;
  102.         for (int i = 0; i < len; ++i) { delete packets[i]; /*Every object individually*/}
  103.         delete[] packets; /*The array as a whole*/
  104.     }
  105.     /* Kamion functions */
  106.    void dodadiElement(ImaMasa *im){
  107.        ImaMasa **tmp;
  108.        tmp = new ImaMasa*[len + 1];
  109.        for (int i = 0; i < len; ++i) {tmp[i] = packets[i];}
  110.        delete[] packets;
  111.        packets = tmp;
  112.        packets[len++] = im;
  113.    }
  114.     double vratiVkupnaMasa() {
  115.         double total = 0;
  116.         for(int i = 0; i < len; ++i) { total += packets[i]->vratiMasa();}
  117.         return total;
  118.     }
  119.     void pecati() {
  120.         cout << "Kamion so registracija " << reg << " i vozac " << driver << " prenesuva: " << endl;
  121.         for(int i = 0; i < len; ++i) {
  122.             PaketSok *s = dynamic_cast<PaketSok *> (packets[i]);
  123.             if (s) { packets[i]->pecati(); }
  124.             PaketVino *v = dynamic_cast<PaketVino *> (packets[i]);
  125.             if (v) { packets[i]->pecati(); }
  126.         }
  127.     }
  128.     Kamion pretovar(char *r, char *d){
  129.         delete [] reg; reg = new char[strlen(r)+1]; strcpy(reg, r);
  130.         delete [] driver; driver = new char[strlen(d)+1]; strcpy(driver, d);
  131.         double largest = 0; int index = 0;
  132.         for(int i = 0; i < len; ++i) {
  133.             if(packets[i]->vratiMasa() > largest){
  134.                 largest = packets[i]->vratiMasa(); index = i; }}
  135.         ImaMasa *ptr = packets[index]; /* Pointer to largest object */
  136.         ImaMasa **tmp = new ImaMasa*[len - 1]; /* New array of pointers without largest */
  137.         for(int i = 0, j = 0; i < len; ++i) {
  138.             if (packets[i] != ptr) {
  139.                 tmp[j++] = packets[i]; }}
  140.         delete [] packets;
  141.         packets = tmp;
  142.         len = len - 1;
  143.         return *this;
  144.     }
  145. };
  146.  
  147. int main() {
  148.     char ime[20], reg[9];
  149.     double vol;
  150.     int kol;
  151.     bool g;
  152.     double proc;
  153.    
  154.     try{
  155.             cin>>reg;
  156.             cin>>ime;
  157.             Kamion A(reg, ime);
  158.             ImaMasa **d = new ImaMasa*[5];
  159.             cin>>vol>>kol;
  160.             cin>>g;
  161.             d[0] = new PaketSok(vol, kol, g);
  162.             cin>>vol>>kol;
  163.             cin>>proc;
  164.             d[1] = new PaketVino(vol, kol, proc);
  165.             cin>>vol>>kol;
  166.             cin>>proc;
  167.             d[2] = new PaketVino(vol, kol, proc);
  168.             cin>>vol>>kol;
  169.             cin>>g;
  170.             d[3] = new PaketSok(vol, kol, g);
  171.             cin>>vol>>kol;
  172.             cin>>proc;
  173.             d[4] = new PaketVino(vol, kol, proc);
  174.  
  175.             A.dodadiElement(d[0]);
  176.             A.dodadiElement(d[1]);
  177.             A.dodadiElement(d[2]);
  178.             A.dodadiElement(d[3]);
  179.             A.dodadiElement(d[4]);
  180.             A.pecati();
  181.             cout<<"Vkupna masa: "<<A.vratiVkupnaMasa()<<endl;
  182.             cin>>reg;
  183.             cin>>ime;
  184.             Kamion B = A.pretovar(reg, ime);
  185.             B.pecati();
  186.             cout<<"Vkupna masa: "<<B.vratiVkupnaMasa()<<endl;
  187.     } catch(int) {
  188.         cerr << "Pogresno vnesena registracija";
  189.     }
  190.    
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement