Lua - Instalace Lua a Jednoduchá kalkulačka

Ostatní jazyky Lua Lua - Instalace Lua a Jednoduchá kalkulačka

Vítejte u druhého dílu seriálu o Lua! Jako první bych chtěl oznámit, že musíte mít nainstalovanou Luu na svém PC! Doteď jsme si Luu zprostředkovávali Javou, ale vzhledem k tomu, že jsem přešel na Mac mi LDT začalo dělat neplechu. Samozřejmě můžete dál používat LDT, do tohoto těžšího způsobu vás nikdo nenutí.

Instalace na Windows

  • Z této stránky si stáhneme Lua for Windows.
  • Projedeme instalaci, při výběru komponent můžeme odškrtnout IDE (můžete používat například Notepad++)
  • V editoru nyní budeme soubory ukládat jako .lua a otevírat je budeme pomocí cmd - příkazem
lua cesta_název

Instalace na OS X (Mac)

  • Z této stránky si stáhneme Lua
  • Projedeme instalaci
  • V editoru nyní budeme soubory ukládat jako .lua a otevírat je budeme pomocí terminálu - příkazem
lua cesta_název

Instalace na Linuxu (Raspbian)

  • Pomocí apt-get stáhneme lua, verzi 5.2
sudo apt-get install lua5.2
  • V editoru nyní budeme soubory ukládat jako .lua a otevírat je budeme pomocí terminálu - příkazem
lua cesta_název

Programování Kalkulačky

Dnes se naučíme číst vstup od uživatele, to se dělá pomocí

io.read()

Budeme používat základní matematické funkce, neboli + - * /. No a vrátíme se k proměnným z minulého dílu.

Začneme tedy základem. Vytvoříme si funkci kalkulacka (věřte nebo ne, v pokročilejších částech vám ten pořádek vykouzlí úsměv na tvářích). Do ní vložíme samozřejmě nějaké to uvítání a vytvoříme si proměnnou s vstupem od uživatele. Tato kalkulačka ale ušetří místo na obrazovce uživatele, nevypíšou se mu totiž všechny výpočty ale jen ten, který si zvolí.

print("Vítá tě kalkulačka z devbooku")
print("Zadej první číslo:")
prvni = io.read()
print("Zadej druhé číslo:")
druhe = io.read()
print("Zadej operaci (+-*/)")
operace = io.read()

A jdeme na podmínky! Podmínky jsou v Lue "tak jak je znáte" - if. No a k ifu samozřejmě patří i else. V lue se podmínky ukončují endem.

print("Vítá tě kalkulačka z devbooku")
print("Zadej první číslo:")
prvni = io.read()
print("Zadej druhé číslo:")
druhe = io.read()
print("Zadej operaci (+-*/)")
operace = io.read()
if operace == "+" then
print(prvni + druhe)
elseif operace == "-" then
print(prvni - druhe)
elseif operace == "*" then
print(prvni * druhe)
elseif operace == "/" then
print(prvni / druhe)
end

To ale ještě není vše. My si kalkulačku vylepšíme a budeme moci provést další operaci bez dalšího spuštění. No a hodí se nám funkce! Vytvoříme funkci znovu, ve které se uživatele zeptáme, jestli chce provést další operaci. A odpověď bude klasická y/n. V případě, že napíše y se spustí funkce kalkulačka, v případě, že napíše cokoli jiného (očekávejme n), program se ukončí.

function znovu()
print("Chceš provést další operaci? y/n")
dalsi = io.read()
if dalsi == "y" then
kalkulacka()
end
end

function kalkulacka()
print("Zadej první číslo:")
prvni = io.read()
print("Zadej druhé číslo:")
druhe = io.read()
print("Zadej operaci (+-*/)")
operace = io.read()
if operace == "+" then
print(prvni + druhe)
elseif operace == "-" then
print(prvni - druhe)
elseif operace == "*" then
print(prvni * druhe)
elseif operace == "/" then
print(prvni / druhe)
end
znovu()
end

print("Vítá tě kalkulačka z devbooku")
kalkulacka()

Naše kalkulačka ve finální podobě:

Kalkulačka v LUA ve finální podobě

Papouškovací program

Budeme pokračovat v šlépějích ostatních redaktorů a pustíme se do programu papoušek, který je několikrát lehčí. Ale proč si ho nenapsat? Vytvoříme si soubor papousek.lua a v něm funkci papousek. No a ještě před papouškem funkci znovu - opět kvůli tomu, že Lua neumí spustit funkce načtené až po pokusu o spuštění. Ve funkci znovu použijeme kód z funkce znovu v kalkulačce:

print("Chceš zadat další text k papouškování? y/n")
dalsi = io.read()
if dalsi == "y" then
papousek()
end

