Project 3
#include
#include
#include
enum class FuelType
{
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::stringgetMake() const
{
return make;
}
std::string getModel() const
{
return model;
}
int getYear() const
{
return year;
}
int getOdometer() const
{
return odometer;
}
void setOdometer(int newOdometer)
{
odometer = newOdometer;
}
virtual FuelType getFuelType() const = 0;
virtual void performMaintenance() = 0;
virtual void rotateTires()
{
std::cout << "Rotating tires for " << make << " " << model << std::endl;
}
virtual void performOilChange()
{
std::cout << "Performing oil change for " << make << " " << model << std::endl;
}
virtual void recharge()
{
std::cout << "Recharging " << make << " " << model << std::endl;
}
virtual void checkTireRotation()
{
int tireCycle = 50000;
int distanceRun = getOdometer() % tireCycle;
if (distanceRun == 0)
{
std::cout << "Time to rotate tires for " << make << " " << model <<
std::endl;
}
else
{
std::cout << "Tires are good to go for " << make << " " << model <<
std::endl;
int remainder = tireCycle - distanceRun;
std::cout << "Remaining distance for tire rotation: " << remainder << " km"
<< std::endl;
}
}
virtual void checkPower()
{
int rechargeDistance = 400;
int distanceRun = getOdometer() % rechargeDistance;
if (distanceRun == 0)
{
std::cout << "Time to recharge the battery for " << make << " " << model <<
std::endl;
}
else
{
std::cout << "Your vehicle is good to go for " << make << " " << model <<
std::endl;
int remainder = rechargeDistance - distanceRun;
std::cout << "Remaining distance for recharge: " << remainder << " km" <<
std::endl;
}
}
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) {}
FuelType getFuelType() const override
{
return FuelType::GAS;
}
void performMaintenance() override {
std::cout << "Performing maintenance on GasCar" << std::endl;
}
void rotateTires() override {
std::cout << "Rotating tires for GasCar" << std::endl;
}
class GasCar : public Vehicle
{
public:
GasCar(const std::string& make, const std::string& model, int year, int odometer)
: Vehicle(make, model, year, odometer) {}
FuelType getFuelType() const override
{
return FuelType::GAS;
}
void performMaintenance() override
{
std::cout << "Performing maintenance on GasCar" << std::endl;
}
void rotateTires() override
{
std::cout << "Rotating tires for GasCar" << std::endl;
}
void performOilChange() override
{
std::cout << "Performing oil change for DieselCar" << 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) {}
FuelType getFuelType() const override {
return FuelType::ELECTRIC;
}
void performMaintenance() override
{
std::cout << "Performing maintenance on ElectricCar" << std::endl;
}
void recharge() override
{
std::cout << "Recharging ElectricCar" << std::endl;
}
};
class MaintenanceLibrary
{
private:
std::vector<Vehicle*> inventory;
public:
~MaintenanceLibrary()
{
for (Vehicle* vehicle : inventory)
{
delete vehicle;
}
}
void addVehicle(Vehicle* vehicle)
{
inventory.push_back(vehicle);
}
void listVehicles() const
{
int index = 0;
for (const Vehicle* vehicle : inventory)
{
std::cout << "Index: " << index << std::endl;
std::cout << "Make: " << vehicle->getMake() << std::endl;
std::cout << "Model: " << vehicle->getModel() << std::endl;
std::cout << "Year: " << vehicle->getYear() << std::endl;
std::cout << "Odometer: " << vehicle->getOdometer() << std::endl;
std::cout << "Fuel Type: ";
switch (vehicle->getFuelType())
{
case FuelType::GAS:
std::cout << "Gas" << std::endl;
break;
case FuelType::DIESEL:
std::cout << "Diesel" << std::endl;
break;
case FuelType::ELECTRIC:
std::cout << "Electric" << std::endl;
break;
}
std::cout << std::endl;
++index;
}
}
void updateVehicle(int index, int newOdometer)
{
if (index >= 0 && static_cast<std::size_t>(index) < inventory.size())
{
Vehicle* vehicle = inventory[index];
vehicle->performMaintenance();
vehicle->setOdometer(newOdometer);
}
}
void removeVehicle(int index)
{
if (index >= 0 && static_cast<std::size_t>(index) < inventory.size())
{
delete inventory[index];
inventory.erase(inventory.begin() + index);
}
}
void rotateTires(int index)
{
if (index >= 0 && static_cast<std::size_t>(index) < inventory.size())
{
Vehicle* vehicle = inventory[index];
vehicle->rotateTires();
}
}
void performOilChange(int index)
{
if (index >= 0 && static_cast<std::size_t>(index) < inventory.size())
{
Vehicle* vehicle = inventory[index];
vehicle->performOilChange();
}
}
void recharge(int index) {
if (index >= 0 && static_cast<std::size_t>(index) < inventory.size()) {
Vehicle* vehicle = inventory[index];
vehicle->recharge();
}
}
void checkTireRotation(int index)
{
if (index >= 0 && static_cast<std::size_t>(index) < inventory.size())
{
Vehicle* vehicle = inventory[index];
int currentOdometer = vehicle->getOdometer();
int tireCycle = 50000;
int remainder = currentOdometer % tireCycle;
if (currentOdometer >= tireCycle && remainder >= 0)
{
std::cout << "Tire rotation is due for " << vehicle->getMake() << " "
<< vehicle->getModel() << std::endl;
std::cout << "Current odometer reading: " << currentOdometer << " km"
<< std::endl;
std::cout << "Tire rotation cycle: " << tireCycle << " km" << std::endl;
std::cout << "Remaining distance for tire rotation: " << tireCycle -
remainder << " km" << std::endl;
}
else
{
std::cout << "Tires are good to go for " << vehicle->getMake() << " "
<< vehicle->getModel() << std::endl;
std::cout << "Current odometer reading: " << currentOdometer << " km"
<< std::endl;
std::cout << "Tire rotation cycle: " << tireCycle << " km" << std::endl;
std::cout << "Remaining distance for tire rotation: " << tireCycle -
remainder << " km" << std::endl;
}
}
}
void checkBatteryPower(int index)
{
if (index >= 0 && static_cast<std::size_t>(index) < inventory.size())
{
Vehicle* vehicle = inventory[index];
int currentOdometer = vehicle->getOdometer();
int powerCycle = 400;
int remainder = currentOdometer % powerCycle;
if (currentOdometer >= powerCycle && remainder == 0)
{
std::cout << "Battery recharge is due for " << vehicle->getMake() << "
" << vehicle->getModel() << std::endl;
std::cout << "Current odometer reading: " << currentOdometer << " km"
<< std::endl;
std::cout << "Battery recharge cycle: " << powerCycle << " km" <<
std::endl;
}
else
{
std::cout << "Battery is good to go for " << vehicle->getMake() << " "
<< vehicle->getModel() << std::endl;
std::cout << "Current odometer reading: " << currentOdometer << " km"
<< std::endl;
std::cout << "Battery recharge cycle: " << powerCycle << " km" <<
std::endl;
std::cout << "Remaining distance for battery recharge: " << powerCycle
- remainder << " km" << std::endl;
}
}
}
};
int main()
{
MaintenanceLibrary library;
while (true)
{
std::cout << "Menu:" << std::endl;
std::cout << "0. Quit." << std::endl;
std::cout << "1. List inventory." << std::endl;
std::cout << "2. Add vehicle." << std::endl;
std::cout << "3. Update vehicle." << std::endl;
std::cout << "4. Remove vehicle." << std::endl;
std::cout << "5. Check tire rotation." << std::endl;
std::cout << "6. Check battery power." << std::endl;
std::cout << "7. Rotate tires." << std::endl;
std::cout << "8. Perform oil change." << std::endl;
std::cout << "9. Recharge vehicle." << std::endl;
std::cout << "Select an option: ";
int option;
std::cin >> option;
if (option == 0)
{
break;
}
else if
(option == 1)
{
library.listVehicles();
}
else if (option == 2)
{
std::cout << "Enter vehicle make: ";
std::string make;
std::cin >> make;
std::cout << "Enter vehicle model: ";
std::string model;
std::cin >> model;
std::cout << "Enter vehicle year: ";
int year;
std::cin >> year;
std::cout << "Enter vehicle odometer reading: ";
int odometer;
std::cin >> odometer;
std::cout << "Select fuel type (0: Gas, 1: Diesel, 2: Electric): ";
int fuelTypeOption;
std::cin >> fuelTypeOption;
FuelType fuelType;
if (fuelTypeOption == 0)
{
fuelType = FuelType::GAS;
}
else if (fuelTypeOption == 1)
{
fuelType = FuelType::DIESEL;
}
else if (fuelTypeOption == 2)
{
fuelType = FuelType::ELECTRIC;
}
else
{
std::cout << "Invalid fuel type. Vehicle not added." << std::endl;
continue;
}
Vehicle* vehicle = nullptr;
switch (fuelType)
{
case FuelType::GAS:
vehicle = new GasCar(make, model, year, odometer);
break;
case FuelType::DIESEL:
vehicle = new DieselCar(make, model, year, odometer);
break;
case FuelType::ELECTRIC:
vehicle = new ElectricCar(make, model, year, odometer);
break;
}
library.addVehicle(vehicle);
std::cout << "Vehicle added successfully." << std::endl;
}
else if (option == 3)
{
std::cout << "Enter index of the vehicle to update: ";
int index;
std::cin >> index;
std::cout << "Enter new odometer reading: ";
int newOdometer;
std::cin >> newOdometer;
library.updateVehicle(index, newOdometer);
}
else if (option == 4)
{
std::cout << "Enter index of the vehicle to remove: ";
int index;
std::cin >> index;
library.removeVehicle(index);
}
else if (option == 5)
{
std::cout << "Enter index of the vehicle to check tire rotation: ";
int index;
std::cin >> index;
library.checkTireRotation(index);
}
else if (option == 6)
{
std::cout << "Enter index of the vehicle to check battery power: ";
int index;
std::cin >> index;
library.checkBatteryPower(index);
}
else if (option == 7)
{
std::cout << "Enter index of the vehicle to rotate tires: ";
int index;
std::cin >> index;
library.rotateTires(index);
}
else if (option == 8)
{
std::cout << "Enter index of the vehicle to perform oil change: ";
int index;
std::cin >> index;
library.performOilChange(index);
}
else if (option == 9)
{
std::cout << "Enter index of the vehicle to recharge: ";
int index;
std::cin >> index;
library.recharge(index);
}
else
{
std::cout << "Invalid option. Try again." << std::endl;
}
std::cout << std::endl;
}
return 0;
}