Challenge

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:

Your portfolio, next

Ship work like this
in your own course.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.