#Lua Programming# Chap. 1~4 종합(타입, 연산자, if, while, for 등)

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 등) #Lua Programming# Chap. 1~4 종합(타입, 연산자, if, while, for 등) Reviewed by kukanuc on 3월 17, 2019 Rating: 5

댓글 없음:

Powered by Blogger.