Projektowanie automatu biletowego w programie Scratch
Scenariusz projektu
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ść.
1
Polecenie 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 Warszawskiego Transportu Publicznego według stanu na początek 2023 roku.
https://www.wtp.waw.pl/ceny-i-rodzaje-biletow
R1WBZT31q28Eu
R1bmuyLQ9mT7q
RGpiSmxBEFVVH
R9RZBl8U7RVGy
R16QPMd61NDaw
R1HbTO8onS8Jc
W poniższym polu tekstowym możesz zapisywać swoje notatki związane z ćwiczeniami poniżej.
RvsY66NglpvYZ
1
Ćwiczenie 1
Zaplanuj działania, które 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ę.
Możesz się zasugerować automatami biletowymi, które znajdują się w twoim lub innym pobliskim mieście. Zazwyczaj najpierw określasz, czy jesteś uprawniony do zniżek, potem ustalasz rodzaj biletu, liczbę biletów oraz sposób zapłaty.
Przykładowy opis działań na kolejnych ekranach:
Wybór biletu pomiędzy ulgowym i normalnym.
Wybór rodzaju biletu (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.
1
Ćwiczenie 2
Zaprojektuj wygląd kolejnych ekranów automatu.
Zastanów się, które elementy będą duszkami, a które – tylko rysunkami kolejnych teł.
Elementy, 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 ćwiczenia 1. Najlepiej, jak zaprojektujesz własne ekrany zgodnie z twoją propozycją rozwiązania ćwiczenia 1. Ekran 1: Wybór pomiędzy biletem ulgowym i normalnym. Przyciski Ulgowy i Normalny będą duszkami.
RZTtXTJ0OWDvG
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.
R1KnGRS53q1uf
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. Obrazka 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.
R186N4XpNV3lt
Ekran 4: Obliczenie kwoty do zapłaty oraz oczekiwanie na zapłatę. Przykładowy ekran po wybraniu 3 biletów ulgowych 20‑minutowych.
RASFt4Z29QWwc
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
Re2GXHx5Fpp3O
1
Ćwiczenie 2
Zaproponuj wygląd automatu do biletów, z którego będzie można w łatwy i intuicyjny sposób skorzystać.
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.
RKs7YFPWC3PbS
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 – kota (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
1
Ćwiczenie 3
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 autorskichPHAguK9Zupamię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 Zarządu Transportu Miejskiego w Warszawie.
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ł, 1 zł, 50 gr, 20 gr, 10 gr. Wzorce monet zostały pobrane ze strony Narodowego Banku Polskiego.
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.
R1LYxmBbXI4Lu
R13Y0S6pNEx3o
RGsh7RSDGnq5L
R1A1eyP6m4O36
RadAUEP0usfSP
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ę.
R7cR3geryGVJr
2
Ćwiczenie 4
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 jeśli 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).
W celu załadowania duszków do projektu skorzystaj z opcji: Wczytaj duszka.
R2gf4dvq6tkKS
Poprawnie załadowane 11 duszków:
RKrxDj7XYxzK4
Przykładowy skrypt, którego kopia znajduje się w każdym duszku:
Rsd3cMCo2GQpt
Wybieramy rodzaj biletu
Pierwszy ekran przykładowej aplikacji dokonuje tylko wyboru pomiędzy biletem ulgowym a normalnym. Na scenie widoczne są dwa duszki – przyciski Ulgowy i Normalny. Po kliknięciu jednego 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 tutajnadawanie_i_odbieranie_komunikatówtutaj.
2
Ćwiczenie 5
Przygotuj odpowiedni skrypt dla sceny wybierający pierwsze tło i czyszczący scenę.
Po uruchomieniu aplikacji zieloną flagą powinien być widoczny pierwszy ekran automatu biletowego.
Przykładowy skrypt:
R1DBum11H3ChH
2
Ćwiczenie 6
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 jego kliknięciu, 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 zielonej flagi – 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.
Przykładowe skrypty:
R11w3GJ0aMyrq
2
Ćwiczenie 7
Utwórz skrypty dla przycisku Normalny. Będą one analogiczne, jak dla poprzedniego przycisku.
Pamiętaj o nadaniu innego komunikatu, np. normalny.
Przykładowe skrypty:
R3FAm6aHC86sN
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ę. Aby zapamiętać, jaki bilet został wybrany, posłużymy się zmienną. Będzie ona przyjmowała wartości od 1 do 6, a każda z tych wartości będzie oznaczała inny rodzaj biletu (np. wartość 1 – bilet normalny 20‑minutowy, wartość 2 – bilet normalny 75‑minutowy).
2
Polecenie 2
Utwórz zmienną do pamiętania wybranego biletu, dostępną dla wszystkich duszków. Nazwij ją np. rodzaj. Niech wartości od 1 do 3 określają bilety normalne, a wartości od 4 do 6 – odpowiadające im bilety ulgowe.
blok_stempluj_dymek
Blok Stempluj znajduje się w kategorii Pisak. Jeżeli kategoria Pisak nie pokazuje Ci się domyślnie po lewej stronie aplikacji Scratch, musisz dodać ją, wchodząc w opcję Dodaj rozszerzenie. Przycisk znajduje się w lewym dolnym rogu programu Scratch.
R8GQJBtgHFRai
Użycie bloku Stempluj powoduje odbicie podobizny duszka na scenie. Utworzony w ten sposób obraz nie może być w żaden sposób kontrolowany innymi skryptami. Odbity zostanie aktualnie wybrany kostium duszka. Stempel nie rysuje po duszkach, które aktualnie znajdują się na scenie.
R6eAuT8R0zjmp
Do usunięcia wszystkich stemplowanych obrazów wykorzystaj blok Wyczyść wszystko.
R1amiyLFVErAe
Poniżej znajduje się przykładowy skrypt z wykorzystaniem bloku Stempluj. Duszek przesuwa się o 100 kroków, następnie wykorzystywany jest blok Stempluj, który tworzy graficzną kopię aktualnego kostiumu duszka. Te dwie czynności powtarzane są trzy razy.
R1KYuT9TsYcDI
Ważne!
Wykorzystaj w swoich skryptach blok Stemplujblok_stempluj_dymekStempluj. Umożliwi Ci on duplikowanie wizerunku duszka na scenie.
2
Ćwiczenie 8
Zaplanuj czynności, które należy przewidzieć dla duszka – biletu. Staraj się tak je zaplanować, aby były uniwersalne niezależnie od rodzaju biletu.
Następnie przygotuj skrypty na podstawie zaplanowanych czynności.
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 zielonej flagi.
po otrzymaniu komunikatu o wyborze biletu ukrycie duszka.
Duszka, 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.
Przykładowe skrypty biletu 20‑minutowego. Dla innych biletów mogą się różnić pozycją na scenie, wyborem kostiumu i wartością zmiennej rodzaj.
Skrypty inicjalizujące:
R1SQdBX6V9dtD
Skrypt – wybór biletu:
R1dnYYY8RPkVn
Skrypt kończący po wyborze rodzaju biletu:
RIqabPgyIDOcv
2
Ćwiczenie 8
Zaplanuj czynności, które należy przewidzieć dla skryptu odpowiedzialnego za wybór biletu. Staraj się tak je zaplanować, aby były uniwersalne niezależnie od rodzaju biletu.
2
Polecenie 3
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.
nadawanie_i_odbieranie_komunikatów
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:
R1KhnmEvYpM10
RxPHtwjBwBckY
Nazwę nadawanego komunikatu można wybrać z listy rozwijalnej lub zdefiniować nowy komunikat przy pomocy opcji nowy komunikat…, dostępnej po rozwinięciu listy.
R1cgsXstZ2MbV
Wyświetlone będzie wówczas okno dialogowe, w którym należy podać nazwę nowego komunikatu.
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.
RtUjVm25RA6n6
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:
R1pypL5ERHeS5
R183iRHgQB9lE
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ę.
2
Ćwiczenie 9
Przygotuj skrypty dla duszków – strzałek. W podpowiedzi znajdziesz algorytmy, według których należy je przygotować.
Po otrzymaniu komunikatu wybrano bilet należy pokazać duszka.
Po kliknięciu 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.
Przykładowe 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.
RRctr5v70etdR
2
Ćwiczenie 10
Przygotuj skrypty dla duszka reprezentującego liczbę kupowanych biletów. W podpowiedzi znajdziesz algorytmy, według których należy je przygotować.
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.
Przykładowe skrypty reagujące na otrzymanie komunikatów wybrano bilet, mniej oraz więcej.
RVBketphzu6Uq
2
Ćwiczenie 11
Przygotuj skrypty dla przycisku Kupuję. W podpowiedzi znajdziesz algorytmy, według których należy je przygotować.
Po otrzymaniu komunikatu wybrano bilet należy pokazać duszka.
Po kliknięciu duszka należy go ukryć i nadać komunikat kupuję.
Przykładowe skrypty:
R1WtNx8RHs0rn
Projektujemy listy cen biletów, nominałów monet i reszty
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_d1111e54911123tutaj. 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.
2
Ćwiczenie 12
Utwórz listy do pamiętania cen poszczególnych biletów, nominałów monet oraz liczby wydawanych monet o poszczególnych nominałach. Utwórz bloki inicjalizujące listy. Pamiętaj, że liczba biletów i ich rodzajów musi być zgodna z Twoim projektem.
Listę cen biletów zaplanuj zgodnie z wartościami zmiennej rodzaj. Tzn. jeśli zmienna rodzaj przyjmuje wartość 1 dla biletu normalnego 20‑minutowego, to na pierwszym miejscu listy powinna być cena tego biletu.
Listę z nominałami monet przygotuj uporządkowaną malejąco: od największego do najmniejszego nominału.
Listę z liczbami monet do wydania jako reszta wypełnij wartościami 0 (nie wiemy jeszcze, czy i jaką resztę trzeba będzie wydać).
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.
Przykładowe skrypty:
RrNI7KYvSwbws
R1e1GrMz9pu1M
RaypwXKNSjNGd
R19vREFK6Vvet
iwePopYOpl_d1111e54911123
Często zachodzi potrzeba przechowania większej ilości 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ąć przycisk Stwórz listę, w polu edycyjnym wpisać nazwę nowo tworzonej listy (można także wybrać, czy będzie dostępna dla wszystkich duszków, czy tylko jednego) i zatwierdzić przyciskiem OK.
R1JGjqTza7RNe
Po utworzeniu listy w kategorii Dane są do dyspozycji klocki umożliwiające operacje na liście.
RFhBirjikjUMr
Dodanie nowego elementu na końcu listy.
R15USYS48OLjT
Usunięcie elementu o określonym indeksie (numerze elementu) lub wszystkich elementów (jeśli z pierwszej listy rozwijalnej zostanie wybrana opcja wszystko).
RZ9VGZGHvbXhL
Wstawienie nowego elementu na pozycji o podanym indeksie.
RJDuFqKiU3xJW
Zmiana wartości elementu na pozycji o podanym indeksie.
R1NjfourZ4MZ2
Wartość elementu na pozycji o podanym indeksie.
RtROUVeSEbkvW
Wartością jest liczba elementów listy.
R1GCr2mpHvsYD
Sprawdzenie, czy na liście znajduje się określony element.
Przykład:
REpL1hEYVzjri
R15m5o3gh3dQZ
Lista może być widoczna na scenie lub ukryta. Widoczność można zmieniać edycyjnie, włączając/wyłączając znacznik przy liście,
R15IpiyUHwqqt
lub programowo, przy pomocy klocków:
RP0vIi5qRM7Ok
iwePopYOpl_d1111e427
Pojęcia bit i bajt mają istotne znaczenie w dziedzinie informatyki. Bit może przyjąć jedno z dwóch możliwych stanów, które oznacza się jako 0 i 1. Bajt natomiast składa się z 8 bitów. W komputerze liczby są przechowywane przy użyciu bajtów pamięci. Warto zaznaczyć, że liczby w informatyce są zawsze ograniczone, ponieważ są reprezentowane w określonym zakresie. Na przykład liczby całkowite mogą być dokładnie przechowywane, podczas gdy większość liczb rzeczywistych jest przechowywana w przybliżeniu, nawet te niewymierne. Ponadto istnieje ograniczenie dotyczące liczby stanów, które można zapisać na określonej liczbie bitó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.
RnsVoYB0ARK9v
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.
R1MK2mMKR80ks
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:
R1C80umkQIcSg
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ładnością do 0.01. Warunek pętli może być następujący:
RWEXe2BZleuSx
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.
Rm0qfokMllefm
Na poniższym filmie możesz obejrzeć, jak utworzyć i wykorzystać własny blok.
R19fZKLFbXL76
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ąć go 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ć.
R1Dq8tSs3YYiR
Na poniższym filmie możesz obejrzeć, jak utworzyć i wykorzystać własny blok z parametrem.
RS0lFzyVjb7J3
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ę.
Polecenie 4
Utwórz zmienną, np. o nazwie kwota do zapłaty, której zadaniem będzie zapamiętanie obliczonej wartości kupowanych biletów. Będzie to wygodne rozwiązanie, dzięki któremu program będzie bardziej przejrzysty.
2
Ćwiczenie 13
Zapisz w postaci listy kroków działanie duszka‑kota na czwartym ekranie. Duszek powinien obliczyć wartość biletów i poinformować, czy zapłacona kwota jest wystarczająca. Jeśli wystąpi konieczność wydania reszty, nadaj komunikat wydaj resztę.
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ą.
Przykładowy skrypt:
Zmień tło na kolejne.
Wyczyść scenę.
Pokaż duszka.
Ustaw wartość zmiennej kwota do zapłaty na:
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: 6.1. Powiedz „Niestety za mała kwota…”. 6.2. Zatrzymaj ten skrypt.
Jeżeli wprowadzona kwota jest równa kwocie do zapłaty: 7.1. Powiedz „Dziękuję, odliczyłeś dokładną kwotę”. 7.2. Zatrzymaj ten skrypt.
Ukryj duszka.
Nadaj komunikat wydaj resztę.
Zatrzymaj ten skrypt.
2
Ćwiczenie 14
Utwórz skrypt uruchamiany po otrzymaniu komunikatu kupuję według algorytmu z rozwiązania poprzedniego ćwiczenia.
Do wyświetlenia napisu złożonego z tekstu i wartości zmiennej użyj polecenia połącziwePopYOpl_d1111e498połącz.
Przykładowy skrypt:
R1Y4DFUYLSoDu
iwePopYOpl_d1111e498
RiSjzbeAAYZGn
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:
R83nrbZfsRKE7
Duszek oblicza resztę
Kwota 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.
2
Ćwiczenie 15
Podaj sposób ustalenia liczby monet poszczególnych nominałów, jakie ma wydać automat jako resztę z wprowadzonej przez kupującego kwoty.
Istnieje kilka sposobów na wydanie reszty. Na przykład resztę można wydać samymi monetami 10‑groszowymi. Postaraj się jednak znaleźć algorytm, który będzie minimalizował liczbę wydanych monet.
Algorytm 1
Weź monetę o najmniejszym nominale, czyli 10 gr, i oblicz, 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.
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.
2
Ćwiczenie 16
Zapisz w postaci listy kroków algorytm wydawania reszty minimalizujący liczbę wydawanych monet.
Żeby zminimalizować liczbę wydawanych monet, trzeba zacząć od jak największych nominałów. Żeby to zrealizować, najpierw trzeba znaleźć największy istniejący nominał, który jest mniejszy od reszty. Potem sprawdzić, ile maksymalnie egzemplarzy tego nominału można wydać oraz pomniejszyć resztę o wartość tych monet. Operację należy powtarzać, aż reszta będzie równa 0.
Dane:
kwota reszty – 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 reszty. Kolejność monet jest zgodna z kolejnością na liście monety.
Ustaw elementy listy reszta na zero.
Powtarzaj, aż kwota reszty będzie równa zero: 2.1. Ustaw zmienną i na 1. 2.2. Powtórz dla każdego elementu listy monety: ⠀ 2.2.1. ustaw element reszta[i] na część całkowitą wyrażenia kwota reszty / monety[i]. ⠀ 2.2.2. ustaw wartość zmiennej kwota reszty na kwota reszty – reszta[i] * monety[i]. ⠀ 2.2.3. zwiększ wartość zmiennej i o 1.
Zatrzymaj ten skrypt.
Ważne!
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ą.
2
Ćwiczenie 17
Utwórz nowy blokiwePopYOpl_d1111e449nowy blok dla duszka wydającego resztę zgodnie z algorytmem z poprzedniego ćwiczenia. Parametrem bloku będzie kwota reszty wyrażona w groszach. Nie musisz zerować listy reszta, zostało już to zrobione podczas tworzenia listy (po kliknięciu zielonej flagi).
Pamiętaj, że w nowo utworzonym bloku Scratcha nie można zmieniać wartości przekazanego parametru (w tym przypadku kwota reszty), więc musisz utworzyć pomocniczą zmienną, na przykład kwota. Do obliczenia części całkowitej liczby możesz wykorzystać funkcję podłogaiwePopYOpl_d1111e549podłoga.
Do realizacji zadania wykorzystaj zmienną pomocniczą. W poniższym przykładzie nazwano ją kwota.
R1OCBeH2BzPeF
2
Ćwiczenie 18
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, że parametrem bloku jest liczba całkowita, która jest kwotą reszty w groszach.
Do zaokrąglenia wartości liczby rzeczywistej możesz wykorzystać bloczek zaokrąglijiwePopYOpl_d1111e568zaokrąglij.
R1Jfap8KmDJGE
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
R17nIlfcC4T8A
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.
RiR4rmVDnQB2T
Przykłady:
RlbTfhyPaZkev
RlWC6NgW9IKuv
R1Kad6333ZqSS
RTRpv6btGAQTt
iwePopYOpl_d1111e568
R1SAFDbqA52eM
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:
ROWhTjsDQDLat
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.
2
Ćwiczenie 19
Przygotuj dwa skrypty związane z wydawaniem reszty dla duszka Monety:
Uruchamiany po otrzymaniu komunikatu wydaj resztę. Jego zadaniem jest tworzenie/generowanie klonów duszka Monety zgodnie z ustawieniami na liście reszta.
Uruchamiany w wyniku wystąpienia zdarzenia gdy zaczynam jako kloniwePopYOpl_d1111e593gdy zaczynam jako klon (duszek powinien pokazać się na scenie w losowym miejscu i wydać dźwięk wypadającej monety).
W podpowiedzi znajdziesz algorytmy, według których należy przygotować skrypty.
Ustaw pomocniczą zmienną i na 1.
Ustaw pierwszy kostium (największy nominał: 5 zł).
Powtórz dla każdego nominału monety: 3.1. Powtórz reszta[i] razy: ⠀ 3.1.1. Sklonuj siebie. ⠀ 3.1.2. Czekaj chwilę (np. 0.5 sekundy). 3.2. Zwiększ wartość zmiennej i o 1. 3.3. Zmień kostium na następny.
Zatrzymaj ten skrypt.
R1NJrKpIvoETI
R4OErEVFols8R
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 zielonej flagi lub przycisku stop (także wykonanie klocka zatrzymaj wszystko) automatycznie usuwa wszystkie kopie (klony).
R18PFm19cqiot
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:
RheEgK0KkwABY
Można także programowo usuwać utworzonego duszka – klona. Jeśli w skryptach zostanie użyty klocek
RaplSKKSILCmn
duszek – klon zostanie usunięty. Zwróć uwagę, że pod ten klocek nie można podczepić żadnego innego. Jeśli 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 gwiazdki powoduje jej usunięcie.