Challenge

Project 3

#include <iostream>

#include <vector>

#include <limits>

enum Type {

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::string getMake() const {

return make;

}

void setMake(const std::string& newMake) {

make = newMake;

}

std::string getModel() const {

return model;

}

void setModel(const std::string& newModel) {

model = newModel;

}

int getYear() const {

return year;

}

void setYear(int newYear) {

year = newYear;

}

int getOdometer() const {

return odometer;

}

void setOdometer(int newOdometer) {

odometer = newOdometer;

}

virtual Type getType() const = 0;

void checkTireRotation() const {

int remainder = odometer % 50000;

if (remainder >= 0) {

std::cout << "Advice: Rotate tires." << std::endl;

} else {

std::cout << "Tires are good to go." << std::endl;

}

}

virtual void checkChargerPower() const = 0;

virtual void checkOil() const = 0;

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) {}

Type getType() const override {

return GAS;

}

void checkChargerPower() const override {}

void checkOil() const override {

std::cout << "Checking oil for a gas car." << std::endl;

}

};

class DieselCar : public Vehicle {

public:

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

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

Type getType() const override {

return DIESEL;

}

void checkChargerPower() const override {}

void checkOil() const override {

std::cout << "Checking oil for a diesel car." << 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) {}

Type getType() const override {

return ELECTRIC;

}

void checkChargerPower() const override {

int distance = 400;

if (odometer >= distance) {

std::cout << "Advice: Recharge battery." << std::endl;

} else {

std::cout << "Battery is good to go." << std::endl;

}

}

void checkOil() const override {

std::cout << "Checking oil for an electric car." << std::endl;

}

};

class FuelVehicle : public Vehicle {

public:

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

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

Type getType() const override = 0;

void checkChargerPower() const override {}

void checkOil() const override = 0;

};

class MaintenanceSystem {

private:

std::vector<std::unique_ptr<Vehicle>> vehicles;

public:

void addVehicle(std::unique_ptr<Vehicle> vehicle) {

vehicles.push_back(std::move(vehicle));

}

void listVehicles() const {

for (const auto& vehicle : vehicles) {

std::cout << "Make: " << vehicle->getMake()

<< ", Model: " << vehicle->getModel()

<< ", Year: " << vehicle->getYear()

<< ", Odometer: " << vehicle->getOdometer()

<< ", Type: " << vehicle->getType() << std::endl;

}

}

void updateVehicle(int index) {

if (index >= 0 && index < vehicles.size()) {

std::string newMake = getNewMake();

std::string newModel = getNewModel();

int newYear = getNewYear();

int newOdometer = getNewOdometerReading();

vehicles[index]->setMake(newMake);

vehicles[index]->setModel(newModel);

vehicles[index]->setYear(newYear);

vehicles[index]->setOdometer(newOdometer);

} else {

std::cout << "Invalid index. Please try again." << std::endl;

}

}

void removeVehicle(int index) {

if (index >= 0 && index < vehicles.size()) {

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

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

} else {

std::cout << "Invalid index. Please try again." << std::endl;

}

}

void tireRotation(int index) const {

if (index >= 0 && index < vehicles.size()) {

vehicles[index]->checkTireRotation();

} else {

std::cout << "Invalid index. Please try again." << std::endl;

}

}

void oilChange(int index) const {

if (index >= 0 && index < vehicles.size()) {

vehicles[index]->checkOil();

} else {

std::cout << "Invalid index. Please try again." << std::endl;

}

}

void recharge(int index) const {

if (index >= 0 && index < vehicles.size()) {

vehicles[index]->checkChargerPower();

} else {

std::cout << "Invalid index. Please try again." << std::endl;

}

}

private:

std::string getNewMake() const {

std::string make;

std::cout << "Enter make: ";

std::getline(std::cin, make);

return make;

}

std::string getNewModel() const {

std::string model;

std::cout << "Enter model: ";

std::getline(std::cin, model);

return model;

}

int getNewYear() const {

int year;

do {

std::cout << "Enter year (4 digits): ";

std::cin >> year;

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

} while (year < 1000 || year > 9999);

return year;

}

int getNewOdometerReading() const {

int odometer;

do {

std::cout << "Enter new odometer reading: ";

std::cin >> odometer;

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

} while (odometer < 0);

return odometer;

}

};

int main() {

MaintenanceSystem maintenanceSystem;

while (true) {

std::cout << "Select an option:\n"

<< "0. Quit\n"

<< "1. List inventory\n"

<< "2. Add vehicle\n"

<< "3. Update vehicle\n"

<< "4. Remove vehicle\n"

<< "5. Tire Rotation\n"

<< "6. Oil Change\n"

<< "7. Recharge\n"

<< "Enter your choice: ";

int choice;

std::cin >> choice;

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

switch (choice) {

case 0:

return 0;

case 1:

maintenanceSystem.listVehicles();

break;

case 2: {

int type;

std::cout << "Select vehicle type (0 for GAS, 1 for DIESEL, 2 for ELECTRIC): ";

std::cin >> type;

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

std::string make = maintenanceSystem.getNewMake();

std::string model = maintenanceSystem.getNewModel();

int year = maintenanceSystem.getNewYear();

int odometer = maintenanceSystem.getNewOdometerReading();

std::unique_ptr<Vehicle> newVehicle;

if (type == GAS) {

newVehicle = std::make_unique<GasCar>(make, model, year, odometer);

} else if (type == DIESEL) {

newVehicle = std::make_unique<DieselCar>(make, model, year, odometer);

} else if (type == ELECTRIC) {

newVehicle = std::make_unique<ElectricCar>(make, model, year, odometer);

} else {

std::cout << "Invalid vehicle type." << std::endl;

continue;

}

maintenanceSystem.addVehicle(std::move(newVehicle));

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

break;

}

case 3:

maintenanceSystem.listVehicles();

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

int updateIndex;

std::cin >> updateIndex;

maintenanceSystem.updateVehicle(updateIndex);

break;

case 4:

maintenanceSystem.listVehicles();

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

int removeIndex;

std::cin >> removeIndex;

maintenanceSystem.removeVehicle(removeIndex);

break;

case 5:

maintenanceSystem.listVehicles();

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

int tireRotationIndex;

std::cin >> tireRotationIndex;

maintenanceSystem.tireRotation(tireRotationIndex);

break;

case 6:

maintenanceSystem.listVehicles();

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

int oilChangeIndex;

std::cin >> oilChangeIndex;

maintenanceSystem.oilChange(oilChangeIndex);

break;

case 7:

maintenanceSystem.listVehicles();

std::cout << "Enter the index of the vehicle for recharge: ";

int rechargeIndex;

std::cin >> rechargeIndex;

maintenanceSystem.recharge(rechargeIndex);

break;

default:

std::cout << "Invalid choice. Please try again." << 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.