====== Podsumowanie: Projekt magazyn ======
* dziedziczenie
* polimorfizm, funkcje wirtualne
* wyjątki
* szablony, kontenery STL i algorytmy STL
===== Projekt: Magazyn =====
Zaprojektuj i zaimplementuj podstawy programu zarządzającego magazynem przechowującym różnego typu substancje w pojemnikach. Kształt pojemnika, gęstość substancji oraz stopnień wypełnienia pojemnika decydują o masie substancji w pojemniku. Na początku system obsługuje dwa rodzaje pojemników określonych następującym zestawem cech:
* **beczka** - pojemnik w kształcie walca określony parametrami: rodzaj substancji, ilość substancji w beczce, wymiary beczki (średnica beczki i wysokość)
* **skrzynia** - pojemnik prostopadłościenny określony parametrami: rodzaj substancji, ilość substancji w skrzyni, wymiary skrzyni (głębokość, szerokość, wysokość)
Wszystkie wymiary wyrażone są w metrach, ilość substancji i objętość w metrach sześciennych.
Każda substancja posiada nazwę (np. "Woda") i określona jest gęstością (np. 1000 kg/$\text{m}^3$).
Stwórz klasy reprezentujące pojemniki oraz klasę reprezentującą substancję. Zadbaj o hermetyzację danych (pola klas nie powinny być publiczne).
Każdy pojemnik udostępnia operacje:
* konstruktor pozwalający zainicjować wszystkie pola składowe, tj rodzaj substancji, ilość substancji oraz wymiary pojemników
* konstruktor domniemany, gdzie domyślną substancją jest woda o gęstości 1000 kg/$\text{m}^3$, stopień wypełnienia wynosi 0 $\text{m}^3$ zaś wszystkie wymiary wynoszą 1 metr
* funkcję składową ''Wypelnij'', która przyjmuje w argumencie ilość substancji dodanej do pojemnika. Ilość wyrażona jest w metrach sześciennych. Dodanie substancji powoduje odpowiedni wzrost wypełnienia pojemnika. W przypadku przekroczenia pojemności pojemnika funkcja rzuca wyjątek typu ''PrzepelnionyPojemnik''.
* funkcję składową ''Pojemnosc'', która zwraca całkowitą objętość pojemnika, odpowiednio:
* pojemnosc beczki: $\pi \cdot r^2 \cdot h $, gdzie $r$ to promień (połowa średnicy), $h$ wysokość
* pojemnosc skrzyni: $s \cdot g \cdot h $, gdzie $s$ to szerokość, $g$ - głębokość, $h$ - wysokość
* funkcję składową ''Masa'' zwracającą masę substancji w pojemniku, równą iloczynowi: objętość substancji $\times$ gęstość
* przeciążony operator ''<<'' umieszczający w strumieniu wyjściowym ''std::ostream'' komunikat zawierający informacje o nazwie substancji i jej gęstości, stopniu wypełnienia pojemnika w procentach oraz masę substancji, np. w postaci: aluminium (2720 kg/m^3), 33%, 897.6 kg
Zaimplementuj klasę ''Magazyn'', która reprezentuje pomieszczenie, w którym składowane są pojemniki. Zakładamy, że magazyn może pomieścić dowolną liczbę pojemników.
Klasa ''Magazyn'' udostępnia następujące operacje:
* konstruktor pozwalający zainicjować pusty magazyn
* funkcję składową ''Dodaj'', której argumentem jest pojemnik. Operacja powoduje umieszczenie pojemnika w magazynie, dostawiany jest na końcu sekwencji pojemników.
* funkcję składową zwracającą liczbę pojemników aktualnie znajdujących się w magazynie
* funkcję składową zwracającą całkowitą masę wszystkich pojemników
* funkcję składową ''Sortuj'', która posortuje kolejność pojemników w magazynie względem masy, od największej do najmniejszej
* przeciążony operator ''[]'', który udostępnia $i$-ty pojemnik w magazynie, w taki sposób aby możliwe było wykonanie na tym pojemniku operacji zwiększenia liczby substancji, np. ''magazyn[i].Wypelnij(2.0)''
* przeciążony operator ''<<'' umieszczający w strumieniu wyjściowym ''std:ostream'' komunikat zawierający informację o liczbie pojemników, sumarycznej masie wszystkich zgromadzonych pojemników oraz ponumerowaną listę wszystkich pojemników, np. w postaci
Liczba pojemnikow: 4
Sumaryczna masa substancji: 2422.93
Lista pojemnikow:
1: aluminium (2720 kg/m^3), 33%, 897.6 kg
2: drewno (700 kg/m^3), 90%, 630 kg
3: alkohol (790 kg/m^3), 100%, 620.446 kg
4: benzyna (700 kg/m^3), 50%, 274.881 kg
Napisz program testujący działanie systemu, który utworzy obiekt reprezentujący magazyn. Dodaj do magazynu co najmniej 2 pojemniki każdego rodzaju, wypełnionych w różnym stopniu przykładowymi substancjami. Wypisz zawartość magazynu w konsoli i poproś użytkownika o wskazanie numeru pojemnika i podanie ilości substancji do dodania. Następnie program zwiększa objętość substancji we wskazanym pojemniku. W przypadku niepowodzenia, gdy pojemność pojemnika nie pozwala na dodanie takiej ilości substancji (złap stosowany wyjątek), wypełnij pojemnik w 100% i wypisz komunikat informujący o tym ile substancji nie zmieściło się w pojemniku. Następnie program konczy swoje działanie zapisując do pliku tekstowego ''wynik.txt'' zawartość magazynu w postaci listy pojemników w kolejności od najcięższego do najlżejszego.
Liczba pojemnikow: 4
Sumaryczna masa substancji: 2272.6 kg
Lista pojemnikow:
1: aluminium (2720 kg/m^3), 0.33 m^3, 33 %, 897.6 kg
2: drewno (700 kg/m^3), 0.9 m^3, 90 %, 630 kg
3: alkohol (790 kg/m^3), 0.5 m^3, 63.6639 %, 395 kg
4: benzyna (700 kg/m^3), 0.5 m^3, 63.6639 %, 350 kg
Podaj numer pojemnika: 4
Aktualna zawartosc pojemnika nr 4 : benzyna (700 kg/m^3), 0.5 m^3, 63.6639 %, 350 kg
Ile substancji dodać? 2.0
W pojemniku zmiesci sie tylko 0.285375 m^3 substancji. Zabraklo 1.71462 m^3.
Liczba pojemnikow: 4
Sumaryczna masa substancji: 2472.36 kg
Lista pojemnikow:
1: aluminium (2720 kg/m^3), 0.33 m^3, 33 %, 897.6 kg
2: drewno (700 kg/m^3), 0.9 m^3, 90 %, 630 kg
3: benzyna (700 kg/m^3), 0.785375 m^3, 100 %, 549.763 kg
4: alkohol (790 kg/m^3), 0.5 m^3, 63.6639 %, 395 kg
Wskazówka: aby uzyskać polimorfizm pojemników magazyn musi przechowywać wskaźniki do klasy bazowej pojemników.