Project 3
Project 3
#include <iostream>
#include <string>
#include <vector>
#include <algorithm> // Include for all_of function
#include <limits> // Include for numeric_limits
using namespace std;
// Enum for fuel types
enum class Type { GAS, DIESEL, ELECTRIC };
// Base Vehicle class
class Vehicle
{
protected:
string make;
string model;
int year;
int odometer;
public:
// Constructor
Vehicle(string mk, string mdl, int yr, int odo) : make(mk), model(mdl), year(yr), odometer(odo)
{}
// Getter and Setter methods
string getMake() const
{
return make;
}
void setMake(string mk)
{
make = mk;
}
string getModel() const
{
return model;
}
void setModel(string mdl)
{
model = mdl;
}
int getYear() const
{
return year;
}
void setYear(int yr)
{
year = yr;
}
int getOdometer() const
{
return odometer;
}
void setOdometer(int odo)
{
odometer = odo;
}
// Maintenance methods
void checkTireRotation() const
{
int cycle = 50000;
int remainder = odometer % cycle;
if (remainder >= 0)
cout << "Advice: Rotate tires\n";
else
cout << "Tires are good to go\n";
}
virtual void checkOil() const = 0; // Pure virtual function
virtual void recharge() const = 0; // Pure virtual function
virtual Type getType() const = 0; // Pure virtual function
};
// GasCar class
class GasCar : public Vehicle
{
public:
GasCar(string mk, string mdl, int yr, int odo) : Vehicle(mk, mdl, yr, odo)
{}
Type getType() const override
{
return Type::GAS;
}
void checkOil() const override
{
cout << "Checking oil for Gas Car\n";
}
void recharge() const override
{
cout << "Recharging gas car battery\n";
}
};
// DieselCar class
class DieselCar : public Vehicle
{
public:
DieselCar(string mk, string mdl, int yr, int odo) : Vehicle(mk, mdl, yr, odo)
{}
Type getType() const override
{
return Type::DIESEL;
}
void checkOil() const override
{
cout << "Checking oil for Diesel Car\n";
}
void recharge() const override
{
cout << "Recharging diesel car battery\n";
}
};
// ElectricCar class
class ElectricCar : public Vehicle
{
public:
ElectricCar(string mk, string mdl, int yr, int odo) : Vehicle(mk, mdl, yr, odo)
{}
Type getType() const override
{
return Type::ELECTRIC;
}
void checkOil() const override
{
cout << "Electric Car does not require oil\n";
}
void recharge() const override
{
cout << "Recharging electric car battery\n";
}
};
// Maintenance class
class Maintenance
{
private:
vector<Vehicle *> inventory;
public:
const vector<Vehicle *> &getInventory() const
{
return inventory;
}
void addVehicle(Vehicle *v)
{
inventory.push_back(v);
}
void listInventory() const
{
cout << "Inventory:\n";
for (const auto &v : inventory)
{
cout << "Make: " << v->getMake() << ", Model: " << v->getModel() << ", Year: " << v->getYear() << ", Odometer: " << v->getOdometer() << endl;
}
}
void updateVehicle(int index)
{
if (index >= 0 && index < inventory.size())
{
Vehicle *v = inventory[index];
cout << "Enter new odometer reading for " << v->getMake() << " " << v->getModel() << ": ";
int newOdo;
cin >> newOdo;
v->setOdometer(newOdo);
cout << "Odometer reading updated\n";
}
else
{
cout << "Invalid index\n";
}
}
void removeVehicle(int index)
{
if (index >= 0 && index < inventory.size())
{
delete inventory[index];
inventory.erase(inventory.begin() + index);
cout << "Vehicle removed from inventory\n";
}
else
{
cout << "Invalid index\n";
}
}
void tireRotation(int index)
{
if (index >= 0 && index < inventory.size())
{
Vehicle *v = inventory[index];
v->checkTireRotation();
}
else
{
cout << "Invalid index\n";
}
}
// Other maintenance methods (not implemented for simplicity)
};
int main()
{
Maintenance maintenance;
while (true)
{
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: ";
int choice;
cin >> choice;
switch (choice)
{
case 0: // Quit
cout << "Exiting program\n";
return 0;
case 1: // List inventory
for (const auto &v : maintenance.getInventory())
{
cout<<"Make:"<<v->getMake()<<",Model:"<<v->getModel() << ", Year: " << v->getYear() << ", Odometer: " << v->getOdometer() << endl;
}
break;
case 2: { // Add vehicle
cout << "Enter make: ";
string make;
cin >> make;
if (make.empty())
{
cout << "Make cannot be blank. Please try again.\n";
continue;
}
cout << "Enter model: ";
string model;
cin >> model;
if (model.empty())
{
cout << "Model cannot be blank. Please try again.\n";
continue;
}
int year;
while (true)
{
cout << "Enter year (4 digits): ";
cin >> year;
if (cin.fail() || year < 1000 || year > 9999)
{
cout << "Invalid year format. Please enter a 4-digit year.\n";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
else
{
break;
}
}
int odometer;
while (true)
{
cout << "Enter odometer reading: ";
cin >> odometer;
if (cin.fail())
{
cout << "Invalid input. Please enter a numerical value.\n";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
else
{
break;
}
}
int fuelType;
while (true)
{
cout << "Enter fuel type (0 for Gas, 1 for Diesel, 2 for Electric): ";
cin >> fuelType;
if (cin.fail() || (fuelType != 0 && fuelType != 1 && fuelType != 2))
{
cout << "Invalid fuel type. Please enter 0, 1, or 2.\n";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
else
{
break;
}
}
Vehicle *v;
if (fuelType == 0)
v = new GasCar(make, model, year, odometer);
else if (fuelType == 1)
v = new DieselCar(make, model, year, odometer);
else if (fuelType == 2)
v = new ElectricCar(make, model, year, odometer);
maintenance.addVehicle(v);
break;
}
case 3: { // Update vehicle
int index;
cout << "Enter index of vehicle to update: ";
cin >> index;
maintenance.updateVehicle(index);
break;
}
case 4: { // Remove vehicle
int index;
cout << "Enter index of vehicle to remove: ";
cin >> index;
maintenance.removeVehicle(index);
break;
}
case 5: { // Tire Rotation
int index;
cout << "Enter index of vehicle to check tire rotation: ";
cin >> index;
maintenance.tireRotation(index);
break;
}
case 6: { // Oil Change
// Check if oil change is needed
for (const auto &v : maintenance.getInventory())
{
if (v->getOdometer() > 10000)
{
cout << "Checking oil for " << v->getMake() << " " << v->getModel() << endl;
v->checkOil();
}
}
break;
}
case 7: { // Recharge
// Check if recharge is needed
for (const auto &v : maintenance.getInventory())
{
if (v->getType() == Type::ELECTRIC)
{
cout << "Recharging " << v->getMake() << " " << v->getModel() << " battery\n";
v->recharge();
}
}
break;
}
default:
cout << "Invalid choice, please try again\n";
}
}
return 0;
}
Output
Menu:
0. Quit
1. List inventory
2. Add vehicle
3. Update vehicle
4. Remove vehicle
5. Tire Rotation
6. Oil Change
7. Recharge
Enter your choice: 2
Enter make: Honda
Enter model: Accord
Enter year (4 digits): 2018
Enter odometer reading: 35000
Enter fuel type (0 for Gas, 1 for Diesel, 2 for Electric): 1
Menu:
0. Quit
1. List inventory
2. Add vehicle
3. Update vehicle
4. Remove vehicle
5. Tire Rotation
6. Oil Change
7. Recharge
Menu:
0. Quit
1. List inventory
2. Add vehicle
3. Update vehicle
4. Remove vehicle
5. Tire Rotation
6. Oil Change
7. Recharge
Enter your choice: 1
Make:Honda,Model:Accord, Year: 2018, Odometer: 35000
Make:toyota,Model:camry, Year: 2023, Odometer: 25000
Make:Tata,Model:Nexon, Year: 2022, Odometer: 45000
Menu:
0. Quit
1. List inventory
2. Add vehicle
3. Update vehicle
4. Remove vehicle
5. Tire Rotation
6. Oil Change
7. Recharge
Enter your choice: 3
Enter index of vehicle to update: 2
Enter new odometer reading for Tata Nexon: 55000
Odometer reading updated
Menu:
0. Quit
1. List inventory
2. Add vehicle
3. Update vehicle
4. Remove vehicle
5. Tire Rotation
6. Oil Change
7. Recharge
Enter your choice: 4
Enter index of vehicle to remove: 0
Vehicle removed from inventory
Menu:
0. Quit
1. List inventory
2. Add vehicle
3. Update vehicle
4. Remove vehicle
5. Tire Rotation
6. Oil Change
7. Recharge
Enter your choice: 1
Make:toyota,Model:camry, Year: 2023, Odometer: 25000
Make:Tata,Model:Nexon, Year: 2022, Odometer: 55000
Make:BMW,Model:X3, Year: 2023, Odometer: 15000
Menu:
0. Quit
1. List inventory
2. Add vehicle
3. Update vehicle
4. Remove vehicle
5. Tire Rotation
6. Oil Change
7. Recharge
Enter your choice: 5
Enter index of vehicle to check tire rotation: 0
Advice: Rotate tires
Menu:
0. Quit
1. List inventory
2. Add vehicle
3. Update vehicle
4. Remove vehicle
5. Tire Rotation
6. Oil Change
7. Recharge
Enter your choice: 6
Checking oil for toyota camry
Checking oil for Diesel Car
Checking oil for Tata Nexon
Electric Car does not require oil
Checking oil for BMW X3
Checking oil for Gas Car
Menu:
0. Quit
1. List inventory
2. Add vehicle
3. Update vehicle
4. Remove vehicle
5. Tire Rotation
6. Oil Change
7. Recharge
Enter your choice: 7
Recharging Tata Nexon battery
Recharging electric car battery
Menu:
0. Quit
1. List inventory
2. Add vehicle
3. Update vehicle
4. Remove vehicle
5. Tire Rotation
6. Oil Change
7. Recharge
Enter your choice: