Lekce 6 - Jednoduchá kalkulačka ve Scratchi
V minulé lekci, Načítání hodnot od uživatele ve Scratchi, jsme se naučili načítat hodnoty zadané uživatelem a dále je zpracovávat.
V dnešním Scratch tutoriálu naučíme kočičáka počítat 🙂 Vytvoříme si jednoduchou kalkulačku a procvičíme si při tom témata minulých lekcí, a to načítání uživatelských vstupů a práci s proměnnými. Ke konci si ještě ukážeme chyby, kterých se musíme pro správné fungování naší aplikace vyvarovat.
Jednoduchá kalkulačka
Teď, když už umíme načítat vstup a různě ho zpracovat, pojďme si zkusit napsat slibovanou kalkulačku 😉 Bude velmi jednoduchá. Na vstup přijdou dvě čísla a program poté vypíše výsledky pro sčítání, odčítání, násobení a dělení.
Založíme si nový projekt a klasicky začneme přidáním bloku po kliknutí na (vlaječka):

Z bloků Vnímání přilepíme blok otázka a přepíšeme
jeho text na Zadej první číslo:

Teď se musíme trochu zamyslet 🙂 Chceme se zeptat na dvě
čísla, ale odpověď, se kterou program pracuje je
vždy jenom jedna. Když se teď zeptáme na první číslo a
hned i na druhé, tak v odpovědi bude vždy pouze poslední zadané
číslo. Kdyby uživatel zadal číslo 2
a pak číslo
8
, program by nepočítal 2 + 8
, ale
8 + 8
! Jak to tedy uděláme?
Použijeme nám známou proměnnou 😉 Do té si uložíme první odpověď a do další proměnné pak druhou odpověď. Takto může uživatel zadat několik čísel a my s nimi budeme moci pracovat 🙂 Pojďme na to.
Tvorba proměnných
V bloku Proměnné si vytvoříme proměnné cislo1
a
cislo2
:

V programování se pro názvy proměnných nikdy nepoužívají háčky a čárky a už vůbec mezery 😉
Teď vezmeme blok nastav na a přilepíme ho k našemu programu:

Klikneme na blok otázka v našem programu a zmáčkneme klávesy Ctrl + C. Pak klikneme kamkoliv vedle a zmáčkneme klávesy Ctrl + V. Část kódu se nám nakopíruje:

Blok, který se nám nakopíroval si trochu upravíme. Do bloku
otázka napíšeme Zadej druhé číslo:
a v bloku
nastav na nebudeme nastavovat proměnnou cislo1
, ale
cislo2
:

Upravenou část kódu přilepíme k našemu současnému kódu:

Potom místo nul dáme do bloků nastav na bloky odpověď z bloků Vnímání:

Operátory a výpis výsledků
Teď už jenom zbývá, aby nám kočičák výsledky vypočítal. Přejdeme do bloků Vzhled a přilepíme za sebe pět bloků bublina sekund:

Dále přejdeme do bloků Operátory a přetáhneme si do hlavního okna čtyři bloky spoj:

Přepíšeme v nich políčko jablko
postupně na
Součet:
, Rozdíl:
, Součin:
,
Podíl:

Vedle každého bloku spoj přidáme odpovídající operátory. Vedle součtu bude operátor plus a tak dále:

Přejdeme do bloků Proměnné a do všech bloků s operátory
přidáme na první místo proměnnou cislo1
a na druhé místo
cislo2
:

Každý z operátorů přesuneme do odpovídajícího bloku spoj na druhou pozici:

Bloky spoj teď přesuneme do bloků bublina:

Do posledního bloku bublina napíšeme
Děkuji za možnost procvičit si matematiku!
:

Když teď program spustíme, náš kočičák nám příklady, které mu zadáme, pěkně vypočítá:

Chyby při tvorbě kalkulačky
Když jsme lekci tvořili, napadlo nás několik chyb, které bychom mohli při tvorbě kalkulačky udělat. Pojďme si je ukázat a vysvětlit si, proč se to tak nedělá 😉
Blok na spojování
Pro sčítání jsme u kalkulačky použili operátor plus. Spojili jsme tak vlastně dvě čísla dohromady v jedno. Co kdybychom ale použili místo operátoru plus blok spoj? Pojďme si to vyzkoušet.
Nejprve v horním panelu klikneme na Soubor a Uložit jako kopii. Tím se nám projekt naklonuje. Kopii můžeme teď tak trochu rozbít, aniž bychom si zničili naši funkční kalkulačku:

Z kopie našeho programu odstraníme všechny bloky bublina kromě prvního a posledního:

Nyní vyndáme z bloku spoj operátor plus:

Proměnné cislo1
a cislo2
přendáme z bloku
plus do bloku spoj a ten přesuneme zpět do bubliny:

Když to uděláme, vidíme, že náš kočičák už tak dobře nesčítá:

Možná si pamatujete, jak jsme si říkali o datových typech.
Právě kvůli nim nám kalkulačka teď nefunguje. Pokud cokoliv umístíme do
bloku spoj, i když to je třeba číslo, Scratch to
převede na text. V tu chvíli je jedno, jestli je v bloku spoj
třeba 12
a 5
nebo Ahoj
a
mami!
. Scratch vždy hodnoty vezme a jednoduše je nalepí hned za
sebe. Odpověď kočičáka tedy vlastně není sto dvacet
pět, ale dvanáct pět 😉
Text ve sčítacím bloku
Když jsme si ukázali, co se stane s číslem v bloku spoj, vyzkoušejme si ještě pravý opak. Co se stane, když zadáme text tam, kde se očekává číslo? Použijeme několikrát klávesovou zkratku Ctrl + Z, dokud nedostaneme do bubliny zpět náš operátor plus:

Když program spustíme a zadáme místo čísel text bude odpověď kočičáka poměrně neutrální:

Proč nám kočičák odpověděl zrovna 0
? Pokoušíme se
nařídit počítači, aby sečetl něco, co není číslo. Scratch si pozdrav
kočičákovi ve sčítacím bloku převede na hodnotu NaN
. Jde o
zkratku anglického Not a Number, česky není
číslo. A protože náš program nenašel žádná čísla k
sečtení, kočičák tedy prohlásí, že výsledek je nula, i když by
správně měl říct, že jsme nezadali čísla.
Samozřejmě bychom mohli program udělat tak, aby uživateli vyhuboval, když místo čísla zadá text. K tomu ovšem budeme muset nejdříve znát podmínky a další vychytávky programování, o kterých se teprve budeme učit. Zatím se tak jenom můžeme těšit, že zanedlouho zatneme šprýmařům, kteří náš program rozbíjejí, tipec 😉
Dělení nulou
Nakonec se podíváme, co se stane, když budeme chtít dělit nulou. Můžeme si to naschvál vyzkoušet na skutečné kalkulačce. Když budeme chtít dělit jakékoliv číslo nulou, kalkulačka zahlásí chybu:

Nebudeme zabíhat do podrobností, jistě už z matematiky víme, že nulou se prostě dělit nedá. Jak rozdělíme čokoládu mezi nula lidí? Nijak, protože ji nemáme mezi koho rozdělit. Ti lidé neexistují, ale musíme mezi ně rozdělit čokoládu. To je nemožné a přesně to nám řekne i kalkulačka. To jsme ale odbočili 🙂
Pojďme zjistit, jak bude reagovat Scratch, když to naschvál porušíme.
Nejprve nahradíme operátor plus operátorem děleno a místo
Součet:
zadáme do bubliny Podíl:

A nyní zkusíme jako druhé číslo zadat nulu:

Jak vidíme, právě jsme přišli na trik, jak našeho kočičáka naučit anglicky 🙂
Teď bez legrace. Kočičák nám řekl, že výsledek dělení nulou je
Infinity
, česky nekonečno. Podle názoru některých
programátorů by dělení nulou mělo také vracet NaN
. Jiní si
myslí, že hodnota Infinity
je lepší volba.
Nejjednodušší vysvětlení této logiky je asi toto. Mějme příklad
12:6
. Asi nás nepřekvapí, že výsledek je 2
. Jak
se můžeme zpátky dostat k číslu 12
? Řekneme si, že
šestka se vejde do dvanáctky dvakrát. Co když tuto logiku
tedy použijeme při dělení nulou? Kolikrát se vejde 0
do
12
? Nekonečněkrát, protože můžeme pořád přidávat nuly,
ale nikdy se nedostaneme na dvanáctku ani jiné číslo.
Vidíme, že naše kalkulačka bude potřebovat podobné situace ještě ošetřit. K tomu budeme muset použít pokročilejší triky. Nemusíme si zoufat, v rámci tohoto kurzu se je spolu ještě všechny naučíme 😉
V příští lekci, Podmínky (větvení) ve Scratchi, se naučíme větvit naše programy pomocí podmínek, popíšeme si relační operátory a vytvoříme program, který podle zadaného věku zjistí, zda jsme dospělí.