Rýchlokurz micro:bit/08 Počítadlo
Zo stránky SensorWiki
← Predchádzajúca lekcia | ⌂ Obsah kurzu | Nasledujúca lekcia →

Čo sa naučíte
- používať premennú na uchovanie stavu programu,
- meniť jednu premennú z viacerých častí programu,
- čo sú globálne a lokálne premenné a prečo Python potrebuje slovo
global.
Vysvetlenie: premenná ako pamäť programu
Usporiadateľ pri vchode do sály drží v ruke mechanické počítadlo a pri každom návštevníkovi stlačí tlačidlo. Naprogramujeme jeho elektronickú verziu. Tlačidlo A pripočíta návštevníka, tlačidlo B ho odpočíta (ak niekto odišiel) a obe tlačidlá naraz počítadlo vynulujú.
Kľúčová je tu premenná pocet. Doteraz sme premenné používali hlavne na pohodlné nastavenie hodnoty. Teraz premenná slúži ako pamäť: uchováva informáciu, ktorá vzniká počas behu programu a ktorú by sme inak nemali kde uložiť. Hodnota premennej v danej chvíli sa nazýva stav programu.
Premennú budú meniť tri rôzne obsluhy udalostí a čítať ju bude cyklus forever. Všetky štyri časti programu teda musia pracovať s tou istou premennou. Preto ju vytvoríme mimo nich, na najvyššej úrovni programu. Takáto premenná sa nazýva globálna a je dostupná z celého programu. Naopak premenná vytvorená vnútri funkcie je lokálna: existuje len počas vykonávania danej funkcie a zvonku o nej nikto nevie.
Program: počítadlo návštevníkov
-
Program v blokoch...
let pocet = 0
input.onButtonPressed(Button.A, function () {
pocet += 1
})
input.onButtonPressed(Button.B, function () {
if (pocet > 0) {
pocet += -1
}
})
input.onButtonPressed(Button.AB, function () {
pocet = 0
})
basic.forever(function () {
basic.showNumber(pocet)
})
pocet = 0
def on_button_pressed_a():
global pocet
pocet += 1
input.on_button_pressed(Button.A, on_button_pressed_a)
def on_button_pressed_b():
global pocet
if pocet > 0:
pocet += -1
input.on_button_pressed(Button.B, on_button_pressed_b)
def on_button_pressed_ab():
global pocet
pocet = 0
input.on_button_pressed(Button.AB, on_button_pressed_ab)
def on_forever():
basic.show_number(pocet)
basic.forever(on_forever)
Ako to funguje
Program má jasne rozdelené úlohy:
- obsluhy udalostí menia stav (hodnotu premennej
pocet), - cyklus forever stav neustále zobrazuje.
Žiadna obsluha sa nemusí starať o displej a zobrazovanie sa nemusí starať o tlačidlá. Takéto rozdelenie programu na nezávislé časti, ktoré spolu komunikujú cez spoločný stav, je veľmi užitočný návyk. Aj veľké programy sa skladajú z častí, ktoré majú každá jednu jasnú úlohu.
Obsluha tlačidla B obsahuje podmienku: počet sa zníži, len ak je väčší ako nula. Záporný počet návštevníkov nedáva zmysel. Takejto kontrole sa hovorí ošetrenie hraničného prípadu a dobrý program ju má všade, kde môže vzniknúť nezmyselný stav.
Zápis pocet += -1 je to isté ako pocet = pocet - 1. MakeCode takto prekladá blok change pocet by -1. Bežnejší zápis je pocet -= 1, oba sú správne.
Prečo je v Pythone slovo global?
Python má pravidlo: ak funkcia do premennej niečo priraďuje, považuje ju za lokálnu, teda za novú premennú, ktorá existuje len vnútri funkcie. Bez riadku global pocet by si napríklad obsluha oboch tlačidiel príkazom pocet = 0 vytvorila vlastnú lokálnu premennú pocet, vynulovala by ju a globálne počítadlo by zostalo nezmenené. V obsluhe tlačidla A by bez global vznikla chyba, pretože pocet += 1 sa snaží čítať lokálnu premennú, ktorá ešte nemá hodnotu. Riadok global pocet hovorí: „v tejto funkcii myslím tú globálnu premennú pocet“.
Funkcia on_forever slovo global nepotrebuje, pretože premennú len číta a nič do nej nepriraďuje. JavaScript tento problém rieši inak: premenná deklarovaná slovom let na najvyššej úrovni je automaticky dostupná vo všetkých funkciách. MakeCode pri preklade z blokov doplní global automaticky, ale pri písaní textom naň musíte myslieť sami.
Časté chyby
- Nastavenie
pocet = 0v cykle forever. Počítadlo by sa neustále nulovalo. - Chýbajúci
globalv Pythone. Niekedy vznikne chyba, ale pri obyčajnom priradení (napr.pocet = 0) program nič nehlási, len nefunguje správne. Takéto chyby sa hľadajú najťažšie. - Pomalé zobrazenie. Viacciferné číslo sa posúva po displeji niekoľko sekúnd. Stlačenia tlačidiel sa počas toho započítajú, ale nové číslo sa ukáže až po dobehnutí predchádzajúceho.
Úlohy
- Vyskúšajte v textovom zobrazení Pythonu zmazať riadok
global pocetv obsluhe oboch tlačidiel (A+B). Funguje ešte nulovanie? Vysvetlite prečo. Potom to isté skúste v obsluhe tlačidla A a porovnajte, ako sa MakeCode zachová. - Sála má kapacitu 20 miest. Upravte obsluhu tlačidla A tak, aby pri plnej sále počet nezvýšila, ale zobrazila ikonu No.
- Doplňte do cyklu forever podmienku: ak je sála plná, zobrazí sa namiesto čísla ikona Skull, inak číslo.
- (len V2) Pri každom novom návštevníkovi nech micro:bit krátko pípne. Použite blok z kategórie Music.
← Predchádzajúca lekcia | ⌂ Obsah kurzu | Nasledujúca lekcia →