Chap. 1 print, function
print("hello! world!") --결과 : hello! world!function fact(n) --함수 선언
if n == 0 then
return 1
else
return n * fact(n-1)
end
end
print("enter a number:") --결과 : enter a number: 출력
a = io.read("*n") --결과 : 숫자를 읽는다. 참고(io.read()는 line을 읽는다)
print(fact(a)) --결과 : 만약 5를 입력한다면, 120이 출력된다.
function norm(x,y)
return (x^2 + y^2)^0.5
end
function twice(x)
return 2*x
end
print(norm(3,4)) --결과 : 5 출력
print(twice(4)) --결과 : 8 출력
--lua 파일 불러오기
--dofile("lib1.lua") --lib1.lua 파일을 불러온다. 그러면 그 안에 들어있는 함수를 활용할 수 있다.
[실행 결과 정리]
hello! world!
enter a number:
5
120
5
8
Chap. 2 타입과 값
--문자열 치환(string replace)a = "one string"
b = string.gsub(a,"one","another")
print(a) --결과 : one string
print(b) --결과 : another string
--문자열 길이 반환(string length)
aa = 'hello'
print(#aa) --결과 : 5
print(#"good\0bye") --결과 : 8
print("good\0bye") --결과 : good bye
--문자열 표현시 작은따옴표(')나 큰 따옴표(")를 쓸 수 있다. (' ' and " " both OK)
print("a 'line'") --결과 : a 'line'
print('ano"the"r line') --결과 : ano"the"r line
--이스케이프 문자(escape)
print("one line\nnext line\n\"in quotes\", 'in quotes'") --\n은 줄바꿈문자, \"는 큰 따옴표 표시
--[[
결과
one line
next line
"in quotes", 'in quotes'
--]]
print('a backslash insed quotes: \'\\\'')
--결과 : a backslash insed quotes: '\'
--\' 는 작은 따옴표 표시, \\는 역슬래시 1개 표시
print("a simpler way: '\\'") --결과 : a simpler way: '\'
--구간 문자열(long string, == or === or ==== or ....)
page = [==[
<html>
</html>
]==]
print(page)
--[[
결과
<html>
</html>
--]]
page2 = [[
<html>3
</html>3
]]
print(page2)
--[[
결과
<html>3
</html>3
--]]
--> 위처럼 대괄호와 대괄호 사이에 등호를 넣어서 구간 주석과 구분할 수 있다.
--강제 형 변환(force conversion)
print("10" + 1) --결과 : 11
print("10 + 1") --결과 : 10 + 1
print("-5.3e-10"*"2") -- 결과 : -1.06e-009 --> force convert from string to number
--print("hello" + 1) --error
print(10 .. 20) --결과 : 1020 --> 문자열 이어 붙이기 연산. 반드시 .. 좌우로 공백이 들어가야 함.
print(5) --결과 : 5
--문자열에서 숫자로 변환(convert from string to number)
line = io.read() -- 한 줄 읽기(input random value, read one line)
n = tonumber(line) -- 읽은 값을 숫자로 형 변환
if n == nil then
error(line .. " is not a valid number") -- 읽은 값이 숫자가 아니면 에러 반환
else
print(n*2) -- 읽은 값이 숫자면 곱하기 2 한다.
end
print(tostring(10) == "10") -- 문자열 10과 문자열 10이 같은지 비교하는 연산. true반환
print(10 .. "" == "10") -- 문자열 10과 문자열 10이 같은지 비교하는 연산. true반환
--테이블은 객체이다(table is object)
a = {} --테이블을 생성하고 'a'로 참조한다.
k = "x"
a[k] = 10 --'키'가 "x"이고 값이 10인 원소를 추가한다.
a[20] = "great" --'키'가 20이고 값이 "great"인 원소를 추가한다.
print(a["x"]) -- 결과 : 10
k = 20
print(a[k]) --결과 : "great"
a["x"] = a["x"] + 1 -- '키'가 "x"인 원소의 값을 1 증가
print(a["x"]) --결과 : 11
a["y"] = 10
b = a --'b'는 'a'와 같은 테이블을 참조한다.
print(b["y"]) --결과 : 10
b["y"] = 20
print(a["y"]) --결과 : 20
a = nil -- 'b'만 테이블을 참조하고 있음
b = nil -- 테이블을 참조하는 것이 없어짐
c={} -- 빈 테이블
for i=1, 1000 do c[i]=i*2 end -- 새 원소 1000개 추가
print(c[9]) -- 결과 : 18
c["x"] = 10
print(c["x"]) -- 결과 : 10
print(c["y"]) -- 결과 : nil
c.x = 30
print(c.x) -- 결과 : 30
print(c.y) -- 결과 : nil
d ={}
x = "y"
d[x] = 10
print(d[x]) -- 결과 : 10
print(d["y"]) -- 결과 : 10
print(d[y]) -- 결과 : nil
print(d.x) -- 결과 : nil
print(d.y) -- 결과 : 10
a = {}
for i = 1, 10 do
a[i] = io.read()
end
for i = 1, #a do
print(a[i])
end
--[[
결과
위에서 아래와 같이 입력한다면, 결과는 다음과 같을 것이다.
입력
1
2
3
4
5
6
7
8
9
10
출력
1
2
3
4
5
6
7
8
9
10
--]]
[실행 결과 정리]
one string
another string
5
8
good bye
a 'line'
ano"the"r line
one line
next line
"in quotes", 'in quotes'
a backslash insed quotes: '\'
a simpler way: '\'
<html>
</html>
11
10 + 1
-1.06e-009
1020
5
4
8
true
true
10
11
10
20
18
10
nil
30
nil
10
10
nil
nil
10
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
Chap. 3 표현식(산술연산자, 논리연산자, 테이블 생성자)
--산술연산자(arthimetic)local tolerance = 10
function isturnback (angle)
angle = angle % 360
return (math.abs(angle-180) < tolerance)
end
print(isturnback(180))
local tol = 0.17
function isturn(ang3)
ang3 = ang3 % (2*math.pi)
return (math.abs(ang3 - math.pi) < tol)
end
print(isturn(math.pi))
--비교 연산자(>, <, <=, >=, ==, ~=)
a = {}; a.x = 1; a.y = 0
b = {}; b.x = 1; b.y = 0
c = a
--> 위 코드에서 a==c이지만 a~=b이다.
--논리연산자(logical)
print(4 and 5) -- 결과 : 5
print(nil and 13) -- 결과 : nil
print(false and 13) -- 결과 : false
print(4 or 5) -- 결과 : 4
print(false or 5) -- 결과 : 5
print(not nil) -- 결과 : true
print(not false) -- 결과 : true
print(not 0) -- 결과 : false(Lua에서 0은 true이다.)
print(not not 1) -- 결과 : true
print(not not nil) -- 결과 : false
--길이 연산자(length)
print(a[#a]) --순열 'a'의 마지막 값을 출력(print last value of table a)
a[#a] = nil --순열 'a'의 마지막 값을 제거 (delete last value of table a)
a[#a + 1] = v --리스트의 끝에 v를 추가 add v in the last of table a
-- 'key' : a['f'], a[4], a[7] ... 'f', 4, 7 is the key
a={}
a[1]=1
a[2]=nil
a[3]=3
a[4]=555
for i=1, 4 do
print(a[i])
end
--[[
결과
1
nil
3
555
]]--
print(#a) -- 결과 : 4
print(a[#a]) -- 결과 : 555
b={}
b[1]=1
b[2]=nil
b[3]=5
b['x'] =3
b['y'] = 4
b[10000]=33
b[10004]=34
print("b :",#b) -- 결과 : b : 1
print(b['x']) -- 결과 : 3
--테이블 생성(table create)
days = {"sunday","monday","tuesday","wednesday","thursday","friday","saturday"}
print(days[0]) -- 결과 : nil
print(days[1]) -- 결과 : sunday
a = {x=10, y=20} -->a={};a.x=10;a.y=20
w = {x=0, y=0, label="console"}
x = {math.sin(0), math.sin(1), math.sin(2)}
w[1] = "another field" -- 결과 : 테이블 'w'에 키 1을 추가
x.f = w -- 결과 : 테이블 'x'에 키 "f"를 추가
print(w["x"]) -- 결과 : 0
print(w[1]) -- 결과 : another field
print(x.f[1]) -- 결과 : another field
w.x = nil -- 결과 : 필드 x 제거
print(x[3]) -- 결과 :0.90929742682568
--테이블을 레코드 리스트처럼 사용(record?? list??)
polyline = {color="blue",
thickness=2,
npoints=4,
{x=0,y=0},
{x=-10,y=0},
{x=0, y=1},
{x=0,y=1}
}
print(polyline["color"]) -- 결과 : blue
print(polyline[2].x) -- 결과 : -10
print(polyline[4].y) -- 결과 : 1
opnames = {["+"]="add", ["-"]="sub", ["*"]="mul", ["/"]="div"}
i = 20; s = "-"
a = {[i+0] = s, [i+1] = s..s, [i+2] = s..s..s}
print(opnames[s]) -- 결과 :sub
print(a[22]) -- 결과 : ---
abc = {[1]="red", [2]="green", [3]="blue",}
print(abc[1]) -- 결과 :red
efg = {x=10, y=45; "one", "two", "three"}
print(efg[2]) -- 결과 :two
test1={x=3578, y=4}
test2={"r","g","b"}
print(test1[2]) --결과 :nil
print(test1[x]) -- 결과 : nil
print(test1["x"]) --결과 : 3578
print(test2[3])
--예제(ex1 나머지연산자 %의 음수처리)
for i=-10,10 do
print(i, i%3)
end
--[[
결과
-10 2
-9 0
-8 1
-7 2
-6 0
-5 1
-4 2
-3 0
-2 1
-1 2
0 0
1 1
2 2
3 0
4 1
5 2
6 0
7 1
8 2
9 0
10 1
--]]
--예제(ex2 )
print(2^3^4) --결과 :2.4178516392293e+024
print(2^-3^4) --결과 :4.1359030627651e-025
--예제(ex3)
polynominal = {1, 2, 3, 4, 5}
print("your polynominal is like this:")
print("a_n*x^n + a_(n-1)*x^(n-1) + ... + a_1*x^1+a_0*x^0")
print("n is polynominal order, a is coefficent, x is solution value")
print("input polynominal order:")
n = io.read()
n = n+1
print("input solution value x")
x_val = io.read()
sum_result = 0
coeflist={}
for i = 1, n do
print("input", i-1 ,"th polynominal coefficent")
coef = io.read()
coeflist[i] = coef
sum_result = x_val^(i-1) * coeflist[i] + sum_result
--print(coeflist[i])
end
print(sum_result)
--[[
결과
your polynominal is like this:
a_n*x^n + a_(n-1)*x^(n-1) + ... + a_1*x^1+a_0*x^0
n is polynominal order, a is coefficent, x is solution value
input polynominal order:
4
input solution value x
2
input 0 th polynominal coefficent
1
input 1 th polynominal coefficent
2
input 2 th polynominal coefficent
3
input 3 th polynominal coefficent
4
input 4 th polynominal coefficent
5
129
--]]
sunday = "monday"; monday = "sunday"
t = {sunday = "monday", [sunday] = monday}
print(t.sunday, t[sunday], t[t.sunday]) --결과 : monday sunday sunday
print(t[monday]) --결과 : monday
print(t["monday"]) --결과 : sunday
[실행결과 정리]
true
true
5
nil
false
4
5
true
true
false
true
false
nil
1
nil
3
555
4
555
b : 1
3
nil
sunday
0
another field
another field
0.90929742682568
blue
-10
1
sub
---
red
two
nil
nil
3578
b
-10 2
-9 0
-8 1
-7 2
-6 0
-5 1
-4 2
-3 0
-2 1
-1 2
0 0
1 1
2 2
3 0
4 1
5 2
6 0
7 1
8 2
9 0
10 1
2.4178516392293e+024
4.1359030627651e-025
your polynominal is like this:
a_n*x^n + a_(n-1)*x^(n-1) + ... + a_1*x^1+a_0*x^0
n is polynominal order, a is coefficent, x is solution value
input polynominal order:
4
input solution value x
2
input 0 th polynominal coefficent
1
input 1 th polynominal coefficent
2
input 2 th polynominal coefficent
3
input 3 th polynominal coefficent
4
input 4 th polynominal coefficent
5
129
monday sunday sunday
monday
sunday
Chap. 4 문장(if, while, for, break, return, goto)
[예제]--할당문, 다중 할당 가능(assignment, multiple assignment)
--다중 할당을 이용한 코드 swap 가능.
-- x, y = y, x --> 'x'와 'y'를 교환
-- a[i], a[j] = a[j], a[i] --> 'a[i]'와 'a[j]'를 교환
a, b, c = 0, 1
print(a, b, c) --결과 :
a, b = a+1, b+1, b+2
print(a, b)
a, b, c = 0
print(a, b, c)
--#local, global variable. global is default.
--chunk means block.
--local is valid only one chunk.
a=2
b=4
c=6
d=8
do
local a2 = 2*a
local d = (b^2-4*a*c)^(1/2)
x1 = (-b + d)/a2
x2 = (-b - d)/a2
end
print(x1, x2)
--Lua -> everything is true except false, nil.(0 is true, ""(empty string) is true
[결과]
0 1 nil
1 2
0 nil nil
1.#QNAN 1.#QNAN
[예제]
a=2
b=4
c=6
d=8
--#if then else
if a < 0 then a = 0 end
if a < b then
-- return a
else
-- return b
end
op = "+"
if op == "+" then
r = a+b
elseif op == "-" then
r = a-b
elseif op == "*" then
r = a*b
elseif op == "/" then
r = a / b
else
error("invalid operation")
end
print(r)
kbs={}
--#while
local k = 1
while kbs[k] do
print(kbs[k])
k = k + 1
end
--#repeat
x = 100
local sqr = x/2
repeat
sqr = (sqr + x/sqr)/2
local error = math.abs(sqr^2 - x)
until error < x/10000
--#numeric for
for i=1, math.huge do
if (0.3*i^3 - 20*i^2 - 500 >= 0) then
print(i)
break
end
end
--#general for key -> index(1, 2, 3, ... n)
--for key, value in paris(table) do print(key, value) end
days = {"sunday","monday","tuesday","wednesday","thursday","friday","saturday"}
revDays = {["sunday"] = 1, ["monday"] = 2, ["tuesday"] = 3, ["wednesday"] = 4, ["thursday"] = 5, ["friday"] = 6, ["saturday"] = 7}
x = "tuesday"
print(revDays[x])
revDays100 = {}
for k, v in pairs(days) do
revDays100[v] = k
print(revDays100[v])
end
--do return end -> 특정 부분이 실행되지 않ㄷ록 함.
!!CAUTION : goto is valid after LUA 5.2
--goto state machine
::s1:: do
local c = io.read(1)
if c == '0' then goto s2
elseif c == nil then print 'ok'; return
else
goto s1
end
end
::s2:: do
local c = io.read(1)
if c == '0' then goto s1
elseif c == nil then print 'not ok'; return
else goto s2
end
end
goto s1
[결과]
6
68
3
1
2
3
4
5
6
7
1
2
2
3
4
5
#Lua Programming# Chap. 1~4 종합(타입, 연산자, if, while, for 등)
Reviewed by kukanuc
on
3월 17, 2019
Rating:
댓글 없음: