Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<cstring>
- using namespace std;
- void string_copy(char* dest, const char* source, const int length) {
- strncpy(dest, source, length);
- dest[length] = 0;
- }
- class ImaMasa {
- public:
- virtual double vratiMasa() = 0;
- virtual void pecati() = 0;
- virtual ImaMasa* clone() = 0;
- virtual ~ImaMasa() {}
- };
- class PaketPijalok : public ImaMasa {
- private:
- static const double gustina = 0.8;
- static const double masa_ambalaza = 0.2;
- protected:
- double volumenEden;
- int kolicina;
- public:
- PaketPijalok(const double volumenEden = 0, const int kolicina = 0) {
- this->volumenEden = volumenEden;
- this->kolicina = kolicina;
- }
- static double getGustina() { return gustina; }
- static double getMasaAmbalaza() { return masa_ambalaza; }
- const int getKolicina() const { return kolicina; }
- double vratiMasa() {
- return ((volumenEden * getGustina()) + getMasaAmbalaza()) * kolicina;
- }
- void pecati() {
- cout << "kolicina " << kolicina << ", ";
- }
- ImaMasa* clone() { return new PaketPijalok(*this); }
- virtual ~PaketPijalok() {}
- };
- class PaketSok : public PaketPijalok {
- private:
- bool daliGaziran;
- public:
- PaketSok(const double volumenEden = 0, const int kolicina = 0, const bool daliGaziran = false)
- : PaketPijalok(volumenEden, kolicina) {
- this->daliGaziran = daliGaziran;
- }
- const bool daliEGaziran() const { return daliGaziran; }
- double vratiMasa() {
- return daliGaziran ? (PaketPijalok::vratiMasa() + (kolicina * 0.1)) : PaketPijalok::vratiMasa();
- }
- void pecati() {
- cout << "Paket sok" << endl;
- PaketPijalok::pecati();
- cout << "so po " << volumenEden*getGustina() << " l(dm3)" << endl;
- }
- ImaMasa* clone() { return new PaketSok(*this); }
- ~PaketSok() {};
- };
- class PaketVino : public PaketPijalok {
- private:
- double procentAlkohol;
- public:
- PaketVino(const double volumenEden = 0, const int kolicina = 0, const double procentAlkohol = 0)
- : PaketPijalok(volumenEden, kolicina) {
- this->procentAlkohol = procentAlkohol;
- }
- const double getProcentAlkohol() const { return procentAlkohol; }
- double vratiMasa() {
- return PaketPijalok::vratiMasa() * (0.9 + procentAlkohol);
- }
- void pecati() {
- cout << "Paket vino" << endl;
- PaketPijalok::pecati();
- cout << procentAlkohol*100 << "% alkohol od po " << volumenEden*getGustina() << " l(dm3)" << endl;
- }
- ImaMasa* clone() { return new PaketVino(*this); }
- ~PaketVino() {};
- };
- ImaMasa* paketSoNajgolemaMasa(ImaMasa** paketi, int n) {
- int index = 0;
- double naj_masa = paketi[0]->vratiMasa();
- for(int i = 1; i < n; ++i) {
- if(paketi[i]->vratiMasa() > naj_masa) {
- index = i;
- naj_masa = paketi[i]->vratiMasa();
- }
- }
- return paketi[index];
- }
- bool proveri_registracija(const char* reg) {
- return isalpha(reg[0])&&isalpha(reg[1]) && isalpha(reg[6]) && isalpha(reg[7]);
- }
- class Kamion {
- char* vozac;
- char* registracija;
- ImaMasa** paketi;
- int vk_paketi;
- public:
- Kamion() { vk_paketi = 0; }
- Kamion(const char* vozac) {
- vk_paketi = 0;
- this->vozac = new char[strlen(vozac)+1];
- string_copy(this->vozac, vozac, strlen(vozac));
- }
- Kamion(const char* registracija, const char* vozac) {
- vk_paketi = 0;
- this->vozac = new char[strlen(vozac)+1];
- string_copy(this->vozac, vozac, strlen(vozac));
- if(!proveri_registracija(registracija)) throw 1;
- this->registracija = new char[strlen(registracija)+1];
- string_copy(this->registracija, registracija, strlen(registracija));
- }
- void registriraj(char* reg) {
- if(!proveri_registracija(reg)) throw 1;
- this->registracija = new char[strlen(registracija)+1];
- string_copy(this->registracija, registracija, strlen(registracija));
- }
- void dodadiElement(ImaMasa* obj) {
- ImaMasa** temp = new ImaMasa*[vk_paketi+1];
- for(int i = 0; i < vk_paketi; ++i) {
- temp[i] = paketi[i];
- }
- paketi = temp;
- paketi[vk_paketi++] = obj;
- }
- double vratiVkupnaMasa() {
- double vk_masa = 3;
- for(int i = 0; i < vk_paketi; ++i) {
- vk_masa += paketi[i]->vratiMasa();
- }
- return vk_masa;
- }
- void pecati() {
- cout << "Kamion so registracija " << registracija << " i vozac " << vozac << " prenesuva: " << endl;
- for(int i = 0; i < vk_paketi; ++i) {
- paketi[i]->pecati();
- }
- }
- Kamion pretovar(char* reg, char* ime) {
- Kamion k(reg, ime);
- ImaMasa* paketSoNajMasa = paketSoNajgolemaMasa(paketi, vk_paketi);
- for(int i = 0; i < vk_paketi; ++i) {
- if(paketi[i] == paketSoNajMasa) continue;
- k.dodadiElement(paketi[i]->clone());
- }
- return k;
- }
- ~Kamion() {
- delete [] vozac;
- delete [] registracija;
- for(int i = 0; i < vk_paketi; ++i) delete paketi[i];
- delete [] paketi;
- }
- };
- 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) {
- cout << "Pogresno vnesena registracija";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement