Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<cstring>
- using namespace std;
- class ImaMasa {
- public:
- virtual double vratiMasa() = 0;
- virtual void pecati() = 0;
- virtual ~ImaMasa() {}
- };
- class PaketPijalok : public ImaMasa {
- /*because there is inheritence we make it protected*/
- protected:
- double volumenEden;
- int kolicina;
- const static double density;
- const static double productMass;
- public:
- PaketPijalok(double vE = 0.0, int k = 0) { volumenEden = vE; kolicina = k;}
- inline double vratiMasa() { return (volumenEden * density + productMass) * kolicina; }
- void pecati() { cout << "kolicina "<< kolicina; }
- int getKolicina() { return kolicina; }
- ~PaketPijalok(){}
- };
- class PaketSok : public PaketPijalok {
- private:
- bool daliGaziran;
- public:
- PaketSok(double vE = 0.0, int k = 0, bool dG = false) : PaketPijalok(vE, k) { volumenEden = vE; kolicina = k; daliGaziran = dG;}
- double vratiMasa() { return daliGaziran ? PaketPijalok::vratiMasa() : (PaketPijalok::vratiMasa() + (0.1 * kolicina));}
- void pecati() { cout << "Paket sok" << endl; PaketPijalok::pecati(); cout << ", so po " << volumenEden*density << " l(dm3)" << endl;}
- ~PaketSok(){}
- };
- /* Initialization of the Static Members */
- const double PaketPijalok::density = 0.8;
- const double PaketPijalok::productMass = 0.2;
- class PaketVino : public PaketPijalok {
- private:
- double procentAlkohol;
- public:
- PaketVino(double vE = 0, int k = 0, double p = 0.0) : PaketPijalok(vE, k) {
- volumenEden = vE; kolicina = k; procentAlkohol = p;
- try {
- if(p < 0 || p > 1) {
- throw (double) 1.0;
- }
- } catch (double) {
- cerr << "Pogresno vnesen procent na alkohol!" << endl;
- procentAlkohol = 0;
- }
- }
- double vratiMasa() { return PaketPijalok::vratiMasa() * (0.9 + procentAlkohol);}
- void pecati() { cout << "Paket vino" << endl; PaketPijalok::pecati(); cout << ", " << 100*procentAlkohol << "% alkohol od po " << volumenEden*density << " l(dm3)" << endl; }
- double getProcentAlkohol() { return procentAlkohol; }
- ~PaketVino(){}
- };
- class Kamion {
- private:
- char *reg;
- char *driver;
- ImaMasa **packets; // Array of pointers
- int len; // length of the array
- public:
- Kamion () { reg = NULL; driver = NULL; packets = NULL; len = 0; }
- Kamion (char *r, char *d) {
- /* Throw exception if bad registration */
- if(!(isalpha(r[0]) && isalpha(r[1]) && isalpha(r[6]) && isalpha(r[7])))
- throw (int) 1;
- reg = new char[strlen(r)+1]; strcpy(reg, r);
- driver = new char[strlen(d)+1]; strcpy(driver, d);
- packets = new ImaMasa*[0]; // Just creates it with 0 pointers
- len = 0;
- }
- // Since we're working with dynamic allocation..
- Kamion (const Kamion &k) {
- len = k.len;
- reg = new char[strlen(k.reg)+1]; strcpy(reg, k.reg);
- driver = new char[strlen(k.driver)+1]; strcpy(driver, k.driver);
- packets = new ImaMasa*[k.len];
- for (int i = 0; i < len; ++i){ packets[i] = k.packets[i]; }
- }
- Kamion &operator = (const Kamion &k){
- if (this == &k) { return *this; }
- delete[] packets;
- /* Delete just the array not the objects themselves */
- len = k.len;
- reg = new char[strlen(k.reg)+1]; strcpy(reg, k.reg);
- driver = new char[strlen(k.driver)+1]; strcpy(driver, k.driver);
- packets = new ImaMasa*[k.len];
- for (int i = 0; i < len; ++i){ packets[i] = k.packets[i]; }
- return *this;
- }
- ~Kamion() {
- delete[] reg; delete[] driver;
- for (int i = 0; i < len; ++i) { delete packets[i]; /*Every object individually*/}
- delete[] packets; /*The array as a whole*/
- }
- /* Kamion functions */
- void dodadiElement(ImaMasa *im){
- ImaMasa **tmp;
- tmp = new ImaMasa*[len + 1];
- for (int i = 0; i < len; ++i) {tmp[i] = packets[i];}
- delete[] packets;
- packets = tmp;
- packets[len++] = im;
- }
- double vratiVkupnaMasa() {
- double total = 0;
- for(int i = 0; i < len; ++i) { total += packets[i]->vratiMasa();}
- return total;
- }
- void pecati() {
- cout << "Kamion so registracija " << reg << " i vozac " << driver << " prenesuva: " << endl;
- for(int i = 0; i < len; ++i) {
- PaketSok *s = dynamic_cast<PaketSok *> (packets[i]);
- if (s) { packets[i]->pecati(); }
- PaketVino *v = dynamic_cast<PaketVino *> (packets[i]);
- if (v) { packets[i]->pecati(); }
- }
- }
- Kamion pretovar(char *r, char *d){
- delete [] reg; reg = new char[strlen(r)+1]; strcpy(reg, r);
- delete [] driver; driver = new char[strlen(d)+1]; strcpy(driver, d);
- double largest = 0; int index = 0;
- for(int i = 0; i < len; ++i) {
- if(packets[i]->vratiMasa() > largest){
- largest = packets[i]->vratiMasa(); index = i; }}
- ImaMasa *ptr = packets[index]; /* Pointer to largest object */
- ImaMasa **tmp = new ImaMasa*[len - 1]; /* New array of pointers without largest */
- for(int i = 0, j = 0; i < len; ++i) {
- if (packets[i] != ptr) {
- tmp[j++] = packets[i]; }}
- delete [] packets;
- packets = tmp;
- len = len - 1;
- return *this;
- }
- };
- int main() {
- char ime[20], reg[9];
- double vol;
- int kol;
- bool g;
- double proc;
- try{
- cin>>reg;
- cin>>ime;
- Kamion A(reg, ime);
- ImaMasa **d = new ImaMasa*[5];
- cin>>vol>>kol;
- cin>>g;
- d[0] = new PaketSok(vol, kol, g);
- cin>>vol>>kol;
- cin>>proc;
- d[1] = new PaketVino(vol, kol, proc);
- cin>>vol>>kol;
- cin>>proc;
- d[2] = new PaketVino(vol, kol, proc);
- cin>>vol>>kol;
- cin>>g;
- d[3] = new PaketSok(vol, kol, g);
- cin>>vol>>kol;
- cin>>proc;
- d[4] = new PaketVino(vol, kol, proc);
- A.dodadiElement(d[0]);
- A.dodadiElement(d[1]);
- A.dodadiElement(d[2]);
- A.dodadiElement(d[3]);
- A.dodadiElement(d[4]);
- A.pecati();
- cout<<"Vkupna masa: "<<A.vratiVkupnaMasa()<<endl;
- cin>>reg;
- cin>>ime;
- Kamion B = A.pretovar(reg, ime);
- B.pecati();
- cout<<"Vkupna masa: "<<B.vratiVkupnaMasa()<<endl;
- } catch(int) {
- cerr << "Pogresno vnesena registracija";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement