Challenge

Project 3

#include

#include

#include

enum class FuelType

{

GAS,

DIESEL,

ELECTRIC

};

class Vehicle

{

protected:

std::string make;

std::string model;

int year;

int odometer;

public:

Vehicle(const std::string& make,

const std::string& model,

int year, int odometer)

: make(make),

model(model), year(year), odometer(odometer) {}

std::stringgetMake() const

{

return make;

}

std::string getModel() const

{

return model;

}

int getYear() const

{

return year;

}

int getOdometer() const

{

return odometer;

}

void setOdometer(int newOdometer)

{

odometer = newOdometer;

}

virtual FuelType getFuelType() const = 0;

virtual void performMaintenance() = 0;

virtual void rotateTires()

{

std::cout << "Rotating tires for " << make << " " << model << std::endl;

}

virtual void performOilChange()

{

std::cout << "Performing oil change for " << make << " " << model << std::endl;

}

virtual void recharge()

{

std::cout << "Recharging " << make << " " << model << std::endl;

}

virtual void checkTireRotation()

{

int tireCycle = 50000;

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 void checkPower()

{

int rechargeDistance = 400;

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 ~Vehicle() {}

};

class GasCar : public Vehicle

{

public:

GasCar(const std::string& make, const std::string& model, int year, int odometer)

: Vehicle(make, model, year, odometer) {}

FuelType getFuelType() const override

{

return FuelType::GAS;

}

void performMaintenance() override {

std::cout << "Performing maintenance on GasCar" << std::endl;

}

void rotateTires() override {

std::cout << "Rotating tires for GasCar" << std::endl;

}

class GasCar : public Vehicle

{

public:

GasCar(const std::string& make, const std::string& model, int year, int odometer)

: Vehicle(make, model, year, odometer) {}

FuelType getFuelType() const override

{

return FuelType::GAS;

}

void performMaintenance() override

{

std::cout << "Performing maintenance on GasCar" << std::endl;

}

void rotateTires() override

{

std::cout << "Rotating tires for GasCar" << std::endl;

}

void performOilChange() override

{

std::cout << "Performing oil change for DieselCar" << std::endl;

}

};

class ElectricCar : public Vehicle

{

public:

ElectricCar(const std::string& make, const std::string& model, int year, int

odometer)

: Vehicle(make, model, year, odometer) {}

FuelType getFuelType() const override {

return FuelType::ELECTRIC;

}

void performMaintenance() override

{

std::cout << "Performing maintenance on ElectricCar" << std::endl;

}

void recharge() override

{

std::cout << "Recharging ElectricCar" << std::endl;

}

};

class MaintenanceLibrary

{

private:

std::vector<Vehicle*> inventory;

public:

~MaintenanceLibrary()

{

for (Vehicle* vehicle : inventory)

{

delete vehicle;

}

}

void addVehicle(Vehicle* vehicle)

{

inventory.push_back(vehicle);

}

void listVehicles() const

{

int index = 0;

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: ";

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;

}

}

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);

}

}

void removeVehicle(int index)

{

if (index >= 0 && static_cast<std::size_t>(index) < inventory.size())

{

delete inventory[index];

inventory.erase(inventory.begin() + index);

}

}

void rotateTires(int index)

{

if (index >= 0 && static_cast<std::size_t>(index) < inventory.size())

{

Vehicle* vehicle = inventory[index];

vehicle->rotateTires();

}

}

void performOilChange(int index)

{

if (index >= 0 && static_cast<std::size_t>(index) < inventory.size())

{

Vehicle* vehicle = inventory[index];

vehicle->performOilChange();

}

}

void recharge(int index) {

if (index >= 0 && static_cast<std::size_t>(index) < inventory.size()) {

Vehicle* vehicle = inventory[index];

vehicle->recharge();

}

}

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;

}

}

}

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)

{

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;

}

else if

(option == 1)

{

library.listVehicles();

}

else if (option == 2)

{

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;

}

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);

std::cout << "Vehicle added successfully." << std::endl;

}

else if (option == 3)

{

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)

{

std::cout << "Enter index of the vehicle to remove: ";

int index;

std::cin >> index;

library.removeVehicle(index);

}

else if (option == 5)

{

std::cout << "Enter index of the vehicle to check tire rotation: ";

int index;

std::cin >> index;

library.checkTireRotation(index);

}

else if (option == 6)

{

std::cout << "Enter index of the vehicle to check battery power: ";

int index;

std::cin >> index;

library.checkBatteryPower(index);

}

else if (option == 7)

{

std::cout << "Enter index of the vehicle to rotate tires: ";

int index;

std::cin >> index;

library.rotateTires(index);

}

else if (option == 8)

{

std::cout << "Enter index of the vehicle to perform oil change: ";

int index;

std::cin >> index;

library.performOilChange(index);

}

else if (option == 9)

{

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.