Pagini recente » Cod sursa (job #1689714) | Cod sursa (job #2264004) | Cod sursa (job #33070) | Cod sursa (job #938821) | Cod sursa (job #2900997)
#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();
};