Challenge

Project 3

1.Build an object-oriented library which 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.
Maintenance tasks include activities like oil change or replace oil filter, replace air filter, replace fuel filter, tire rotations, infotainment system debug, replace spark plugs, replace the cabin or a/c filter, check the level and refill clutch fluid or brake fluid, examine belts, wipers, hoses, check the tire conditions, check the charging systems and battery.

Aim:
Build an object-oriented library which 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.

#include <iostream>
#include <string>
#include <vector>


// 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;
}

1.ADD VEHICLES

2.UPDATE VEHICLES, REMOVE VEHICLES

3.CHECK BATTERY POWER

4. ROTATE TIRES

5. RECHARGE VEHICLE

Your portfolio, next

Ship work like this
in your own course.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.