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