V samotném programu budeme používat opět io.read a jednu proměnnou. Takže jdeme na na to! Do funkce papousek napíšeme přivítání a vytvoříme proměnnou text s uživatelským textem. No a vypíšeme proměnnou text printem - a klidně dvakrát.

print("Jsem papoušek z afriky a budu po tobě opakovat")
print("Napiš něco")
text = io.read()
print(text)
print(text)

Výsledek:

Program papoušek v LUA

Věkomátor

A nyní jdeme na program věkomátor. Ukáže vám váš aktuální věk poté, co zadáte rok narození. Odchylka může být tedy 365 dní (v přestupném roku). Naučíme se taky, jak zjistit datum. Aktuální datum nebo čas zjistíme pomocí os.date(). Příklad:

os.date("%d.%m.%Y")

a dostaneme

1. 1. 1111

Jdeme tedy na program věkomátor! Uděláme si ho trošku složitější - budeme moci zadat až 5 jmen, příjmení a datumů narození. Vytvoříme tedy funkci vekomator a funkci upravit. Funkce upravit musí být jako první, protože ji budeme používat ve funkci vekomator.

Vytvoříme si 5x proměnné jmenoprijmeni a rok. Tedy například jmenoprijmeni3. A jdeme zapisovat do proměnných! Na každou proměnnou se zeptáme uživatele, protože generátor jmen ještě neumíme. Kód tedy nyní vypadá takto:

print("Vlož 1. Jméno a Příjmení")
jmenoprijmeni1 = io.read()
print("Vlož 1. rok narození")
rok1 = io.read()
print("Vlož 2. Jméno a Příjmení")
jmenoprijmeni2 = io.read()
print("Vlož 2. rok narození")
rok2 = io.read()
print("Vlož 3. Jméno a Příjmení")
jmenoprijmeni3 = io.read()
print("Vlož 3. rok narození")
rok3 = io.read()
print("Vlož 4. Jméno a Příjmení")
jmenoprijmeni4 = io.read()
print("Vlož 4. rok narození")
rok4 = io.read()
print("Vlož 5. Jméno a Příjmení")
jmenoprijmeni5 = io.read()
print("Vlož 5. rok narození")
rok5 = io.read()

Ano, vypadá to šíleně, ale není. A teď jdeme udělat příkazy. No, jako první uděláme samozřejmě help. Pro každý příkaz vytvoříme samostatnou funkci. Příkazy uděláme tři - help, zobraz a uprav. Pro zadávání vytvoříme taky samostatnou funkci, kvůli opakování. Zatím tedy kód celého programu vypadá takto:

function uprav()
vloz()
end

function zobraz()
vloz()
end

function help()
print("help - Všechny příkazy")
print("zobraz - Zobrazí informace o uživateli")
print("uprav - Upraví uživatele")
vloz()
end

function vekomator()
print("Vlož 1. Jméno a Příjmení")
jmenoprijmeni1 = io.read()
print("Vlož 1. rok narození")
rok1 = io.read()
print("Vlož 2. Jméno a Příjmení")
jmenoprijmeni2 = io.read()
print("Vlož 2. rok narození")
rok2 = io.read()
print("Vlož 3. Jméno a Příjmení")
jmenoprijmeni3 = io.read()
print("Vlož 3. rok narození")
rok3 = io.read()
print("Vlož 4. Jméno a Příjmení")
jmenoprijmeni4 = io.read()
print("Vlož 4. rok narození")
rok4 = io.read()
print("Vlož 5. Jméno a Příjmení")
jmenoprijmeni5 = io.read()
print("Vlož 5. rok narození")
rok5 = io.read()
vloz()
end

function vloz()
prikaz = io.read()
if prikaz == "help" then
help()
elseif prikaz == "zobraz" then
zobraz()
elseif prikaz == "uprav" then
uprav()
else
print("Neplatný příkaz")
vloz()
end
end

vekomator()

Kód už je celkem dlouhý, co říkáte? :) To je pro tento článek všechno, příště program doděláme.


 

Stáhnout

Staženo 206x (2.29 kB)
Aplikace je včetně zdrojových kódů v jazyce Lua

 

  Aktivity (1)

Článek pro vás napsal Michal Vašíček
Avatar
Autor je webař, čas od času udělá i mobilní appku. Před Windows dává přednost Linuxu, ale ještě raději má macOS. Podílí se na překladech v Mozille, dobrovolničí i jinde, k tomu se snaží rozvíjet sebe sama.

Jak se ti líbí článek?
Celkem (9 hlasů) :
4.777784.777784.777784.777784.77778


 


