Kolejnym twoim zadaniem będzie zaprojektowanie automatu sprzedającego bilety, np. komunikacji miejskiej. Zwykle takie automaty umożliwiają wybór rodzaju biletu, liczbę kupowanych biletów, formę zapłaty (kartą płatniczą lub gotówką), a w przypadku płacenia gotówką wydają resztę. Podczas kupna biletu automat przeprowadza kupującego przez kolejne kroki, od wyboru biletów po płatność.
Ćwiczenie 1
Odwiedź stronę internetową przedsiębiorstwa komunikacji miejskiej twojego miasta lub (jeśli mieszkasz w mniejszej miejscowości) najbliższego większego miasta z taką komunikacją. Zapoznaj się z obowiązującym systemem biletowym. Wybierz co najmniej dwa rodzaje biletów, które wykorzystasz w swojej aplikacji. Jeśli są na stronie zdjęcia – wzorce biletów, pobierz je.
Na poniższych obrazkach znajdziesz wzorce kilku przykładowych biletów komunikacji miejskiej w Warszawie pobrane ze strony http://www.ztm.waw.pl według stanu na wiosnę 2015 roku.
RuvERJynM4Icn1
R12l1CPKW92Mg1
RCQJNyYaLeBx41
R1OP5LBoFXGXC1
RgwVoZLYgzmlt1
Rt0iTktK0lZ0f1
Ćwiczenie 2
Zaplanuj, jakie działania będą wykonywane na kolejnych ekranach automatu (np. wybór rodzaju biletu – spośród przykładowych biletów można wybierać ze względu na strefę lub pomiędzy biletami normalnymi i ulgowymi, wybór liczby kupowanych biletów, itd.). Załóż, że płatność będzie dokonywana tylko gotówką i automat będzie wydawał resztę.
Przykładowy podział:
Wybór biletu pomiędzy ulgowym i normalnym.
Wybór rodzaju biletu (spośród przykładowych biletów są trzy rodzaje: 20 minutowy, 75 minutowy i 90 minutowy).
Wybór liczby biletów.
Prośba o zapłatę z podaniem kwoty oraz oczekiwanie na zapłatę.
Ewentualne wydanie reszty i zakończenie zakupu.
Ćwiczenie 3
Zaprojektuj wygląd kolejnych ekranów automatu. Zastanów się, które elementy będą duszkami, a które tylko rysunkami kolejnych teł.
Elementy, w które będzie można kliknąć i będą powodowały określony wybór, powinny być duszkami. Pozostałe elementy graficzne mogą być narysowane jako tło kolejnych ekranów automatu biletowego. Poniżej przykładowy wygląd kolejnych ekranów, zaprojektowany zgodnie z odpowiedzią do zadania 2. Najlepiej, jak zaprojektujesz własne ekrany zgodnie z twoją propozycją rozwiązania zadania 2. Ekran 1: Wybór pomiędzy biletem ulgowym i normalnym. Przyciski Ulgowy i Normalny będą duszkami.
R113b1irIu5Vw1
Ekran 2: Wybór rodzaju biletu spośród ulgowych lub normalnych (zgodnie z wcześniejszym wyborem). Przykładowy ekran po wyborze biletu ulgowego. Obrazki biletów będą duszkami.
R1POujryqvYQJ1
Ekran 3: Wybór liczby biletów. Przykładowy ekran po wyborze biletu ulgowego 20 minutowego. Przycisk Kupuję oraz przyciski strzałek do zmiany liczby biletów powinny być duszkami. W obrazek biletu nie można już klikać, więc może to być element tła – np. przystemplowany wizerunek duszka. Ponieważ będzie można zmieniać liczbę kupowanych biletów, wygodnie będzie, żeby ich liczba była duszkiem.
RweIP52ooTkUp1
Ekran 4: Obliczenie kwoty do zapłaty oraz oczekiwanie na zapłatę. Przykładowy ekran po wybraniu 3 biletów ulgowych 20 minutowych.
RNPAMnrv1AJol1
Ekran 5: Ewentualne wydanie reszty. Przykładowy ekran po wprowadzeniu kwoty 6 zł (przy zakupie 3 biletów ulgowych 20 minutowych). Zostanie wydane 90 gr reszty, np. moneta 50 gr i dwie monety 20 gr. Obrazy monet wygodnie będzie przedstawić jako duszki, można je znaleźć na stronie Narodowego Banku Polskiego http://www.nbp.pl.
R1EGJsbpLVfoj1
W przykładowej aplikacji można maksymalnie wybrać 9 biletów, reszta wydawana jest zawsze monetami. Jej działanie można obejrzeć na poniższym filmie.
R8STKF4QFoH1B1
Dalszych kilka podrozdziałów opisuje kolejne kroki tworzenia i oprogramowania interfejsu przykładowej aplikacji według przedstawionego powyżej scenariusza. Pamiętaj, że tworzysz aplikację podobną, ale według własnego scenariusza, więc twoje skrypty sterujące duszkami i ekranami automatu będą prawdopodobnie różnić się od przykładowych. Zwróć szczególną uwagę na kilka ostatnich podrozdziałów, w których duszka – kotka (lub inną postać zaproponowaną przez ciebie) czeka ważne zadanie. Oblicza należność do zapłaty oraz kwotę reszty. W tym celu musi wyznaczyć liczbę monet poszczególnych nominałów jako resztę, którą należy wydać. Algorytm wyznaczenia reszty w twojej aplikacji będzie prawdopodobnie analogiczny jak w przykładowej.
iwePopYOpl_d5e409
Przygotowujemy tła i duszki
Ćwiczenie 4
Przygotuj wszystkie potrzebne duszki oraz tła do twojego projektu. Część duszków znajdziesz w galerii Scratcha, inne pobierz z internetu (pamiętaj o przestrzeganiu praw autorskich) lub zaprojektuj samodzielnie w edytorze graficznym. Pamiętaj, że duszek może mieć kilka kostiumów, które mogą być wykorzystywane nie tylko do animacji.
W przykładowej aplikacji występują następujące duszki:
Przyciski. Łącznie są trzy duszki‑przyciski Ulgowy, Normalny i Kupuję. Zostały zaprojektowane w edytorze graficznym.
Bilety. Łącznie jest sześć biletów. Ponieważ równocześnie są wyświetlane maksymalnie trzy bilety (same ulgowe lub same normalne), reprezentowane są przez trzy duszki, a każdy z nich posiada dwa kostiumy (normalny i ulgowy). Wzorce biletów zostały pobrane ze strony http://www.ztm.waw.pl.
Strzałki do wyboru liczby kupowanych biletów. Dwa duszki z galerii Scratcha.
Cyfry podające liczbę kupowanych biletów. Duszek z dziewięcioma kostiumami z galerii Scratcha kolejno reprezentującymi cyfry od 1 do 9.
Standardowy duszek kotek podający kwotę do zapłaty i oczekujący na zapłatę.
Monety. Jeden duszek z kolejnymi kostiumami reprezentującymi monety 5 zł, 2 zł, 1zł, 50 gr, 20 gr, 10 gr. Wzorce monet zostały pobrane ze strony http://www.nbp.pl.
Łącznie więc w przykładowym projekcie jest 11 duszków. Poniżej możesz pobrać duszki (przyciski, bilety, monety) z przykładowej aplikacji.
RebnwcmGNb6No1
R1WtRY7NJ5iR81
R1UfF239qaBv71
Rl2J9tk7KgN9F1
RJ2vgkrf6gCDA1
Tła sceny są bardzo proste. Trzy tła z napisami „Jaki bilet chcesz kupić?”, „Wybierz rodzaj biletu:”, „Wybierz liczbę biletów:” oraz czwarte puste tło, na którym duszek pobiera opłatę oraz wydaje resztę.
RQ77xVKqnobcp1
Zapewne w swojej aplikacji zaprojektujesz ciekawsze tła.
Ćwiczenie 5
Załaduj do projektu Scratcha przygotowane duszki oraz tła. Ustaw, że domyślnie duszki są niewidoczne. Dla każdego z nich przygotuj także skrypt, uruchamiany po kliknięciu zielonej flagi, ukrywający duszka. Nawet jak domyślnie wszystkie duszki są ukryte, to niektóre mogą być widoczne po poprzednim wykonaniu aplikacji (reszta w postaci monet, niektóre duszki po przerwaniu działania aplikacji przyciskiem stop).
iwePopYOpl_d5e512
Wybieramy rodzaj biletu
Pierwszy ekran przykładowej aplikacji dokonuje tylko wyboru pomiędzy biletem ulgowym i normalnym. Na scenie widoczne są dwa duszki – przyciski Ulgowy i Normalny. Po kliknięciu w jeden z tych przycisków następuje przejście do następnego ekranu – wyboru rodzaju biletu spośród ulgowych lub normalnych. Powinien w związku z tym zostać nadany komunikat informujący pozostałe duszki o wyborze biletu ulgowego lub normalnego, aby mogły być podjęte następne działania. Jeśli jeszcze nie umiesz korzystać z komunikatów kliknij tutajiwePopYOpl_d1111e271tutaj.
Ćwiczenie 6
Po uruchomieniu aplikacji zieloną flagą powinien być widoczny pierwszy ekran automatu biletowego. Przygotuj odpowiedni skrypt dla sceny wybierający pierwsze tło i czyszczący scenę.
Ćwiczenie 7
Zaplanuj i utwórz skrypty dla przycisku Ulgowy. Ten duszek jest widoczny tylko na pierwszym ekranie, więc może mieć stałą pozycję na scenie. Pamiętaj, że ma zostać ukryty nie tylko po kliknięciu w niego, ale także przy wyborze przycisku Normalny.
Przycisk ten znajduje się na pierwszym ekranie (tle), w związku z tym po uruchomieniu aplikacji – kliknięciu w zieloną flagę – powinien zostać pokazany (popraw w związku z tym skrypt uruchamiany po kliknięciu zielonej flagi). Po kliknięciu duszka tło zmienia się na następne i zostaje nadany komunikat o wyborze biletu ulgowego. Ponieważ duszek ma być ukryty także po kliknięciu drugiego przycisku, najlepiej ukryć go, gdy nastąpi zdarzenie zmiany tła.
RoJRAUM3CFXAp1
Ćwiczenie 8
Utwórz skrypty dla przycisku Normalny. Będą one analogiczne, jak dla poprzedniego przycisku. Możesz je skopiować przeciągając skrypty i upuszczając na drugim duszki. Pamiętaj o nadaniu innego komunikatu, np. normalny.
Na kolejnym ekranie (po otrzymaniu komunikatu normalny lub ulgowy) jest wyświetlana grupa trzech biletów do wyboru. Każdy z nich ma dwa kostiumy, wybór kostiumu zależy od odebranego komunikatu (normalny lub ulgowy). Wybrany bilet zmienia swoją pozycję na następnym ekranie, więc należy programowo ustawiać jego pozycję. Wygodnie będzie także zapamiętać wybór biletu w zmiennej. Niech wartości od 1 do 3 określają bilety normalne, a wartości od 4 do 6 odpowiadające im bilety ulgowe.
Ćwiczenie 9
Utwórz zmienną do pamiętania wybranego biletu, dostępną dla wszystkich duszków. Nazwij ją np. rodzaj.
Ćwiczenie 10
Zastanów się, jakie czynności należy przewidzieć dla duszka – biletu. Staraj się tak je zaplanować, aby były uniwersalne niezależnie od rodzaju biletu.
Czynności inicjalizujące:
pokazanie duszka,
ustawienie pozycji,
wybranie kostiumu.
Pokazanie i wybranie kostiumu powinno nastąpić w momencie odebrania komunikatu normalny lub ulgowy. Ustawienie pozycji może nastąpić po kliknięciu w zieloną flagę.
Reakcja na kliknięcie w duszka (wybór biletu):
określenie wartości zmiennej rodzaj,
zmiana tła na kolejny ekran,
ustawienie duszka i przystemplowanie jego obrazu,
nadanie komunikatu o wyborze biletu.
Czynności końcowe:
po otrzymaniu komunikatu o wyborze biletu ukrycie duszka.
Duszka, w którego kliknięto, można ukryć bezpośrednio przed nadaniem komunikatu o wyborze biletu w poprzednim punkcie. Biletów mamy jednak więcej, one także powinny zostać ukryte.
Ćwiczenie 11
Przygotuj skrypty zgodnie z rozwiązaniem poprzedniego zadania.
Skrypty na przykładzie biletu 20 minutowego. Dla innych biletów mogą się różnić pozycją na scenie, wyborem kostiumu i wartością zmiennej rodzaj. Skrypty inicjalizujące:
R9yR4WeeZXV3R1
Skrypt – wybór biletu:
Rnq8nb8cNVf8g1
Skrypt kończący po wyborze rodzaju biletu:
RUtemymJv9gmV1
Ćwiczenie 12
Skopiuj skrypty dla pozostałych biletów i dokonaj niezbędnych poprawek: przypisania odpowiedniej wartości zmiennej rodzaj, położenia na scenie oraz wyboru kostiumu.
iwePopYOpl_d1111e271
Nadawanie i odbieranie komunikatów umożliwia porozumiewanie się pomiędzy duszkami, a także sceną. W ten sposób jeden duszek może uruchomić skrypty innych duszków lub sceny. Trzy klocki związane z nadawaniem i odbieraniem komunikatów znajdują się w grupie Zdarzenia. Nowy komunikat można zdefiniować i nadać przy pomocy jednego z dwóch bloczków:
R1NDE8u8do1pE1
Nazwę nadawanego komunikatu można wybrać z listy rozwijalnej lub zdefiniować nowy komunikat przy pomocy opcji nowy komunikat ... dostępnej po rozwinięciu listy.
R1aHy3QYkMPxD1
Wyświetlone będzie wówczas okno dialogowe, w którym należy podać nazwę nowego komunikatu.
R7mH237sEqjwr1
Po nadaniu komunikatu (wykonaniu bloczka nadaj lub nadaj i czekaj) uruchamiane są automatycznie skrypty zaczynające się od bloczka kiedy otrzymam z taką samą nazwą komunikatu.
R1WvdNM1IoOfl1
Działanie skryptu, który nadał komunikat jest kontynuowane równolegle (klocek nadaj) lub wstrzymane do czasu zakończenia działania wszystkich skryptów odbierających ten komunikat (nadaj i czekaj). Przykład:
RQoszEo3A0O531
R13bF5ro1byXD1
iwePopYOpl_d5e684
Wybieramy liczbę biletów
Na kolejnym ekranie (po otrzymaniu komunikatu wybrano bilet) określamy liczbę biletów. Na scenie dostępne są duszki – strzałki do zmiany liczby kupowanych biletów, duszek reprezentujący wybraną liczbę biletów oraz przycisk Kupuję.
Ćwiczenie 13
Zaplanuj działania dla duszków - strzałek.
Po otrzymaniu komunikatu wybrano bilet należy pokazać duszka.
Po kliknięciu w duszka należy nadać komunikat więcej lub mniej w zależności od strzałki, aby duszek pokazujący liczbę wybranych biletów mógł zmienić kostium.
Po otrzymaniu komunikatu generowanego przez przycisk Kupuję należy ukryć duszka.
Ćwiczenie 14
Przygotuj skrypty dla obu strzałek zgodnie z rozwiązaniem poprzedniego zadania.
Skrypty dla strzałki do góry. Dla strzałki do dołu różni się tylko skrypt reagujący na kliknięcie duszka – należy nadać komunikat mniej.
ROmuBSUbFA1j31
Ćwiczenie 15
Zaplanuj działania dla duszka reprezentującego liczbę kupowanych biletów.
Po otrzymaniu komunikatu wybrano bilet należy pokazać duszka oraz ustawić pierwszy kostium z cyfrą 1.
Po otrzymaniu komunikatu mniej należy ustawić poprzedni kostium (o ile nie był pierwszy).
Po otrzymaniu komunikatu więcej należy ustawić następny kostium (o ile nie był ostatni).
Po otrzymaniu komunikatu generowanego przez przycisk Kupuję należy ukryć duszka.
Ćwiczenie 16
Przygotuj skrypty dla duszka reprezentującego liczbę biletów zgodnie z rozwiązaniem poprzedniego zadania.
Skrypty reagujące na otrzymanie komunikatów wybrano bilet, mniej oraz więcej.
R12g3a9WbkqmK1
Ćwiczenie 17
Zaplanuj działania i przygotuj skrypty dla przycisku Kupuję.
Po otrzymaniu komunikatu wybrano bilet należy pokazać duszka.
Po kliknięciu duszka należy go ukryć i nadać komunikat kupuję.
iwePopYOpl_d5e797
Projektujemy struktury danych
Ponieważ automat biletowy ma nie tylko umożliwić wybranie rodzaju biletu, ich liczby, ale także obliczyć wartość kupowanych biletów oraz wydać resztę, potrzebne będą informacje dotyczące cen poszczególnych biletów, nominałów monet, liczby wydawanych poszczególnych monet. Ponieważ w przykładowej aplikacji występuje 6 różnych biletów, mamy także 6 nominałów monet, niewygodne będzie pamiętanie tych informacji w pojedynczych zmiennych liczbowych. Lepiej utworzyć i zapamiętać te informacje na listach. Więcej informacji dotyczących list znajdziesz tutajiwePopYOpl_d1111e397tutaj. Ceny biletów lepiej jest pamiętać jako liczby naturalne, a więc wyrażone w groszach. Wynika to z faktu, że liczby całkowite są w komputerze pamiętane dokładnie, a liczby rzeczywiste w przybliżeniu. Łatwiej będzie prowadzić obliczenia. Analogicznie, nominały monet zapamiętamy w tych samych jednostkach, czyli w groszach (np. 1 zł jako 100 groszy). Więcej o reprezentacji liczb całkowitych i rzeczywistych dowiesz się tutajiwePopYOpl_d1111e427tutaj.
Ćwiczenie 18
Utwórz listy do pamiętania cen poszczególnych biletów, nominałów monet oraz liczby wydawanych monet o poszczególnych nominałach.
Listę cen biletów zaplanuj tak, aby najpierw były bilety jednego rodzaju, np. normalne, a potem odpowiadające im ulgowe.
Listę z nominałami monet przygotuj uporządkowaną malejąco od największego do najmniejszego nominału.
Lista z liczbami monet do wydania jako reszta powinna być wypełniona wartościami 0 (nie wiemy jeszcze, czy i jaką resztę trzeba będzie wydać).
Utwórz bloki inicjalizujące listy. Pamiętaj, że możesz mieć inną liczbę biletów i ich rodzajów, zgodnie z twoim projektem. Zastanów się, na jakie zdarzenie oraz dla jakiego obiektu (którego duszka lub sceny) wywołać bloki. Jeśli chcesz sobie przypomnieć informacje o tworzeniu własnych bloków, kliknij tutajiwePopYOpl_d1111e449tutaj.
Najwygodniej będzie wywołać bloki inicjalizujące listy po kliknięciu zielonej flagi dla sceny, ponieważ jest jedna, a duszków wiele i każdy z nich ma inne własne skrypty.
RGu0I3J6GQCws1
RFE4qpq1yOOkD1
iwePopYOpl_d1111e397
Często zachodzi potrzeba przechowania większej liczby danych. Niewygodne staje się wówczas pamiętanie ich na pojedynczych zmiennych, szczególnie gdy pełnią podobny charakter. Lepiej pamiętać je pod jedną nazwą. Dostęp do pojedynczej danej (elementu) możliwy jest wtedy za pośrednictwem indeksu (numeru elementu). W Scratchu służą do tego listy. Przykład: Rzucamy wielokrotnie sześcienną kostką do gry. Chcemy policzyć, ile razy wypadły poszczególne liczby oczek. Można utworzyć sześć zmiennych odpowiednio do przechowywania liczby wystąpień jednego oczka, dwóch oczek, itd. Lepiej jednak utworzyć sześcioelementową listę. Liczba oczek będzie w takim przypadku indeksem. Symbolicznie indeks będziemy podawać w nawiasach kwadratowych: Wyniki[liczba oczek] – ile razy wypadła liczba oczek, gdzie liczba oczek może przyjmować wartości od 1 do 6. Listę, podobnie jak pojedynczą zmienną, można utworzyć w kategorii Dane. Należy kliknąć w przycisk Stwórz listę, w polu edycyjnym wpisać nazwę nowotworzonej listy (można także wybrać, czy będzie dostępna dla wszystkich duszków, czy tylko jednego) i zatwierdzić przyciskiem OK.
R10HDK8pQllv21
Po utworzeniu listy w kategorii Dane są do dyspozycji klocki umożliwiające operacje na liście.
RWP09sw9YlATw1
Dodanie nowego elementu na końcu listy.
R192QaiBqRFlD1
Usunięcie elementu o określonym indeksie (numerze elementu) lub wszystkich elementów (jeśli z pierwszej listy rozwijalnej zostanie wybrana opcja wszystko).
RZrqcoDZENCFK1
Wstawienie nowego elementu na pozycji o podanym indeksie.
R17YFKJQt6nCe1
Zmiana wartości elementu na pozycji o podanym indeksie.
R1G8JvquZmbgS1
Wartość elementu na pozycji o podanym indeksie.
R1XzmawPPmUO31
Wartością jest liczba elementów listy.
R15cknCrYdnu81
Sprawdzenie, czy na liście znajduje się określony element. Przykład:
RkZxx7KmJvCdn1
RaQzBmFeapnmL1
Lista może być widoczna na scenie lub ukryta. Widoczność można zmieniać edycyjnie włączając/wyłączając znacznik przy liście
RyqJDHxuBbbxn1
lub programowo, przy pomocy klocków:
R1cftBzhekpUK1
iwePopYOpl_d1111e427
Wiesz już co oznacza pojęcie bit oraz bajt, że na jednym bicie można zapisać jeden z dwóch stanów (oznaczanych 0 i 1), a bajt to 8 bitów. Do zapamiętania liczby w komputerze przeznacza się od jednego do kilku bajtów pamięci. W związku z tym zbiór liczb w informatyce to zawsze zbiór ograniczony, liczby są reprezentowane w pewnym zakresie. Liczby całkowite pamiętane są dokładnie. Natomiast większość liczb rzeczywistych pamiętana jest w przybliżeniu, nie tylko liczby niewymierne. Mając dwie liczby rzeczywiste (np. a<b), zawsze można znaleźć trzecią, która będzie większa od pierwszej i mniejsza od drugiej (a<c<b). Na komputerze często jest to niemożliwe, ponieważ na określonej liczbie bitów możemy zapamiętać tylko określoną liczbę stanów. Liczby całkowite bez znaku Liczby całkowite bez znaku są pamiętane w układzie przy podstawie 2 (dwójkowym, binarnym). Jeśli do pamiętania liczby przeznaczy się n bitów, to można zapamiętać na nich 2Indeks górny nn stanów, czyli reprezentować liczby od 0 do 2Indeks górny nn-1. Na przykład na jednym bajcie można zapamiętać liczby z zakresu od 0 do 255.
R16OArAD14JIa1
Liczby całkowite ze znakiem Jeden bit przeznacza się na pamiętanie znaku liczby. A więc np. na jednym bajcie można zapamiętać liczby z zakresu od -128 do 127. Liczby pamiętane są w specjalnym kodzie (kodzie uzupełnień do 2), tak, aby przy operacjach arytmetycznych znak stanowił integralną część liczby i nie musiał być interpretowany oddzielnie.
RUsA1yU7TsIGS1
Liczby rzeczywiste Liczby rzeczywiste najczęściej reprezentowane są w pamięci komputera w zapisie zmiennoprzecinkowym w tzw. notacji naukowej. W układzie dziesiętnym zapis liczby w notacji naukowej jest następujący: x=znak*mantysa*10Indeks górny cechacecha znak – znak liczby. mantysa – liczba ułamkowa w zakresie [1,10). cecha – wykładnik potęgi, liczba całkowita. Przykłady: Liczba 234,567 zapisana w notacji naukowej to 2,34567*10Indeks górny 22 Liczba -0,234567 zapisana w notacji naukowej to -2,34567*10Indeks górny -1-1 W układzie binarnym zapis w notacji naukowej jest następujący: x=znak*mantysa*2Indeks górny cechacecha znak – znak liczby. mantysa – liczba ułamkowa w zakresie [1,2). Część całkowita jest zawsze równa 1, można ją pominąć. Mantysę można więc pamiętać jako liczbę całkowitą. cecha – wykładnik potęgi, liczba całkowita. Często liczba, która wydaje się nam, że powinna być pamiętana dokładnie, jest pamiętana w przybliżeniu (na przykład dziesiętna liczba 0.1). Dzieje się tak, ponieważ liczba mająca skończone rozwinięcie w układzie dziesiętnym, może mieć nieskończone rozwinięcie w układzie binarnym. Spróbuj wykonać poniższy skrypt:
RFnwmJ77wSana1
Zapewne się zdziwisz, że skrypt działa w nieskończoność (pętli się). Zmienna x nigdy nie osiąga dokładnie wartości 1. W takich sytuacjach często prowadzimy obliczenia do osiągnięcia wartości przybliżonej z określoną dokładnością, np. w tym przypadku z dokładnoscią do 0.01. Warunek pętli może być następujący:
R1CKCY6bKHeV51
iwePopYOpl_d1111e449
Często bardziej złożony problem warto podzielić na podproblemy i zapisać je w postaci oddzielnych bloków. W celu utworzenia nowego bloku należy przejść do kategorii Więcej bloków. Następnie kliknąć przycisk Stwórz blok, w polu edycyjnym wpisać jego nazwę i zatwierdzić przyciskiem OK. W obszarze skryptów pojawi się nowy klocek, pod który można podczepić instrukcje‑klocki realizujące rozwiązywany podproblem. Przykład 1. Duszek ma narysować kilka obróconych kwadratów. Wygodnie będzie zdefiniować własny blok rysujący pojedynczy kwadrat.
RojmHbqVgytZr1
Na poniższym filmie możesz obejrzeć, jak utworzyć i wykorzystać własny blok.
R1THzpeQ3NhzE1
Własne bloki mogą mieć też parametry, analogicznie jak w przypadku wielu standardowych klocków (np. w klocku przesuń podajesz, o ile kroków duszek ma się przemieścić). Przykład 2. Duszek ma rysować mniejsze i większe kwadraty. Parametrem dla bloku rysującego kwadrat będzie więc długość boku. Jeśli blok jest już zdefiniowany, wystarczy kliknąć w niego prawym przyciskiem myszy i wybrać z menu kontekstowego Edytuj, a następnie rozwinąć listę opcji. Jeśli dopiero tworzymy nowy blok, po podaniu jego nazwy należy od razu rozwinąć listę opcji. W kolejny krokach trzeba:
wybrać parametr liczbowy,
wpisać nazwę parametru,
zatwierdzić przyciskiem OK.
Żeby wykorzystać parametr należy przeciągnąć go z klocka rozpoczynającego definicję nowego bloku do instrukcji, w której chcemy go użyć.
R3N72SnTOqEhO1
Na poniższym filmie możesz obejrzeć, jak utworzyć i wykorzystać własny blok z parametrem.
RFHWHXcIPpP3W1
iwePopYOpl_d5e989
Duszek oblicza należność i prosi o zapłatę
Na kolejnym ekranie (po otrzymaniu komunikatu kupuję) należy pokazać duszka, który nas rozliczy. Powinien on najpierw obliczyć wartość kupowanych biletów, następnie poprosić o zapłatę. Wygodnie zapamiętać obliczoną wartość w zmiennej, w tym celu utwórz zmienną np. o nazwie kwota do zapłaty.
Ćwiczenie 19
Zapisz w postaci listy kroków działania dla duszka rozliczającego kupowane bilety. Jeśli wystąpi konieczność wydania reszty nadaj komunikat wydaj resztę. Wskazówka: Cena wybranego biletu jest pamiętana w elemencie o numerze rodzaj listy ceny biletów, a liczba kupowanych biletów to numer kostiumu duszka Cyfry. Pamiętaj, że kwoty są pamiętane w groszach oraz kupujący może podać dokładną kwotę, mniejszą lub większą.
Zmień tło na kolejne.
Wyczyść scenę.
Pokaż duszka.
Ustaw wartość zmiennej kwota do zapłaty na: numer kostiumu duszka Cyfry)*(ceny biletów[rodzaj])/100.
Wyświetl kwotę do zapłaty i poproś o wprowadzenie kwoty przez kupującego.
Jeżeli wprowadzona kwota jest mniejsza od kwoty do zapłaty:
Powiedz „Niestety za mała kwota...”.
Zatrzymaj ten skrypt.
Jeżeli wprowadzona kwota jest równa kwocie do zapłaty:
Powiedz „Dziękuję, odliczyłeś dokładną kwotę.”.
Zatrzymaj ten skrypt.
Ukryj duszka.
Nadaj komunikat wydaj resztę.
Zatrzymaj ten skrypt.
Ćwiczenie 20
Utwórz skrypt uruchamiany po otrzymaniu komunikatu kupuję według algorytmu z rozwiązania poprzedniego zadania. Wskazówka: Do wyświetlenia napisu złożonego z tekstu i wartości zmiennej użyj polecenia połącziwePopYOpl_d1111e498połącz.
R1U4y0ygJ3ZRg1
iwePopYOpl_d1111e498
ROhbNJg8B3HTG1
Wynikiem działania klocka jest połączenie dwóch napisów w jeden. Wykorzystywany często do połączenia napisu wprowadzonego z klawiatury z wartością zwracaną przez inny klocek. Przykład:
R7SVZk3IwvdBk1
iwePopYOpl_d5e1072
Duszek oblicza resztę
Kwota do wydania reszty to różnica pomiędzy kwotą wprowadzoną przez kupującego a kwotą do zapłaty. Możesz założyć, że twój automat ma nieograniczoną liczbę monet każdego nominału.
Ćwiczenie 21
Zastanów się i spróbuj podać algorytm wyliczenia liczby monet poszczególnych nominałów, jakie ma wydać automat, jako resztę z wprowadzonej przez kupującego kwoty. Przedyskutuj swoje propozycje z kolegami i koleżankami, spróbujcie podać więcej niż jedną propozycję rozwiązania.
Algorytm 1 Wystarczy wziąć monetę o najmniejszym nominale, czyli 10 gr, i policzyć, ile ich potrzeba (reszta do wydania podzielona przez 10). Takie rozwiązanie jest bardzo proste, ale mało przyjazne dla użytkownika. System monetarny można by ograniczyć do jednego nominału monety o najmniejszej wartości. Chyba nie chcielibyście, płacąc np. w sklepie, otrzymywać reszty wyłącznie dużą liczbą monet 10 gr, czy wręcz 1 gr? Warto się zastanowić nad algorytmem, który zminimalizuje liczbę wydawanych monet. Algorytm 2 Zacznij od monety o największym nominale. Wydaj jej tyle egzemplarzy, ile się da. Od kwoty reszty odejmij wartość wydanych monet i przejdź do monety o kolejnym niższym nominale. Działania te powtarzaj, aż kwota reszty będzie równa zero.
Ćwiczenie 22
Zapisz w postaci listy kroków algorytm wydawania reszty minimalizujący liczbę wydawanych monet. Taką strategię postępowania, w której w najbliższym kroku bierzemy to co uważamy za najlepsze (w tym wypadku monetę o największym nominale mniejszym od kwoty, która pozostała do wydania) nazywamy metodą zachłannąiwePopYOpl_d1111e536metodą zachłanną.
Dane:
kwota – reszta do wydania wyrażona w groszach.
monety – lista dostępnych nominałów monet uporządkowana malejąco wyrażona w groszach.
Wynik:
reszta – lista z liczbą monet poszczególnych nominałów o łącznej wartości kwota. Kolejność monet jest zgodna z kolejnością na liście monety.
Ustaw elementy listy reszta na zero.
Powtarzaj aż kwota będzie równa zero:
Ustaw zmienną i na 1.
Powtórz dla każdego elementu listy monety:
ustaw element reszta[i] na część całkowitą wyrażenia kwota/monety[i].
ustaw wartość zmiennej kwota na kwota‑reszta[i]*monety[i].
zwiększ wartość zmiennej i o 1.
Zatrzymaj ten skrypt.
Ćwiczenie 23
Utwórz nowy blok dla duszka wydającego resztę zgodnie z algorytmem z poprzedniego zadania. Parametrem bloku będzie kwota reszty do wydania wyrażona w groszach. Nie musisz zerować listy reszta, zostało już to zrobione podczas tworzenia listy (po kliknięciu w zieloną flagę). Wskazówka: Pamiętaj, że w bloku Scratcha nie można zmieniać wartości parametru, więc musisz utworzyć pomocniczą zmienną. Do obliczenia części całkowitej liczby możesz wykorzystać funkcję podłogaiwePopYOpl_d1111e549podłoga.
Rn7dx7SWno0Wp1
Ćwiczenie 24
Zmodyfikuj skrypt dla duszka wydającego resztę, uruchamiany po otrzymaniu komunikatu kupuję. Przed nadaniem komunikatu wydaj resztę wstaw wywołanie bloku Oblicz_resztę. Pamiętaj, żeby podać jako parametr wartość reszty do wydania wyrażoną jako liczba całkowita w groszach. Wskazówka: Do zaokrąglenia wartości liczby rzeczywistej możesz wykorzystać bloczek zaokrąglijiwePopYOpl_d1111e568zaokrąglij.
R1JOigOy3qP121
iwePopYOpl_d1111e536
Metoda zachłanna polega na dokonywaniu najlepszego w danym momencie wyboru. Nie dokonuje oceny, jak wybór wpłynie na kolejne kroki, kontynuuje rozwiązywanie problemu zgodnie z podjętą decyzją w danym kroku. Metoda zachłanna nie zawsze prowadzi do znalezienia rozwiązania najlepszego (optymalnego). Dla wielu problemów może prowadzić do rozwiązania przybliżonego. Systemy monetarne większości państw tak są konstruowane (tak dobierane są wartości nominałów), aby metoda zachłanna umożliwiała wydanie reszty jak najmniejszą liczbą monet. Można podać przykład, kiedy metoda zachłanna nie znajdzie minimalnej liczby monet. Załóżmy, że monetę 2 zł zastępujemy monetą 4 zł. Chcemy wydać 8 zł. Metoda zachłanna wyznaczy jedną monetę 5 zł i trzy monety 1 zł, czyli razem cztery monety. A kwotę 8 zł można przedstawić za pomocą dwóch monet 4 zł.
iwePopYOpl_d1111e549
R1R5ZHZPIePzY1
Funkcja podłoga zaokrągla liczbę rzeczywistą „w dół”, a funkcja sufit „w górę”. Wartością funkcji podłoga jest największa liczba całkowita mniejsza lub równa od parametru, a wartością funkcji sufit najmniejsza liczba całkowita większa od parametru. Funkcję należy wybrać z listy rozwijalnej.
RmQP2xytwmiZl1
Przykłady:
R19Z28u7nupOF1
R1auNBPjEUZPN1
RXAWk4ofENzRJ1
RuiRnxy1QTAln1
iwePopYOpl_d1111e568
RWEzpZ6SsoXTN1
Wartością jest zaokrąglony argument do najbliższej liczby całkowitej – zgodnie z regułami zaokrąglania, tzn. końcówka 0.5 i więcej jest zaokrąglana w górę, w przeciwnym przypadku w dół. Przykład:
RILOkFyBpxzZp1
iwePopYOpl_d5e1235
Duszek wydaje resztę
Ostatnim elementem oprogramowania automatu będzie wydanie reszty zgodnie z wyznaczoną liczbą monet o poszczególnych nominałach. Odpowiedzialny za to będzie duszek Monety, po otrzymaniu komunikatu wydaj resztę. Zwróć uwagę, że duszek jest jeden (ma sześć kostiumów, poszczególne nominały monet), a na scenie należy wyświetlić kilka monet, często także o takich samych nominałach. Umożliwia to mechanizm klonowania duszków. Więcej o klonowaniu duszków dowiesz się tutajiwePopYOpl_d1111e593tutaj.
Ćwiczenie 25
Zapisz w postaci listy kroków algorytm generowania (klonowania) duszków monet zgodnie z ustawieniami na liście reszta.
Ustaw pomocniczą zmienną i na 1.
Ustaw pierwszy kostium (największy nominał: 5zł).
Powtórz dla każdego nominału monety:
Powtórz reszta[i] razy:
Sklonuj siebie.
Czekaj chwilę (np. 0.5 sekundy).
Zwiększ wartość zmiennej i o 1.
Zmień kostium na następny.
Zatrzymaj ten skrypt.
Ćwiczenie 26
Przygotuj skrypty dla duszka Monety:
Uruchamiany po otrzymaniu komunikatu wydaj resztę zgodnie z algorytmem z poprzedniego zadania.
Uruchamiany w wyniku wystąpienia zdarzenia Kiedy zaczynam jako kloniwePopYOpl_d1111e593Kiedy zaczynam jako klon (duszek powinien pokazać się na scenie w losowym miejscu i wydać dźwięk wypadającej monety).
RCLv0nAEc06Y81
RrkjOUbbPCjtq1
iwePopYOpl_d1111e593
W kategorii Kontrola znajdują się trzy klocki związane z tworzeniem i obsługą kopii (klonów) duszków podczas działania programu. Klocki te nie są dostępne dla sceny. Kliknięcie w zieloną flagę lub przycisk stop (także wykonanie klocka zatrzymaj wszystko) automatycznie usuwa wszystkie kopie (klony).
RANVit8Y40ahs1
Klocek umożliwia duszkowi utworzenie swojej kopii lub kopii dowolnego innego duszka wybranego z listy rozwijalnej (na liście znajdują się nazwy wszystkich duszków z obszaru zarządzania duszkami). Nowo utworzony duszek posiada wszystkie cechy i funkcjonalności swojego wzorca. Po utworzeniu rozpoczyna się automatycznie wykonywanie skryptu rozpoczynającego się od klocka:
R23P36Q56ki4e1
Można także programowo usuwać utworzonego duszka – klona. Jeśli w skryptach zostanie użyty klocek
R1WUbhDKWcm091
duszek – klon zostanie usunięty. Zwróć uwagę, że pod ten klocek nie można podczepić żadnego innego. Jak duszek zostanie usunięty, to nie może już wykonywać innych czynności. Przykład: Na niebie (niebieskim tle sceny) co 1 sekundę pojawia się w losowym miejscu gwiazdka. Kliknięcie w gwiazdkę powoduje jej usunięcie.