Cykly a return v Lua
For
V lua existujú dva typy cyklov for
a while
. For sa
zapisuje takto
for <promena> = <odkdy>,<dokdy> do end
:
for i = 1,3 do print("ahoj svete") end
Pozn. na rozdiel od C-like jazykov Lua začína od 1 nie od 0.
Vypíše do konzoly 3krát ahoj svete
.
While
zápis: while <podmínka> do end
exit = 1 -- vytvoříme proměnou exit a dáme jí hodnotu 1 while not exit == 3 do -- cyklus zkontroluje jestli exit nemá hodnotu 3 print("ahoj svete") -- vypíše ahoj svete exit = exit + 1 -- přičteme k exit 1 end
Pozn. Lua nepozná ++
ani --
Kalkulačka
Kalkulačku by teda išlo napísať aj s pomocou cyklu a to takto.
exit = false while not exit do --Šlo by také napsat while not exit == true do ale v případě že proměnné přiřadíme logickou hodnotu true/false můžeme == vynechat. print("první číslo") cislo = io.read() print("zadej druhé cislo") cislo2 = io.read() print("zadej operaci") operace = io.read(); if operace == "+" then print(cislo + cislo2) elseif operace == "-" then print(cislo - cislo2) elseif operace == "*" then) print(cislo * cislo2) elseif operace == "/" then print(cislo / cislo) else --příkazy po else se provedou v případě že operace nesplňuje if ani žádný z elseif. print("spatna operace") end print("chcete zadat další příklad ano/ne") roz = io.read() if roz == "ne" then exit = true end end
Kalkulačka má však jednu chybu a to že nie je takzvane blbuvzdorný teda
že program spadne keď zadáte zlý vstup. Aby sme toho dosiahli a pritom
kalkulačku neznepřehlednily ukážeme si ďalšiu zaujímavú vec na
funkciách. Vytvoríme si funkciu ziskejvstup()
ktorá bude vstup
validovať.
function ziskejvstup() exit = false while not exit do vstup = io.read() if not tonumber(vstup) == nil then -- Funkce tonumber je součástí standardních knihoven lua tedy ---je přístupná ve všech lua programech. -- programu stejně jako standardní knihovna funkcí io ze které je funkce io.read(). -- tonumber se normálně používá v případě že je potřeba převést textový řetězec na číslo. -- Ovšem díky tomu že vrací nil když se převod nepovede se dá použít k validaci vstupu. print("nezadali jste číslo") vystup() -- Tato funkce bude vysvětlena níže. else return tonumber(vstup)-- Vrátíme vstup převedený na číslo. end end
K validáciu vstupu operácie vytvoríme ďalšiu funkciu a ešte ďalšiu funkciu, ktorá umožní vystúpiť z programu po každom zlom vstupe.
function vystup() print("byl zadán neplatný vstup") print("chcete ukončit program? (Ano pro ukončeni cokoli pro pokračování.)") vstup = io.read() if vstup == "ano" then os.exit(1)--ukončíme program s kódem 1 (program byl ukončen bez chyby). end end function ziskejoperaci() exit = false while not exit do vstup = io.read() if vstup == "+" then return "+" elseif vstup == "-" then return "-" elseif vstup == "*" then return "*" elseif vstup == "/" then return "/" else print("neznámá operace") vystup() end end end
Kalkulačka z tohto dielu potom vyzerá takto.
function vystup() print("byl zadán neplatný vstup") print("chcete ukončit program? (Ano pro ukončeni cokoli pro pokračování.)") vstup = io.read() if vstup == "ano" then os.exit(1)--ukončíme program s kódem 1 (program byl ukončen bez chyby). end end function ziskejoperaci() exit = false while not exit do vstup = io.read() if vstup == "+" then return "+" elseif vstup == "-" then return "+" elseif vstup == "*" then return "*" elseif vstup == "/" then return "/" else print("neznámá operace") vystup() end end end function ziskejvstup() exit = false while not exit do vstup = io.read() if not tonumber(vstup) == nil then -- Funkce tonumber je součástí standardních knihoven lua tedy je přístupná . -- programu stejně jako standardní knihovna funkcí io ze které je funkce io.read(). -- tonumber se normálně používá v případě že je potřeba převést textový řetězec na číslo. -- Ovšem díky tomu že vrací nil když se převod nepovede se dá použít k validaci vstupu. print("nezadali jste číslo") else return tonumber(vstup)-- Vrátíme vstup převedený na číslo. end end function main() exit = false while not exit do print("zadejte první číslo") cislo = ziskejvstup() print("zadej druhe číslo") cislo2 = ziskejvstup() print("zadejte operaci") operace = ziskejoperaci() if operace == "+" then print(cislo + cislo2) elseif operace == "-" then print(cislo - cislo2) elseif operace == "*" then print(cislo * cislo2) elseif operace == "/" then print(cislo / cislo2) else print("neznama operace") vystup() end end end main();
Aby sme boli z funkciami hotoví ukážem ešte posledná vec a to argumenty.
function zvetsi(cislo,o)--dáme funkci argumenty cislo = cislo + o --argument je vlastně proměnná takže můžeme použít tohle. return cislo end