我开始用 Lua 制作一个十进制到十六进制的转换器来尝试我所知道的;我读过 Lua 可以自己做到这一点,但我还是想重新发明它。
我犯了一个巨大的错误,但我不确定问题出在哪里:
file = "log"..os.date("%S.%M.%H%p.%d.%m.%Y")..".txt"
do
log = io.open(file, "w")
io.output(log)
end
dechexint = remainder
function hexTracker()
remainder = result % 16
result = result / 16
print(remainder, "\n")
io.write(remainder, "\n")
end
function hexTranslator()
if remainder == 11
then print("A")
io.write("A")
else
if dechexint == 12
then print("B")
io.write("B")
else
if dechexint == 13
then print("C")
io.write("C")
else
if dechexint == 14
then print("D")
io.write("D")
else
if dechexint == 15
then print("E")
io.write("E")
else
if dechexint == 16
then print("F")
io.write("F")
end
end
end
end
end
end
end
decint = io.read("*number")
result = decint / 16
result = decint % 16
while(result>0.1)
do
hexTracker()
hexTranslator()
end
它在技术上确实有效,但是......
input:
4579
output:
3
0.1875
它应该给出 11E3;有人可以帮忙吗?
最佳答案
存在一些严重的问题。它无法循环遍历数字的数字。它在十六进制数字映射上不匹配。它无法正确打印十进制数字。 hexTracker
之间的关系和hexTranslator
功能不起作用。其中每一个都会阻止它工作。另外还有一些较小的问题不会彻底破坏它,但会导致代码的可维护性较差。其中一些包括大量使用全局变量、深度嵌套的 if / else if
构造,多余do
构造,使用不带参数的过程等函数。
我试图使这个答案在结构上尽可能接近您的答案,以便您可以更轻松地看到我更改了什么以及它是如何工作的。我更专注于制作一些你可以学习的东西,而不是在各方面都完美的东西,并且我保留了你的 io.read()
输入数据的方法和输出日志文件具有相同的名称,因此运行完全相同。
我清理了一些结构并以(希望如此)透明的方式简化了它们。我掉了hexTracker()
功能但做了hexTranslator()
递归,以便它遍历所有数字。除此之外,我还制作了 hexTranslator()
同时使用参数和返回值。
您可以在此处查看结果:
file = "/tmp/log"..os.date("%S.%M.%H%p.%d.%m.%Y")..".txt"
log = io.open(file, "w")
io.output(log)
function hexTranslator(result)
if result >= 16 then
local intQuotient = math.floor(result / 16)
local remainder = result % 16
return hexTranslator(intQuotient) .. hexTranslator(remainder)
else
if result == 10 then
io.write("A")
return "A"
elseif result == 11 then
io.write("B")
return "B"
elseif result == 12 then
io.write("C")
return "C"
elseif result == 13 then
io.write("D")
return "D"
elseif result == 14 then
io.write("E")
return "E"
elseif result == 15 then
io.write("F")
return "F"
else
io.write(result)
return tostring(result)
end
end
end
decint = io.read("*number")
print(hexTranslator(decint))
有一些方法可以使这个解决方案变得更好,值得一提的是替换整个 if / elseif
通过表查找来构造。它更短、更容易阅读并且执行起来更快。这是一种快速的方法,保持其他一切不变:
file = "/tmp/log"..os.date("%S.%M.%H%p.%d.%m.%Y")..".txt"
log = io.open(file, "w")
io.output(log)
function hexTranslator(result)
hexDigits = {[10] = "A", [11] = "B", [12] = "C", [13] = "D", [14] = "E", [15] = "F"}
if result >= 16 then
local intQuotient = math.floor(result / 16)
local remainder = result % 16
return hexTranslator(intQuotient) .. hexTranslator(remainder)
else
io.write(result)
return hexDigits[result] or tostring(result)
end
end
decint = io.read("*number")
print(hexTranslator(decint))
我希望这有帮助。一旦您熟悉了它,您可能会想要删除日志记录,并且除了现在的方法之外,可能还想研究一些选项,例如支持命令行输入数字。
关于lua - 十进制到十六进制转换器 Lua,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38296848/