Challenge

Project 3

#include <iostream>
#include <vector>

enum class FuelType {
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 FuelType getFuelType() const = 0;

virtual void performMaintenance() 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) {}

FuelType getFuelType() const override { return FuelType::GAS; }

void performMaintenance() const override {
std::cout << "Performing maintenance tasks for GasCar..." << std::endl;
// Perform gas car specific maintenance tasks here
}
};

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

FuelType getFuelType() const override { return FuelType::DIESEL; }

void performMaintenance() const override {
std::cout << "Performing maintenance tasks for DieselCar..." << std::endl;
// Perform diesel car specific maintenance tasks here
}
};

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

FuelType getFuelType() const override { return FuelType::ELECTRIC; }

void performMaintenance() const override {
std::cout << "Performing maintenance tasks for ElectricCar..." << std::endl;
// Perform electric car specific maintenance tasks here
}
};

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

public:
~MaintenanceTracker() {
for (auto vehicle : vehicles) {
delete vehicle;
}
}

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

void listVehicles() const {
if (vehicles.empty()) {
std::cout << "No vehicles in the inventory." << std::endl;
return;
}

std::cout << "Vehicle Inventory:" << std::endl;
for (const auto& vehicle : vehicles) {
std::cout << "Make: " << vehicle->getMake() << ", Model: " << vehicle->getModel()
<< ", Year: " << vehicle->getYear() << ", Odometer: " << vehicle->getOdometer()
<< std::endl;
}
}

void updateVehicle(int index, int newOdometer) {
if (index < 0 || index >= vehicles.size()) {
std::cout << "Invalid vehicle index." << std::endl;
return;
}

Vehicle* vehicle = vehicles[index];
// vehicle->odometer = newOdometer;
}

void removeVehicle(int index) {
if (index < 0 || index >= vehicles.size()) {
std::cout << "Invalid vehicle index." << std::endl;
return;
}

delete vehicles[index];
vehicles.erase(vehicles.begin() + index);
}

void performTireRotation(int index) {
if (index < 0 || index >= vehicles.size()) {
std::cout << "Invalid vehicle index." << std::endl;
return;
}

ElectricCar* electricCar = dynamic_cast<ElectricCar*>(vehicles[index]);
if (electricCar) {
// Perform tire rotation based on electric car's specific criteria
std::cout << "Performing tire rotation for ElectricCar..." << std::endl;
} else {
// Perform tire rotation for non-electric cars
std::cout << "Performing tire rotation..." << std::endl;
}
}

void performOilChange(int index) {
if (index < 0 || index >= vehicles.size()) {
std::cout << "Invalid vehicle index." << std::endl;
return;
}

Vehicle* vehicle = vehicles[index];
vehicle->performMaintenance();
}

void performRecharge(int index) {
if (index < 0 || index >= vehicles.size()) {
std::cout << "Invalid vehicle index." << std::endl;
return;
}

ElectricCar* electricCar = dynamic_cast<ElectricCar*>(vehicles[index]);
if (electricCar) {
// Perform recharge based on electric car's specific criteria
std::cout << "Performing recharge for ElectricCar..." << std::endl;
} else {
// Perform recharge for non-electric cars
std::cout << "Performing recharge..." << std::endl;
}
}
};

int main() {
MaintenanceTracker tracker;

while (true) {
std::cout << "Menu:" << std::endl;
std::cout << " 0. Quit." << std::endl;
std::cout << " 1. List inventory." << std::endl;
std::cout << " 2. Add vehicle." << std::endl;
std::cout << " 3. Update vehicle." << std::endl;
std::cout << " 4. Remove vehicle." << std::endl;
std::cout << " 5. Perform tire rotation." << std::endl;
std::cout << " 6. Perform oil change." << std::endl;
std::cout << " 7. Perform recharge." << std::endl;

int choice;
std::cin >> choice;

if (choice == 0) {
break;
} else if (choice == 1) {
tracker.listVehicles();
} else if (choice == 2) {
std::string make, model;
int year, odometer;
int fuelType;

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 fuel type (0 for GAS, 1 for DIESEL, 2 for ELECTRIC): ";
std::cin >> fuelType;

Vehicle* vehicle = nullptr;
if (fuelType == 0) {
vehicle = new GasCar(make, model, year, odometer);
} else if (fuelType == 1) {
vehicle = new DieselCar(make, model, year, odometer);
} else if (fuelType == 2) {
vehicle = new ElectricCar(make, model, year, odometer);
} else {
std::cout << "Invalid fuel type." << std::endl;
continue;
}

tracker.addVehicle(vehicle);
} else if (choice == 3) {
int index, newOdometer;

std::cout << "Enter vehicle index: ";
std::cin >> index;
std::cout << "Enter new odometer reading: ";
std::cin >> newOdometer;

tracker.updateVehicle(index, newOdometer);
} else if (choice == 4) {
int index;

std::cout << "Enter vehicle index: ";
std::cin >> index;

tracker.removeVehicle(index);
} else if (choice == 5) {
int index;

std::cout << "Enter vehicle index: ";
std::cin >> index;

tracker.performTireRotation(index);
} else if (choice == 6) {
int index;

std::cout << "Enter vehicle index: ";
std::cin >> index;

tracker.performOilChange(index);
} else if (choice == 7) {
int index;

std::cout << "Enter vehicle index: ";
std::cin >> index;

tracker.performRecharge(index);
} else {
std::cout << "Invalid choice. Please try again." << std::endl;
}
}

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.