Project 3--Build an object-oriented library that can be used to track automobile maintenance. There can be different car types such as petrol, diesel, gas, electric etc., This library should be able to support at least three of the car types.
Aim:
Build an object-oriented library that can be used to track automobile maintenance. There can be different car types such as petrol, diesel, gas, electric etc., This library should be able to support at least three of the car types.
C++ CODE:
#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(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(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(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(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(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(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(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;
}
Output console explanation:
Step-by-step explanation for the execution:
- on running

- We can select the required option. First we add a new vehicle, Selecting option 2 to add vehicle’s details for an example three vehicle’s details have entered



- Listing all the vehicles, Selecting option 1 to display all the stored vehicle details

- Updating the vehicle’s details which is already stored, Selecting option 3 and vehicle index 0.

- Removing the vehicle’s details, by selecting the required option 4 and vehicle index 1.

- Checking the tire rotation(condition), by selecting the required option 5 and vehicle index 0.

- To check battery power of electric vehicle, by selecting the required option 6.

- To rotate the tires, by selecting the required option 7 and vehicle index 0.

- To perform oil change, by selecting the required option 8 and vehicle index 0 .

- To recharge the electric vehicle, by selecting the required option 9 and vehicle index 1.

- Entering ‘0’ to quit the program.
