Operácie

Rýchlokurz micro:bit/08 Počítadlo

Zo stránky SensorWiki

← Predchádzajúca lekcia | ⌂ Obsah kurzu | Nasledujúca lekcia →

Mechanické počítadlo návštevníkov

Č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

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 = 0 v cykle forever. Počítadlo by sa neustále nulovalo.
  • Chýbajúci global v 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

  1. Vyskúšajte v textovom zobrazení Pythonu zmazať riadok global pocet v 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á.
  2. 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.
  3. Doplňte do cyklu forever podmienku: ak je sála plná, zobrazí sa namiesto čísla ikona Skull, inak číslo.
  4. (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 →