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