Řízení běhu makra (1) – Příkazy if, then, else a podmínka boolean

programovani.png Jakým způsobem vlastně program řídíte? Dáte mu příkazy, co má dělat v určité situaci, jak ale program pozná právě tu situaci? Znalost tohoto způsobu je jednou z nejdůležitějších v celém programování.  

Řízení běhu programů

Příkaz IF… THEN… ELSE

Pomocí tohoto příkazu dokážete jednoduše řídit běh makra na základě vstupních podmínek, nebo na základě podmínek změněných v průběhu programu. Příkaz rozdělí činnosti v závislosti na vyhodnocení podmínek na dvě nebo více větví, které dále pokračují nezávisle na sobě – program samozřejmě pokračuje pouze po jedné z nich.

Zjednodušeně „Venku prší, vezmu si deštník?“ – pokud ANO, tak jdu a vezmu si deštník, pokud NE, tak si ho nevezmu. Program zhodnotí, zda venku prší a je­ li to pravda, tak si vezme deštník.

Přeloženo do češtiny je příkaz IF … Then … Else – Když…tak…nebo. Pozor, nepleťte si tuto funkci s funkcí IF, kterou poskytuje Calc. Její výsledek je podobný (u IF … Then … Else lze zadat více vstupů funkce), ale zápis se zásadně liší. Funkce Calcu v Basicu nefungují!

A co na to nápověda:

Příkaz If…Then spustí blok příkazů v závislosti na dané podmínce. Když StarBasic narazí na příkaz If, ověří podmínku. Je­li podmínka True, spustí se všechny následující příkazy až do příštího příkazu Else nebo ElseIf. Je­ li podmínka False a následuje příkaz ElseIf, StarBasic ověří podmínku a spustí následující příkazy, je­ li podmínka True. Je­ li False, program přeskočí příkazy až k dalšímu příkazu ElseIf nebo Else. Příkazy následující za příkazem Else se spustí pouze tehdy, nebyla­ li žádná z předchozích podmínek splněna. Po vyhodnocení všech podmínek a spuštění odpovídajících příkazů pokračuje program příkazy následujícími po EndIf.

Možné je vložit do sebe více příkazů If…Then.

Podmínka porovnání

Nejčastěji se jako podmínka používá porovnání – tedy například promenna1 < promenna2; pokud je toto pravda, pokračuje makro příkazem následujícím za then.

V praxi:

If promenna1 < promenna2 
then msgbox "Proměnná 1 je menší než Proměnná 2"
endif

Samozřejmě potřebujete ošetřit i případ, kdy je to opačně – tedy použijete else (nebo):

if promenna1 < promenna2 then
 msgbox "Proměnná 1 je menší než Proměnná 2"
 else
 msgbox "Proměnná 2 je menší než Proměnná 1"
 end if

Ani toto ale nemusí stačit, a proto použijete ElseIF (nebo když)

if promenna1 < promenna2 then
 msgbox "Proměnná 1 je menší než Proměnná 2"
 elseif promenna1 > promenna2 then
 msgbox "Proměnná 2 je menší než Proměnná 1"
 else ' cokoliv jiného (již se nezadává podmínka)
 msgbox "Proměnné jsou si rovny"
 end if

Pokud chcete pro výsledek jedné podmínky použít další dělení dle podmínky, tak vnoříte další funkci (takových vnoření můžete použít, kolik chcete, ale pro přehlednost je lepší použít další možnosti, například Select case).

TIP: Nezapomeňte každé takovéto vnoření samostatně ukončit pomocí EndIF, jinak program hlásí chybu. U rozsáhlejších maker se taková chyba špatně dohledává, protože program se zastaví na zcela jiném místě (to proto, že plní příkazy, které jsou v podmínce). Každé IF musí mít svůj Endif!!

V praxi:

function porovnani (cislo as long, cislo2 as long) as long
if cislo < 0 then
  if cislo2 < 0 then
   porovnani = 0
  else
   porovnani = 0 
  endif
elseif cislo > 0 then
  if cislo2 < 0 then
   porovnani = 0
  else
   if cislo > cislo2 then
    porovnani = cislo – cislo2
   elseif cislo < cislo2 then
    porovnani = cislo2 – cislo
   else
    porovnani = cislo 
   endif
 endif
endif 
end function

Funkce vždy odečte menší číslo od většího. Pokud jsou si čísla rovna, je jedno z čísel výsledkem.

Podmínka BOOLEAN – logická hodnota

Pokud potřebujete použít podmínku již při zadání, nebo při volání makra jiným makrem, definujete proměnnou jako logickou hodnotu přímo (dim podminka as boolean); tato proměnná pak vrací pouze True nebo False. Při použití v Calcu pak zadáváte do této podmínky přímo "true" ("false") nebo jejich číselné vyjádření 1 (true) a 0 (false) .

Zadání pak programujete takto:

dim promenna as boolean
 promenna = true
  if promenna then
   msgbox "Pravda"
  else
   msgbox "Nepravda"
 end if

Vidíte, že nprovádíme porovnání, protože sama proměnná je buď True, nebo False, nepotřebujeme tedy znát výsledek testu.

Tady je také ale nutné ošetřit případ, kdy podmínka není zadaná, nebo ji umožníte nezadat. Například pro zjednodušení zápisu funkce umožníte nezadat podmínku s tím, že pokud podmínka chybí, bude program pokračovat, jako když je podmínka True (nebo False). Na ošetření takového chování použijete funkci IsMissing a možnost zadání (nebo nezadání) podmínky zajistíte příkazem Optional před určením podmínky.

IsMissing (když chybí) vrací True nebo False.

Optional při zadání tohoto příkazu dáváte programu na vědomí, že tato proměnná může, ale nemusí být zadána, a program, pokud tato proměnná chybí, nehlásí chybu, ale pokračuje tak, jak chcete vy.

Tento jednoduchý příklad pro Calc sečte dvě hodnoty, pokud je zadaná podmínka True, nebo pokud není zadaná. Pokud je zadaná podmínka False, vrátí první hodnotu.

Function soucet (cislo1 as long, cislo2 as long, optional podminka as boolean) as long
 if IsMissing (podminka) then
 soucet = cislo1 + cislo2
elseif podminka = true then
 soucet = cislo1 + cislo2
else
 soucet = cislo1
end if
end function

možnosti použití funkce:

Možnosti použití funkce v sešitu Možnosti použití funkce v sešitu

Je možné kdykoliv IF Then Else ukončit (Exit sub), nikdy ale není možné do IF vstoupit. Vyskočení provedete jednoduše jako příkaz po vyhodnocení podmínky. Například pokud jste dosáhli požadovaného výsledku a podmínka je True, tak ukončíte makro – Exit sub .

(Jako ve škole) Průměr: 1.00 | Hodnotilo: 19
 

Přidat názor

 

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích najdete v nápovědě. Diskuzi můžete sledovat pomocí RSS kanálu.

 
Daniel Sedláček

Daniel Sedláček

Amatérsky se věnuji programování maker od podzimu 2010.
Aktivní jsem na fóru od ledna 2011.
Od července 2011 spolupracuji i jako moderátor fóra.

Využívám pouze OpenOffice.org (LibreOffice nemám nainstalován).

 
 
 
woo jaw demo hz