Baltíkův pomocník (procedura)

Tabulka pomocníků

Baltíkův pomocník je chlapík, který Baltíkovi pomáhá dělat různé věci.

Práce s pomocníky sestává ze dvou částí:

Ü definice pomocníka, při níž určíte, co má pomocník udělat, až jej z programu zavoláte, a

Ü volání pomocníka v programu v okamžiku, kdy potřebujeme, aby vykonal předem naprogramovanou činnost.

V této sekci si povíme

kde se pomocníci používají,

jak se pomocníci definují,

jak se pomocníci z programu zavolají,

jak mohou pomocníci používat proměnné,

jak pomocníkovi předáme parametry,

jak pomocníkovi předáme proměnnou, v níž má něco vrátit,

jak činnost pomocníka předčasně ukončíme.

1) Použití pomocníků

Pomocníky použijeme s velkou výhodou ve chvílích, kdy potřebujeme vykonat na několika místech programu stejnou činnost. Není moudré naprogramovat tuto činnost tolikrát, kolikrát ji potřebujeme vykonat. Mnohem výhodnější je definovat pomocníka, tuto činnost jej "naučit" a v programu jej pak na příslušných místech zavolat, aby pro nás onu činnost vykonal.

Druhým důvodem, který nás vede k používání pomocníků, je zpřehlednění programu. V dlouhých programech bývají často chyby, které se špatně hledají. Daleko výhodnější je rozdělit celou úlohu na sadu úloh jednodušších a pro každou z nich definovat jejího vlastního pomocníka. Místo jednoho dlouhého programu tak získáme několik programů kratších, v nichž se lépe vyznáme a proto v nich také uděláme méně chyb. Navíc chyby, které v takovýchto přehledných programech náhodou uděláme, se mnohem lépe nacházejí a opravují.

V klasických programovacích jazycích se samostatně definovaná část programu, kterou počítač vykoná na požádání (tj. ekvivalent našeho pomocníka), nazývá procedura nebo podprogram.

Pozn.:Prvky Nový Pomocník a Volání pomocníka najdete v tabulce pomocníků:

Tabulka pomocníků

2) Definice Baltíkova pomocníka

Část programu, v níž definujeme, co má pomocník dělat, nazýváme definice pomocníka. Definice pomocníka musí začínat prvkem Nový pomocník, za nímž následuje označení pomocníka.

Prvek Nový pomocník
vložíte do programu z Tabulky pomocníků.

Baltík může mít mnoho pomocníků - jejich počet je omezen pouze velikostí paměti počítače. Aby se v nich Baltík (i programátor) vyznal, musí mít každý pomocník svoje označení.

Pomocníka označíte tak, že za prvek Nový pomocník vložíte:

Ü číslo,

Ü jméno (tj. textový řetězec) nebo

Ü předmět.

Nový pomocník 1.

Nový pomocník předmět 4.

Nový pomocník Postav domek.

Z předchozích ukázek asi sami odhadnete, že nejvýhodnější je označovat pomocníky pomocí jmen a nebo alespoň pomocí předmětů, jejichž obrázek se nějak týká vykonávané činnosti.

Pozn.:Nezadání označení pomocníka má stejný efekt, jako zadání čísla 0. Doporučujeme ale této možnosti nevyužívat, protože v opačném případě při opravách nepoznáte, kde jste označení zapomněli záměrně a kde omylem.

Prvek Nový pomocník následovaný označením a případným komentářem bývá označován jako hlavička pomocníka (= definice pomocníka).

Za hlavičku pomocníka vkládáte příkazy, které má váš nový pomocník provádět. Tyto příkazy tvoří tělo pomocníka.

Příkazy můžete vložit hned za jméno pomocníka nebo na libovolný další řádek. Nejdůležitějším kritériem je přitom maximální přehlednost programu

Tělo pomocníka (a tím i tělo celé definice) ukončí buď konec celého programu nebo počátek definice dalšího pomocníka.

3) Volání Baltíkova pomocníka

Baltíkova pomocníka aktivujete tak, že na místo programu, kde budete chtít, aby pomocník vykonal to, co jste jej naučili, vložíte prvek Volání pomocníka následovaný označením volaného pomocníka. Po ukončení činnosti volaného pomocníka program pokračuje dalšími příkazy následujícími za příkazem volání.

