Project 3
Note : For better understanding word file is attached below. Thanks
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.
Every vehicle should have the following details:
- Make
- Model
- Year
- Odometer reading
The library interfaces or the API’s (Application Program Interface) should be capable of adding, updating, listing and removing the entries at runtime.
Consider there are three classes such as
- Vehicle
- This class includes protected members such as Make, Model, Year and Odometer. These members are initialized using the class constructor.
- The functions include getter and setter functions of Make(), Model(), Year() and Odometer().
- Maintenance activities that should be done are checkTireRotation(), getCarInformation()
- Let the three fuel types be -
enum Type{
GAS,
DIESEL,
ELECTRIC
};
- Let there be a pure virtual method to get the fuel type i.e.,
- virtual Type getType() = 0;
- GasCar
- This is inherited from the vehicle class and has functions getType() and getFuelType()
- Diesel Car
- This class is also a subclass of vehicle and the functions include getFuelType() and getType()
- ElectricCar
- This is a subclass of Vehicle class and methods include.
- checkTireRotation()- based on odometer reading, we decide whether the car needs to rotate tires or not.
- checkChargerPower- based on odometer reading this advices to recharge power.
- This is a subclass of Vehicle class and methods include.
- getType() – to get the fuel type
- FuelVehicle
a.This is an abstract class that inherits vehicle class. The methods in this class include checkOil() and pure virtual function getFuelType()
Maintenance activities that has to be done are as follows :
- Check tire rotation: Let the tire cycle be 50,000 km. Calculate the distance the car has run and if this distance run is at 50k km, then advise rotation, else tires are good to go. Also, calculate the remainder of each 50k km, If remainder >=0 then advice to rotate tires.
- Check Power: Let the distance be 400km, If the distance the car has run is at 400km, then advise battery to be recharged else your vehicle is good to go.
Now that we have learnt about the classes to be created, we need to write our driver code i.e., main.cpp
- In the main class, initialize the inventory and ask the user to select whether to add, update, list or delete the Vehicle list.
- addVehicle() – to add new vehicle to inventory
- ListVehicle()- to list the vehicles in the inventory
- UpdateVehicle()- to update the vehicle in the inventory list
- RemoveVehicle()- to remove the vehicle from the inventory list
- Tire Rotation() – Check if tires need rotation
- OilChange()- check if car requires oil change
- Recharge() – check if vehicle needs recharge
- Check for the user input, 0-1-2-3-4-5-6-7, Functions will be called based on the input provided by the user. If the input is wrong, ask again.
- Menu should be as below,
|
<< " 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" |
|
- Retrieve the user input on the vehicle’s make, model, year, type and odometer.
- getNewMake() – If input is blank, request again
- getNewModel() – If input is blank, request again
- getYear() – If input doesn’t have 4 digits, request again
- getNewOdometer()- Input should be only numerical
- getNewType() – Input should be within 0-2, else request again
- Retrieve the selected car from the user input.
- selectCar() – Input should be within the size of vehicle list, else request again
- getNewOdometerReading() – New odometer reading is used to calculate the oil change, tire rotation, power recharge etc.
Program :
#include <iostream>
#include <vector>
#include <string>
enum class Type {
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 Type getType() const = 0;
virtual void checkTireRotation() const = 0;
virtual void getCarInformation() const = 0;
virtual ~Vehicle() {}
};
class GasCar : public Vehicle {
public:
GasCar(const std::string& make, const std::string& model, int year, int odometer)
: Vehicle(make, model, year, odometer) {}
Type getType() const override {
return Type::GAS;
}
void checkTireRotation() const override {
int tireCycle = 50000;
int distance = getOdometer() % tireCycle;
if (distance >= 0) {
std::cout << "Tire rotation is advised." << std::endl;
} else {
std::cout << "Tires are good to go." << std::endl;
}
}
void getCarInformation() const override {
std::cout << "Gas Car Information" << std::endl;
std::cout << "Make: " << getMake() << std::endl;
std::cout << "Model: " << getModel() << std::endl;
std::cout << "Year: " << getYear() << std::endl;
std::cout << "Odometer: " << getOdometer() << std::endl;
}
};
class DieselCar : public Vehicle {
public:
DieselCar(const std::string& make, const std::string& model, int year, int odometer)
: Vehicle(make, model, year, odometer) {}
Type getType() const override {
return Type::DIESEL;
}
void checkTireRotation() const override {
int tireCycle = 50000;
int distance = getOdometer() % tireCycle;
if (distance >= 0) {
std::cout << "Tire rotation is advised." << std::endl;
} else {
std::cout << "Tires are good to go." << std::endl;
}
}
void getCarInformation() const override {
std::cout << "Diesel Car Information" << std::endl;
std::cout << "Make: " << getMake() << std::endl;
std::cout << "Model: " << getModel() << std::endl;
std::cout << "Year: " << getYear() << std::endl;
std::cout << "Odometer: " << getOdometer() << std::endl;
}
};
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() const override {
return Type::ELECTRIC;
}
void checkTireRotation() const override {
int tireCycle = 50000;
int distance = getOdometer() % tireCycle;
if (distance >= 0) {
std::cout << "Tire rotation is advised." << std::endl;
} else {
std::cout << "Tires are good to go." << std::endl;
}
}
void checkChargerPower() const {
int powerCycle = 400;
int distance = getOdometer() % powerCycle;
if (distance >= 0) {
std::cout << "Battery recharge is advised." << std::endl;
} else {
std::cout << "Vehicle is good to go." << std::endl;
}
}
void getCarInformation() const override {
std::cout << "Electric Car Information" << std::endl;
std::cout << "Make: " << getMake() << std::endl;
std::cout << "Model: " << getModel() << std::endl;
std::cout << "Year: " << getYear() << std::endl;
std::cout << "Odometer: " << getOdometer() << std::endl;
}
};
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 {
for (const auto& vehicle : vehicles) {
vehicle->getCarInformation();
std::cout << std::endl;
}
}
void updateVehicle(int index, int newOdometer) {
if (index >= 0 && index < vehicles.size()) {
Vehicle* vehicle = vehicles[index];
vehicle->getCarInformation();
vehicle->checkTireRotation();
if (vehicle->getType() == Type::ELECTRIC) {
ElectricCar* electricCar = dynamic_cast<ElectricCar*>(vehicle);
if (electricCar) {
electricCar->checkChargerPower();
}
}
vehicle->getCarInformation();
vehicle->checkTireRotation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
vehicle->getCarInformation();
} else {
std::cout << "Invalid vehicle index." << std::endl;
}
}
void removeVehicle(int index) {
if (index >= 0 && index < vehicles.size()) {
delete vehicles[index];
vehicles.erase(vehicles.begin() + index);
std::cout << "Vehicle removed." << std::endl;
} else {
std::cout << "Invalid vehicle index." << 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. Tire Rotation" << std::endl;
std::cout << " 6. Oil Change" << std::endl;
std::cout << " 7. Recharge" << std::endl;
int choice;
std::cout << "Enter your 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 typeChoice;
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 << "Select fuel type:" << std::endl;
std::cout << " 0. Gas" << std::endl;
std::cout << " 1. Diesel" << std::endl;
std::cout << " 2. Electric" << std::endl;
std::cout << "Enter your choice: ";
std::cin >> typeChoice;
Vehicle* vehicle = nullptr;
if (typeChoice == 0) {
vehicle = new GasCar(make, model, year, odometer);
} else if (typeChoice == 1) {
vehicle = new DieselCar(make, model, year, odometer);
} else if (typeChoice == 2) {
vehicle = new ElectricCar(make, model, year, odometer);
} else {
std::cout << "Invalid fuel type." << std::endl;
}
if (vehicle) {
tracker.addVehicle(vehicle);
std::cout << "Vehicle added." << std::endl;
}
} 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 {
std::cout << "Invalid choice." << std::endl;
}
}
return 0;
}
Output :
Menu:
- Quit
- List inventory
- Add vehicle
- Update vehicle
- Remove vehicle
- Tire Rotation
- Oil Change
- Recharge
Enter your choice: 2
Enter make: Suzuki
Enter model: Brezza
Enter year: 2017
Enter odometer reading: 23000
Select fuel type:
- Gas
- Diesel
- Electric
Enter your choice: 1
Vehicle added.
Menu:
- Quit
- List inventory
- Add vehicle
- Update vehicle
- Remove vehicle
- Tire Rotation
- Oil Change
- Recharge
Enter your choice: 2
Enter make: Honda
Enter model: City
Enter year: 2018
Enter odometer reading: 32000
Select fuel type:
- Gas
- Diesel
- Electric
Enter your choice: 0
Vehicle added.
Menu:
- Quit
- List inventory
- Add vehicle
- Update vehicle
- Remove vehicle
- Tire Rotation
- Oil Change
- Recharge
Enter your choice: 2
Enter make: MG
Enter model: Hector
Enter year: 2021
Enter odometer reading: 5000
Select fuel type:
- Gas
- Diesel
- Electric
Enter your choice: 2
Vehicle added.
Menu:
- Quit
- List inventory
- Add vehicle
- Update vehicle
- Remove vehicle
- Tire Rotation
- Oil Change
- Recharge
Enter your choice: 1
Diesel Car Information
Make: Suzuki
Model: Brezza
Year: 2017
Odometer: 23000
Gas Car Information
Make: Honda
Model: City
Year: 2018
Odometer: 32000
Electric Car Information
Make: MG
Model: Hector
Year: 2021
Odometer: 5000
Menu:
- Quit
- List inventory
- Add vehicle
- Update vehicle
- Remove vehicle
- Tire Rotation
- Oil Change
- Recharge
Enter your choice: 2
Enter make: Kia
Enter model: Seltos
Enter year: 2017
Enter odometer reading: 55000
Select fuel type:
- Gas
- Diesel
- Electric
Enter your choice: 1
Vehicle added.
Menu:
- Quit
- List inventory
- Add vehicle
- Update vehicle
- Remove vehicle
- Tire Rotation
- Oil Change
- Recharge
Enter your choice: 3
Enter vehicle index: Kia
Enter new odometer reading: Diesel Car Information
Make: Kia
Model: Seltos
Year: 2017
Odometer: 55000
Tire rotation is advised.