LUA - programovací jazyk / LUA - programming language |
2 | ||
1.1. Poznámky Do svého kódu si můžeš psát poznámky, které nic neovlivňují, je to pouhý text, který ti může připomenout, že chceš doprogramovat tohle tam a tohle funguje takhle. Vše,co napíšeš za dvě pomlčky, je poznámka, například: Code Lua 1 --já jsem poznámka Poznámky je také možné psát na více řádků, pokud napíšeš dvě pomlčky a text napíšeš do dvou hranatých závorek, takhle: Code Lua 1 2 3 --[[já jsem 1.2. Proměnné Lua má 3 základní typy hodnot. Číslo, string a boolean. • Číslo je jakákoliv číselná hodnota včetně záporných a necelých čísel. Desetinná čárka se vždy píše jako tečka. Takže za číslo se považuje například: 100, 0, -6, 0.8, 0.9454, -6, ... • String je jakýkoliv text. Texty se píšou do " uvozovek. Za text se tedy považuje například: "ahoj", "jak se máš?", "Vítej, cestovateli, musíš být unavený, odpočiň si u táboráku...", ... • Boolean je velice jednoduchá hodnota, protože má pouze 2 podoby. Buď je pravda nebo nepravda. K čemu přesně je boolean dobrý si vysvětlíme později. Za boolean se tedy považuje: true, false. Proměnnou v kódu vytvoříme tak, že napíšeme libovolný název pro naši proměnnou, rovná se a nakonec hodnotu, které chceme, aby se proměnná rovnala. Tady jsou příklady vytvoření všech třech typů proměnných: Code Lua 1 2 3 4 5 x = 0.5 --já jsem číslo Pozor, do názvů proměnných se nikdy nepíše diakritika. Pokud chceš mít víceslovný název proměnné, tak slova neodděluj mezerou, ale podtržítkem. Například x_hodnota = 600 Proměnná se může rovnat i jiné proměnné: Code Lua 1 2 3 x = 10 --mám hodnotu 10 Hodnotu proměnné můžeš jednoduše změnit tím, že proměnné přiřadíš novou hodnotu: Code Lua 1 2 3 x = 10 --mám hodnotu 10 Dokonce můžeš měnit i typ hodnoty: Code Lua 1 2 3 4 5 x = 1 --teď jsem číslo 1.3. print() Print ti vypíše hodnotu do zprávy v #lua chatu, je to úžasný nástroj na testování nejrůznějších věcí a my ho budeme v hojném počtu využívat. Konečně se dostáváme k prvnímu programování! Slavnostně si můžeš přímo v TFM poprve otevřít Lua konzoli příkazem /lua. Pokud se nic neotevřelo, podívej se znovu úplně na vrch tohoto topicu, jak se spouští Lua. Jako první si vytiskneme string "hello world!". Je to takový rituál pro nováčka, který tímto zdraví nový neprobádaný svět programování! Do konzole tedy napiš tohle a stiskni Potvrdit: Code Lua 1 print("hello world!") Pokud máš vše správně, otevře se ti chat #lua a uvidíš svou první vytisklou zprávu ![]() 1. Mám pro tebe první úkol! Vytiskni tři hodnoty: "Já jsem programátor", -6, false. (Odpovědi si vždy někam zapisuj a potom zkontroluj s řešením. Vždy pokračuj dál ve čtení tutorialu až jakmile splníš úkol. Pokud si úkol splnil špatně, prohlédni si zadání a řešení, pokračuj, jakmile pochopíš, co máš proč špatně.) c: 1. řešení Code Lua 1 2 3 print("Já jsem programátor") Print dokáže vytisknout i proměnné, například: Code Lua 1 2 3 x = -150 1.4. Operace s čísly Přejdeme do jednoduché matematiky. Lua umí 4 základní operace: • plus + • mínus - • násobení * • dělení / Operace je velice jednoduché použít, například: Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 x = 10 Stejně jako v matematice, i v Lua můžeš využívat závorky například pro upřednostnění sčítání před násobením. Code Lua 1 2 3 4 5 x = 10 2. Je tu druhý úkol! V kódu jsou tři proměnné x, y a z. V printech doplň proměnné místo otazníků tak, aby každý print vytiskl číslo, které je napsané v poznámce za printem. Code Lua 1 2 3 4 5 6 7 8 9 x = 2 2. řešení Code Lua 1 2 3 4 5 6 7 8 9 x = 2 1.5. Logické operátory I když jsem říkal, že boolean je velice jednoduchá hodnota, zatajil jsem, že se v ní skrývá něco zajímavého, do čeho se právě ponoříme. Jak jsem říkal, boolean může být buď pravda nebo nepravda. Ovšem pravda a nepravda jde díky logickým operátorům získat různými způsoby. Vysvětlíme si, co každý logický operátor dělá a jak se zapisuje: • and - logická spojka a, píše se ve tvaru boolean and boolean. Oba booleany musí být true, aby byl výsledek true, v každém jiném případě dostaneme false. • or - logická spojka nebo, píše se ve tvaru boolean or boolean. Jeden z booleanů musí být true, aby byl i výsledek true. Takže pouze pokud budou oba booleany false, výsledek bude false. • not - logická spojka ne, píše se ve tvaru not boolean. Neguje boolean, to znamená, že true změní na false a false zmení na true. Tady je pár příkladů přímo v kódu: Code Lua 1 2 3 4 5 6 7 8 print(true and true) --vytiskne true, protože všechny booleany jsou true Logické operátory and a or je možné řetězit na libovolný počet booleanů. Tady je pár příkladů: Code Lua 1 2 3 4 5 print(true and true and true and true) --vytiskne true, protože všechny booleany jsou true Stejně jako má násobení a dělení přednost před sčítáním a odčítáním, and má přednost před or; not má přednost před and i or. Code Lua 1 2 print(false or false and true or true) --vytiskne true Ovšem opět je možné využít závorky, aby jsme upřednostnili operace, které chceme aby se staly jako první, stejně jako když napíšeme u operací 9 * (4 + 4), můžeme napsat například (boolean or boolean) and (boolean or boolean). Tady je příklad, jak mohou závorky změnit výsledek přímo v kódu: Code Lua 1 2 print(false or false and true or true) --vytiskne true A ano, tyhle hodnoty je možné zadat do proměnné stejně jako všechny ostatní hodnoty: Code Lua 1 2 3 x = false or false and true or true 3. Ve třetím úkolu tu máš nekolik printů s booleany a logickými operátory. Uhádni u každého printu, jestli vytiskne true nebo false. Code Lua 1 2 3 4 5 6 7 8 9 10 11 print(false and false) 3. řešení Code Lua 1 2 3 4 5 6 7 8 9 10 11 print(false and false) --vytiskne false 1.6. Srovnávací operátory ==, ~=, <, >, <= a >= Aby toho nebylo málo, máme tu další důležité operátory, které nám také jako výsledek dají boolean. Všechny se píšou ve tvaru hodnota operátor hodnota. Naštěstí jsou jednoduché na pochopení: • == (rovná se) - Pokud jsou hodnoty stejné, výsledek je true, pokud jsou jiné, výsledek je false. • ~= (nerovná se) - Pokud jsou hodnoty jiné, výsledek je true, pokud jsou stejné, výsledek je false. Je to opak == operátoru. • < (je menší) - Srovnává dvě čísla. Pokud je první číslo menší než druhé, výsledek je true. V jiném případě je výsledek false. • > (je větší) - Srovnává dvě čísla. Pokud je první číslo větší než druhé, výsledek je true. V jiném případě je výsledek false. • <= (je menší nebo rovno) - Srovnává dvě čísla. Pokud je první číslo menší nebo rovno druhému, výsledek je true. V jiném případě je výsledek false. • >= (je větší nebo rovno) - Srovnává dvě čísla. Pokud je první číslo větší nebo rovno druhému, výsledek je true. V jiném případě je výsledek false. Lua je v operátorech == a ~= hodná a nehodí chybu, i když srovnáváme dva úplně jiné typy hodnot. Tady je pár příkladů, jak se tyto operátory využívají: Code Lua 1 2 3 4 5 6 7 print(1 == 1) --vytiskne true Opět je možné tyhle hodnoty zadat do proměnné stejně jako všechny ostatní hodnoty: Code Lua 1 2 3 x = 9 ~= "zdarec" 4. Tentokrát tu máš několik printů s hodnotami a srovnávacími operátory. Uhádni u každého printu, jestli vytiskne true nebo false. Code Lua 1 2 3 4 5 6 7 8 9 10 x = 2 4. řešení Code Lua 1 2 3 4 5 6 7 8 9 10 x = 2 Teď spojíme srovnávací operátory s logickými operátory and, or a not, protože se využívají společně a brzy si řekneme kde. Srovnávací operátory se vyhodnotí jako první, až potom se vyhodnocují logické operátory. Tady je pár příkladů přímo v kódu: Code Lua 1 2 3 4 5 6 7 8 9 x = 5 5. Tohle bude poslední test, jestli rozumíš logickým i srovnávacím operátorům. Uhádni u každého printu, jestli vytiskne true nebo false. Code Lua 1 2 3 4 5 6 7 8 9 10 x = 2 5. řešení Code Lua 1 2 3 4 5 6 7 8 9 10 x = 2 1.7. IF prohlášení Konečně se dostáváme do něčeho, co vypadá jako pořádné programování! :D Využijeme tu pořádně naše logické a srovnávací operátory. If prohlášení je takzvané podmíněné vykonání příkazu. Ukážeme si, jak se zapisuje v kódu. Začneme jednoduše. Na začátek napíšeme slovíčko if, za něj nějaký boolean a nakonec slovíčko then. Vznikne nám if boolean then. Například if x > 9 then. Potom stiskneme 2x enter a napíšeme end. Tím si prohlášení uzavřeme a vše, co napíšeme mezi řádky s if a end se stane pouze, pokud boolean za if bude true. Ukážeme si to názorně v kódu: Code Lua 1 2 3 4 5 x = 10 V tomto případě kód vytiskne x je menší než 100, protože hodnota x na začátku je opravdu menší než 100. Můžeš vidět, že jsem print odsadil od kraje tabem. Odsazení tabem se používá pro lepší čitelnost kódu. K if můžeme dále využít komponent v podobě elseif boolean then. Napojuje se vždy pod if a můžeme jich pod sebou napsat kolik chceme. Pokud první if není pravda, vyzkouší se elseif pod ním. Pokud ani to není pravda, vyzkouší se další elseif pod ním a tak dále. Code Lua 1 2 3 4 5 6 7 8 9 10 11 x = 10 V tomto případě kód vytiskne x je větší než 5. protože elseif x > 5 then je jako první pravda. Všechny ostatní elseif se už ani nezkontrolují a přejde se rovnou k end. Poslední slovíčko, které můžeme k if přidat je else. Napojuje se vždy až jako poslední, můžeme napsat pouze jedno a nepíše se k němu boolean ani slovo then. Pokud není if ani žádné elseif pravda, spustí se else. Code Lua 1 2 3 4 5 6 7 8 9 10 11 x = 10 Kód vytiskne x není 3 ani 7 ani 15, protože žádné z prohlášení není pravda. 6. Máš tu kód s několika if prohlášeními. Urči u každého prohlášení, jaké číslo vytiskne. Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 x = -3 6. řešení Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 x = -3 7. Dostaneš první opravdu programovací úkol. V kódu je hodnota x, za kterou můžeš dosadit libovolné číslo. Napiš takovou if strukturu, která vytiskne, jestli je x záporné číslo, kladné číslo nebo 0. Klidně si kód můžeš několikrát spustit s různými x hodnotami pro ověření, jestli ho máš naprogramovaný správně. Code Lua 1 2 3 x = 254 7. řešení Code Lua 1 2 3 4 5 6 7 8 9 x = 254 Nebo Code Lua 1 2 3 4 5 6 7 8 9 x = 254 Vyzkoušíme si do if prohlášení přidat i logické operátory, tady je příklad přímo v kódu: Code Lua 1 2 3 4 5 6 7 x = 7 8. V kódu jsou hodnoty x a y. Za x můžeš dosadit libovolné číslo a za y libovolný boolean. Napiš takovou if strukturu, která vytiskne boolean true, pokud je x rovno 1 nebo 150 nebo 2000 a zároveň y je true. V jiném případě se vytiskne boolean false. Využij i logické operátory. Klidně si kód můžeš několikrát spustit s různými x a y hodnotami pro ověření, jestli ho máš naprogramovaný správně. Code Lua 1 2 3 4 x = 2000 8. řešení Code Lua 1 2 3 4 5 6 7 8 x = 2000 Nebo Code Lua 1 2 3 4 5 6 7 8 9 10 x = 2000 9. Úkoly už začínají být obtížnější. V kódu jsou hodnoty x a y, za které můžeš dosadit libovolná čísla. Napiš takovou if strukturu, která vytiskne string "x je podobné y", pokud je x nejvíce o 10 menší nebo větší, něž y. Pokud to nebude pravda, vytiskne string "x není podobné y". Využij i logické operátory. Klidně si kód můžeš několikrát spustit s různými x a y hodnotami pro ověření, jestli ho máš naprogramovaný správně. Code Lua 1 2 3 4 x = 50 9. řešení Code Lua 1 2 3 4 5 6 7 8 x = 50 Nebo například i jinak upravené rovnice Code Lua 1 2 3 4 5 6 7 8 x = 50 If se může vnořit do dalšího If: Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 x = 5 10. V kódu jsou dvě if struktury. U obou urči, jaké číslo vytiskne. Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 x = 10 10. řešení Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 x = 10 11. Dám ti úkol, podle kterého se pozná, jestli opravdu rozumíš všemu, co jsme si zatím řekli. V kódu máš tři proměnné. Dvě čísla s názvy x a y a jeden string s názvem operace. Čísla mohou být libovolná a string může být jedna ze čtyř hodnot "plus", "mínus", "krát", "děleno". Naprogramuj jednoduchou kalkulačku pro hodnoty x a y, která vytiskne jejich součet, rozdíl, násobek nebo podíl podle toho, jakou string hodnotu bude mít operace. Code Lua 1 2 3 4 5 x = 10 11. řešení Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 x = 10 1.8. Hodnota nil Když jsem poprve vysvětloval hodnoty, zatajil jsem, že v Lua existují další dva základní typy hodnot, aby toho nebylo na začátek tolik. Na první z nich se podíváme právě teď. Typ hodnoty nil má jen jedinou podobu a znamená prázdnou hodnotu. Používá se například, pokud chceme vytvořit proměnnou, která zatím nemá žádnou hodnotu, ale dá se s ní pracovat jako se všemi ostatními proměnnými. Code Lua 1 x = nil --já jsem nil 1.9. Table Table je druhý typ hodnoty, který jsem na začátku záměrně nezmínil, protože tenhle je nejsložitější. Table je velice speciální hodnota, protože v sobě dokáže ukládat jakékoliv další hodnoty. Ukážeme si, jak se vytvoří proměnná s hodnotou table: Code Lua 1 2 3 x = {} --já jsem prázdný table Na hodnoty tablu se dostaneme pomocí indexů. Index v Lua začíná od 1. Například, pokud máme y = {2, 10, 100}, číslo 2 je na indexu 1, číslo 10 na indexu 2 a číslo 100 na indexu 3. Pokud budeme chtít ve zmíněném tablu dostat hodnotu na určitém indexu, napíšeme název tablu a za něj do hranatých závorek index. Například y[2] má hodnotu 10. Ukážeme si to názorně v kódu: Code Lua 1 2 3 4 5 6 7 x = {5, 10, 15, 20, 25, 30} Pokud se pokusíme získat hodnotu na indexu, který v tablu není, například index 10 z tablu x = {5, 10, 15, 20, 25, 30}, dostaneme hodnotu nil. Code Lua 1 2 3 x = {5, 10, 15, 20, 25, 30} Další důvod, proč jsou tably tak úžasné je, že v sobě dokážou ukládat opravdu jakýkoliv typ hodnoty. To znamená, že v sobě dokážou uložit i další tably. Tím se dostáváme do vícedimenzionálních tablů. Pokud máme table, kderý má v sobě další table, nazývá se dvoudimenzionální table. Pokud zajdeme do větších extrémů a budeme mít table, který má v sobě další tably a ty v sobě mají další tably, nazývá se trojdimenzionální. Stejným způsobem mohou být čtyřdimenzionální, pětidimenzionální a tak dále. Vytvoříme si jednoduchý dvoudimenzionální a trojdimenzionální table a názorně si ukážeme, jak se dostat na všechny jejich hodnoty: Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 x = {10, "ahoj", nil, true, {}} --do tablu jde vložit jakýkoliv typ hodnoty Už trojdimenzionální tably dokážou být velice matoucí. Proto doporučuji nepřehledné vícedimenzionální tably zapisovat mnohem srozumitelněji na více řádků: Code Lua 1 2 3 4 5 6 7 y = { Pro ještě větší srozumitelnost můžeme v kódu i znázornit jednodlivé indexy. To už záleží na samotném programátorovi, jestli se rozhodne indexy rozepisovat nebo ne. Mně osobně se to někdy vyplatí a někdy ne. Zápis ukážu na tablech z posledních dvou kódů a nechám i printy pro srovnání, o kolik je jednodušší přečíst takhle rozepsané tably: Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 y = { 12. V kódu máš několik vícedimenzionálních tablů. Každý rozepiš na více řádků do srozumitelnější podoby. Code Lua 1 2 3 4 a = {{1, 2, 3, 4, 5, 6}, {10, 20, 30, 40, 50, 60}} 12. řešení Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 a = { 13. V kódu máš několik vícedimenzionálních tablů. Urči u každého printu, co vytiskne. Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 x = {{3, 6, 9, 12}, {4, 8, 12, 16}, {5, 10, 15, 20}} 13. řešení Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 x = {{3, 6, 9, 12}, {4, 8, 12, 16}, {5, 10, 15, 20}} Výborně, teď už víme, jak se orientovat v tablech a indexech. Teď si ukážeme způsob, jak můžeme do tablu přidávat další hodnoty nebo z tablu mazat hodnoty. K tomu slouží dvě funkce. Do teď jsme znali pouze funkci print(hodnota), tak teď si do našeho repertoáru přidáme další. table.insert(table, index, hodnota) - Přidá do tablu novou hodnotu. Do funkce zadáváme tři věci: • table - název tablu, do kterého chceme přidat hodnotu • index - index, na který chceme v tablu přidat hodnotu • hodnota - nějaká hodnota, kterou chceme přidat. Není nutné zadávat index. Funkci můžeme použít i takhle: table.insert(table, hodnota). V tomto případě se hodnota dá na konec tablu. table.remove(table, index) - Smaže z tablu určitou hodnotu. Do funkce musíme zadat dvě věci: • table - název tablu, ze kterého chceme smazat hodnotu. • index - index, ze kterého chceme smazat hodnotu. Opět není nutné zadávat index. Funkci můžeme použít i takhle: table.remove(table). V tomto případě se smaže poslední hodnota. Tady je několik příkladů, jak funkce použít: Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 x = {5, 2, 3} Pokud budeme mít například table x = {1, 2} a na 7. index dáme číslo 4, tedy použijeme table.insert(x, 7, 4), můžeme si představit, že všechny indexy, mezi 2. indexem a 7. indexem, do kterých jsme nezadali žádné číslo, mají hodnotu nil. Takže výsledek bude x = {1, 2, nil, nil, nil, nil, 4}. Code Lua 1 2 3 x = {1, 2} 14. V kódu máš table x s čísly. Použij funkce table.insert() a table.remove() k uspořádání tablu tak, aby jeho finální podoba vypadala takhle x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}. Pokus se využít co nejméně table.insert() a table.remove() funkcí. Vytisknutím tablu pomocí print(x) na konci kódu si můžeš zkontrolovat, jestli máš úkol splněný správně. Code Lua 1 2 3 4 5 x = {-9, 4, 0.5, 3, 4, 100, 5, 6, "ahoj", 9} 14. řešení Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 x = {-9, 0.5, 3, 4, 100, 5, 6, "ahoj", 9} Druhý způsob, jak můžeme v tablu manipulovat s hodnotami je přímo přepisování v podobě x[2] = 6. Tohle nám změní na druhém indexu v tablu x hodnotu na 6. Ukážeme si pár příkladů přímo v kódu: Code Lua 1 2 3 4 5 6 7 x = {3, 6, 9, 12} 15. Mám pro tebe ještě jeden podobný úkol. V kódu máš opět table x s čísly. Tentokrát změň hodnoty stylem x[index] = hodnota k uspořádání tablu tak, aby jeho finální podoba vypadala takhle x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}. Pokus se změnit co nejméně hodnot. Vytisknutím tablu pomocí print(x) na konci kódu si můžeš zkontrolovat, jestli máš úkol splněný správně. Code Lua 1 2 3 4 5 x = {-9, 0.5, 3, 4, 100, 6, "ahoj", 9} 15. řešení Code Lua 1 2 3 4 5 6 7 8 9 10 11 x = {-9, 0.5, 3, 4, 100, 6, "ahoj", 9} Velice užitečný je také operátor #, který nám dá délku tablu. Píše se ve tvaru #table. Pozor, pokud je v tablu uložený nil, může způsobit zvláštní chování # operátoru, proto nedoporučuji používat #, pokud v tablu ukládáš nil. Ukážeme si příklady použití # přímo v kódu: Code Lua 1 2 3 4 5 6 7 8 x = {10, 20, 30, 40} Index je první způsob, jak můžeme ukládat hodnoty do tablu a následně se v nich navigovat. Druhý způsob je klíč. V Lua je, oproti jiným programovacím jazykům, velmi malý rozdíl mezi tím, co je index a co klíč a to dokáže být matoucí. Proto si teď přesně definujeme, co budeme považovat za index a co za klíč. • Index může být pouze celé číslo větší než 0. Například 1, 2, 10, 5000, 5413215, ... • Klíč může být jakákoliv hodnota, která se nepovažuje za index. Jediný nil se nemůže použít jako klíč. I tak silně doporučuji jako klíč využívat pouze string, aby jste se vyznali v tom, co děláte. Například "ahoj", "age", "key_one", ... Ukážeme si, jak table s klíči vypadá na tablu jménem pes: Code Lua 1 2 3 4 5 6 7 8 9 pes = { Pro klíče neexistuje něco jako table.insert() a table.remove(), vše se dělá přímo přiřazením hodnoty. Pokud chceme do výše vytvořeného tablu pes přidat třeba rychlost, uděláme to takhle pes["rychlost"] = 30. Ukážu i příklad přímo v kódu: Code Lua 1 2 3 4 5 6 7 8 pes = { Pokud z tablu chceme smazat hodnotu s klíčem, dáme ji rovno nil. například pes["vek"] = nil. Opět ukážu příklad přímo v kódu: Code Lua 1 2 3 4 5 6 7 8 pes = { Je možné mít table, kde jsou zároveň indexy i klíče: Code Lua 1 x = {1, 10, ["velikost"] = 500, ["vzdalenost"] = 300} V takovém případě bych doporučil lepší zápis kvůli jednodušší čitelnosti kódu: Code Lua 1 2 3 4 5 6 x = { Pozor, operátor # ignoruje klíče, takže pokud bude mít table 2 indexy a 3 klíče, jeho velikost bude 2. Žádný strach, jak zjistit velikost tablu i s klíči si ukážeme níže v tutorialu. Code Lua 1 2 3 4 5 6 7 8 9 x = { Klíče je možné zapisovat dvěma různými způsoby. Já mám ve většině případů raději druhý styl zápisu, který vám teď ukážu: Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 pes = { Nezáleží na tom jakým stylem klíče zapíšeš. Například i když vytvoříš hodnotu pes["rychlost"] = 3 a vytiskneš ji jako print(pes.rychlost), vše bude fungovat bez problémů, ale kvůli jednodušší čitelnosti doporučuji využívat jednotně takový styl, ve kterém si klíč vytvoříš. Code Lua 1 2 3 4 5 6 7 8 9 10 pes = { 16. Mám pro tebe poslední úkol v této sekci s tably. Na začátku kódu je velký table se seznamem křečků podle jmen a každý křeček má své statistiky. Dole v kódu je několik prázdných printů a u každého je komentář s požadavkem, co má vytisknout. Místo otazníku zapiš do každého printu takovou proměnnou, aby print vytiskl požadovanou hodnotu z tablu s křečky. Například, pokud budu chtít hlad Pauly, odpověď bude seznam_krecku["Paula"].hlad Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 seznam_krecku = { 16. řešení Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 seznam_krecku = { Pozor, operátor == a ~= nepozná, jaký je obsah tablu, takže například print({1, 2, 3} == {1, 2, 3}) vytiskne false. Code Lua 1 2 3 4 5 6 7 8 9 x = {1, 2, 3} Pozor, v TFM, funkce print tiskne špatně vícedimenzionální tably. Pokud budeme chtít vytisknout table x = {1, 2, {3, 4}}, dostaneme: ![]() Přitom správně vytisknutý table x = {1, 2, {3, 4}} by měl vypadat takhle: Code Lua 1 2 3 4 5 6 7 8 x = { Zbytek tutorialu zatím není dokončený, chybí mi tu ještě 2 hlavní části. Jenže protože brzy končí tyto fóra, dám sem potřebné informace jiným způsobem, než jsem plánoval. Pomůžu si youtube videi a dál prozatím nebudou úkoly, proto si sám/sama pečlivě procvič vše, co se naučíš. Tutrial dodělám později, až budu mít hotové zkoušky v irl a jakmile najdu jiné místo na dokončení tutorialu než stránky Atelier801. 1.10. Cykly Je to část kódu, která se dokáže několikrát opakovat. Jsou tři druhy cyklů: for, while a repeat until. Tady je youtube tutorial na všechny cykly: https://www.youtube.com/watch?v=wZjkaHplAWs Chci k tutorialu něco málo dodat: • Youtuber využil v tutorialu break, který ukončí cyklus předčasně. Například: Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 for i = 1, 10 do • Když máš ve for cyklu například for i = 1, 10 do, místo i si můžeš napsat cokoliv, třeba for day = 1, 10 do. Nejčastěji se ovšem jako nepsané pravidlo využívá i. • Existuje ještě druhý způsob využití for cyklu, který projede celý table (indexy i klíče). Projíždí vždy jeden index/klíč po druhém. i se vždy rovná indexu nebo klíči a v je příslušná hodnota tomu indexu nebo klíči. Zápis cyklu je následovný: for i,v in pairs(table) do. Místo i a v můžeme opět napsat co chceme. Ukážeme si to přímo v kódu: Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 numbers = {10, 20, ["a"] = 50, ["b"] = 150} • Pokud místo pairs napíšeme ipairs, cyklus bude ignorovat klíče. Opět ukážu v kódu: Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 numbers = {10, 20, ["a"] = 50, ["b"] = 150} • Samozřejmě je možné vnořit jeden cyklus do druhého: Code Lua 1 2 3 4 5 6 for i = 1, 10 do 1.11. Vlastní funkce Jedna z úplně nejdůležitějších a nejzajímavějších věcí v programování je tvorba vlastních funkcí. Tady je tutorial z YouTube. Bohužel je torchu složitější, ale lepší jsem nenašel: https://youtu.be/9EVjBNjqU2U?si=jqKhLp_cuqEN3pfE Opět chci k tutorialu něco dodat: • V tutorial píše programátor před všechny funkce local. To nemusíš nutně psát. Ovšem local je velmi užitečné při vytváření hodnot ve funkcích, protože vytváří lokální hodnotu, která bude existovat pouze uvnitř dané funkce. Například: Code Lua 1 2 3 4 b = 10 Code Lua 1 2 3 4 5 6 7 8 9 function ahoj() • Taky v kódu použil age = age or 5. To je zkrácená verze pro: Code Lua 1 2 3 4 5 if age ~= nil then • Dále využil spojení stringu s další hodnotou, což se dělá pomocí dvou teček .. Code Lua 1 2 3 4 5 6 7 8 9 10 a = "ahoj" • Pokud funkce vrací pouze true nebo false, nazývá se predikátová a do jejího názvu doporučuji psát na konec P jako predikátová, aby byl kód o něco srozumitelnější. Predikátová funkce je například: Code Lua 1 2 3 4 5 6 function vetsiNez10P(x) • Pokud funkce volá sama sebe, nazývá se rekurzivní. Rekurzivní funkce může vypadat například takhle: Code Lua 1 2 3 4 5 6 7 8 function printNumbers(x, y) 1.12. Math Už umíš všechny nejdůležitější prvky programování. Ale ještě, než se vrhneš na svou epickou cestu programátora, ukážu ti některé velice užitečné funkce. Začnu s math funkcemi, které ti pomůžou při práci s čísly. • math.random(x, y) - Funkce ti vrátí náhodné číslo v rozsahu od x do y. Například print(math.random(5, 10)) vytiskne náhodné číslo od 5 do 10. • math.abs(x) - Funkce ti vrátí absolutní hodnotu x. Například print(math.abs(-90)) vytiskne 90. • math.ceil(x) - Funkce ti vrátí x zaokrouhlené nahoru. Například print(math.ceil(5.65421)) vytiskne 6. • math.floor(x) - Funkce ti vrátí x zaokrouhlené dolů. Například print(math.floor(5.65421)) vytiskne 5. Můžeme udělat zaokrouhlování od desetinné pětky nahoru, jak známe z matematiky, pokud k x přičteme 0.5. Například math.floor(5.65421 + 0.5). • math.sqrt(x) - Funkce ti vrátí odmocninu z x. Například print(math.sqrt(9)) vytiskne 3. • math.huge - Funkce ti vrátí tak velké číslo, že funguje jako nekonečno, print(math.huge) vytiskne inf. • math.pi - Funkce ti vrátí číslo pi, print(math.pi) vytiskne 3.1415927. Math dokáže pracovat například i se sinus, cosinus, tangens, cotangens, radiány nebo logaritmy, tady jsou všechny math funkce: https://www.tutorialspoint.com/lua/lua_math_library.htm. 1.13. Operace ^ a %. Lua umí kromě +, -, *, / i další 2 operace, které jsem na začátku tutorialu zatajil. • mocnina ^ • celočíselný zbytek po dělení % Jak fungují: Code Lua 1 2 3 4 5 6 7 8 x = 7 Pomocí % jde vytvořit jednoduše kontrola, jestli je číslo sudé necho liché: Code Lua 1 2 3 4 5 if x % 2 == 0 then Dernière modification le 1733744100000 |
0 | ||
1.14. Něco víc ke stringu Říkal jsem, že string se píše do " uvozovek. Co ale dělat, pokud chceme mít uvozovky přímo v textu? Jsou dva způsoby. První je, že před uvozovku v textu napíšeme obrácené lomítko \. Například "Potom řekla \"jak se máš?\"". Druhý způsob je, že string nezapíšeme do " uvozovek, ale do ' uvozovek. Potom můžeme používat dvojité uvozovky bez problému. Tady jsou i příklady přímo v kódu: Code Lua 1 2 print("Zeptala se \"jak se máš?\", když jsem došel.") --vytiskne: Zeptala se "jak se máš?", když jsem došel. Někdy můžeme chtít napsat text na více řádků. To můžeme udělat opět dvěma způsoby. První je, že do textu přídáme znak pro nový řádek \n. Druhý způsob je, že string nezapíšeme do uvozovek, ale do dvou hranatých závorek, takhle: [[text]]. Ukážu příklady přímo v kódu: Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 print("Ahoj Hufe,\njak se máš?") Stejně jako existují funkce pro úpravu s čísly, existují také funkce pro úpravu stringů: • string.lower(string) - Všechna písmena ve stringu změní na malá. • string.upper(string) - Všechna písmena ve stringu změní na velká. • string.sub(string, x, y) - Vrátí určitou část textu. Například, pokud x bude 1 a y -2, vrátí se nám string, který začíná od prvního znaku a končí předposledním znakem vstupního stringu. Těchto funkcí existuje více, všechny najdeš tady: https://www.tutorialspoint.com/lua/lua_strings.htm. Příklady string funkcí přímo v kódu: Code Lua 1 2 3 print(string.lower("AhoJ, jAK sE Máš?")) --vytiskne: ahoj, jak se máš? Připojovat do stringu proměnné nemusíš pouze pomocí dvou teček, ale také funkcí string.format(string, x1, x2, x3, ...). Funkce funguje tak, že do ní zadáš string, který má v sobě připravené zástupné symboly pro hodnoty. Zástupné symboly mohou být následovné: • %d nebo %i - číslo • %f - desetinné číslo • %s - string • %x - číslo předělá na hexadecimální číslo • %c - číslo předělá na znak z ASCII tabulky (https://cs.wikipedia.org/wiki/ASCII) Příklad přímo v kódu: Code Lua 1 2 3 4 5 6 7 8 9 jmeno = "Pája" 2. Pár slov na závěr V budoucnu chci tento tutorial ještě vylepšit a rozšířit. Od cyklů je vše vysvětlené spíš v rychlosti a za použití YouTube videí, které nejsou úplně vhodně zasazené do tohoto tutorialu, ale snažil jsem se! xD Programování je nikdy nekončící učení a v Lua se toho skrývá mnohem více, než co jsem ukázal. Každopádně, tohle je skvělý způsob, jak ukázat nováčkům svět programování a jak poskytnout nejdůležitější informace postupně, srozumitelně a bez stovek hodin googlení. Děkuji, že jsi prošel můj tutorial a přeji hodně štěstí do tvé cesty programátora! :D |