Project 3
#include <iostream>
#include <vector>
#include <limits>
enum Type {
GAS,
DIESEL,
ELECTRIC
};
class Vehicle {
protected:
std::string make;
std::string model;
int year;
int odometer;
public:
Vehicle(const std::string& make, const std::string& model, int year, int odometer)
: make(make), model(model), year(year), odometer(odometer) {}
std::string getMake() const {
return make;
}
void setMake(const std::string& newMake) {
make = newMake;
}
std::string getModel() const {
return model;
}
void setModel(const std::string& newModel) {
model = newModel;
}
int getYear() const {
return year;
}
void setYear(int newYear) {
year = newYear;
}
int getOdometer() const {
return odometer;
}
void setOdometer(int newOdometer) {
odometer = newOdometer;
}
virtual Type getType() const = 0;
void checkTireRotation() const {
int remainder = odometer % 50000;
if (remainder >= 0) {
std::cout << "Advice: Rotate tires." << std::endl;
} else {
std::cout << "Tires are good to go." << std::endl;
}
}
virtual void checkChargerPower() const = 0;
virtual void checkOil() const = 0;
virtual ~Vehicle() {}
};
class GasCar : public Vehicle {
public:
GasCar(const std::string& make, const std::string& model, int year, int odometer)
: Vehicle(make, model, year, odometer) {}
Type getType() const override {
return GAS;
}
void checkChargerPower() const override {}
void checkOil() const override {
std::cout << "Checking oil for a gas car." << std::endl;
}
};
class DieselCar : public Vehicle {
public:
DieselCar(const std::string& make, const std::string& model, int year, int odometer)
: Vehicle(make, model, year, odometer) {}
Type getType() const override {
return DIESEL;
}
void checkChargerPower() const override {}
void checkOil() const override {
std::cout << "Checking oil for a diesel car." << std::endl;
}
};
class ElectricCar : public Vehicle {
public:
ElectricCar(const std::string& make, const std::string& model, int year, int odometer)
: Vehicle(make, model, year, odometer) {}
Type getType() const override {
return ELECTRIC;
}
void checkChargerPower() const override {
int distance = 400;
if (odometer >= distance) {
std::cout << "Advice: Recharge battery." << std::endl;
} else {
std::cout << "Battery is good to go." << std::endl;
}
}
void checkOil() const override {
std::cout << "Checking oil for an electric car." << std::endl;
}
};
class FuelVehicle : public Vehicle {
public:
FuelVehicle(const std::string& make, const std::string& model, int year, int odometer)
: Vehicle(make, model, year, odometer) {}
Type getType() const override = 0;
void checkChargerPower() const override {}
void checkOil() const override = 0;
};
class MaintenanceSystem {
private:
std::vector<std::unique_ptr<Vehicle>> vehicles;
public:
void addVehicle(std::unique_ptr<Vehicle> vehicle) {
vehicles.push_back(std::move(vehicle));
}
void listVehicles() const {
for (const auto& vehicle : vehicles) {
std::cout << "Make: " << vehicle->getMake()
<< ", Model: " << vehicle->getModel()
<< ", Year: " << vehicle->getYear()
<< ", Odometer: " << vehicle->getOdometer()
<< ", Type: " << vehicle->getType() << std::endl;
}
}
void updateVehicle(int index) {
if (index >= 0 && index < vehicles.size()) {
std::string newMake = getNewMake();
std::string newModel = getNewModel();
int newYear = getNewYear();
int newOdometer = getNewOdometerReading();
vehicles[index]->setMake(newMake);
vehicles[index]->setModel(newModel);
vehicles[index]->setYear(newYear);
vehicles[index]->setOdometer(newOdometer);
} else {
std::cout << "Invalid index. Please try again." << std::endl;
}
}
void removeVehicle(int index) {
if (index >= 0 && index < vehicles.size()) {
vehicles.erase(vehicles.begin() + index);
std::cout << "Vehicle removed successfully." << std::endl;
} else {
std::cout << "Invalid index. Please try again." << std::endl;
}
}
void tireRotation(int index) const {
if (index >= 0 && index < vehicles.size()) {
vehicles[index]->checkTireRotation();
} else {
std::cout << "Invalid index. Please try again." << std::endl;
}
}
void oilChange(int index) const {
if (index >= 0 && index < vehicles.size()) {
vehicles[index]->checkOil();
} else {
std::cout << "Invalid index. Please try again." << std::endl;
}
}
void recharge(int index) const {
if (index >= 0 && index < vehicles.size()) {
vehicles[index]->checkChargerPower();
} else {
std::cout << "Invalid index. Please try again." << std::endl;
}
}
private:
std::string getNewMake() const {
std::string make;
std::cout << "Enter make: ";
std::getline(std::cin, make);
return make;
}
std::string getNewModel() const {
std::string model;
std::cout << "Enter model: ";
std::getline(std::cin, model);
return model;
}
int getNewYear() const {
int year;
do {
std::cout << "Enter year (4 digits): ";
std::cin >> year;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
} while (year < 1000 || year > 9999);
return year;
}
int getNewOdometerReading() const {
int odometer;
do {
std::cout << "Enter new odometer reading: ";
std::cin >> odometer;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
} while (odometer < 0);
return odometer;
}
};
int main() {
MaintenanceSystem maintenanceSystem;
while (true) {
std::cout << "Select an option:\n"
<< "0. Quit\n"
<< "1. List inventory\n"
<< "2. Add vehicle\n"
<< "3. Update vehicle\n"
<< "4. Remove vehicle\n"
<< "5. Tire Rotation\n"
<< "6. Oil Change\n"
<< "7. Recharge\n"
<< "Enter your choice: ";
int choice;
std::cin >> choice;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
switch (choice) {
case 0:
return 0;
case 1:
maintenanceSystem.listVehicles();
break;
case 2: {
int type;
std::cout << "Select vehicle type (0 for GAS, 1 for DIESEL, 2 for ELECTRIC): ";
std::cin >> type;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::string make = maintenanceSystem.getNewMake();
std::string model = maintenanceSystem.getNewModel();
int year = maintenanceSystem.getNewYear();
int odometer = maintenanceSystem.getNewOdometerReading();
std::unique_ptr<Vehicle> newVehicle;
if (type == GAS) {
newVehicle = std::make_unique<GasCar>(make, model, year, odometer);
} else if (type == DIESEL) {
newVehicle = std::make_unique<DieselCar>(make, model, year, odometer);
} else if (type == ELECTRIC) {
newVehicle = std::make_unique<ElectricCar>(make, model, year, odometer);
} else {
std::cout << "Invalid vehicle type." << std::endl;
continue;
}
maintenanceSystem.addVehicle(std::move(newVehicle));
std::cout << "Vehicle added successfully." << std::endl;
break;
}
case 3:
maintenanceSystem.listVehicles();
std::cout << "Enter the index of the vehicle to update: ";
int updateIndex;
std::cin >> updateIndex;
maintenanceSystem.updateVehicle(updateIndex);
break;
case 4:
maintenanceSystem.listVehicles();
std::cout << "Enter the index of the vehicle to remove: ";
int removeIndex;
std::cin >> removeIndex;
maintenanceSystem.removeVehicle(removeIndex);
break;
case 5:
maintenanceSystem.listVehicles();
std::cout << "Enter the index of the vehicle for tire rotation: ";
int tireRotationIndex;
std::cin >> tireRotationIndex;
maintenanceSystem.tireRotation(tireRotationIndex);
break;
case 6:
maintenanceSystem.listVehicles();
std::cout << "Enter the index of the vehicle for oil change: ";
int oilChangeIndex;
std::cin >> oilChangeIndex;
maintenanceSystem.oilChange(oilChangeIndex);
break;
case 7:
maintenanceSystem.listVehicles();
std::cout << "Enter the index of the vehicle for recharge: ";
int rechargeIndex;
std::cin >> rechargeIndex;
maintenanceSystem.recharge(rechargeIndex);
break;
default:
std::cout << "Invalid choice. Please try again." << std::endl;
}
}
return 0;
}