Prvek Volání pomocníka vložíte do programu z Tabulky pomocníků.

Zavolej pomocníka 1.

Zavolej pomocníka předmět 4.

Zavolej pomocníka Postav domek.

Pomocník si může na pomoc zavolat dalšího pomocníka nebo dokonce může zavolat sám sebe - v tom případě mluvíme o tzv. rekurzivním volání.

4) Používání lokálních proměnných (košíků)

Pomocník může kromě globálních proměnných (šuplíků), které jsou viditelné ze všech míst programu, používat také lokální proměnné (košíky), které vidí (a může používat) pouze ten pomocník, v jehož definici se daná proměnná vykytuje. Ostatní pomocníci ani samotný hlavní program k ní nemají přístup a mohou jim pouze přiřadit počáteční hodnotu.

Lokální proměnné (košíky)

Lokální proměnné jsou v Baltíkovi zobrazeny jako košíky. Jejich nedostupnost si můžete zdůvodnit tak, že si každý pomocník nosí své košíky pořád s sebou a nikomu nedovolí, aby se mu do nich díval nebo se v nich dokonce přehraboval.

Pozn.:Každý pomocník si na začátku své práce definuje (vytváří) své vlastní košíky. Používají-li dva pomocníci stejně nazvaný košík (lokální proměnnou), jedná se o dva různé košíky, které se pouze shodou okolností stejně jmenují. Protože pomocníci o cizích košících nevědí, nemůže tato shoda jmen vést k jakékoliv záměně.

Pomocník však programu, který jej žádá o pomoc, umožní, aby mu předal některé hodnoty či celé proměnné s doporučením, do kterého košíku si má každou z nich uložit.

Při rekurzivním volání (tj. volá-li pomocník sám sebe), se tato volání vůči sobě chovají stejně, jako by se chovala v případě, kdy volající pomocník volá zcela jiného pomocníka. V případě lokálních proměnných to tedy znamená, že

Ü volající pomocník může lokálním proměnným (košíkům) volaného pomocníka pouze přiřadit počáteční hodnotu a jinak jsou pro něj nedostupné,

Ü volaný pomocník si pořídí vlastní košíky (lokální proměnné) a košíky pomocníka, který jej zavolal, jsou pro něj neviditelné a tím i nedostupné, a to přesto, že volající pomocník je on sám.

5) Předání parametrů

Pomocník umožní volajícímu programu, aby při volání naplnil jeho košíky a přiřadil jim tak počáteční hodnotou (aby inicioval lokální proměnné) - odborně bychom řekli aby mu předal parametry.

Pozn.:Této možnosti však samozřejmě nemusíte využít nebo můžete přiřadit počáteční hodnotu pouze některým košíkům.

Zavolej pomocníka předmět 4, jeho košík Klávesa naplň klávesou A a jeho košík Počitadlo naplň hodnotou z šuplíku Délka.

Přiřazujete-li košíku hodnotu konstanty nebo literálu, nemusíte vkládat prvek Přiřadit.

Zavolej pomocníka Postav domek. Jeho košík Pater naplň hodnotou 2, košík Jmeno naplň hodnotou Jaruška a košík Barva naplň hodnotou Kaštanová.

POZOR!

Máte-li pomocníka označeného jménem, musíte při předávání řetězcových parametrů dát pozor na to, aby je Baltík nesloučil se jménem do jednoho řetězce jako v uvedeném příkladu (schválně jsme jej přeškrtali, abychom zdůraznili, že takto se program psát nemá).

Stejnému riziku se vystavujete v případě, kdy budete přiřazovat počáteční hodnoty dvěma řatězcovým košíkům za sebou.

Problémům s nechtěným automatickým spojováním řetězců můžete předejít tím, že všechny parametry uzavřete do společné závorky a jednotlivé parametry oddělíte od sebe čárkami:

6) Rozdíly mezi předáním parametrů hodnotou a odkazem

Máte-li počáteční hodnotu, kterou chcete naplnit některý z pomocníkových košíků, uloženu v proměnné, mohou nastat dvě situace:

Ü chcete do košíku předat pouze hodnotu uloženou v proměnné a nechcete, aby volaný pomocník hodnotu v této proměnné jakkoliv měnil - pak hovoříme od předání parametru hodnotou, nebo

