Project 3
CHALLENGE 21 : PROJECT 3
//Build an object-oriented library which can be used to track automobile maintenance. There can be different car types such as petrol, diesel, gas, electric etc., This library should be able to support at least three of the car types.
Maintenance tasks include activities like oil change or replace oil filter, replace air filter, replace fuel filter, tire rotations, infotainment system debug, replace spark plugs, replace the cabin or a/c filter, check the level and refill clutch fluid or brake fluid, examine belts, wipers, hoses, check the tire conditions, check the charging systems and battery. //
PROGRAM
#include <iostream>
#include <string>
#include <vector>
using namespace std;
enum class FuelType
{
GAS,
DIESEL,
ELECTRIC
};
class Vehicle
{
protected:
string make;
string model;
int year;
double odometer;
public:
Vehicle(string make, string model, int year, double odometer)
: make(make), model(model), year(year), odometer(odometer) {}
// Getters and setters
string getMake() const
{
return make;
}
void setMake(const string& make)
{
this->make = make;
}
string getModel() const
{
return model;
}
void setModel(const string& model)
{
this->model = model;
}
int getYear() const
{
return year;
}
void setYear(int year)
{
this->year = year;
}
double getOdometer() const
{
return odometer;
}
void setOdometer(double odometer)
{
this->odometer = odometer;
}
virtual FuelType getFuelType() const = 0;
void checkTireRotation()
{
int tireCycle = 50000;
int distanceRun = static_cast<int>(odometer);
int remainder = distanceRun % tireCycle;
if (remainder >= 0)
{
cout << "Advice: Rotate tires." << endl;
}
else
{
cout << "Tires are good to go." << endl;
}
}
void getCarInformation()
{
cout << "Make: " << make << endl;
cout << "Model: " << model << endl;
cout << "Year: " << year << endl;
cout << "Odometer Reading: " << odometer << " miles" << endl;
}
};
class GasCar : public Vehicle
{
public:
GasCar(string make, string model, int year, double odometer)
: Vehicle(make, model, year, odometer) {}
FuelType getFuelType() const override
{
return FuelType::GAS;
}
};
class DieselCar : public Vehicle
{
public:
DieselCar(string make, string model, int year, double odometer)
: Vehicle(make, model, year, odometer) {}
FuelType getFuelType() const override
{
return FuelType::DIESEL;
}
};
class ElectricCar : public Vehicle
{
public:
ElectricCar(string make, string model, int year, double odometer)
: Vehicle(make, model, year, odometer) {}
FuelType getFuelType() const override
{
return FuelType::ELECTRIC;
}
void checkChargerPower()
{
int distanceRun = static_cast<int>(odometer);
int rechargeDistance = 400;
if (distanceRun >= rechargeDistance)
{
cout << "\nAdvice: Recharge the battery." << endl;
}
else
{
cout << "\nVehicle is good to go." << endl;
}
}
};
class Inventory
{
private:
vector<Vehicle*> vehicles;
public:
~Inventory()
{
// Clean up the dynamically allocated vehicles
for (Vehicle* vehicle : vehicles)
{
delete vehicle;
}
}
void addVehicle(Vehicle* vehicle)
{
vehicles.push_back(vehicle);
}
void listVehicles()
{
if (vehicles.empty())
{
cout << "\nNo vehicles in the inventory." << endl;
return;
}
cout << "Inventory:" << endl;
for (size_t i = 0; i < vehicles.size(); ++i)
{
cout << "Vehicle " << i + 1 << ":" << endl;
vehicles[i]->getCarInformation();
cout << endl;
}
}
void updateVehicle(int index)
{
if (index < 0 || index >= vehicles.size())
{
cout << "\nInvalid vehicle index." << endl;
return;
}
Vehicle* vehicle = vehicles[index];
string make, model;
int year;
double odometer;
cout << "\nEnter new make: ";
getline(cin, make);
vehicle->setMake(make);
cout << "Enter new model: ";
getline(cin, model);
vehicle->setModel(model);
cout << "Enter new year: ";
cin >> year;
cin.ignore(); // Ignore the newline character
vehicle->setYear(year);
cout << "Enter new odometer reading: ";
cin >> odometer;
cin.ignore(); // Ignore the newline character
vehicle->setOdometer(odometer);
}
void removeVehicle(int index)
{
if (index < 0 || index >= vehicles.size())
{
cout << "Invalid vehicle index." << endl;
return;
}
delete vehicles[index];
vehicles.erase(vehicles.begin() + index);
}
Vehicle* getVehicle(int index)
{
if (index < 0 || index >= vehicles.size())
{
cout << "Invalid vehicle index." << endl;
return nullptr;
}
return vehicles[index];
}
};
int main()
{
Inventory inventory;
int choice;
do {
cout << "Menu:" << endl;
cout << "1. List inventory" << endl;
cout << "2. Add vehicle" << endl;
cout << "3. Update vehicle" << endl;
cout << "4. Remove vehicle" << endl;
cout << "5. Tire Rotation" << endl;
cout << "6. Oil Change" << endl;
cout << "7. Recharge" << endl;
cout << "Enter your choice: ";
cin >> choice;
cin.ignore(); // Ignore the newline character
switch (choice)
{
case 0:
cout << "Quitting..." << endl;
break;
case 1:
inventory.listVehicles();
break;
case 2:
{
string make, model;
int year;
double odometer;
cout << "Enter make: ";
getline(cin, make);
cout << "Enter model: ";
getline(cin, model);
cout << "Enter year: ";
cin >> year;
cin.ignore(); // Ignore the newline character
cout << "Enter odometer reading: ";
cin >> odometer;
cin.ignore(); // Ignore the newline character
int fuelTypeChoice;
cout << "Enter fuel type (0 - Gas, 1 - Diesel, 2 - Electric): ";
cin >> fuelTypeChoice;
cin.ignore(); // Ignore the newline character
Vehicle* vehicle = nullptr;
switch (fuelTypeChoice)
{
case 0:
vehicle = new GasCar(make, model, year, odometer);
break;
case 1:
vehicle = new DieselCar(make, model, year, odometer);
break;
case 2:
vehicle = new ElectricCar(make, model, year, odometer);
break;
default:
cout << "Invalid fuel type." << endl;
continue;
}
inventory.addVehicle(vehicle);
cout << "Vehicle added to the inventory." << endl;
break;
}
case 3:
{
int index;
cout << "Enter the index of the vehicle to update: ";
cin >> index;
cin.ignore(); // Ignore the newline character
inventory.updateVehicle(index);
cout << "Vehicle updated." << endl;
break;
}
case 4:
{
int index;
cout << "Enter the index of the vehicle to remove: ";
cin >> index;
cin.ignore(); // Ignore the newline character
inventory.removeVehicle(index);
cout << "Vehicle removed from the inventory." << endl;
break;
}
case 5:
{
int index;
cout << "Enter the index of the vehicle to check tire rotation: ";
cin >> index;
cin.ignore(); // Ignore the newline character
Vehicle* vehicle = inventory.getVehicle(index);
vehicle->checkTireRotation();
break;
}
case 6:
{
int index;
cout << "Enter the index of the vehicle to check oil change: ";
cin >> index;
cin.ignore(); // Ignore the newline character
Vehicle* vehicle = inventory.getVehicle(index);
// Call the appropriate function for oil change
break;
}
case 7:
{
int index;
cout << "Enter the index of the vehicle to check power recharge: ";
cin >> index;
cin.ignore(); // Ignore the newline character
Vehicle* vehicle = inventory.getVehicle(index);
// Call the appropriate function for power recharge
break;
}
default:
cout << "Invalid choice. Please try again." << endl;
}
cout << endl;
} while (choice != 0);
return 0;
}
OUTPUT:
Menu:
- Quit.
- List inventory.
- Add vehicle.
- Update vehicle.
- Remove vehicle.
- Perform maintenance.
Enter your choice: 2
Enter make: Toyota
Enter model: Camry
Enter year: 2022
Enter odometer reading: 15000
Enter fuel type (0 - GAS, 1 - DIESEL, 2 - ELECTRIC): 0
Vehicle added to inventory.
Menu:
- Quit.
- List inventory.
- Add vehicle.
- Update vehicle.
- Remove vehicle.
- Perform maintenance.
Enter your choice: 2
Enter make: BMW
Enter model: X5
Enter year: 2021
Enter odometer reading: 25000
Enter fuel type (0 - GAS, 1 - DIESEL, 2 - ELECTRIC): 1
Vehicle added to inventory.
Menu:
- Quit.
- List inventory.
- Add vehicle.
- Update vehicle.
- Remove vehicle.
- Perform maintenance.
Enter your choice: 1
Type: Gas car, Make: Toyota, Model: Camry
Type: Diesel car, Make: BMW, Model: X5
Menu:
- Quit.
- List inventory.
- Add vehicle.
- Update vehicle.
- Remove vehicle.
- Perform maintenance.
Enter your choice: 5
Select a vehicle for maintenance:
Type: Gas car, Make: Toyota, Model: Camry
Type: Diesel car, Make: BMW, Model: X5
Select a vehicle (0-1): 0
Performing maintenance for Gas car: Toyota Camry
Menu:
- Quit.
- List inventory.
- Add vehicle.
- Update vehicle.
- Remove vehicle.
- Perform maintenance.
Enter your choice: 4
Select a vehicle to remove:
Type: Gas car, Make: Toyota, Model: Camry
Type: Diesel car, Make: BMW, Model: X5
Select a vehicle (0-1): 1
Removing vehicle: BMW X5
Menu:
- Quit.
- List inventory.
- Add vehicle.
- Update vehicle.
- Remove vehicle.
- Perform maintenance.
Enter your choice: 1
Type: Gas car, Make: Toyota, Model: Camry
Menu:
- Quit.
- List inventory.
- Add vehicle.
- Update vehicle.
- Remove vehicle.
- Perform maintenance.
Enter your choice: 0