Funkce
PoužÃváme je již od zaÄátku naÅ¡eho výukového seriálu. Jsou to funkce. Funkce jsou hodnÄ› důležité hned z mnoha důvodů: UlehÄujà práci tÃm, že můžeme použÃt jednu funkci vÃcekrát, jednoduchá komunikace se hrou, atd... I náš obyÄejný print co použÃváme je funkce.
ObyÄejná funkce mimo tÅ™Ãdu
Funkce se deklaruje pomocà klÃÄového slova function a názvu. Na název se vztahujà stejná pravidla jako na promÄ›nné (jen text a ÄÃsla - prvnà znak nesmà být ÄÃslice). Následujà kulaté závorky (), ve kterých jsou vypsány vÅ¡echny parametry funkce. Nakonec nám funkce může, ale nemusà vráti nÄ›jakou hodnotu pomocà klÃÄového slova return. PÅ™Ãklad který si dále rozebereme:
12-- n?jake promenne mimo fci3local a = 5;4local b = 2;5local c = scitej(a,b);6print(c);78-- deklarace funkce9function scitej(a,b)10 return(a+b);11end;
Zde vidÃte kód který využÃvá rovnou dvou funkcà - funkce print, která nám vypÃÅ¡e text do konzole/logu a funkci scitej kterou jsme si nadefinovali na řádku 9. Funkce scitej má dva vstupnà parametry oddÄ›lené Äárkou a to jsou a a b. Tyto parametry se uvnitÅ™ funkce chovajà jako lokálnà promÄ›nné a jejich název se může shodovat s ÄÃmkoli mimo funkci - jelikož se vytvořà lokálnÄ› majà vÄ›tÅ¡Ã váhu než globálnà (pokud je název stejný).
Pomocà klÃÄového slova return si na řádku 10 necháme vrátit souÄet obou vstupnÃch parametrů. Dále si mimo funkci vyalokujeme promÄ›nné a a b do kterých uložÃme nÄ›jaké ÄÃsla. DalÅ¡Ã promÄ›nnou je c na řádku 5 do které rovnou uložÃme výsledek funkce scitej s parametry které jsou a (5) a b (2). Jakmile zavoláme funkci scitej, pÅ™esune se program na zaÄátek deklarace funkce a provede kód až po prvnà return na který narazÃ. Výsledek returnu se uložà do promÄ›nné c kterou si vypÃÅ¡u.
Návratové hodnoty funkcÃ
Funkce může a nemusà vracet hodnotu. My se teÄ zaměřÃme na ty funkce, které hodnotu vracejÃ. Funkce může vrátit jakoukoli hodnotu ke které má pÅ™Ãstup. Dokonce může vracet i vÃce hodnot. Nynà si ukážeme funkci která vracà jednu hodnotu.
1local plus = secti(2,5);2print(plus);34function secti(cislo1,cislo2)5 return (cislo1+cislo2);6end;
V pÅ™Ãkladu můžeme vidÄ›t jednoduchou funkci na sÄÃtánà která vrátà souÄet dvou vstupnÃch parametrů. VracÃme jednu hodnotu a ukládáme ji tak do jedné promÄ›nné. Ale co když máme funkci která nám vrátà dvÄ› promÄ›nné? Jak si vlastnÄ› vytvoÅ™Ãme a zachytÃme výstupnà data? To vám nynà ukážu na pÅ™Ãkladu a popÃÅ¡eme si ho.
12-- chceme vratit nejmensi cislo v poli a jeho pozici3local cisla = nasobkyCislaDoN(3,20);4local nejmensi,poziceNejmensiho = minAPozice(cisla);5print("Nejmensi cislo v poli je "..nejmensi.." a je na indexu"..poziceNejmensiho);67-- s vynechanim promenne8local _,poziceMin = minAPozice(cisla);9print("Index minimalniho cisla je"..poziceMin);10-- zde nezname to nejmensi cislo1112-- definice funkci13function minAPozice(cisla)14 local min;15 local pozice;16 local projel;17 for k,v in ipairs(cisla) do18 if projel == nil then19 projel = true;20 min = v;21 pozice = k;22 end;23 if min > v then24 min = v;25 pozice = k;26 end;27 end;28 return min,pozice;29end;3031function nasobkyCislaDoN(cislo,doKdy)32 local nasobky = {};33 for i=1,doKdy do34 nasobky[i] = i*cislo;35 end;36 return(nasobky);37end;
PÅ™Ãklad ukazuje vrácenà dvou hodnot (lze ale použÃt i pro vÃce tÅ™eba pro 5). DocÃlÃme toho tak, že mezi promÄ›nné urÄené k návratu za klÃÄovým slovem return dáme Äárku. Zachytávánà výstupu do promÄ›nných je potom stejné - mezi promÄ›nné dám Äárku. Pozor - poÅ™adà zachytávaných promÄ›nných je stejné, jako jsou zapsané ve funkci. Pokud nechceme jednu nebo vÃce promÄ›nných zachytit, pak použžijeme znak podtržÃtka (_) mÃsto názvu promÄ›nné. (viz řádek 8)
Break
AÄkoli to nenà pÅ™Ãmo funkce, vztahuje se k nim alespoň z Äásti a tak si ho zde ukážeme. Toto klÃÄové slovo se použÃvá v cyklech a umožňujà zastavenà cyklu. Ukázu a popÃÅ¡u:
12-- promenne3local i = 1;4local b = 5;5while true do6 if b >= 15 then7 break;8 end;9 b = b * i;10 i = i + 1;11 print(b);12end;13-- vypise jen cisla 5,10 a 1514
V ukázce máme pÅ™Ãklad který použÃvá cyklus. PÅ™Ãklad nám vypisuje násobky ÄÃsla 5 až do 15. Pokud se totiž podmÃnka na řádku 6 splnÃ, cyklus bude ukonÄen a nespadneme tak do nekoneÄného zacyklenÃ.
Použità break je tak jasné - break ukonÄà cyklus a už nic neporovnává.
PÅ™Ãklad na závÄ›r
Nakonec zde uvedu jeden vÄ›tÅ¡Ã pÅ™Ãklad který si můžete vyzkouÅ¡et a upravit. ÄŒÃm vÃce budete upravovat a cviÄit, tÃm vÃce pochopÃte.
1--[[2 Author: Martin Fabik3 Predmet: Ukazkovy skript (cykly, funkce, break)4]]--56mujSkript = {};78function mujSkript.prerequisitesPresent(specializations)9 return true;10end;1112function mujSkript:load(xmlFile)13 local ciselka = nasobkyCislaDoN(5,15);14 print("Sude cisla v poli ciselka:");15 vypisKazdeSude(ciselka);16 local maximalniCislo,licheCisla = kolikJeLichychAMaxCislo(ciselka);17 print("Maximalni cislo je: "..maximalniCislo);18 print("");19 print("Pocet lichych v poli ciselka: "..licheCisla);20 ciselka = nasobkyCislaDoN(3,10);21 maximalniCislo,_ = kolikJeLichychAMaxCislo(ciselka);22 print("");23 print("Maximalni cislo pro 10 nasobku cisla 3: "..maximalniCislo);24end;2526function mujSkript:mouseEvent(posX, posY, isDown, isUp, button)27end;2829function mujSkript:keyEvent(unicode, sym, modifier, idDown)30end;3132function mujSkript:update(dt)33end;3435function mujSkript:updateTick(dt)36end;3738function mujSkript:draw()39end;4041function nasobkyCislaDoN(cislo,doKdy)42 local nasobky = {};43 for i=1,doKdy do44 nasobky[i] = i*cislo;45 end;46 return(nasobky);47end;4849function vypisKazdeSude(cisla)50 for k,v in ipairs(cisla) do51 if v%2 == 0 then52 print(v);53 end;54 end;55end;5657function kolikJeLichychAMaxCislo(cisla)58 local liche = 0;59 local maxCislo;60 local projel;61 for k,v in ipairs(cisla) do62 if v%2 ~= 0 then63 liche = liche + 1;64 end;65 if projel == nil then66 projel = true;67 maxCislo = v;68 end;69 if maxCislo < v then70 maxCislo = v;71 end;72 end;73 return maxCislo,liche;74end;