2. Vetvenie v algoritmoch (v programovacom jazyku Logo alebo Pascal)

  • Prečo a v akých situáciách používame podmienený príkaz? Uveďte motivačné príklady, ktoré vedú k použitiu podmienených príkazov.
  • Vysvetlite princíp fungovania podmieneného príkazu (podmienka, podmienený výraz, vnorené podmienené príkazy).
  • Ilustrujte použitie vetvenia na konkrétnom algoritme.

Pri programovaní budeme často riešiť situácie, keď sa niektoré príkazy budú vykonávať len pri splnení istých podmienok. Napr. deliť čísla A a B budeme len vtedy, keď B ≠ 0, alebo v cykle budeme stále zväčšovať nejakú hodnotu, ale keď presiahne napr. 100, budeme to špeciálne riešiť. Všetky tieto situácie potrebujú nejaký spôsob otestovania podmienky.

Podmienkou budeme rozumieť taký výraz, ktorého výsledkom je buď pravda alebo nepravda. Podmienka je splnená, ak nadobúda hodnotu pravda, inak je podmienka nesplnená. Veľmi často to budú podmienky, v ktorých sa nejaké hodnoty navzájom porovnávajú, napr. na rovnosť, alebo ktorá hodnota je väčšia. V Pascale na porovnávanie hodnôt máme k dispozícii tieto tzv. relačné operátory:

= rovnaké hodnoty – rovnosť

<> rôzne hodnoty – nerovnosť

< prvá hodnota je menšia ako druhá

<= prvá hodnota je menšia alebo rovná druhej

> prvá hodnota je väčšia ako druhá

>= prvá hodnota je väčšia alebo rovná druhej

Takto vyzerajú zápisy niekoľkých jednoduchých podmienok:

X > 100

I mod 5 = 0

I div 10 >= 1

A > B

Random(6) = 1

Abs(X) < 0

1 + 1 = 2

Výsledok podmienky väčšinou závisí od nejakých premenných (napr. X > 100), ale niektoré podmienky sú vždy nepravdivé (napr. Abs(X) < 0), iné sú zas pravdivé vždy (napr. X < X + 1).

Teraz sa naučíme nový príkaz, tzv. príkaz vetvenia (hovoríme mu aj podmienený príkaz). Jeho zápis je nasledovný:

if podmienka then

príkaz1

else

príkaz2;

Podobne ako for-cyklus, aj tento príkaz v sebe obsahuje nejaké iné príkazy a v tomto prípade sú dva: príkaz1 a príkaz2. Vnorený príkaz príkaz1 sa vykoná jedine vtedy, keď výsledok podmienky je pravdivý inak sa vykoná len vnorený príkaz príkaz2. Po slovensky by sme ho mohli povedať:

ak je splnená podmienka, tak vykonaj príkaz1, inak vykonaj príkaz2;

Treba tomu rozumieť tak, že vždy sa vykoná len jeden z týchto dvoch príkazov a to buď iba príkaz1, ak bola podmienka splnená alebo iba príkaz2, ak bola podmienka nesplnená.

Prvý program, v ktorom použijeme podmienený príkaz, po zatlačení tlačidla Button1 vygeneruje X, Y na náhodných pozíciách a ak bude X menšie ako 100 nakreslí modrý krúžok s polomerom 10 inak bude červený:

Treba si zapamätať to, že v príkaze vetvenia sa nesmie písať bodkočiarka za prvým vnoreným príkazom prikaz1 ešte pred else, ale bodkočiarku píšeme až za druhým vnoreným príkazom príkaz2. Tiež je veľmi dôležité formátovanie príkazu: zatiž vidíme že príkaz1, else aj príkaz2 sú každé na novom riadku, else je na tej istej úrovni ako if a oba príkaz1 aj príkaz2 sú odsunuté vľavo o 2 medzery. Neskôr uvidíme aj iné varianty tohto príkazu.

Ďalší program ukáže použitie vetvenia vo vnútri cyklu. Nakreslíme rad štvorčekov a krúžkov, pričom každý tretí bude krúžok, inak sú to samé štvorčeky:

Keďže celý príkaz vetvenia je vnorený vo for-cykle, tak celý je odsunutý o dve medzery vpravo. Na otestovanie každého tretieho útvaru sme použili podmienku I mod 3 = 0, ktorá zistí či hodnota počítadla je deliteľná číslom 3, t.j. pre hodnoty premennej I: 3, 6, 9, … sa nakreslí krúžok, inak sú to štvorčeky.

