You are on page 1of 2

3 II 2023, Warszawa

Egzamin z Projektowanie i Programowania Obiektowego


BioInformatyka/Kognitywistyka
Kucharze
Czas pisania 180 min., wer. 1.00
Uwaga: czytanie przypisów nie jest konieczne dla rozwiązania zadania.

Jednym z ważniejszych (a jednocześnie i przyjemniejszych) aspektów życia, jest przygotowywanie jedzenia (no i
spożywanie oczywiście też)1. Spróbujmy opisać pracę kucharzy w ośrodku wypoczynkowym, statku
międzygalaktycznym czy stołówce zakładowej. Codziennie przygotowują oni posiłki korzystając ze sprawdzonych
receptur (przepisów) mając do dyspozycji magazyn składników.

Receptury opisują potrzebne składniki, ich wagę oraz sposób przyrządzania danej potrawy (ten ostatni pomijamy w
tym zadaniu). Waga składników jest podana w wielkości potrzebnej na sporządzenie kilograma potrawy, kucharz
otrzymując zamówienie dostaje recepturę i wagę całości potrawy (np. 150 kg sernika) i stosowanie przelicza wagi
potrzebnych składników2. Ponieważ nie zawsze wszystkie składniki są dostępne (np. dziś nie dowieźli do ośrodka,
albo leżały za blisko reaktora gwiazdolotu i teraz niepokojąco świecą) receptury przewidują dla każdego ze
składników listę zamienników (dla uproszczenia przyjmujemy, że zamiennika potrzeba tyle samo co oryginału). Ta
lista może być pusta, może zawierać jeden lub więcej elementów. Na przykład receptura może zamiast kaszy
gryczanej pozwalać użyć kaszy jaglanej czy kaszy pęczak (jakkolwiek bulwersująco by to brzmiało). Zastępniki są
używane nie tylko z powodu braku oryginału, ale też mogą być preferowane przez niektórych kucharzy, chcących
urozmaicić długie tygodnie deszczowych wczasów, czy długie lata podróży gwiezdnych, gdy akurat nie trafiają się
żadne, mniej lub bardziej kłopotliwe, spotkania z obcymi cywilizacjami. Są też potrawy, których receptura to w
zasadzie jedna długa lista zamienników (np. włoska pizza, hiszpańska paella, czy nasze naleśniki).

Składniki mają nazwy i są podzielone na kategorie: dodatki (takie jak np. mąka czy cukier), przyprawy (np.
kurkuma), warzywa (kartofel, brokuły), owoce (jabłko, gruszka) itp.. Jak dowodzą wieki doświadczeń kulinarnych
te grupy składników istotnie się różnią, co powinniśmy uszanować w rozwiązaniu, choć nie wprowadzamy tu
rozróżniających te grupy składników operacji. Każdy składnik ma swoją cenę (za ile został kupiony, w przeliczeniu
na kilogram), datę produkcji (gdy trudno mówić o produkcji to po prostu data zapakowania) i datę przydatności do
spożycia. Dla uproszczenia przyjmiemy w tym zadaniu, wzorując się trochę na znanym z poważnej literatury SciFi
pojęciu daty gwiezdnej3, że daty są reprezentowane przez pojedyncze liczby całkowite, przy czym większe liczby
określają późniejsze daty.

