Project 3
#include
#include
#include
// Define an enumeration for fuel types
enum class FuelType{
GAS,
DIESEL,
ELECTRIC
};
// Define a base class Vehicle
class Vehicle
{
protected:
std::string make;
std::string model;
int year;
int odometer;
public:
// Constructor for Vehicle class
Vehicle(const std::string& make, const std::string& model, int year, int odometer)
: make(make), model(model), year(year), odometer(odometer) {}
// Getter methods for Vehicle class
std::string getMake() const { return make; }
std::string getModel() const { return model; }
int getYear() const { return year; }
int getOdometer() const { return odometer; }
// Setter method for odometer
void setOdometer(int newOdometer) { odometer = newOdometer; }
// Pure virtual function to get the fuel type of the vehicle
virtual FuelType getFuelType() const = 0;
// Pure virtual function to perform maintenance on the vehicle
virtual void performMaintenance() = 0;
// Virtual function to rotate tires
virtual void rotateTires()
{
std::cout << "Rotating tires for " << make << " " << model << std::endl;
}
// Virtual function to perform oil change
virtual void performOilChange()
{
std::cout << "Performing oil change for " << make << " " << model << std::endl;
}
// Virtual function to recharge the vehicle
virtual void recharge()
{
std::cout << "Recharging " << make << " " << model << std::endl;
}
// Virtual function to check if tire rotation is needed
virtual void checkTireRotation()
{
int tireCycle = 50000; // Tire rotation cycle in kilometers
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 function to check if battery recharge is needed
virtual void checkPower()
{
int rechargeDistance = 400; // Recharge distance in kilometers
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 destructor for the base class
virtual ~Vehicle() {}
};
class GasCar : public Vehicle {
public:
// Constructor for GasCar class
GasCar(const std::string& make, const std::string& model, int year, int odometer)
: Vehicle(make, model, year, odometer) {}
// Return the fuel type of GasCar
FuelType getFuelType() const override {
return FuelType::GAS;
}
// Perform maintenance on GasCar
void performMaintenance() override {
std::cout << "Performing maintenance on GasCar" << std::endl;
}
// Rotate tires for GasCar
void rotateTires() override {
std::cout << "Rotating tires for GasCar" << std::endl;
}
// Perform oil change for GasCar
void performOilChange() override {
std::cout << "Performing oil change for GasCar" << std::endl;
}
};
class DieselCar : public Vehicle {
public:
// Constructor for DieselCar class
DieselCar(const std::string& make, const std::string& model, int year, int odometer)
: Vehicle(make, model, year, odometer) {}
// Return the fuel type of DieselCar
FuelType getFuelType() const override {
return FuelType::DIESEL;
}
// Perform maintenance on DieselCar
void performMaintenance() override {
std::cout << "Performing maintenance on DieselCar" << std::endl;
}
// Rotate tires for DieselCar
void rotateTires() override {
std::cout << "Rotating tires for DieselCar" << std::endl;
}
// Perform oil change for DieselCar
void performOilChange() override {
std::cout << "Performing oil change for DieselCar" << std::endl;
}
};
class ElectricCar : public Vehicle {
public:
// Constructor for ElectricCar class
ElectricCar(const std::string& make, const std::string& model, int year, int
odometer)
: Vehicle(make, model, year, odometer) {}
// Return the fuel type of ElectricCar
FuelType getFuelType() const override {
return FuelType::ELECTRIC;
}
// Perform maintenance on ElectricCar
void performMaintenance() override {
std::cout << "Performing maintenance on ElectricCar" << std::endl;
}
// Recharge ElectricCar
void recharge() override {
std::cout << "Recharging ElectricCar" << std::endl;
}
};
class MaintenanceLibrary {
private:
std::vector<Vehicle*> inventory;
public:
// Destructor for MaintenanceLibrary class
~MaintenanceLibrary() {
// Delete each vehicle in the inventory
for (Vehicle* vehicle : inventory) {
delete vehicle;
}
}
// Add a vehicle to the inventory
void addVehicle(Vehicle* vehicle) {
inventory.push_back(vehicle);
}
// List all vehicles in the inventory
void listVehicles() const {
int index = 0;
// Iterate over each vehicle in the inventory
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: ";
// Print the fuel type based on the enum value
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;
}
}
// Update the odometer reading of a vehicle in the inventory
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);
}
}
// Remove a vehicle from the inventory
void removeVehicle(int index) {
if (index >= 0 && static_cast<std::size_t>(index) < inventory.size()) {
delete inventory[index];
inventory.erase(inventory.begin() + index);
}
}
// Rotate tires for a vehicle in the inventory
void rotateTires(int index) {
if (index >= 0 && static_cast<std::size_t>(index) < inventory.size()) {
Vehicle* vehicle = inventory[index];
vehicle->rotateTires();
}
}
// Perform an oil change for a vehicle in the inventory
void performOilChange(int index) {
if (index >= 0 && static_cast<std::size_t>(index) < inventory.size()) {
Vehicle* vehicle = inventory[index];
vehicle->performOilChange();
}
}
// Recharge an electric vehicle in the inventory
void recharge(int index) {
if (index >= 0 && static_cast<std::size_t>(index) < inventory.size()) {
Vehicle* vehicle = inventory[index];
vehicle->recharge();
}
}
// Check if tire rotation is due for a vehicle in the inventory
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;
}
}
}
// Check if battery recharge is due for an electric vehicle in the inventory
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) {
// Display menu options
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; // Exit the loop and quit the program
} else if (option == 1) {
library.listVehicles(); // List the vehicles in the inventory
} else if (option == 2) {
// Add a new vehicle to the inventory
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; // Skip to the next iteration of the loop
}
// Create a new vehicle based on the selected fuel type
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); // Add the vehicle to the inventory
std::cout << "Vehicle added successfully." << std::endl;
}
else if (option == 3) {
// Update the odometer reading of a vehicle in the inventory
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) {
// Remove a vehicle from the inventory
std::cout << "Enter index of the vehicle to remove: ";
int index;
std::cin >> index;
library.removeVehicle(index);
} else if (option == 5) {
// Check tire rotation for a vehicle in the inventory
std::cout << "Enter index of the vehicle to check tire rotation: ";
int index;
std::cin >> index;
library.checkTireRotation(index);
} else if (option == 6) {
// Check battery power for an electric vehicle in the inventory
std::cout << "Enter index of the vehicle to check battery power: ";
int index;
std::cin >> index;
library.checkBatteryPower(index);
} else if (option == 7) {
// Rotate tires for a vehicle in the inventory
std::cout << "Enter index of the vehicle to rotate tires: ";
int index;
std::cin >> index;
library.rotateTires(index);
} else if (option == 8) {
// Perform an oil change for a vehicle in the inventory
std::cout << "Enter index of the vehicle to perform oil change: ";
int index;
std::cin >> index;
library.performOilChange(index);
} else if (option == 9) {
// Recharge the battery of an electric vehicle in the inventory
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;
}