Podmínky a operátory

Jedna z dalších, velmi důležitých částí každého jazyka. V každém skriptu naleznete podmínky a operátory. Podmínky se používají k větvení programu na základě nějakého výrazu. Operátory pak porovnávají např. dvě proměnné a tak vznikne daný výraz, který se použije v podmínce.

Podmínky

V jazyce lua začíná podmínka, stejně jako jinde, klíčovým slovem if. Vytváří blok příkazů který je ukončen klíčovým slovem end. Přesná syntaxe uvození je if {výraz} then tady nějaký kód v podmínce end. Od klíčového slova then po end je kód v podmínce a je tedy prováděn pouze pokud je splněn výraz. Zde je názorný příklad:

1local promenna = 5;
2-- toto se provede vzdy
3if promenna == 5 then
4 -- toto se provede jen pokud je promenna 5
5 -- protoze promenna je opravdu 5, tak se to tu provede
6end;
7-- toto se provede taky vzdy

Na tomto příkladu je snad dostatečně vidět, kdy se co spouští a jak jednoduchá podmínka vypadá. Nyní se podíváme na podmínky i s druhou větví kódu - tedy ty, které mají vymezený kód pro splněnou podmínku a pro nesplněnou podmínku. Druhá větev se vytvoří tak, že před klíčové slovo end - tedy před ukončením celé podmíny - vložíme klíčové slovo else. Toto klíčové slovo nám rozdělí podmínku na dvě větve - první je určena pro kód při splněné podmínce a ta druhá je pro nesplněnou podmínku. Ukázka takové podmínky:

1local promenna = 5;
2-- toto se provede vzdy
3if promenna == 5 then
4 -- toto se provede jen pokud je promenna 5
5 -- protoze promenna je opravdu 5, tak se to tu provede
6else
7 -- toto by se provedlo pokud by nebyla promenna 5
8end;
9-- toto se provede taky vzdy

Pozor! Podmínka je vyhodnocována pouze jednou, takže pokud změníte hodnotu výrazu, už se neprovede větev např. else, i když je opticky později. Zde vidíme podmínku s dvěma větvema. Ale co když potřebuji porovnávat možností více? V takovém případě se nám nabízí klíčové slovo elseif, které zajistí přidání další větve do podmínky. Přidává se mezi počáteční if a případný end. Pokud je v podmínce else tak ještě před něj. Struktura elseif je stejná jako u if.

Ukázka kódu s použitím elseif:

1-- Zapis 1 (s elseif):
2
3local promenna = 5;
4if promenna == 1 then
5 -- kod pokud je promenna = 1
6elseif promenna == 2 then
7 -- kod pokud je promenna = 2
8
9 -- atd az do:
10elseif promenna == 5 then
11 -- kod pro hodnotu promenne 5
12else
13 -- vsechny jine neunikatni hodnoty
14end;
15
16-- vyuziti u nenaplnenich podminek
17if ridici == nil then
18 ridici = true;
19elseif ridici then
20 -- kod pokud je ridici true
21else
22 -- moznosti jsou true, nil a false
23 -- takhle pokryji vsechny
24end;

Zde je ukázka použití podmínek elseif pro různá čísla, a nebo pro ošetření stavu, kdy proměnná neobsahuje žádnou hodnotu (nil - nebyla deklarovana a nebo neni naplnena hodnotou). Nyní uvedu příklad kdy je podmínka složená do sebe (výsledek bude stejný jako u elseif). Rozdíl mezi použitím elseif a tímto způsobem je ve složitosti kontrukce. Posuďte sami:

1-- Zapis 2 - slozene podminky
2
3local promenna = 5;
4if promenna == 1 then
5 -- kod pokud promenna = 1
6else
7 if promenna == 2 then
8 -- kod pokud promenna = 2
9 else
10 if promenna == 3 then
11 -- kod pokud promenna = 3
12 else
13 -- takto to pokracuje do pozadovane hodnoty
14 -- koncime nejak takto
15 if promenna == 5 then
16 -- kod pro promenna = 5
17 else
18 -- vic nez 5 nepotrebuju
19 -- uz zde bude jen finalni kod
20 -- pro vse ostatni
21 end;
22 end;
23 end;
24end;

Všimněte si zbytečné složitosti a nepřehlednosti kódu. Velmi doporučuji používat elseif.

Operátory

Dalším velmi důležitým tématen v každém programovacím jazyce jsou operátory. Tato část je spojená a podmínkami, protože operátory se používají k vyhodnocování podmínek. S jedním operátorem jsme se setkali v příkladech podmínek - a to dvojici rovnítek ==. Uvedu zde přehled porovnávacích operátorů a rovnou je popíšu.

