lua快速入门 —— 练习

本文最后更新于:2020年2月9日 下午

概览

参照书籍:《Lua程序设计(第二版)》

Lua版本:Lua 5.3.5

马尔科夫链算法 —— markov chain

该算法根据原始文本中n个单词的序列来确定后面的单词,从而生成随机的文本。本例中将n=2.

– the more we try the more we do
statetab = { [“\n \n”] = {“the”},
[“\n the”] = {“more”},
[“the more”] = {“we”,”we”},
[“more we”] = {“try”,”do”},
[“we try”] = {“the”},
[“try the”] = {“more”},
[“we do”] = {“\n”},
}

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
--将两个单词以空格连接 编码形成一个前缀
function prefix(w1,w2)
return w1 .. " " .. w2
end

local statetab = {}

-- 向table中的某个前缀列表插入一个新单词
function insert(index,value)
local list = statetab[index]
if list == nil then
statetab[index] = {value}
else
list[#list + 1] = value
end
end

function allwords()
local line = io.read() --当前行
local pos = 1 --行中的当前位置
return function() -- 迭代器函数
while line do --只要还有行就一直循环
local s,e = string.find(line,"%w+",pos)
if s then --找到下一个单词吗?
pos = e+1 --更新下一个位置
return string.sub(line,s,e) --返回该单词
else
line = io.read() -- 没有找到单词,尝试下一行
pos = 1 --从行首位置从新开始
end
end
return nil --所有行都遍历完
end
end

---------主程序-------------
local N = 2
local MAXGEN = 10000
local NOWORD = "\n"

-- 构建table
local w1,w2 = NOWORD,NOWORD
for w in allwords() do
insert(prefix(w1,w2),w)
w1 = w2
w2 = w
end

insert(prefix(w1,w2),NOWORD)

--生成文本
w1 = NOWORD
w2 = NOWORD --重新初始化

for i = 1,MAXGEN do
local list = statetab[prefix(w1,w2)]
--从列表中选择一个随机项
local r = math.random(#list)
local nextword = list[r]
if nextword == NOWORD then return end
io.write(nextword," ")
w1 = w2
w2 = nextword
end

emmmm,测试结果一般,在命令行里输入内容最后想要结束的时候记得使用Ctrl+Z来结束。


输出“Hello,World!”

1
print "Hello,World!"

当函数参数仅为一个并且是字符串或者表的构造式的时候,有没有括号都无所谓

实现两数相加

获取用户输入的两个数字,并使两数相加,结果输出到屏幕上。

1
2
3
4
5
6
7
8
9
print "Please enter a number:"
num1 = io.read("*number")

print "Please enter a number again:"
num2 = io.read("*number")

sums = num1 + num2

print(num1.." + "..num2.." = "..sums)

求商及余数

获取用户输入的两个整数,计算结果输出到屏幕上。

Lua的number类型式双精度的浮点数,而且正常的运算结果是个浮点数。

可以使用Lua的math库里的math.modf(x) —— 返回 x 的整数部分和小数部分。 第二个结果一定是浮点数。

1
2
3
4
5
6
7
8
9
10
11
12
13
print(5/3)  --1.6666666666667
print(5%3) --2

print "Please enter a number:"
num1 = io.read("*number")

print "Please enter a number again:"
num2 = io.read("*number")
shang,flots = math.modf(num1/num2)
-- shang 是运算的整数部分,flots是运算得到的小数部分
yushu = num1 - shang * num2

print(num1.." / "..num2.." = "..shang.." 余数为 "..yushu)

判断元音还是辅音

#是长度操作符,可以获取table或者字符串的长度。

还有Lua中的table的下标是从数字1开始的。

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
local vowel = {"a","e","i","o","u"} --元音

function judgeVowel(str)
for i = 1,#vowel do
if str == vowel[i] then
return true
end
end
return false
end

local j = 1

while j < 5 do
print "Please enter a character:"
strs = io.read()
if #strs == 1 then
if judgeVowel(strs) then
print(strs .. " is a vowel")
else
print(strs .. " is a consonant")
end
else
print("Please enter a character!!!")
end
j = j+1
end

判断闰年

闰年是能够被4整除但不能被100整除的年份。

1
2
3
4
5
6
7
8
9
10
11
12
13
local j = 1
while j < 5 do
print"Please enter a years"
years = io.read("*number")
num1,num2 = math.modf(years/4)
num3,num4 = math.modf(years/100)
if num2 == 0 and num4 ~= 0 then
print(years.." is a leap year")
else
print(years.." not is a leap year")
end
j = j+1
end

求两数的最大公约数和最小公倍数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
print "Please enter a number:"
num1 = io.read("*number")

print "Please enter a number again:"
num2 = io.read("*number")

hcf = num1
temp = num2

while hcf ~= temp do
if hcf > temp then
hcf = hcf - temp
else
temp = temp - hcf
end
end

lcm = num1*num2/hcf

print("The greatest common divisor is "..hcf)
print("The minimum common multiple is "..lcm)