Project 3
#include
#include
#include
using namespace std;
enum class FuelType // Define an enumeration for fuel types
{
GAS, DIESEL, ELECTRIC
};
class Vehicle // Define a base class Vehicle
{
protected:
string make;
string model;
int year;
int odometer;
public: // Constructor for Vehicle class
Vehicle(const string &make, const string &model, int year, int odometer) :
make(make), model(model), year(year), odometer(odometer){}
string getMake() const // Getter methods for Vehicle class
{
return make;
}
string getModel() const
{
return model;
}
int getYear() const
{
return year;
}
int getOdometer() const
{
return odometer;
}
void setOdometer(int newOdometer) // Setter method for odometer
{
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 void rotatetyres() // Virtual function to rotate tyres
{
cout << "Rotating tyres for " << make>
}
virtual void performOilChange() // Virtual function to perform oil change
{
cout << "Performing oil change for " << make>
}
virtual void recharge() // Virtual function to recharge the vehicle
{
cout << "Recharging " << make>
}
// Virtual function to check if tire rotation is needed
virtual void checkTyreRotation()
{
int tyreCycle = 50000; // Tire rotation cycle in kilometers
int distanceRun = getOdometer() % tyreCycle;
if (distanceRun == 0)
{
cout << "Time to rotate tyres for " << make>
}
else
{
cout << "tyres are good to go for " << make>
int remainder = tyreCycle - distanceRun;
cout << "Remaining distance for tire rotation: " << remainder>
<< " km" << 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)
{
cout << "Time to recharge the battery for " << make>
<< endl>
}
else
{
cout << "Your vehicle is good to go for " << make>
<< endl>
int remainder = rechargeDistance - distanceRun;
cout << "Remaining distance for recharge: " << remainder>
}
}
virtual ~Vehicle() // Virtual destructor for the base class
{
}
};
class GasCar : public Vehicle
{
public: // Constructor for GasCar class
GasCar(const string &make, const string &model, int year, int odometer) :
Vehicle(make, model, year, odometer) {}
FuelType getFuelType() const override // Return the fuel type of GasCar
{
return FuelType::GAS;
}
void performMaintenance() override // Perform maintenance on GasCar
{
cout << "Performing maintenance on GasCar" << endl>
}
void rotatetyres() override // Rotate tyres for GasCar
{
cout << "Rotating tyres for GasCar" << endl>
}
void performOilChange() override // Perform oil change for GasCar
{
cout << "Performing oil change for GasCar" << endl>
}
};
class DieselCar : public Vehicle
{
public:
// Constructor for DieselCar class
DieselCar(const string &make, const string &model, int year, int odometer) :
Vehicle(make, model, year, odometer) {}
FuelType getFuelType() const override // Return the fuel type of DieselCar
{
return FuelType::DIESEL;
}
void performMaintenance() override // Perform maintenance on DieselCar
{
cout << "Performing maintenance on DieselCar" << endl>
}
void rotatetyres() override // Rotate tyres for DieselCar
{
cout << "Rotating tyres for DieselCar" << endl>
}
void performOilChange() override // Perform oil change for DieselCar
{
cout << "Performing oil change for DieselCar" << endl>
}
};
class ElectricCar : public Vehicle
{
public:
// Constructor for ElectricCar class
ElectricCar(const string &make, const string &model, int year, int odometer) :
Vehicle(make, model, year, odometer) {}
FuelType getFuelType() const override // Return the fuel type of ElectricCar
{
return FuelType::ELECTRIC;
}
void performMaintenance() override // Perform maintenance on ElectricCar
{
cout << "Performing maintenance on ElectricCar" << endl>
}
void recharge() override // Recharge ElectricCar
{
cout << "Recharging ElectricCar" << endl>
}
};
class MaintenanceLibrary
{
private:
vector inventory;
public: // Destructor for MaintenanceLibrary class
~MaintenanceLibrary()
{
for (Vehicle *vehicle : inventory) // Delete each vehicle in the inventory
{
delete vehicle;
}
}
void addVehicle(Vehicle *vehicle) // Add a vehicle to the inventory
{
inventory.push_back(vehicle);
}
void listVehicles() const // List all vehicles in the inventory
{
int index = 0;
// Iterate over each vehicle in the inventory
for (const Vehicle *vehicle : inventory)
{
cout << "Index: " << index>
cout << "Make: " << vehicle>getMake() << endl>
cout << "Model: " << vehicle>getModel() << endl>
cout << "Year: " << vehicle>getYear() << endl>
cout << "Odometer: " << vehicle>getOdometer() << endl>
cout << "Fuel Type: ";
// Print the fuel type based on the enum value
switch (vehicle->getFuelType())
{
case FuelType::GAS:
cout << "Gas" << endl>
break;
case FuelType::DIESEL:
cout << "Diesel" << endl>
break;
case FuelType::ELECTRIC:
cout << "Electric" << endl>
break;
}
cout << endl>
++index;
}
}
// Update the odometer reading of a vehicle in the inventory
void updateVehicle(int index, int newOdometer)
{
if (index >= 0 && static_cast(index) < inventory>
{
Vehicle *vehicle = inventory[index];
vehicle->performMaintenance();
vehicle->setOdometer(newOdometer);
}
}
void removeVehicle(int index) // Remove a vehicle from the inventory
{
if (index >= 0 && static_cast(index) < inventory>
{
delete inventory[index];
inventory.erase(inventory.begin() + index);
}
}
void rotatetyres(int index) // Rotate tyres for a vehicle in the inventory
{
if (index >= 0 && static_cast(index) < inventory>
{
Vehicle *vehicle = inventory[index];
vehicle->rotatetyres();
}
}
// Perform an oil change for a vehicle in the inventory
void performOilChange(int index)
{
if (index >= 0 && static_cast(index) < inventory>
{
Vehicle *vehicle = inventory[index];
vehicle->performOilChange();
}
}
// Recharge an electric vehicle in the inventory
void recharge(int index)
{
if (index >= 0 && static_cast(index) < inventory>
{
Vehicle *vehicle = inventory[index];
vehicle->recharge();
}
}
// Check if tire rotation is due for a vehicle in the inventory
void checkTyreRotation(int index)
{
if (index >= 0 && static_cast(index) < inventory>
{
Vehicle *vehicle = inventory[index];
int currentOdometer = vehicle->getOdometer();
int tyreCycle = 50000;
int remainder = currentOdometer % tyreCycle;
if (currentOdometer >= tyreCycle && remainder >= 0)
{
cout << "Tyre rotation is due for " << vehicle>getMake() << " " << vehicle>getModel() << endl>
cout << "Current odometer reading: " << currentOdometer>
cout << "Tyre rotation cycle: " << tyreCycle>
cout << "Remaining distance for tyre rotation: " << tyreCycle>
}
else
{
cout << "tyres are good to go for " << vehicle>getMake() << " " << vehicle>getModel() << endl>
cout << "Current odometer reading: " << currentOdometer>
cout << "Tyre rotation cycle: " << tyreCycle>
cout << "Remaining distance for tyre rotation: "<< tyreCycle>
}
}
}
// Check if battery recharge is due for an electric vehicle in the inventory
void checkBatteryPower(int index)
{
if (index >= 0 && static_cast(index) < inventory>
{
Vehicle *vehicle = inventory[index];
int currentOdometer = vehicle->getOdometer();
int powerCycle = 400;
int remainder = currentOdometer % powerCycle;
if (currentOdometer >= powerCycle && remainder == 0)
{
cout << "Battery recharge is due for " << vehicle>getMake()<< " " << vehicle>getModel() << endl>
cout << "Current odometer reading: " << currentOdometer>
cout << "Battery recharge cycle: " << powerCycle>
}
else
{
cout << "Battery is good to go for " << vehicle>getMake()<< " " << vehicle>getModel() << endl>
cout << "Current odometer reading: " << currentOdometer>
cout << "Battery recharge cycle: " << powerCycle>
cout << "Remaining distance for battery recharge: "<< powerCycle>
}
}
}
};
int main()
{
MaintenanceLibrary library;
while (true) // Display menu options
{
cout << "Menu:" << endl>
cout << "0. Quit." << endl>
cout << "1. List inventory." << endl>
cout << "2. Add vehicle." << endl>
cout << "3. Update vehicle." << endl>
cout << "4. Remove vehicle." << endl>
cout << "5. Check tyre rotation." << endl>
cout << "6. Check battery power." << endl>
cout << "7. Rotate tyres." << endl>
cout << "8. Perform oil change." << endl>
cout << "9. Recharge vehicle." << endl>
cout << "Select an option: ";
int option;
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
cout << "Enter vehicle make: ";
string make;
cin >> make;
cout << "Enter vehicle model: ";
string model;
cin >> model;
cout << "Enter vehicle year: ";
int year;
cin >> year;
cout << "Enter vehicle odometer reading: ";
int odometer;
cin >> odometer;
cout << "Select fuel type (0: Gas, 1: Diesel, 2: Electric): ";
int fuelTypeOption;
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
{
cout << "Invalid fuel type. Vehicle not added." << 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
cout << "Vehicle added successfully." << endl>
}
else if (option == 3)
{
// Update the odometer reading of a vehicle in the inventory
cout << "Enter index of the vehicle to update: ";
int index;
cin >> index;
cout << "Enter new odometer reading: ";
int newOdometer;
cin >> newOdometer;
library.updateVehicle(index, newOdometer);
}
else if (option == 4)
{
// Remove a vehicle from the inventory
cout << "Enter index of the vehicle to remove: ";
int index;
cin >> index;
library.removeVehicle(index);
}
else if (option == 5)
{
// Check tyre rotation for a vehicle in the inventory
cout << "Enter index of the vehicle to check tyre rotation: ";
int index;
cin >> index;
library.checkTyreRotation(index);
}
else if (option == 6)
{
// Check battery power for an electric vehicle in the inventory
cout << "Enter index of the vehicle to check battery power: ";
int index;
cin >> index;
library.checkBatteryPower(index);
}
else if (option == 7)
{
// Rotate tyres for a vehicle in the inventory
cout << "Enter index of the vehicle to rotate tyres: ";
int index;
cin >> index;
library.rotatetyres(index);
}
else if (option == 8)
{
// Perform an oil change for a vehicle in the inventory
cout << "Enter index of the vehicle to perform oil change: ";
int index;
cin >> index;
library.performOilChange(index);
}
else if (option == 9)
{
// Recharge the battery of an electric vehicle in the inventory
cout << "Enter index of the vehicle to recharge: ";
int index;
cin >> index;
library.recharge(index);
}
else
{
cout << "Invalid option. Try again." << endl>
}
cout << endl>
}
return 0;
}

Your portfolio, nextShip work like this