Challenge

Project 3

#include

#include

#include // For numeric_limits

#include

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

    // Getter and setter functions

    const std::string& getMake() const { return make; }

    const std::string& getModel() const { return model; }

    int getYear() const { return year; }

    int getOdometer() const { return odometer; }

    void setMake(const std::string& newMake) { make = newMake; }

    void setModel(const std::string& newModel) { model = newModel; }

    void setYear(int newYear) { year = newYear; }

    void setOdometer(int newOdometer) { odometer = newOdometer; }

    virtual Type getType() const = 0;

};

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

};

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

};

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 checkTireRotation() const {

        int tireCycle = 50000;

        int distanceRun = getOdometer();

        int remainder = distanceRun % tireCycle;

        if (distanceRun >= tireCycle && remainder >= 0) {

            std::cout << "Advice: Rotate tires.\n";

        } else {

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

        }

    }

    void checkChargerPower() const {

        int rechargeDistance = 400;

        int distanceRun = getOdometer();

        if (distanceRun >= rechargeDistance) {

            std::cout << "Advice: Recharge the battery.\n";

        } else {

            std::cout << "Vehicle is good to go.\n";

        }

    }

};

class FuelVehicle : public Vehicle {

public:

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

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

    virtual void checkOil() const {

        std::cout << "Checking oil for fuel vehicles.\n";

    }

    virtual Type getFuelType() const = 0;

};

class CarMaintenanceSystem {

private:

    std::vector> inventory;

public:

    void addVehicle(const std::string& make, const std::string& model, int year, int odometer, Type type) {

        // Create a new vehicle based on the type

        std::unique_ptr newVehicle;

        switch (type) {

            case GAS:

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

                break;

            case DIESEL:

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

                break;

            case ELECTRIC:

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

                break;

            default:

                std::cerr << "Invalid vehicle type.\n";

                return;

        }

        // Add the new vehicle to the inventory

        inventory.push_back(std::move(newVehicle));

    }

    void listVehicles() const {

        std::cout << "Inventory:\n";

        for (size_t i = 0; i < inventory>

            const auto& vehicle = inventory[i];

            std::cout << "Index: " << i>

                      << ", Make: " << vehicle>getMake()

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

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

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

                      << ", Type: " << vehicle>getType() << "\n";

        }

    }

    void updateVehicle(size_t index, const std::string& make, const std::string& model, int year, int odometer) {

        if (index < inventory>

            inventory[index]->setMake(make);

            inventory[index]->setModel(model);

            inventory[index]->setYear(year);

            inventory[index]->setOdometer(odometer);

        } else {

            std::cerr << "Invalid index.\n";

        }

    }

    void removeVehicle(size_t index) {

        if (index < inventory>

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

        } else {

            std::cerr << "Invalid index.\n";

        }

    }

    void tireRotation(size_t index) const {

        if (index < inventory>

            dynamic_cast(inventory[index].get())->checkTireRotation();

        } else {

            std::cerr << "Invalid index.\n";

        }

    }

    void oilChange(size_t index) const {

        if (index < inventory>

            dynamic_cast(inventory[index].get())->checkOil();

        } else {

            std::cerr << "Invalid index.\n";

        }

    }

    void recharge(size_t index) const {

        if (index < inventory>

            dynamic_cast(inventory[index].get())->checkChargerPower();

        } else {

            std::cerr << "Invalid index.\n";

        }

    }

    size_t size() const {

        return inventory.size();

    }

};

// Helper functions for user input

std::string getNewMake() {

    std::string make;

    do {

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

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

    } while (make.empty());

    return make;

}

std::string getNewModel() {

    std::string model;

    do {

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

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

    } while (model.empty());

    return model;

}

int getYear() {

    int year;

    do {

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

        std::cin >> year;

        std::cin.ignore(std::numeric_limits::max(), '\n'); // Clear the input buffer

    } while (year < 1000> 9999);

    return year;

}

int getNewOdometerReading() {

    int odometer;

    do {

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

        std::cin >> odometer;

        std::cin.ignore(std::numeric_limits::max(), '\n'); // Clear the input buffer

    } while (odometer < 0>

    return odometer;

}

Type getNewType() {

    int type;

    do {

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

        std::cin >> type;

        std::cin.ignore(std::numeric_limits::max(), '\n'); // Clear the input buffer

    } while (type < 0> 2);

    return static_cast(type);

}

size_t selectCar(const CarMaintenanceSystem& system) {

    size_t index;

    do {

        system.listVehicles();

        std::cout << "Select a car (enter the index): ";

        std::cin >> index;

        std::cin.ignore(std::numeric_limits::max(), '\n'); // Clear the input buffer

    } while (index >= system.size());

    return index;

}

int main() {

    CarMaintenanceSystem maintenanceSystem;

    int choice;

    do {

        std::cout << "Menu:\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: ";

        std::cin >> choice;

        std::cin.ignore(std::numeric_limits::max(), '\n'); // Clear the input buffer

        switch (choice) {

            case 1: // List inventory

                maintenanceSystem.listVehicles();

                break;

            case 2: // Add vehicle

                maintenanceSystem.addVehicle(getNewMake(), getNewModel(), getYear(), getNewOdometerReading(), getNewType());

                break;

            case 3: // Update vehicle

                maintenanceSystem.updateVehicle(selectCar(maintenanceSystem), getNewMake(), getNewModel(), getYear(), getNewOdometerReading());

                break;

            case 4: // Remove vehicle

                maintenanceSystem.removeVehicle(selectCar(maintenanceSystem));

                break;

            case 5: // Tire Rotation

                maintenanceSystem.tireRotation(selectCar(maintenanceSystem));

                break;

            case 6: // Oil Change

                maintenanceSystem.oilChange(selectCar(maintenanceSystem));

                break;

            case 7: // Recharge

                maintenanceSystem.recharge(selectCar(maintenanceSystem));

                break;

            case 0: // Quit

                std::cout << "Quitting the program.\n";

                break;

            default:

                std::cerr << "Invalid choice. Please try again.\n";

        }

    } while (choice != 0);

    return 0;

}

Output

[?2004l

Menu:

   0. Quit.

   1. List inventory.

   2. Add vehicle.

   3. Update vehicle.

   4. Remove vehicle.

   5. Tire Rotation.

   6. Oil Change.

   7. Recharge.

Enter your choice: 1

Inventory:

Menu:

   0. Quit.

   1. List inventory.

   2. Add vehicle.

   3. Update vehicle.

   4. Remove vehicle.

   5. Tire Rotation.

   6. Oil Change.

   7. Recharge.

Enter your choice: 2

Enter type (0: GAS, 1: DIESEL, 2: ELECTRIC): 0

Enter odometer reading: 2500

Enter year (4 digits): 2022

Enter model: 2022

Enter make: toyota

Menu:

   0. Quit.

   1. List inventory.

   2. Add vehicle.

   3. Update vehicle.

   4. Remove vehicle.

   5. Tire Rotation.

   6. Oil Change.

   7. Recharge.

Enter your choice: 1

Inventory:

Index: 0, Make: toyota, Model: 2022, Year: 2022, Odometer: 2500, Type: 0

Menu:

   0. Quit.

   1. List inventory.

   2. Add vehicle.

   3. Update vehicle.

   4. Remove vehicle.

   5. Tire Rotation.

   6. Oil Change.

   7. Recharge.

Enter your choice: 5

Inventory:

Index: 0, Make: toyota, Model: 2022, Year: 2022, Odometer: 2500, Type: 0

Select a car (enter the index): 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.