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