Spotkanie 21.

Omówienie zadań z zawodów CMI – część I

Najbliższe dwa spotkania poświęcimy zadaniom z pierwszego etapu zawodów CMI, który zakończył się 10. kwietnia. Kolejne istotnie elementy rozwiązania danego problemu będą przedstawione w postaci ćwiczeń tak, aby każdy z Was mógł ,,poskładać” wszystko w całość i raz jeszcze zmierzyć się z tymi zadaniami. Przypominam, że treści zadań są dostępne na wpisie spotkanie 19.

Zadanie Skarb piratów
Wypiszmy główne założenia:
  • znamy liczbę piratów p\geqslant 2,
  • znamy: liczbę sztuk złota z\geqslant 0, liczbę sztuk srebra s\geqslant 0 i liczbę sztuk klejnotów k\geqslant 0,
  • mamy obliczyć ile łupów każdego rodzaju otrzymają piraci i ile ich przypadnie Długiemu Johnowi.
Piraci ustalili, że dobra mają być – w miarę możliwości – dzielone po równo, a ewentualne reszta dodatkowo przypada hersztowi. Ewentualne wątpliwości wyjaśnia przykład: przy p=10 piratach i s=61 sztukach srebra każdy pirat otrzyma po 6 sztuk srebra i jeszcze pozostałą ostatnią część dostanie Długi John.

Ćwiczenie 1. Oblicz po ile sztuk łupów każdego rodzaju otrzymają piraci i ich herszt dla danych: p=12, z=103, s=72 i k=1001.

Wykonujemy dzielenie z resztą: 103:12=8 i reszta 7 – piraci otrzymają po 8 sztuk złota, a herszt razem 8+7=15 sztuk złota.
Podobnie dla srebra: 72:12=6 i reszta 0 – wszyscy (także Długi John) otrzymają po 6 sztuk srebra.
Klejnoty: 1001:12=83 i 5 reszty, zatem piraci dostaną po 83 klejnoty, a szef dostanie ich 83+5=88 sztuk.

W scratchu należy więc zaprogramować dzielenie z resztą i odpowiednie wartości wpisać do lity WYNIKI. Resztę z takiego dzielenia uzyskamy dzięki komendzie

Gorzej jest z szybkim otrzymaniem całkowitego ilorazu. Działanie dzielenia dostępne w wyrażeniach zwraca zawsze dokładną wartość ilorazu w postaci liczby dziesiętnej. Należy więc zadbać o to, aby dzielenie było wykonalne bez reszty. W tym celu od danej liczby bogactw (np. klejnotów k) odejmujemy odpowiednią resztą i dopiero dzielimy. Czyli potrzebujemy wyrażenia postaci

Ćwiczenie 2. Powyższy fragment programu oblicza wynik dzielenia całkowitego (bez reszty) dla danych wartości k i p – tyle klejnotów powinni otrzymać piraci. A jak obliczyć liczbę klejnotów dla Długiego Johna?

Sprawę załatwia polecenie


Zadanie 1. Wykorzystując powyższe wskazówki – rozwiąż oryginalne zadanie z zawodów Skarb piratów.

Nie najlepsze – ale działające – rozwiązanie wygląda tak.


Zadanie Miękkie lądowanie

Zadanie polega na zaprogramowaniu poszczególnych obiektów (dwóch chmur i trzech kotów), aby zachowywały się zgodnie z wytycznymi podanymi w treści. Zaczniemy od skryptów dla chmur – są one zupełnie takie same w obu przypadkach. Aby zagwarantować zgodność z narzuconymi wymogami, na początku ustawiamy ich kierunek na 90 stopni. Później – wykorzystujemy już wbudowany w Scratcha mechanizm wykrywania brzegu obszaru roboczego i odbijania. Wystarczy tylko ustawić odpowiedni styl obrotu na wartość nie obracaj.

Ćwiczenie 3. Zaprogramuj obie chmury (działając na dołączonym do zadania szablonie) aby w pętli typu zawsze przesuwały się z krokiem 5 i odbijały od lewego i prawego brzegu zgodnie z warunkami zadania (bez obrotów).

Odpowiedź do ćwiczenia – pierwszy element rozwiązania zadania.


Spadanie kotów można uzyskać zmniejszając ich współrzędne y (np. za pomocą polecenia zmień y o -5). Oczywiście nie możemy tego robić bez końca, a jedynie do momentu, w którym duszek osiągnie dolny brzeg. Można więc wykorzystać pętlę z warunkiem: powtarzaj aż dotyka krawędź. Z drugiej strony takie warunkowanie może być nieskuteczne, gdy początkowa pozycja duszka jest np. zbyt wysoka i kotek zahacza o górną krawędź obszaru roboczego. Można więc powyższy warunek zastąpić takim: powtarzaj aż pozycja y < -155.

Ćwiczenie 4. Wykorzystując powyższe uwagi napisz skrypt dla Procka, dzięki któremu kotek będzie spadał aż do dolnego brzegu.

Poniżej – obie możliwości.


Pozostaje jeszcze nauczyć koty co mają zrobić przy spotkaniu z chmurami. Gdy postąpimy naiwnie dodając instrukcję warunkową z czujnikiem: jeżeli dotyka Chmura to – obróć o 180 stopni, to w efekcie przy kolizji z odpowiednią chmurą duszek zacznie ,,migać” co jest spowodowane tym, że szerokość chmury jest większa od 5, więc kolizja jest obsługiwana przez kilka kroków duszka i za każdym razem obraca się on o 180 stopni. Aby wyeliminować ten efekt, można użyć zmiennej (tzw. flagowej), której jednym zadaniem będzie pamiętanie o tym, czy taka kolizja już wystąpiła (wartość zmiennej równa 1) czy jeszcze nie (wartość równa 0 – to też będzie wartość początkowa). Jeżeli zmienną tą nazwiemy Drap1 (kolizja Drapka z Chmurą 1), to odpowiedni fragment programu mógłby wyglądać tak:

W zadaniu musimy zaprogramować takie zachowanie każdego kota przy ewentualnym spotkaniu z obiema chmurami – ten sposób będzie więc wymagał użycia aż sześciu zmiennych (trzy koty razy dwie chmury).

Ćwiczenie 5. W podobny sposób jak powyżej, dodaj obsługę kolizji Drapka i drugiej chmury. Przetestuj działanie programu przy różnych początkowych ustawieniach Drapka i chmur (chmury nie muszą się poruszać).

Ostatnim etapem jest zatrzymanie chmur zaraz po lądowaniu ostatniego kota. Tu też można użyć trzech zmiennych flagowych (dla każdego kota osobna zmienna, np. DrapLeci, MruLeci, ProcLeci), które będą określały czy dany kot już wylądował (wartość równa 1) czy jeszcze spada (wartość początkowa równa 0). Wtedy – po zdefiniowaniu wszystkich trzech takich zmiennych – do pętli w programach obu chmur należy dorzucić warunek: powtarzaj aż DrapLeci=0 i MruLeci=0 i ProcLeci=0. Sprawi to, że chmury zatrzymają się gdy tylko do dolnej krawędzi dotrze ostatni kot.

Zadanie 2. Wykorzystując powyższe wskazówki – rozwiąż oryginalne zadanie z zawodów Miękkie lądowanie.

Przykładowe rozwiązanie jest zawarte w poniższym pliku.
Miękkie lądowanie (plik .sb3)


Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *