Operácie

Rýchlokurz micro:bit/05 Cyklus while

Zo stránky SensorWiki

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

Čo sa naučíte

  • opakovať príkazy, kým platí nejaká podmienka,
  • čo je podmienka (logický výraz) a ako sa zapisuje,
  • kedy použiť cyklus for a kedy while.

Vysvetlenie: cyklus s podmienkou

Pri cykle for vieme vopred, koľkokrát sa má telo zopakovať. Niekedy to však dopredu nevieme, napr. „bľakaj šípkou, kým používateľ nestlačí tlačidlo“. Nevieme, či to bude o sekundu alebo o hodinu. Na takéto situácie slúži cyklus while (po slovensky „kým“, „pokiaľ“).

Cyklus while funguje takto:

  1. Vyhodnotí podmienku.
  2. Ak podmienka platí, vykoná telo cyklu a vráti sa na krok 1.
  3. Ak podmienka neplatí, cyklus skončí a program pokračuje za ním.

Podmienka (odborne logický výraz) je otázka, na ktorú existuje len odpoveď áno alebo nie (true / false). Najčastejšie vzniká porovnaním dvoch hodnôt:

Význam Zápis v JS aj Pythone Príklad
rovná sa == x == 0
nerovná sa != x != 0
menšie, menšie alebo rovné <, <= teplota < 20
väčšie, väčšie alebo rovné >, >= body >= 10

Všimnite si, že porovnanie sa píše dvoma rovnítkami ==. Jedno rovnítko = je priradenie (vložiť hodnotu do premennej), dve rovnítka sú otázka „rovnajú sa?“.

Podmienku môže dodať aj senzor alebo tlačidlo. Napr. blok button A is pressed (kategória Input) má hodnotu true, keď je tlačidlo práve stlačené, inak false. Opak podmienky vytvoríme logickým operátorom not (v JS !, v Pythone not).

Program: čakanie na tlačidlo

Program po zapnutí bliká šípkou smerujúcou k tlačidlu A, kým ho používateľ nestlačí. Potom zobrazí fajku. Blok while nájdete v kategórii Loops, blok not v kategórii Logic.

while (!(input.buttonIsPressed(Button.A))) {
    basic.showArrow(ArrowNames.West)
    basic.clearScreen()
    basic.pause(200)
}
basic.showIcon(IconNames.Yes)
while not (input.button_is_pressed(Button.A)):
    basic.show_arrow(ArrowNames.WEST)
    basic.clear_screen()
    basic.pause(200)
basic.show_icon(IconNames.YES)

Ako to funguje

Podmienka cyklu znie „nie je stlačené tlačidlo A“. Kým tlačidlo nestlačíte, podmienka platí a šípka bliká. Keď tlačidlo stlačíte, podmienka prestane platiť, cyklus skončí a vykoná sa príkaz za ním.

Podmienka sa vyhodnocuje len na začiatku každého opakovania, nie nepretržite. Ak tlačidlo krátko ťuknete práve vtedy, keď sa vykonáva telo cyklu (zobrazuje sa šípka), program to nezaznamená. Tlačidlo preto treba chvíľu podržať. Ako tento problém elegantne vyriešiť, uvidíte v nasledujúcej lekcii.

For alebo while?

Každý cyklus for sa dá prepísať na while. Napríklad odpočítavanie z minulej lekcie:

let cislo = 9
while (cislo >= 0) {
    basic.showNumber(cislo)
    cislo += -1
}
cislo = 9
while cislo >= 0:
    basic.show_number(cislo)
    cislo += -1

Pravidlo pre výber je jednoduché: ak vopred poznáte počet opakovaní, použite for (je kratší a prehľadnejší). Ak opakovanie závisí od niečoho, čo vopred neviete (stlačenie tlačidla, hodnota senzora, výsledok výpočtu), použite while.

A čo cyklus forever? Je to vlastne while s podmienkou, ktorá platí vždy: while (true) v JS, while True: v Pythone.

Časté chyby

  • Nekonečný cyklus. Ak sa v tele cyklu nikdy nezmení nič, od čoho podmienka závisí, cyklus nikdy neskončí. Skúste v príklade vyššie vynechať riadok cislo += -1: displej bude navždy ukazovať 9.
  • Podmienka neplatí už na začiatku. Potom sa telo cyklu nevykoná ani raz. Je to správne správanie, ale často prekvapí.
  • = namiesto == v podmienke. V blokoch sa to stať nemôže.

Úlohy

  1. Upravte program tak, aby čakal na tlačidlo B a šípka ukazovala doprava.
  2. Napíšte program, ktorý zobrazuje hodnotu premennej cislo začínajúcej na 1 a v každom opakovaní ju zdvojnásobí, kým neprekročí 100. Aké posledné číslo sa zobrazí? Dá sa to vyriešiť cyklom for?
  3. (len V2) Upravte program tak, aby čakal na dotyk loga. Podmienku nájdete v kategórii Input ako blok logo is pressed.
  4. Spojte túto lekciu s lekciou 2: program najprv bliká šípkou, a keď stlačíte tlačidlo, začne donekonečna žmurkať smajlík. Kam treba umiestniť cyklus while a kam animáciu?

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