Ďalšie príklady na precvičenie:

  • pre číslo zo vstupného riadku vypíše či je párne alebo nepárne a tiež či je deliteľné 7 alebo nie je deliteľné
  • vypíše minimum a aj maximum z dvoch čísel zadaných v dvoch vstupných riadkoch
  • najprv vygeneruje dve náhodné čísla v intervale <50, 200> a potom nakreslí obdĺžnik, ktorého vodorovná strana má dĺžku väčšieho z týchto dvoch čísel a zvislá strana menšieho

Viac príkazov vo vetve: ak v nejakej vetve potrebujeme zapísať viac príkazov, použijeme zložený príkaz beginend.

Pri formátovani podmieneného príkazu if: pravidlá sú rovnaké, s akými sme sa stretli pri formátovaní for-cyklu: ak je vnorený jeden príkaz, tak ten je odsunutý oproti if (resp. else) v predchádzajúcom riadku o 2 medzery vpravo, ak je vnorených viac príkazov (teda sme použili zložený príkaz), tak slová begin a end sú na rovnakej úrovni ako príslušný if a else a odsunuté sú až príkazy medzi begin a end.

Toto využijeme napr. v úlohe:

Vypíšte na náhodné pozície 100-krát vypísať červené písmeno ‘A’ alebo modré písmeno ‘B’. Ktoré z týchto písmen program vypíše, rozhodne náhodný generátor: hodí kockou s číslami 0 až 5 (t.j. zavolá funkciu Random(6)), a ak na kocke padne 5, tak to bude A inak B. Je jasné, že pravdepodobnosť A je 1/6 a pravdepodobnosť B je 5/6.

Niekedy je vhodné použitie neúplného podmieneného príkazu, t.j. variantu príkazu, ktorý nemá else vetvu. Jeho zápis je nasledovný:

if podmienka then

príkaz;

V ďalšom príklade potrebujeme nakresliť tesne vedľa seba napr. 300 kruhov. Pravdepodobne sa nevojdú do jedného riadku. Preto ich do prvého riadku nakreslíme najviac ako sa dá a v kreslení pokračujeme na ďalšom riadku. Použijeme dve premenné X, Y, ktoré označujú stred kresleného kruhu. Ak by sme pred nakreslením každého kruhu skontrolovali, či X-ová súradnica nie je už väčšia ako šírka plochy, tak by sme mohli X aj Y presunúť na začiatok nového radu, t.j. X nastavíme na začiatok a Y posunieme nadol o výšku radu, t.j. 2 polomery. Opäť tu bude podmienený príkaz s jednou vetvou:

Riešenie tejto úlohy je zaujímavé aj tým, že ukazuje spôsob, ako môžeme dvojrozmerný priestor zapĺňať jedným cyklom. Neskôr toto uvidíme naprogramované pomocou vnorených cyklov.

Vnorené podmienené príkazy:

Na to, aby sme vypísali správu o tom, či používateľ zadal (cez vstupný riadok) kladné číslo, záporné číslo alebo číslo rovné 0, môžeme použiť tri za sebou idúce príkazy vetvenia:

Hoci je program správny, na ňom si môžeme uvedomiť to, že pri ľubovoľnej zadanej hodnote, program vždy testuje tri rôzne podmienky a pritom vôbec nevyužíva else vetvu.

Ak to teraz prepíšeme takto:

V prípade, že bola zadaná 0, sa už ďalej v programe nič netestuje. Ak zadáme nejaké kladné číslo, tak sa urobí ešte jeden test. Ak zadáme záporné číslo, tak sa tiež uskutočnia iba dva testy. Takémuto príkazu if, ktorý je vo vnútri iného if príkazu, hovoríme vnorený podmienený príkaz, a pri programovaní sa používa veľmi často. Všimnite si formátovanie príkazu: keďže vnorený príkaz if patrí do else vetvy, je celý odsunutý o 2 medzery vpravo.

Reklamy

Pridaj komentár

Zadajte svoje údaje, alebo kliknite na ikonu pre prihlásenie:

WordPress.com Logo

Na komentovanie používate váš WordPress.com účet. Odhlásiť sa / Zmeniť )

Twitter picture

Na komentovanie používate váš Twitter účet. Odhlásiť sa / Zmeniť )

Facebook photo

Na komentovanie používate váš Facebook účet. Odhlásiť sa / Zmeniť )

Google+ photo

Na komentovanie používate váš Google+ účet. Odhlásiť sa / Zmeniť )

Connecting to %s