Ü chcete pomocníkovi předat celou proměnnou s tím, že v průběhu své činnosti má do předané proměnné vložit aktualizovanou hodnotu - pak hovoříme o předání parametru odkazem. Pomocník pak bude místo své lokální proměnné používat předanou proměnnou (v lokální proměnné bude pouze odkaz na předanou proměnnou, kterou má použít místo ní).

Chceme-li předat parametr hodnotou, musíme přiřadit košíku tuto hodnotu (zde předáváme pouze peníze uložené v šuplíku),

chceme-li předat parametr odkazem, vynecháme znak přiřazení a tím předáme do košíku celou proměnnou (zde předáváme celý šuplík).

Pro názornost uvedeme příklad ze života: představte si, že rodiče posílají dítě (pomocníka) na nákup. Aby mohl pomocník vykonat požadovanou činnost (aby mohlo dítě nakoupit), potřebuje peníze - ty budou parametrem, jehož předání podmiňuje úspěšné splnění úkolu.

Ü Dají-li rodiče dítěti peníze, za něž nakoupí, jedná se vlastně o předání parametru hodnotou.

Ü Dají-li mu peněženku (proměnnou) s penězi (hodnota uložená v proměnné), předávají mu parametr odkazem (až budeš potřebovat peníze, podívej se do peněženky). Po ukončení požadované činnosti (nákupu) vrátí pomocník (dítě) svěřenou proměnnou (peněženku) s novou hodnotou.

Pokud pomocníka volá jiný pomocník, může přiřadit jeho lokální proměnné některou ze svých lokálních proměnných.

Příklad:

V následujícím příkladu je uveden program pomocníka, který počítá faktoriál (faktoriál musíte umět spočítat např. tehdy, když potřebujete zjistit pravděpodobnost své výhry ve sportce a podobných hrách).

Faktoriál se značí vykřičníkem a je definován následovně:

n! = 1× 2 × 3 × ... × n

Z uvedeného si jistě umíte odvodit, že n!=n×(n-1)! - tedy např. 5!=5×4!=120. Toho využívá i náš program, který pracuje v následujících krocích:

1.Pomocník nejprve zjistí, zda číslo, jehož faktoriál má zjišťovat (tj. obsah košíku N), je větší než 1. Pokud není, nemusí nic dělat (pro zjednodušení nepředpokládáme, že by se někdo ptal na faktoriál čísla menšího než 1).

2.Do košíku Hmotnost uloží hodnotu o jedničku menší, než je hodnota čísla, jehož faktoriál počítá.

3.Požádá pomocníka (sebe sama), aby mu spočítal faktoriál tohoto čísla, tj. faktoriál čísla N-1. Parametr (číslo, jehož faktoriál má pomocník spočítat) předá odkazem, takže po skončení práce pomocníka najde v proměnné Hmotnost hodnotu zjišťovaného faktoriálu.

4.Vynásobí právě získanou hodnotu faktoriálu čísla o jedničku menšího (má ji v proměnné Hmotnost) hodnotou čísla, jehož faktoriál zjišťuje (má ji v proměnné N), neboli vynásobí N×(N-1)!. Výsledek (hledaný N!) uloží do proměnné N.

Abyste si předchozího pomocníka vyzkoušeli, zkuste následující prográmek:

Pomocníkovi nemůžeme předávat přímo proměnnou Počitadlo, protože je parametrem cyklu. Pomocník by její hodnotu změnil a nám by nefungoval cyklus. Proto jsme zavedli pomocnou proměnnou Hmotnost.

7) Předčasné ukončení činnosti Baltíkova pomocníka

Prvek Opusť program nebo pomocníka
ukončí provádění pomocníka.

Je-li příkaz použit mimo pomocníka, bude ukončen celý program.

Chcete-li ukončit činnost více vnořených volání pomocníků, použijte prvek Opusť program nebo pomocníka s číslem:

Ukonči 2 úrovně.
Použijete-li tento příkaz např. v pomocníkovi, kterého volá jiný pomocník, budou ukončeni oba; použijete-li jej v pomocníkovi, kterého volá přímo hlavní program, bude ukončen celý program.

Ukonči všechny úrovně.
Použijete-li jako počet ukončovaných úrovní prvek Nekonečno, ukončí se všechny úrovně, tedy i celý program.

Converted from CHM to HTML with chm2web Pro 2.85 (unicode)