Operátor Funkce
< Operátor pro porovnání dvou hodnot. Výsledkem je true pokud je levá strana hodnotou menší než pravá. Lze použít na čísla.
> Operátor pro porovnání dvou hodnot. Výsledkem je true pokud je pravá strana hodnotou menší než levá. Lze použít na čísla.
<= Operátor pro porovnání dvou hodnot. Výsledkem je true pokud je levá strana hodnotou menší nebo rovna pravé. Lze použít na čísla.
>= Operátor pro porovnání dvou hodnot. Výsledkem je true pokud je pravá strana hodnotou menší nebo rovna levé. Lze použít na čísla.
== Operátor pro porovnání dvou hodnot. Výsledkem je true pokud je pravá strana rovna levé. Lze použít na čísla (ale ne desetinné kvůli toleranci) a na cokoli dalšího. U tabulek si vysvětlíme porovnávání později.
~= Operátor pro porovnání dvou hodnot. Výsledkem je true pokud se pravá strana nerovná levé. Lze použít na cokoli (kromě desetinných čísel).
not Negace. Převrací pravdivostní hodnotu (true na false a false na true). Užitečné u složitějších podmínek
and Logické a zároveň. Využití u větších podmínek. True je pouze pokud jsou oba parametry true.
or Logické nebo. Využití u větších podmínek. Vrací true jen když je jeden nebo více parametru true.
.. Sloučení textu. Spojí 2 řetězce do jednoho výsledného.
^ Exponent. Zápis je a^b, kde a je základ a b je exponentem a.
= Přiřazení. Přiřadí hodnotu na pravé straně do proměnné na straně levé.
*,/,-,+ Matematické operátory. Význam snad nemusím vysvětlovat.

Zde je přehled operátorů lua. Myslím, že nemusím doplňovat a můžu přejít rovnou na příkaldy. Složitější ukázky ukážu později. To co zde ukážu a bude se mi zdát těžké vysvětlím podrobněji.

Příklad:

1-- Priklad na operatory
2
3-- promenne
4local pravda = true;
5local pravda2;
6local cislo = 1.86446;
7local cislo2 = 846.6556;
8local cislo3 = 648;
9local cislo4 = 2;
10local text = "ahojda";
11local text2 = "ahojky";
12
13-- ukazka operatoru <
14if cislo < cislo2 then
15 print("Cislo "..cislo.." je mensi nez cislo "..cislo2);
16else
17 print("Cislo "..cislo.." je vetsi nebo rovno nez cislo "..cislo2);
18end;
19
20-- ukazka operatoru >
21if cislo3 > cislo4 then
22 print("Cislo "..cislo3.." je vetsi nez cislo "..cislo4);
23else
24 print("Cislo "..cislo3.." je mensi nebo rovno nez cislo "..cislo4);
25end;
26
27-- operatory >= a <= jsou v podstate stejne, jen pridam tu moznost ze se rovnaji
28
29-- operator ==
30if text == text2 then
31 print("text se rovna text2");
32else
33 print("text se nerovna text2");
34end;
35
36-- operator ~=
37if pravda2 ~= nil then
38 print("Hodnota promenne pravda2 je: "..pravda2);
39else
40 print("Nezname hodnotu promenne pravda2, protoze neni definovana.");
41end;
42
43-- operator not
44if not pravda then
45 print("pravda je false");
46else
47 print("pravda je true");
48 -- protoze je tam not ktere obrati vysledek
49end;
50
51-- operatory and a or
52if pravda and cislo < cislo2 then
53 print("pravda je true a "..cislo.." je mensi nez "..cislo2);
54end;
55
56if pravda2 ~= nil or cislo < cislo2 then
57 print("pravda2 byla definovana nebo je "..cislo.." mensi nez "..cislo2)
58end;

Operátory jsou velmi náročné na pochopení a zároveň velmi jednoduché. Doporučuji chvíli experimentovat a tvořit abyste plně pochopili o co se jedná. Na zkoušku přikládám soubory z tohoto návodu. Všímejte si prosím, že některé operátory jsou pro jednu proměnnou a některé pro dvě. Porovnávací operátory (==,~=,<,>,<=,>= a not) vracejí true/false a lze je zachytit i do proměnné - moc se to ale nepoužívá a bude o tom řeč později.

Související video

Soubory ke stažení

  1. skript1.lua (z návodu)
  2. mujskript.lua (video)