Challenge

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;

}

 

 

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.