Miniatura
Předchozí článek
Úvod do jazyka Lua
Miniatura
Všechny články v sekci
Lua
Miniatura
Následující článek
Lua - Cvičení #1

 

 

Komentáře
Zobrazit starší komentáře (4)

Avatar
Jan Vargovský
Redaktor
Avatar
Jan Vargovský:

Pak by mě spíše zajímalo jak je to s datovými typy v tom jazyku, jestli v tom jdou dělat objekty a celé podmínky + cykly bych spojil do jednoho.

Buď bych to psal úplně pro začátečníky co nikdy neprogramovali nebo aspoň pokročile, že ukážeš co to vše umí.

 
Odpovědět 3.2.2014 14:22
Avatar
Michal Vašíček
Tým ITnetwork
Avatar
Odpovídá na Jan Vargovský
Michal Vašíček:

Datové typy deklarovat nemusíš. Když se budeš snažit sečíst a+b, vyhodí to chybu, ale když 1+2, spočítá to (například).

Na tom pohledu na to (začátečník x pokročilý) asi něco bude, dneska večer se nad tím zamyslím :) (nejlíp se mi prostě přemejšlí večer ;))

Odpovědět 3.2.2014 14:28
Příspěvek může obsahovat stopy arašídů, sarkasmu a sóji.
Avatar
Michal Vašíček
Tým ITnetwork
Avatar
Odpovídá na Jan Vargovský
Michal Vašíček:

No, a zapoměl jsem dopsat, že nemusíš, ale můžeš. Zmíním je v dalším díle.

Odpovědět 3.2.2014 14:57
Příspěvek může obsahovat stopy arašídů, sarkasmu a sóji.
Avatar
Odpovídá na Michal Vašíček
Michael Olšavský:

Jsou zde nějaká pravidla formátování kódu? :) docela mi tam chybí alespoň odsazení podle úrovně zanoření. Pokud se ale ty skripty píší bez toho, budu respektovat standart.

 
Odpovědět 3.2.2014 16:21
Avatar
Michal Vašíček
Tým ITnetwork
Avatar
Odpovídá na Michael Olšavský
Michal Vašíček:

Vidíš, co se učím, nikdy jsem o odsazení neslyšel, takže nevím, jak to bude fungovat. Vyzkouším to a dám vědět.
//EDIT: Okej, odsazení nevadí. Ale už jsem si zvykl na to, že ho tam nemám, takže ve článcích nebude.

Editováno 3.2.2014 18:18
Odpovědět  -3 3.2.2014 18:16
Příspěvek může obsahovat stopy arašídů, sarkasmu a sóji.
Avatar
PiskotPiskotovic
Redaktor
Avatar
PiskotPiskotovic:

Teď nevím co mi na tom nejde, ale snažím se udělat kalkulačku obsahu a obvodu obdélníku či čtverce ... Avšak mi to pořád hází po dlouhém opravování neurčité errory typu:

<eof> expected near 'elseif'

Co tam mám špatně ?

print("Vitej v aplikaci Vypocet OBVODU / OBSAHU")
function vypocet()
end
print("Prejete si vypocitat obdelnik nebo ctverec?")
print("Ctverec = C Obdelnik = O")
obct = io.read()
if obct == "c" then
ctverec()
end
elseif obct =="o" then
obdelnik()
end

function ctverec()
end
print("Obvod nebo obsah?")
print("Obvod = A Obsah = B")
vyber = io.read()
if vyber == "a" then
ctverec1()
end
elseif vyber == "b" then
ctverec2()
end

function ctverec2()
end
print("Zadejte delku strany ctverce (v cm):")
ac1 = io.read()
print("Obsah ctverce (v cm) je:")
print(ac1 * ac1)
print("Chcete provest dalsi vypocet? Y/N")
yn = io.read()
if yn == "y" then
vypocet()
end

function ctverec1()
end
print("Zadejte delku strany ctverce (v cm):")
ac = io.read()
print("Obvod ctverce (v cm) je:")
print(ac + ac + ac + ac)
print("Chcete provest dalsi vypocet? Y/N")
yn = io.read()
if yn == "y" then
vypocet()
end

function obdelnik()
end
print("Obvod nebo obsah?")
print("Obvod = A Obsah = B")
vyber1 = io.read()
if vyber1 == "a" then
end
obdelnik1()
end
elseif vyber1 == "b" then
obdelnik2()
end

function obdelnik1()
end
print("Zadejte delku strany 1 obdelniku (v cm):")
ac3 = io.read()
print("Zadejte delku strany 2 obdelniku (v cm):")
ac4 = io.read()
print("Obvod obdelniku (v cm) je:")
print(ac3 + ac4 + ac3 + ac4)
print("Chcete provest dalsi vypocet? Y/N")
yn = io.read()
if yn == "y" then
vypocet()
end

