Challenge

Project 3

#include <iostream>

#include <vector>

#include <string>

#include <limits>

enum Type {

GAS,

DIESEL,

ELECTRIC

};

// Base class representing a generic vehicle

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

virtual ~Vehicle() {}

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

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

int getYear() const { return year; }

int getOdometer() const { return odometer; }

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

virtual Type getType() = 0; // Pure virtual function to get the fuel type

virtual void displayInfo() const {

std::cout << "Make: " << make << ", Model: " << model << ", Year: " << year << ", Odometer: " << odometer << " km\n";

}

void checkTireRotation() const {

if (odometer % 50000 == 0) {

std::cout << "Tire rotation needed.\n";

} else {

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

}

}

};

// Abstract class for fuel vehicles

class FuelVehicle : public Vehicle {

public:

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

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

virtual std::string getFuelType() const = 0; // Pure virtual function

void checkOil() const {

std::cout << "Checking oil level...\n";

if (odometer % 10000 == 0) {

std::cout << "Oil change required.\n";

} else {

std::cout << "Oil level is sufficient.\n";

}

}

};

// Gas car class derived from FuelVehicle

class GasCar : public FuelVehicle {

public:

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

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

Type getType() override { return GAS; }

std::string getFuelType() const override { return "Gas"; }

};

// Diesel car class derived from FuelVehicle

class DieselCar : public FuelVehicle {

public:

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

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

Type getType() override { return DIESEL; }

std::string getFuelType() const override { return "Diesel"; }

};

// Electric car class derived from Vehicle

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

void checkChargerPower() const {

if (odometer % 400 == 0) {

std::cout << "Recharge battery needed.\n";

} else {

std::cout << "Battery power is sufficient.\n";

}

}

};

// Inventory class to manage the vehicle list

class Inventory {

private:

std::vector<Vehicle*> vehicles;

public:

~Inventory() {

for (Vehicle* vehicle : vehicles) {

delete vehicle; // Clean up allocated memory

}

}

void addVehicle(Vehicle* vehicle) {

vehicles.push_back(vehicle);

std::cout << "Vehicle added successfully!\n";

}

void listVehicles() const {

if (vehicles.empty()) {

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

return;

}

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

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

vehicles[i]->displayInfo();

}

}

void updateVehicle(int index, int newOdometer) {

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

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

return;

}

vehicles[index]->setOdometer(newOdometer);

std::cout << "Vehicle odometer updated successfully!\n";

}

void removeVehicle(int index) {

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

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

return;

}

delete vehicles[index];

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

std::cout << "Vehicle removed successfully!\n";

}

Vehicle* getVehicle(int index) const {

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

return nullptr;

}

return vehicles[index];

}

int getInventorySize() const {

return vehicles.size();

}

};

// Helper functions for user input

std::string getNewMake() {

std::string make;

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

std::cin >> make;

return make;

}

std::string getNewModel() {

std::string model;

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

std::cin >> model;

return model;

}

int getYear() {

int year;

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

std::cin >> year;

return year;

}

int getNewOdometer() {

int odometer;

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

std::cin >> odometer;

return odometer;

}

Type getNewType() {

int type;

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

std::cin >> type;

return static_cast<Type>(type);

}

int selectCar(int max) {

int index;

std::cout << "Select vehicle by number: ";

std::cin >> index;

return index - 1; // Adjust to zero-based index

}

// Main function to interact with the user

int main() {

Inventory inventory;

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;

switch (choice) {

case 1:

inventory.listVehicles();

break;

case 2: {

std::string make = getNewMake();

std::string model = getNewModel();

int year = getYear();

int odometer = getNewOdometer();

Type type = getNewType();

Vehicle* newVehicle;

if (type == GAS) {

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

} else if (type == DIESEL) {

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

} else {

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

}

inventory.addVehicle(newVehicle);

break;

}

case 3: {

inventory.listVehicles();

int index = selectCar(inventory.getInventorySize());

int newOdometer = getNewOdometer();

inventory.updateVehicle(index, newOdometer);

break;

}

case 4: {

inventory.listVehicles();

int index = selectCar(inventory.getInventorySize());

inventory.removeVehicle(index);

break;

}

case 5: {

inventory.listVehicles();

int index = selectCar(inventory.getInventorySize());

Vehicle* vehicle = inventory.getVehicle(index);

if (vehicle) {

vehicle->checkTireRotation();

}

break;

}

case 6: {

inventory.listVehicles();

int index = selectCar(inventory.getInventorySize());

FuelVehicle* fuelVehicle = dynamic_cast<FuelVehicle*>(inventory.getVehicle(index));

if (fuelVehicle) {

fuelVehicle->checkOil();

} else {

std::cout << "Oil check is not applicable for electric cars.\n";

}

break;

}

case 7: {

inventory.listVehicles();

int index = selectCar(inventory.getInventorySize());

ElectricCar* electricCar = dynamic_cast<ElectricCar*>(inventory.getVehicle(index));

if (electricCar) {

electricCar->checkChargerPower();

} else {

std::cout << "Recharge check is not applicable for fuel vehicles.\n";

}

break;

}

case 0:

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

break;

default:

std::cout << "Invalid choice, please try again.\n";

break;

}

} while (choice != 0);

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.