|
|||||||||||||||
|
Pięć monet
Mamy pięć monet A, B, C, D, E, których ciężary są parami różne. Dysponując bardzo czułą wagą szalkową, pozwalającą porównać ze sobą ciężary dwóch monet, uszereguj je od najlżejszej do najcięższej. Waga jest delikatnym i kosztownym urządzeniem. Pierwszych siedem porównań możemy wykonać za darmo. Ósme kosztuje 1 złoty, a każde następne porównanie jest 125 razy droższe od poprzedniego. Decyzję o tym, które porównanie wykonać w danej chwili, możemy podejmować w zależności od wyników poprzednich pomiarów. Zaprojektuj algorytm sortujący monety, tak aby koszt ważenia był jak najmniejszy.
ZadanieRozwiązanie możesz zapisać w Pascalu lub w języku C.PascalTutaj jest program, który pozwoli Ci uruchomić Twoje rozwiązanie. Uzupełnij treść procedury sortujMonety z pliku USORT.PAS. Ta procedura powinna, korzystając z funkcji lzejsza, uszeregować monety według ich ciężaru od najlżejszej do najcięższej, a następnie, wywołując procedurę wynik, przekazać znalezioną kolejność. Ocena poprawności rozwiązania dla pewnych dowolnie wybranych ciężarów monet zostanie dokonana na podstawie tego wywołania procedury wynik.Kod źródłowy programu jest zapisany w następujących plikach: Procedura sortujMonety powinna korzystać z typu TMoneta, zdefiniowanego w pliku UMONETA.PAS: unit UMoneta; interface type TMoneta = (A, B, C, D, E); {Z pozostałych deklaracji, zawartych w tym pliku, korzystać nie wolno.} implementation {...}Do porównywania monet oraz podawania rozwiązania służą funkcja lzejsza i procedura wynik zadeklarowane w pliku UWAGA.PAS: unit UWaga; interface uses UMoneta; function lzejsza(m1,m2:TMoneta):boolean; {Przyjmuje wartość true jeśli moneta m1 jest lżejsza od monety m2, w przeciwnym przypadku przyjmuje wartość false.} procedure wynik(m1,m2,m3,m4,m5:TMoneta); {Gdy monety zostaną już uszeregowane od najlżejszej do najcięższej, należy wywołać procedurę wynik . Parametry m1, m2, m3, m4, m5 oznaczają monety uszeregowane od najlżejszej do najcięższej. Zwróć uwagę, że ta procedura musi być wywołana dokładnie jeden raz w trakcie działania sortujMonety.} implementation {...}Rozwiązanie zapisz w pliku USORT.PAS: unit USort; interface uses UMoneta,UWaga; procedure sortujMonety; implementation {Poniżej jest miejsce na kod Twojego rozwiązania. Typy, zmienne, funkcje oraz procedury, które zadeklarujesz muszą być lokalne dla tego modułu.} procedure sortujMonety; begin end;Spośród funkcji, procedur, typów oraz zmiennych zadeklarowanych w innych plikach wolno Ci korzystać tylko z funkcji lzejsza, procedury wynik i typu Tmoneta. Nie wolno zmieniać czegokolwiek poza implementacją modułu USORT.PAS. Ocenie podlega tylko plik USORT.PAS, który zostanie skompilowany z innym programem sprawdzającym poprawność rozwiązania, dlatego interfejs modułu musi pozostać nie zmieniony. Język CTutaj jest program, który pozwoli Ci uruchomić Twoje rozwiązanie. Uzupełnij treść procedury sortujMonety z pliku USORT.C. Ta procedura powinna, korzystając z funkcji lzejsza, uszeregować monety według ich ciężaru od najlżejszej do najcięższej, a następnie, wywołując procedurę wynik, przekazać znalezioną kolejność. Ocena poprawności rozwiązania dla pewnych dowolnie wybranych ciężarów monet zostanie dokonana na podstawie tego wywołania procedury wynik.Kod źródłowy programu jest zapisany w następujących plikach:
UMONETA.H, UMONETA.C - definicja typu: Tmoneta, Procedura sortujMonety powinna korzystać z typu TMoneta, zdefiniowanego w pliku UMONETA.H: typedef enum {A, B, C, D, E} TMoneta; /* Z pozostałych deklaracji, zawartych w tym pliku, korzystać nie wolno. */Do porównywania monet oraz podawania rozwiązania służą funkcja lzejsza i procedura wynik zadeklarowane w pliku UWAGA.H: extern int lzejsza (TMoneta m1, TMoneta m2); /* Przyjmuje wartość 1 (prawda) jeśli moneta m1 jest lżejsza od monety m2, w przeciwnym przypadku przyjmuje wartość 0 (fałsz). */ extern void wynik (TMoneta m1, TMoneta m2, TMoneta m3, TMoneta m4, TMoneta m5); /* Gdy monety zostaną już uszeregowane od najlżejszej do najcięższej, należy wywołać procedurę wynik . Parametry m1, m2, m3, m4, m5 oznaczają monety uszeregowane od najlżejszej do najcięższej. Zwróć uwagę, że ta procedura musi być wywołana dokładnie jeden raz w trakcie działania sortujMonety. */Rozwiązanie zapisz w pliku USORT.C: #include "usort.h" /* Tu mogą być umieszczone zmienne i funkcje pomocnicze */ void sortujMonety() { /* To jest miejsce na twoje rozwiązanie */ /* Można wywołać tylko funkcje lzejsza(...) i wynik(...) oraz własne funkcje z tego modułu. */ }Spośród funkcji, procedur, typów oraz zmiennych zadeklarowanych w innych plikach wolno Ci korzystać tylko z funkcji lzejsza, procedury wynik i typu Tmoneta. Nie wolno również zmieniać czegokolwiek poza implementacją modułu USORT.C. Ocenie podlega tylko plik USORT.C, który zostanie skompilowany z innym programem sprawdzającym poprawność rozwiązania, dlatego interfejs modułu musi pozostać nie zmieniony. |