Challenge

Project 3

#include <iostream>

#include <string>

#include <vector>

// Enum for fuel types

enum Type {

GAS,

DIESEL,

ELECTRIC

};

// Base class Vehicle

class Vehicle {

protected:

std::string make;

std::string model;

int year;

int odometer;

public:

Vehicle(std::string m, std::string mod, int y, int odo)

: make(m), model(mod), year(y), odometer(odo) {}

// Getter and Setter methods

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

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

int getYear() { return year; }

int getOdometer() { return odometer; }

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

virtual Type getType() = 0; // Pure virtual method for fuel type

virtual void checkTireRotation() = 0;

virtual void getCarInformation() = 0;

};

// Abstract class FuelVehicle, inherited from Vehicle

class FuelVehicle : public Vehicle {

public:

FuelVehicle(std::string m, std::string mod, int y, int odo)

: Vehicle(m, mod, y, odo) {}

virtual void checkOil() = 0; // Pure virtual method to check oil

virtual std::string getFuelType() = 0;

};

// GasCar class

class GasCar : public FuelVehicle {

public:

GasCar(std::string m, std::string mod, int y, int odo)

: FuelVehicle(m, mod, y, odo) {}

Type getType() override {

return GAS;

}

void checkOil() override {

std::cout << "Checking oil for Gas Car.\n";

}

std::string getFuelType() override {

return "Gasoline";

}

void checkTireRotation() override {

if (odometer >= 50000) {

std::cout << "Time to rotate tires for Gas Car.\n";

} else {

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

}

}

void getCarInformation() override {

std::cout << "Make: " << make << ", Model: " << model << ", Year: " << year

<< ", Odometer: " << odometer << " km\n";

}

};

// DieselCar class

class DieselCar : public FuelVehicle {

public:

DieselCar(std::string m, std::string mod, int y, int odo)

: FuelVehicle(m, mod, y, odo) {}

Type getType() override {

return DIESEL;

}

void checkOil() override {

std::cout << "Checking oil for Diesel Car.\n";

}

std::string getFuelType() override {

return "Diesel";

}

void checkTireRotation() override {

if (odometer >= 50000) {

std::cout << "Time to rotate tires for Diesel Car.\n";

} else {

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

}

}

void getCarInformation() override {

std::cout << "Make: " << make << ", Model: " << model << ", Year: " << year

<< ", Odometer: " << odometer << " km\n";

}

};

// ElectricCar class

class ElectricCar : public Vehicle {

public:

ElectricCar(std::string m, std::string mod, int y, int odo)

: Vehicle(m, mod, y, odo) {}

Type getType() override {

return ELECTRIC;

}

void checkTireRotation() override {

if (odometer >= 50000) {

std::cout << "Time to rotate tires for Electric Car.\n";

} else {

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

}

}

void checkChargerPower() {

if (odometer >= 400) {

std::cout << "Time to recharge the Electric Car.\n";

} else {

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

}

}

void getCarInformation() override {

std::cout << "Make: " << make << ", Model: " << model << ", Year: " << year

<< ", Odometer: " << odometer << " km\n";

}

};

#include <iostream>

#include <vector>

// Function declarations

void addVehicle(std::vector<Vehicle*>& inventory);

void listVehicles(const std::vector<Vehicle*>& inventory);

void updateVehicle(std::vector<Vehicle*>& inventory);

void removeVehicle(std::vector<Vehicle*>& inventory);

void checkTireRotation(const std::vector<Vehicle*>& inventory);

void checkOilChange(const std::vector<Vehicle*>& inventory);

void checkRecharge(const std::vector<Vehicle*>& inventory);

int getValidIntegerInput(const std::string& prompt, int min, int max);

// Main function

int main() {

std::vector<Vehicle*> inventory;

int choice;

while (true) {

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

std::cout << "Enter choice: ";

std::cin >> choice;

switch (choice) {

case 0:

// Quit

for (auto& vehicle : inventory) {

delete vehicle; // Free memory

}

return 0;

case 1:

// List inventory

listVehicles(inventory);

break;

case 2:

// Add a new vehicle

addVehicle(inventory);

break;

case 3:

// Update a vehicle

updateVehicle(inventory);

break;

case 4:

// Remove a vehicle

removeVehicle(inventory);

break;

case 5:

// Check tire rotation

checkTireRotation(inventory);

break;

case 6:

// Check oil change

checkOilChange(inventory);

break;

case 7:

// Check recharge

checkRecharge(inventory);

break;

default:

std::cout << "Invalid option. Please try again.\n";

}

}

return 0;

}

// Function to add a new vehicle to the inventory

void addVehicle(std::vector<Vehicle*>& inventory) {

std::string make, model;

int year, odometer, type;

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

std::cin >> make;

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

std::cin >> model;

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

std::cin >> year;

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

std::cin >> odometer;

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

std::cin >> type;

Vehicle* newVehicle = nullptr;

if (type == 0) {

newVehicle = new GasCar(make, model, year, odometer);

} else if (type == 1) {

newVehicle = new DieselCar(make, model, year, odometer);

} else if (type == 2) {

newVehicle = new ElectricCar(make, model, year, odometer);

} else {

std::cout << "Invalid type!\n";

return;

}

inventory.push_back(newVehicle);

}

// Function to list all vehicles in the inventory

void listVehicles(const std::vector<Vehicle*>& inventory) {

if (inventory.empty()) {

std::cout << "No vehicles in the inventory.\n";

return;

}

for (size_t i = 0; i < inventory.size(); ++i) {

std::cout << i + 1 << ". ";

inventory[i]->getCarInformation();

}

}

// Function to update a vehicle's odometer

void updateVehicle(std::vector<Vehicle*>& inventory) {

int index = getValidIntegerInput("Enter vehicle index to update: ", 1, inventory.size()) - 1;

int newOdometer;

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

std::cin >> newOdometer;

inventory[index]->setOdometer(newOdometer);

}

// Function to remove a vehicle from the inventory

void removeVehicle(std::vector<Vehicle*>& inventory) {

int index = getValidIntegerInput("Enter vehicle index to remove: ", 1, inventory.size()) - 1;

delete inventory[index];

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

}

// Function to check tire rotation for all vehicles

void checkTireRotation(const std::vector<Vehicle*>& inventory) {

int index = getValidIntegerInput("Enter vehicle index to check tire rotation: ", 1, inventory.size()) - 1;

inventory[index]->checkTireRotation();

}

// Function to check oil change for fuel vehicles

void checkOilChange(const std::vector<Vehicle*>& inventory) {

int index = getValidIntegerInput("Enter vehicle index to check oil change: ", 1, inventory.size()) - 1;

FuelVehicle* fuelVehicle = dynamic_cast<FuelVehicle*>(inventory[index]);

if (fuelVehicle) {

fuelVehicle->checkOil();

} else {

std::cout << "Oil check not applicable for non-fuel vehicles.\n";

}

}

// Function to check recharge for electric vehicles

void checkRecharge(const std::vector<Vehicle*>& inventory) {

int index = getValidIntegerInput("Enter vehicle index to check recharge: ", 1, inventory.size()) - 1;

ElectricCar* electricCar = dynamic_cast<ElectricCar*>(inventory[index]);

if (electricCar) {

electricCar->checkCharger

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.