function obdelnik2()
end
print("Zadejte delku strany 1 obdelniku (v cm):")
ac5 = io.read()
print("Zadejte delku strany 2 obdelniku (v cm):")
ac6 = io.read()
print("Obsah ctverce (v cm) je:")
print(ac5 * ac6)
print("Chcete provest dalsi vypocet? Y/N")
yn = io.read()
if yn == "y" then
vypocet()
end
end

Děkuji :/

Odpovědět 24.7.2014 17:54
Error 404 - stránka motto.php nenalezena.
Avatar
Odpovídá na PiskotPiskotovic
Martin Konečný (pavelco1998):

Jazyk Lua neznám vůbec, ale něco mi říká, že ty příkazy end hned za deklarací funkce tam nemají co dělat.
Edit: a za těmi ify taky

Editováno 24.7.2014 17:57
 
Odpovědět 24.7.2014 17:57
Avatar
Michal Vašíček
Tým ITnetwork
Avatar
Odpovídá na PiskotPiskotovic
Michal Vašíček:

if a elseify jsou jeden a ten samý if a end patří až za všechny elseify, jak psal Martin.
Jestli chceš, můžu ti to opravit, kdyžtak pošli PM, vysvětlím ti to podrobnějc :)

Editováno 24.7.2014 18:00
Odpovědět 24.7.2014 17:59
Příspěvek může obsahovat stopy arašídů, sarkasmu a sóji.
Avatar
PiskotPiskotovic
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
PiskotPiskotovic:

Jenomže, když jsem to spustil v konzoli, tak mi to vypsalo, že tam chybí end.

Odpovědět 24.7.2014 18:00
Error 404 - stránka motto.php nenalezena.
Avatar
vojta3310
Člen
Avatar
Odpovídá na PiskotPiskotovic
vojta3310:

Vím že odpovídám pozdě, ale náhodou jsem na to narazil až teď. Podle mě by to mělo vypadat takto. Zkoušel jsem to v Computer Craftu a tam to funguje.
(s tím odsazením to je čitelnější a je menší pravděpodobnost že zapomenu end)

print("Vitej v aplikaci Vypocet OBVODU / OBSAHU")
 function vypocet()
   print("Prejete si vypocitat obdelnik nebo ctverec?")
   print("Ctverec = C Obdelnik = O")
   obct = io.read()
   if obct == "c" then
     ctverec()
   elseif obct =="o" then
     obdelnik()
   end
 end

 function ctverec()
   print("Obvod nebo obsah?")
   print("Obvod = A Obsah = B")
   vyber = io.read()
   if vyber == "a" then
     ctverec1()
   elseif vyber == "b" then
     ctverec2()
   end
 end

 function ctverec2()
   print("Zadejte delku strany ctverce (v cm):")
   ac1 = io.read()
   print("Obsah ctverce (v cm) je:")
   print(ac1 * ac1)
   print("Chcete provest dalsi vypocet? Y/N")
   yn = io.read()
   if yn == "y" then
     vypocet()
   end
 end
 function ctverec1()
   print("Zadejte delku strany ctverce (v cm):")
   ac = io.read()
   print("Obvod ctverce (v cm) je:")
   print(ac + ac + ac + ac)
   print("Chcete provest dalsi vypocet? Y/N")
   yn = io.read()
   if yn == "y" then
     vypocet()
   end
 end

 function obdelnik()
   print("Obvod nebo obsah?")
   print("Obvod = A Obsah = B")
   vyber1 = io.read()
   if vyber1 == "a" then
     obdelnik1()
   elseif vyber1 == "b" then
     obdelnik2()
   end
 end

 function obdelnik1()
   print("Zadejte delku strany 1 obdelniku (v cm):")
   ac3 = io.read()
   print("Zadejte delku strany 2 obdelniku (v cm):")
   ac4 = io.read()
   print("Obvod obdelniku (v cm) je:")
   print(ac3 + ac4 + ac3 + ac4)
   print("Chcete provest dalsi vypocet? Y/N")
   yn = io.read()
   if yn == "y" then
     vypocet()
   end
 end

 function obdelnik2()
   print("Zadejte delku strany 1 obdelniku (v cm):")
   ac5 = io.read()
   print("Zadejte delku strany 2 obdelniku (v cm):")
   ac6 = io.read()
   print("Obsah ctverce (v cm) je:")
   print(ac5 * ac6)
   print("Chcete provest dalsi vypocet? Y/N")
   yn = io.read()
   if yn == "y" then
     vypocet()
   end
 end
 vypocet()
 
Odpovědět 30.8.2014 11:13
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 14. Zobrazit vše