Created
January 8, 2026 13:05
-
-
Save m1irka/f4e1166e3928e1dcadbe8f4c6a968326 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <iostream> | |
| using namespace std; | |
| class Base { | |
| public: | |
| int people_on_base; | |
| int vehicles_on_base; | |
| double petrol_on_base; | |
| double goods_on_base; | |
| Base(int people, int vehicles, double petrol, double goods) | |
| : people_on_base(people), vehicles_on_base(vehicles), | |
| petrol_on_base(petrol), goods_on_base(goods) { | |
| } | |
| }; | |
| class Vehicle { | |
| protected: | |
| double petrol_amount; | |
| double tank_volume; | |
| public: | |
| Vehicle(double petrol, double volume) | |
| : petrol_amount(petrol), tank_volume(volume) { | |
| } | |
| double getTankVolume() { return tank_volume; } | |
| double getPetrolAmount() { return petrol_amount; } | |
| virtual void arrive(Base& b) { | |
| b.vehicles_on_base += 1; | |
| b.people_on_base += 1; | |
| } | |
| virtual bool leave(Base& b) { | |
| if (b.people_on_base < 1) return false; | |
| double need(tank_volume - petrol_amount); | |
| if (b.petrol_on_base < need) return false; | |
| b.petrol_on_base -= need; | |
| petrol_amount = tank_volume; | |
| b.vehicles_on_base -= 1; | |
| b.people_on_base -= 1; | |
| return true; | |
| } | |
| }; | |
| class Bus : public Vehicle { | |
| int people; | |
| int max_people; | |
| public: | |
| Bus(int ppl, int maxp, double petrol, double volume) | |
| : Vehicle(petrol, volume), people(ppl), max_people(maxp) { | |
| } | |
| int getPeopleCount() { return people; } | |
| int getMaxPeople() { return max_people; } | |
| void arrive(Base& b) override { | |
| Vehicle::arrive(b); | |
| b.people_on_base += people; | |
| people = 0; | |
| } | |
| bool leave(Base& b) override { | |
| if (!Vehicle::leave(b)) return false; | |
| int to_take(b.people_on_base >= max_people ? max_people : b.people_on_base); | |
| b.people_on_base -= to_take; | |
| people = to_take; | |
| return true; | |
| } | |
| }; | |
| class Truck : public Vehicle { | |
| double load; | |
| double max_load; | |
| public: | |
| Truck(double l, double maxl, double petrol, double volume) | |
| : Vehicle(petrol, volume), load(l), max_load(maxl) { | |
| } | |
| double getCurrentLoad() { return load; } | |
| double getMaxLoad() { return max_load; } | |
| void arrive(Base& b) override { | |
| Vehicle::arrive(b); | |
| b.goods_on_base += load; | |
| load = 0; | |
| } | |
| bool leave(Base& b) override { | |
| if (!Vehicle::leave(b)) return false; | |
| double to_take(b.goods_on_base >= max_load ? max_load : b.goods_on_base); | |
| b.goods_on_base -= to_take; | |
| load = to_take; | |
| return true; | |
| } | |
| }; | |
| int main() { | |
| Base base(10, 2, 500.0, 20.0); | |
| Bus b(5, 20, 20, 60); | |
| Truck t(10, 15, 30, 80); | |
| cout << "Initial: People " << base.people_on_base | |
| << " Vehicles " << base.vehicles_on_base | |
| << " Petrol " << base.petrol_on_base | |
| << " Goods " << base.goods_on_base << endl; | |
| b.arrive(base); | |
| t.arrive(base); | |
| cout << "After arrivals: People " << base.people_on_base | |
| << " Vehicles " << base.vehicles_on_base | |
| << " Petrol " << base.petrol_on_base | |
| << " Goods " << base.goods_on_base << endl; | |
| b.leave(base); | |
| t.leave(base); | |
| cout << "After departures: People " << base.people_on_base | |
| << " Vehicles " << base.vehicles_on_base | |
| << " Petrol " << base.petrol_on_base | |
| << " Goods " << base.goods_on_base << endl; | |
| return 0; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment