Challenge

Project 3

/******************************************************************************

Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
C#, OCaml, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
Code, Compile, Run and Debug online from anywhere in world.

*******************************************************************************/
#include <iostream>
#include <vector>
#include <limits>
#include <algorithm>

enum Type {
    GAS,
    DIESEL,
    ELECTRIC
};

class Vehicle {
protected:
    std::string make;
    std::string model;
    int year;
    int odometer;

public:
    Vehicle(std::string make, std::string model, int year, int odometer)
        : make(make), model(model), year(year), odometer(odometer) {}

    // Getter functions
    std::string getMake() const { return make; }
    std::string getModel() const { return model; }
    int getYear() const { return year; }
    int getOdometer() const { return odometer; }

    // Setter functions
    void setMake(std::string newMake) { make = newMake; }
    void setModel(std::string newModel) { model = newModel; }
    void setYear(int newYear) { year = newYear; }
    void setOdometer(int newOdometer) { odometer = newOdometer; }

    virtual Type getType() const = 0;
    virtual void maintenanceActivities() = 0;
};

class GasCar : public Vehicle {
public:
    GasCar(std::string make, std::string model, int year, int odometer)
        : Vehicle(make, model, year, odometer) {}

    Type getType() const override { return Type::GAS; }
    void maintenanceActivities() override {
        // Implement gas car maintenance activities here
        std::cout << "Performing maintenance activities for Gas Car." << std::endl;
    }
};

class DieselCar : public Vehicle {
public:
    DieselCar(std::string make, std::string model, int year, int odometer)
        : Vehicle(make, model, year, odometer) {}

    Type getType() const override { return Type::DIESEL; }
    void maintenanceActivities() override {
        // Implement diesel car maintenance activities here
        std::cout << "Performing maintenance activities for Diesel Car." << std::endl;
    }
};

class ElectricCar : public Vehicle {
public:
    ElectricCar(std::string make, std::string model, int year, int odometer)
        : Vehicle(make, model, year, odometer) {}

    Type getType() const override { return Type::ELECTRIC; }
    void maintenanceActivities() override {
        // Implement electric car maintenance activities here
        std::cout << "Performing maintenance activities for Electric Car." << std::endl;
    }
};

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

public:
    // Destructor to free memory for dynamically allocated vehicles
    ~MaintenanceTracker() {
        for (Vehicle* vehicle : vehicles) {
            delete vehicle;
        }
    }

    void addVehicle(Vehicle* vehicle) {
        vehicles.push_back(vehicle);
    }

    void listVehicles() const {
        for (size_t i = 0; i < vehicles.size(); i++) {
            std::cout << "Vehicle " << i + 1 << ":\n";
            std::cout << "Make: " << vehicles[i]->getMake() << ", ";
            std::cout << "Model: " << vehicles[i]->getModel() << ", ";
            std::cout << "Year: " << vehicles[i]->getYear() << ", ";
            std::cout << "Odometer: " << vehicles[i]->getOdometer() << " km\n";
            std::cout << "Fuel Type: ";
            switch (vehicles[i]->getType()) {
                case Type::GAS:
                    std::cout << "Gas" << std::endl;
                    break;
                case Type::DIESEL:
                    std::cout << "Diesel" << std::endl;
                    break;
                case Type::ELECTRIC:
                    std::cout << "Electric" << std::endl;
                    break;
                default:
                    std::cout << "Unknown" << std::endl;
                    break;
            }
        }
    }

    void updateVehicle(int index) {
        if (index >= 0 && index < vehicles.size()) {
            std::string newMake, newModel;
            int newYear, newOdometer;

            std::cout << "Enter the new make: ";
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // Ignore newline character from previous input
            std::getline(std::cin, newMake);
            std::cout << "Enter the new model: ";
            std::getline(std::cin, newModel);
            std::cout << "Enter the new year: ";
            std::cin >> newYear;
            std::cout << "Enter the new odometer reading: ";
            std::cin >> newOdometer;

            vehicles[index]->setMake(newMake);
            vehicles[index]->setModel(newModel);
            vehicles[index]->setYear(newYear);
            vehicles[index]->setOdometer(newOdometer);
        } else {
            std::cout << "Invalid index." << std::endl;
        }
    }

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

// Function to get user input within a specific range
int getUserInput(int lower, int upper) {
    int input;
    while (true) {
        std::cin >> input;
        if (std::cin.fail() || input < lower || input > upper) {
            std::cout << "Invalid input. Please try again: ";
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        } else {
            return input;
        }
    }
}

int main() {
    MaintenanceTracker tracker;
    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"
                  << "Enter your choice (0-4): ";

        choice = getUserInput(0, 4);

        std::string make;
        std::string model;
        int year;
        int odometer;
        int fuelType;
        Vehicle* newVehicle;

        switch (choice) {
            case 0:
                std::cout << "Exiting the program.\n";
                break;
            case 1:
                std::cout << "Listing inventory:\n";
                tracker.listVehicles();
                break;
            case 2:
                std::cout << "Adding a new vehicle:\n";
                std::cout << "Enter the make: ";
                std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // Ignore newline character from previous input
                std::getline(std::cin, make);
                std::cout << "Enter the model: ";
                std::getline(std::cin, model);
                std::cout << "Enter the year: ";
                std::cin >> year;
                std::cout << "Enter the odometer reading: ";
                std::cin >> odometer;
                std::cout << "Enter the fuel type (0-GAS, 1-DIESEL, 2-ELECTRIC): ";
                fuelType = getUserInput(0, 2);

                switch (fuelType) {
                    case 0:
                        newVehicle = new GasCar(make, model, year, odometer);
                        break;
                    case 1:
                        newVehicle = new DieselCar(make, model, year, odometer);
                        break;
                    case 2:
                        newVehicle = new ElectricCar(make, model, year, odometer);
                        break;
                    default:
                        std::cout << "Invalid fuel type." << std::endl;
                        continue;
                }
                tracker.addVehicle(newVehicle);
                break;
            case 3:
                std::cout << "Updating a vehicle:\n";
                std::cout << "Enter the index of the vehicle to update: ";
                int updateIndex;
                std::cin >> updateIndex;
                tracker.updateVehicle(updateIndex);
                break;
            case 4:
                std::cout << "Removing a vehicle:\n";
                std::cout << "Enter the index of the vehicle to remove: ";
                int removeIndex;
                std::cin >> removeIndex;
                tracker.removeVehicle(removeIndex);
                break;
            default:
                std::cout << "Invalid choice. Please try again.\n";
                break;
        }
    } while (choice != 0);

    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.