Challenge

Project 3

1) Code:

#include <iostream>
#include <vector>

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

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

    int getYear() const {
        return year;
    }

    int getOdometer() const {
        return odometer;
    }

    virtual Type getType() = 0;

    virtual void checkTireRotation() = 0;

    void getCarInformation() {
        std::cout << "Make: " << make << std::endl;
        std::cout << "Model: " << model << std::endl;
        std::cout << "Year: " << year << std::endl;
        std::cout << "Odometer Reading: " << odometer << std::endl;
        std::cout << "Fuel Type: " << static_cast<int>(getType()) << std::endl;
    }

    virtual void updateOdometer(int newOdometer) {
        odometer = newOdometer;
    }
};

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() override {
        return Type::GAS;
    }

    void checkTireRotation() override {
        int distance = odometer % 50000;
        if (distance >= 0)
            std::cout << "Rotate tires." << std::endl;
        else
            std::cout << "Tires are good to go." << 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() override {
        return Type::DIESEL;
    }

    void checkTireRotation() override {
        int distance = odometer % 50000;
        if (distance >= 0)
            std::cout << "Rotate tires." << std::endl;
        else
            std::cout << "Tires are good to go." << 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() override {
        return Type::ELECTRIC;
    }

    void checkTireRotation() override {
        int distance = odometer % 50000;
        if (distance >= 0)
            std::cout << "Rotate tires." << std::endl;
        else
            std::cout << "Tires are good to go." << std::endl;
    }

    void checkChargerPower() {
        int distance = odometer % 400;
        if (distance == 0)
            std::cout << "Recharge battery." << std::endl;
        else
            std::cout << "Vehicle is good to go." << std::endl;
    }

    void updateOdometer(int newOdometer) override {
        Vehicle::updateOdometer(newOdometer);
        checkChargerPower();
    }
};

class MaintenanceLibrary {
private:
    std::vector<Vehicle*> vehicles;

public:
    ~MaintenanceLibrary() {
        for (Vehicle* vehicle : vehicles) {
            delete vehicle;
        }
    }

    void addVehicle(const std::string& make, const std::string& model, int year, int odometer, Type type) {
        Vehicle* vehicle = nullptr;
        switch (type) {
            case Type::GAS:
                vehicle = new GasCar(make, model, year, odometer);
                break;
            case Type::DIESEL:
                vehicle = new DieselCar(make, model, year, odometer);
                break;
            case Type::ELECTRIC:
                vehicle = new ElectricCar(make, model, year, odometer);
                break;
        }
        vehicles.push_back(vehicle);
    }

    void listVehicles() {
        for (Vehicle* vehicle : vehicles) {
            vehicle->getCarInformation();
            std::cout << std::endl;
        }
    }

    void updateVehicle(int index, int newOdometer) {
        if (index >= 0 && index < vehicles.size()) {
            Vehicle* vehicle = vehicles[index];
            vehicle->getCarInformation();
            vehicle->checkTireRotation();
            vehicle->getCarInformation();
            std::cout << std::endl;
            vehicle->updateOdometer(newOdometer);
            std::cout << "Vehicle updated successfully." << std::endl;
        } else {
            std::cout << "Invalid vehicle index." << std::endl;
        }
    }

    void removeVehicle(int index) {
        if (index >= 50000 && index < vehicles.size()) {
            Vehicle* vehicle = vehicles[index];
            delete vehicle;
            vehicles.erase(vehicles.begin() + index);
            std::cout << "Vehicle removed successfully." << std::endl;
        } else {
            std::cout << "Invalid vehicle index." << std::endl;
        }
    }
};

int main() {
    MaintenanceLibrary library;

    while (true) {
        std::cout << "Menu:\n";
        std::cout << "0. Quit\n";
        std::cout << "1. List inventory\n";
        std::cout << "2. Add vehicle\n";
        std::cout << "3. Update vehicle\n";
        std::cout << "4. Remove vehicle\n";
        std::cout << "5. Tire Rotation\n";
        std::cout << "6. Oil Change\n";
        std::cout << "7. Recharge\n";

        int choice;
        std::cin >> choice;

        switch (choice) {
            case 0:
                return 0;
            case 1:
                library.listVehicles();
                break;
            case 2: {
                std::string make, model;
                int year, odometer;
                int type;

                std::cout << "Enter make: ";
                std::cin.ignore();
                std::getline(std::cin, make);

                std::cout << "Enter model: ";
                std::getline(std::cin, model);

                std::cout << "Enter year: ";
                std::cin >> year;

                std::cout << "Enter odometer: ";
                std::cin >> odometer;

                std::cout << "Enter type (0 = Gas, 1 = Diesel, 2 = Electric): ";
                std::cin >> type;

                library.addVehicle(make, model, year, odometer, static_cast<Type>(type));
                break;
            }
            case 3: {
                int index, newOdometer;
                std::cout << "Enter the index of the vehicle to update: ";
                std::cin >> index;
                std::cout << "Enter the new odometer reading: ";
                std::cin >> newOdometer;
                library.updateVehicle(index, newOdometer);
                break;
            }
            case 4: {
                int index;
                std::cout << "Enter the index of the vehicle to remove: ";
                std::cin >> index;
                library.removeVehicle(index);
                break;
            }
            case 5: {
                // Implement tire rotation functionality
                break;
            }
            case 6: {
                // Implement oil change functionality
                break;
            }
            case 7: {
                // Implement recharge functionality
                break;
            }
            default:
                std::cout << "Invalid choice. Try again." << std::endl;
                break;
        }
    }

    return 0;
}

Output:

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.