Druhy opakování v programu

V lekci K čemu je dobré pole hodnot jsme si ukázali, jakým způsobem můžeme pole hodnot použít pro uložení jednotlivých pozic naší robotické ruky.

V dnešní lekci se naučíme, jakým způsobem můžeme toto pole naplnit výchozími hodnotami. Tento krok není obvykle nutný, pole plníme v běžném programu dle potřeby průběžně.

V našem programu ale budou nějaké úvodní hodnoty vhodné. Jednotlivá pole totiž naplníme výchozí polohou ovládaných servomotorů, abychom zamezili případným nepředvídatelným pohýbům ruky v případě spuštění přehrávání ještě před uložením veškerých požadovaných pozic.

Navíc se dozvíme něco více o tom, jakým způsobem fungují programové bloky pro opakování (cykly) a k čemu je v našem programu můžeme použít.

Plníme proměnnou typu pole daty

Než se pustíme do programování, připomeňme si základní strukturu proměnné typu pole.

definice_pole 1

Jen zopakování důležitých informací pro tvorbu další části programu, první pozice pole má svůj index 0, druhá pozice má index 1 a tak dále.

Předpokládejme, že budeme chtít ukládat osm pozic robotické ruky. V tom případě první pozice v poli bude mít index 0 a poslední pozice bude mít index 7. Výchozí pozice ruky bude nastavena na úhel 90°.

Kód by pro tento případ a pro první servo vypadal takto:

piece_array_initial_values_by_hand

Zkuste si představit, jak by tato část programu byla dlouhá, kdybychom potřebovali uložit třeba padesát pozic a navíc pro všechny servomotory, ne jen pro jeden (jako v této ukázce).

Vzpomeňme si na programátorské pravidlo DRY (zmiňované v úvodu lekce Pracujeme s proměnnou) - "neopakuj se". Jak bychom ho mohli použít při řešení našeho problému s efektivním naplnění polí výchozími hodnotami?

Máme již nějaké proměnné, obsahující použitelné informace, k dispozici? Existují nějaké programové bloky, které ještě neznáme, ale které bychom mohli použít?

Ano, v tomto okamžiku již máme k dispozici proměnnou "pocet_pohybu", obsahující požadovaný počet jednotlivých pozic ruky, které chceme uložit. Dále využijeme proměnnou "index" (jakým způsobem ji použijeme bude vysvětleno dále v této lekci).

Na pomoc si ještě vezmeme další programový blok, který je velmi podobný programovému bloku "Opakuj stále" (lekce První program).

Opakuj ... krát

blok_opakuj_pocet

Tento blok cyklu v programu zajistí, že cokoli (jakékoli další programové bloky) umístíte dovnitř tohoto bloku, bude ve smyčce (v cyklu) provedeno v požadovaném počtu opakování. V případě tohoto konkrétního bloku bude vše provedeno 10x, poté tento blok skončí a program bude pokračovat dále.

V případě našeho programu můžeme použít pro nastavení počtu opakování proměnnou "pocet_pohybu", která zajistí provedení právě takového počtu opakování, která potřebujeme. Pro ukládání aktuální hodnoty indexu využijeme proměnnou "index".

Během každého jednotlivého cyklu potřebujeme provést následující činnosti:

  1. Do aktuální pozice pole (dané indexem) uložit požadovanou hodnotu (výchozí úhel natočení servomotoru).
  2. Zvětšit hodnotu indexu o 1.

Druhý bod je velmi důležitý. Pokud bychom totiž hodnotu indexu postupně nezvětšovali, cyklus by se sice v požadovaném počtu opakování provedl, ale výchozí hodnoty by se ukládaly stále jen do jedné pozice v poli.

Zvyšování hodnoty indexu nám zajistí následující programový blok.

Zaměnit ... za ...

blok_zmen_promennou_o_v3

Tento blok zajistí změnu konkrétní proměnné o požadovanou hodnotu. Například pokud chceme zvýšit proměnnou index o jeden, do okénka vepíšeme číslo 1. Pokud bychom chtěli naopak index snížit o jeden, vepíšeme číslo -1.

Poznámka: Na tomto místě je potřeba zmínit, že český překlad tohoto bloku je trochu matoucí. Spíše než "zaměnit ... za ..." by bylo vhodnější "změnit ... o ...".

Složený programový blok

Kompletní složený programový blok vykonávající výše uvedenou funkcionalitu vypadá následovně (pro první servo nastavené na úhel 90°):

piece_repeat_one_servo

Dále kompletní složený blok pro všechna serva na 90°:

piece_repeat_all_servos

Na závěr celá úvodní část našeho programu.

  • zahájení vykonávání programu
  • inicializace ovladače servomotorů
  • definice potřebných proměnných
  • definice polí hodnot pro servomotory
  • naplnění polí výchozími hodnotami

piece_all_setup_v3

Poznámka: Všimněme si, že po provedení cyklu plnění polí daty je přidán znovu blok, který nastaví proměnné "index" hodnotu 0. Vzhledem k tomu, že s proměnnou "index" dále v programu budeme pracovat, její opětné vynulování je nezbytný předpoklad pro správné fungování zbytku programu.

Shrnutí

Připomeňme si, co vše jsme se v této lekci naučili:

  • víme, jakým způsobem pracuje cyklus s daným počtem opakování a umíme jej v programu použít
  • umíme naplnit proměnnou typu pole výchozími hodnotami
  • umíme aktivně používat proměnné

Zatím jsme pracovali především na úvodní a velice důležité části celého programu, nadefinovali a nastavili jsme si všechny potřebné proměnné. Dále již začneme pracovat na výkonné části programu, kde aktivně využijeme veškeré znalosti z minulých lekcí.