Niezwykle istotną częścią kompleksu kuchennego jest magazyn. Można do niego dodawać nowe składniki (np. pół
tony kartofli), pytać o dostępność składników i je pobierać do gotowania. Smutną acz konieczną operacją jest
przeglądanie magazynu i usuwanie z niego wszystkich, nawet tylko trochę przeterminowanych, produktów. W
kuchni składniki identyfikowane są poprzez nazwy i w ten sposób są wyszukiwane przez kucharzy. Ponieważ
jednak ten sam składnik może pojawić się w kilku dostawach, to może mieć różne ceny (np. za kilogram
ziemniaków na Andromedzie trzeba zapłacić zupełnie astronomiczną liczbę dolarów altairskich 4). No i daty
produkcji/przydatności są zapewne inne. Dlatego magazyn dla każdego składnika trzyma osobno informacje o jego
dostawach (każda dostawa składnika ma unikatowy identyfikator (liczba całkowita), wagę, cenę, datę produkcji i
datę przydatności do spożycia). Przyjmujemy, że jedna dostawa dotyczy jednego składnika. Identyfikator dostawy
jest wyznaczany (np. jako o jeden większy od poprzedniego) przez magazyn przy każdym dodawaniu składnika do
magazynu (tzn. przy każdej dostawie). Kucharz może zapytać o łączną masę dostępnego składnika lub poprosić o
listę dostępnych dostaw składnika. Zamawiając może poprosić o zadaną masą składnika (wtedy magazyn pobiera z
dowolnych dostaw żądaną masę składnika) lub wskazać oprócz składnika i masy jeszcze identyfikator dostawy (i
wtedy oczywiście magazyn wydaje składnik tylko z tej dostawy). Próba pobrania zbyt dużej ilości składnika
1 O jednym i drugim można się przekonać np. słuchając audycji „Gastrofaza” Pawła Lorocha
(https://pl.wikipedia.org/wiki/Paweł_Loroch) (nazwy stacji nie podaję zwn. problem unikania lokowania produktu).
2 Bez matematyki – lub komputera, czyli informatyki – nie ma dobrej kuchni!
3 Data gwiezdna (ang. Stardate) https://en.wikipedia.org/wiki/Stardate powszechnie znany ze Star Treka sposób określania czasu.
4 Dolar altairski (ang. Altairian dollar) https://hitchhikers.fandom.com/wiki/Altairian_dollar.

Str. 1 z 2
powinna być sygnalizowana stosownym wyjątkiem nadzorowanym.

Smutne doświadczania z przeszłości pokazały, że aby mieć pewność otrzymania śniadania w poniedziałek rano
należy zatrudnić więcej niż jednego kucharza. Zbyt intensywnie spędzony weekend, na przygotowywaniu się do
egzaminu z programowania, czy też drobne zaburzenie czasoprzestrzeni przy zbyt bliskim mijaniu czarnej dziury
mogą uczynić najwybitniejszego kucharza (to pierwsze raczej tylko chwilowo) całkiem niezdatnym do użytku. Ale
kucharze są bardzo różni. Samo wybieranie składników do zadanej receptury potrafią wykonywać zupełnie inaczej.
Miłośnicy świeżynek do każdego przepisu wybierają zawsze składniki najświeższe (nie zwracając uwagi, czy to
oryginały czy zamienniki). Kucharze oszczędni dobierają składniki (znów nie zwracając uwagi czy to oryginał czy
zamiennik) o najniższej cenie. Kucharze ekologiczni wybierają zawsze składniki o najkrótszym terminie ważności
(znów, bez zwracania uwagi na to czy to oryginały czy zastępniki). Kucharze akuratni zawsze wybierają składniki
oryginalne, gdy ich zabraknie dobierają resztę z zamienników, w obu przypadkach preferując składniki najdroższe
(a więc w ich mniemaniu najlepsze). Kucharze prości zawsze pobierają składnik tylko z jednej dostawy. Jak widać
zwykle kucharze biorą z kolejnych dostaw, wg swoich algorytmów, aż do zebrania odpowiedniej ilości składnika.
Jeśli kucharzowi nie uda się dobrać wystarczającej ilości któregoś ze składników, to zgłasza stosowny wyjątek
nadzorowany.

Zaprojektuj hierarchię klas/interfejsów opisującą przedstawioną w tym zadaniu rzeczywistość. W projekcie


przedstaw wszystkie potrzebne klasy, podaj ich nazwy, atrybuty, konstruktory i metody. Dla atrybutów opisz ich typ,
dla metod podaj ich nagłówki (typ wyniku, nazwy i typy parametrów). Dla każdej metody, konstruktora i atrybutu
wskaż zakres widoczności. Zaznacz, które metody są abstrakcyjne. Podaj powiązania (dziedziczenie) między
klasami. Zaznacz, które klasy są abstrakcyjne bądź gdzie zaprojektowałaś/eś interfejsy. Zadbaj o to, by
zaprojektowane klasy były poprawne w Javie oraz by można było się nimi wygodnie posługiwać (jak zaprojektujesz
wypisywanie?).

Zaimplementuj dla wszystkich wymienionych kucharzy metodę pobierającą z magazynu składniki dla zadanej
(jak?) receptury i ilości potrawy. Zaimplementuj też metodę usuwania z magazynu przeterminowanych produktów.
Wszystkie użyte przez Ciebie niestandardowe metody (tj. niedostępne w standardowej bibliotece Javy) należy
zaimplementować.

Projekt musi być zapisany osobno, w notacji UML, zaś implementacja ma być z nim zgodna.

Uwagi:
• Pamiętaj, że to egzamin z Projektowania i programowania obiektowego w Javie (czyli np. nawet w pełni
działające rozwiązanie, ale z jedną tylko klasą albo zapisane w pseudokodzie zostanie odczytane jako chęć
rychłego ponownego spotkania w sesji poprawkowej :) ).
• Zadanie przedstawia uproszczony opis działania obszernej i niezwykle frapującej dziedziny naszego życia
zwanej potocznie gotowaniem, opisz tylko to (ale i wszystko to), co jest podane w treści zadania.
• Możesz używać (byle poprawnie) wszystkich standardowych (tzn. występujących w bibliotece standardowej
Javy) klas, nawet jeśli nie były omawiane na zajęciach.
• Pamiętaj, aby projekt umożliwiał korzystanie z zaprojektowanych klas, czyli dla każdej klasy należy
zaprojektować co najmniej jeden konstruktor główny i stosowny zestaw rozsądnych operacji.
• Zadanie możesz rozwiązywać na komputerze (w dowolnym IDE), albo na kartce - jak wolisz, nie ma to
wpływu na ocenę. Możesz też jedną część (projekt/kod) oddać na kartce, a drugą elektronicznie.
• Możesz korzystać z dowolnych materiałów nieelektronicznych (książki, ksera, notatki, rękopisy, itd.),
możesz korzystać z informacji dostarczanych przez IDE, możesz wyszukiwać w sieci opisy składni języka,
czy opisy biblioteki standardowej (listę dozwolonych miejsc ustalaliśmy na forum), inne wyszukiwania w
sieci nie są dozwolone.
• W trakcie egzaminu nie możesz komunikować się z nikim (obojętnie białkowym czy krzemowym).
Wyjątkiem są tylko pilnujący :). Czyli np. nie można w czasie egzaminu zadawać jakichkolwiek pytań na
forach, ani używać poczty. Nie wolno w czasie egzaminu w jakikolwiek sposób upubliczniać treści zadania
(np. fotografować treści, czy też przepisywać w komputerze),
• Osoby piszące na komputerze koniecznie muszą co pewien czas zapisywać swoje rozwiązanie na dysku!
Smacznego! Powodzenia!

Str. 2 z 2

You might also like