Cod sursa(job #2900997)

Utilizator petru.theodor07Petru Cristea petru.theodor07 Data 12 mai 2022 18:49:44
Problema Sortare prin comparare Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 8.04 kb
#include <bits/stdc++.h>

#include "util/IoBase.h"
#include "util/functions.h"

using namespace std;

class masina: public IoBase{
protected:
    int viteza{}, greutate{}, an{};
    string nume;
public:
    masina(){};
    masina(int viteza, int greutate, int an, const string &nume) : viteza(viteza), greutate(greutate), an(an),
                                                                   nume(nume) {}

    virtual ~masina() {
    }

    istream &read(istream &is) override {
        cout<<"Nume model: "; is>>nume;
        cout<<"An: "; is>>an;
        cout<<"Viteza: "; is>>viteza;
        cout<<"Greutate: "; is>>greutate;
        return is;
    }

    ostream &write(ostream &os) const override {
        os<<nume<<' '<<"an: "<<an<<' '<<"Viteza max: "<<viteza<<' '<<"Greutate "<<greutate<<" ";
        return os;
    }

    virtual int calc_autonomie(){
        return 0;
    }
};

class modelFosil: virtual public masina{
protected:
    string combustibil;
    int capacitate;
public:
    modelFosil(){}
    modelFosil(int viteza, int greutate, int an, const string &nume, const string &combustibil, int capacitate)
            : masina(viteza, greutate, an, nume), combustibil(combustibil), capacitate(capacitate) {}

    virtual ~modelFosil() {

    }

    istream &read(istream &is) override {
        masina::read(is);
        cout<<"Combustibil: "; is>>combustibil;
        cout<<"Capacitate: "; is>>capacitate;
        return is;
    }

    ostream &write(ostream &os) const override {
        masina::write(os);
        os<<"Combustibil: "<<combustibil<<' '<<"Capacitate: "<<capacitate<<endl;
        return os;
    }

    int calc_autonomie() override {
        return capacitate / sqrt(greutate);
    }
};

class modelElectric: virtual public masina{
protected:
    int capacitatea_bateriei;
public:
    modelElectric(){}

    modelElectric(int viteza, int greutate, int an, const string &nume, int capacitateaBateriei) : masina(viteza,
                                                                                                          greutate, an,
                                                                                                          nume),
                                                                                                   capacitatea_bateriei(
                                                                                                           capacitateaBateriei) {}
    virtual ~modelElectric() {

    }

    istream &read(istream &is) override {
        masina::read(is);
        cout<<"Capacitate baterie: "; is>>capacitatea_bateriei;
        return is;
    }

    ostream &write(ostream &os) const override {
        masina::write(os);
        os<<"Capacitate baterie: "; os<<capacitatea_bateriei;
    }

    int calc_autonomie() override {
        return capacitatea_bateriei / (greutate * greutate);
    }
};

class modelHibrid: public modelFosil, public modelElectric{
private:
public:
    modelHibrid(){}
    modelHibrid(int v, int g, int an, string model, string c,  int capacitate, int capacitateB) : masina(v,g,an,model){
        combustibil = c;
        capacitate = capacitate;
        capacitatea_bateriei = capacitateB;
}

    virtual ~modelHibrid() {

    }

    istream &read(istream &is) override {
        masina::read(is);
        cout<<"Capacitate motor: "; is>>capacitate;
        cout<<"Capacitate baterie: "; is>>capacitatea_bateriei;
        return is;
    }

    ostream &write(ostream &os) const override {
        masina::write(os);
        os<<"Capacitate motor: "; os<<capacitate<<' ';
        os<<"Capacitate baterie: "; os<<capacitatea_bateriei;
        return os;
    }

    int calc_autonomie() override {
        return capacitatea_bateriei / (greutate * greutate) + capacitatea_bateriei / sqrt(greutate);;
    }
};

shared_ptr<masina> citeste_masina(){
    int tip;
    cout<<"1. Combustibili fosili\n2.Electrica\n3.Hibrid";
    cin>>tip;
    shared_ptr<masina> m;
    if(tip==1){
        m= make_shared<modelFosil>();
    }else if(tip==2){
        m= make_shared<modelElectric>();
    }else if(tip==3){
        m= make_shared<modelHibrid>();
    }
    cin>>*m;
    return m;
}


class Tranzactie: public IoBase {
private:
    string name, data;
    vector<shared_ptr<masina>> masini;
public:
    Tranzactie(){}
    Tranzactie(const string &name, const string &data, const vector<shared_ptr<masina>> &masini) : name(name),
                                                                                                   data(data),
                                                                                                   masini(masini) {}

    virtual ~Tranzactie() {

    }

    istream &read(istream &is) override {
        cout<<"Nume: "; is>>name;
        cout<<"Data: "; is>>data;
        return is;
    }

    ostream &write(ostream &os) const override {
        os<<name<<' '<<data<<' '<<endl;
        if(masini.size())
            for(auto x: masini){
                cout<<*x<<endl;
            }
        return os;
    }
    Tranzactie& operator=(Tranzactie alta){
        name = alta.name;
        data = alta.data;
        masini = alta.masini;
    }

    vector<shared_ptr<masina>> getmasini(){
        return masini;
    }
    void setm(vector<shared_ptr<masina>> m){
        masini=m;
    }
};

class Menu: public IoBase{
private:
    vector<shared_ptr<masina>> masini;
    vector<Tranzactie> tranzactii;
public:
    void afiseazaOPT(){
        cout<<"1.Adauga o masina\n";
        cout<<"2.Adauga o tranzactie\n";
        cout<<"3. Afiseaza cel mai vandut model\n";
        cout<<"4. Afiseaza modelul cu autonomia cea mai mare\n";
    }

    void menu() {
        int opt;
        afiseazaOPT();
        cin >> opt;
        while (true) {
            if (opt == 1) {
                cout << "Citeste masina si adauga" << endl;
                masini.push_back(citeste_masina());
            } else if (opt == 2) {
                vector<shared_ptr<masina>> masiniT;
                cout << "Adauga o tranzactie" << endl;
                Tranzactie T;
                cin >> T;
                int n;
                cout<<"Cate masini? "; cin>>n;
                for(int i = 0; i < n; i++){
                    int index;
                    cout<<"Dati indexul masinii dorite pe care o tranzactionati: "; cin>>index;
                    masiniT.push_back(masini[index]);
                }
                T.setm(masiniT);
                tranzactii.push_back(T);
            }else if(opt==3) {
                int F = 0, E = 0, H = 0;
                for(auto y: tranzactii)
                    for(auto x: y.getmasini()){
                        auto* f = dynamic_cast<modelFosil*>(x.get());
                        auto* e = dynamic_cast<modelElectric*>(x.get());
                        auto* h = dynamic_cast<modelHibrid*>(x.get());
                        if(f != nullptr)
                            F++;
                        if(e != nullptr)
                            E++;
                        if(h != nullptr)
                        H++;
                    }
                int maxim = max(max(F, E), H);
                if(F == maxim)
                    cout<<"modelFosil";
                if(E == maxim)
                    cout<<"modelElectric";
                if(H == maxim)
                    cout<<"modelHibrid";
            }else if(opt==4){
                int autonomie = 0;
                int index = 0;
                int i=0;
                for(auto x: masini) {
                    if (autonomie < x->calc_autonomie()) {
                        autonomie = x->calc_autonomie();
                        index = i;
                    }
                    i++;
                    //cout<<*x;
                }
                cout<<*masini[index];
            }else break;
            afiseazaOPT();
            cin>>opt;
        }
    }
};

int main(){
    Menu m;
    m.menu();

};