为了说清楚,这是我第一次使用该网站作为会员。我试图在Lua中创建一个代码来读取包含莫尔斯加密图表的文件,读取包含消息的文件,然后将其解密并在stdout中打印。我尝试使用上面的代码并对其进行了调查,但到目前为止还没有取得任何成功。第一个函数正常工作,但是,以下两个函数中的循环似乎是徒劳的。作为观察:我已经在C中为数据结构分配完成了类似的代码。
>
function lista()
local table = {}
io.input("morse.txt")
local lines ={}
for line in io.lines() do
lines[#lines+1] = line
end
io.input(stdin)
for i=1,#lines, 1 do
local x; local y; local s;
x, y = string.find(lines[i], " ")
s=string.sub(lines[i], y+1, -1)
local c=string.sub(lines[i], 1, 1)
table[s]=c
io.write(c, " ", s, "\n")
end
return table
end
function mensagem_cifrada()
print("Mensagem cifrada")
io.input("mensagem.txt")
local words= {}
local file = io.read("*all")
for w in string.gmatch(file, "%a+") do
print(#words)
words[#words+1] = w
end
io.input(stdin)
for i=1, (#words) do --Is not working
print(i)
io.write(i, words[i], " ")
end
io.write("\n")
return words
end
function conversao(mensagem, table)
print("Conversao")
msg = {}
for i=1, (#mensagem) do
print(i)
if mensagem[i] == "/" then
msg[i] = " "
else
local s = mensagem[i]
msg[i] = table[s]
end
end
for i=1, #msg do -- Is not working
print(i)
io.write(i, msg[i])
end
io.write("\n")
return msg
end
--Main Function
mensagem = {}
table = {}
table=lista()
mensagem=mensagem_cifrada()
conversao(mensagem, table)
- mensagem.txt
.--.. .-. .-.. .-. -.... .. -.. .... -.-.--. / ...-. ---. -.-.. .. .... / -.-.. ---. -.. .... .. --.. ..-. ... .-.. .-. --. / -... .. -.-.. ---. -... ... ..-.. ... -.-.. .-. .-.. / -.-.. ---. .-.. .-.. .. -. .-. --. .. -.. -. .. / .. .... -. .-. / --. .. -.. .... .-. --.. .. --. -.-.--. / .. -.. ...-. ... .. / .-. --.. ---. .-.. .-. / --. .. .... --. ---. / ..-. --. / .. -....-. --. .-. ... .-... / .--.. .-. .-.. .-. / .-. .-... -.-.. ..... ... .. .-.. ... .--.-.. -.-.. ... -.-.. .-.-.-. ..-. -.. -.... .-.-.-. -.... .-.. / .. / --. .-. .-.. --.-. ..-. .. / .-. / .-. .--.. .-.. .. .... .. -.. -. .-. -.-.. .-. ---. / -... ---. / -. .-.. .-. -.... .-. .-... ..... ---. -.-.--.
- morse.txt
A .-.
B -....
C -.-..
D -...
E ..
F ..-..
G --..
H .....
I ...
J .---.
K -.-.
L .-...
M --.
N -..
O ---.
P .--..
Q --.-.
R .-..
S ....
T -.
U ..-.
V ...-.
W .--.
X -..-.
Y -.--.
Z --...
1 .----.
2 ..---.
3 ...--.
4 ....-.
5 ......
6 -.....
7 --....
8 ---...
9 ----..
0 -----.
. .-.-.-.
, --..--.
? ..--...
' .----..
! -.-.--.
/ -..-..
( -.--..
) -.--.-.
& .-....
: ----....
; -.-.-..
= -...-.
- -....-.
_ ..--.-.
" .-..-..
$ ...-..-.
@ .--.-..
新代码
-
- Trabalho 2 de ED em Lua
function lista()
local table = {}
io.input("morse.txt")
local lines ={}
for line in io.lines() do
lines[#lines+1] = line
end
io.input(stdin)
for i=1,#lines, 1 do
local x; local y; local s;
x, y = string.find(lines[i], " ")
s=string.sub(lines[i], y+1, -1)
local c=string.sub(lines[i], 1, 1)
table[s]=c
io.write(c, " ", s, "\n")
end
return table
end
function mensagem_cifrada()
print("Mensagem cifrada")
io.input("mensagem.txt")
local words= {}
local file = io.read("*all")
for w in string.gmatch(file, "[^%s]+") do
words[#words+1] = w
end
io.input(stdin)
for i, v in ipairs(words) do
io.write(i, " ", v)
end
io.write("#words =", #words,"\n")
io.write("\n")
return words
end
function conversao(mensagem, tab)
print("Conversao")
msg = {}
for i=1, (#mensagem) do
if mensagem[i] == "/" then
msg[i] = " "
else
local s = mensagem[i]
msg[i] = tab[s]
end
end
for i, v in ipairs(msg) do
io.write(v)
end
io.write("\n")
return msg
end
--Função Main
mensagem = {}
tab = {}
tab=lista()
mensagem=mensagem_cifrada()
conversao(mensagem, tab)
预期产出:
A .-.
B -....
C -.-..
D -...
E ..
F ..-..
G --..
H .....
I ...
J .---.
K -.-.
L .-...
M --.
N -..
O ---.
P .--..
Q --.-.
R .-..
S ....
T -.
U ..-.
V ...-.
W .--.
X -..-.
Y -.--.
Z --...
1 .----.
2 ..---.
3 ...--.
4 ....-.
5 ......
6 -.....
7 --....
8 ---...
9 ----..
0 -----.
. .-.-.-.
, --..--.
? ..--...
' .----..
! -.-.--.
/ -..-..
( -.--..
) -.--.-.
& .-....
: ----....
; -.-.-..
= -...-.
- -....-.
_ ..--.-.
" .-..-..
$ ...-..-.
@ .--.-..
Mensagem cifrada
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 --..65 ..66 --.67 -.-.--.68 /69 ..70 -..71 ...-.72 ...73 ..74 /75 .-.76 --..77 ---.78 .-..79 .-.80 /81 --.82 ..83 ....84 --.85 ---.86 /87 ..-.88 --.89 /90 ..91 -....-.92 --.93 .-.94 ...95 .-...96 /97 .--..98 .-.99 .-..100 .-.101 /102 .-.103 .-...104 -.-..105 .....106 ...107 ..108 .-..109 ...110 .--.-..111 -.-..112 ...113 -.-..114 .-.-.-.115 ..-.116 -..117 -....118 .-.-.-.119 -....120 .-..121 /122 ..123 /124 --.125 .-.126 .-..127 --.-.128 ..-.129 ..130 /131 .-.132 /133 .-.134 .--..135 .-..136 ..137 ....138 ..139 -..140 -.141 .-.142 -.-..143 .-.144 ---.145 /146 -...147 ---.148 /149 -.150 .-..151 .-.152 -....153 .-.154 .-...155 .....156 ---.157 -.-.--.#words =157
Conversao
PARABENS! VOCES CONSEGUIRAM DECODIFICAR CORRETAMENTE ESTA MENSAGEM! ENVIE AGORA MESMO UM E-MAIL PARA ALCHIERI@CIC.UNB.BR E MARQUE A APRESENTACAO DO TRABALHO!
答案 0 :(得分:0)
有点难以判断问题是由于您的代码还是由于您的输入造成的。例如,如果“mensagem.txt”不包含字母,您会看到完全相同的结果。但是,您的代码存在一些问题,可能会解释您所看到的内容。
首先:不要使用'table'作为变量名。 'table'是内置模块的名称,它包含处理表的方法,例如table.length(其中'#'是语法糖)。如果你覆盖'table'的值,很难预测会出现什么问题,但你可以合理地预期与表操作有关的任何事情都会出错。
第二:table.length提供表中以条目“1”开头的连续数字索引条目的数量。我会避免尝试对此进行算术编制索引:如果你不认为事情恰到好处,很容易通过跳过一个插槽丢失大部分条目。 table.insert函数会自动使用相应的数字键将值附加到表的末尾。我没有通过查看你是否正确计算它,但是我已经被这个足够的时间咬了,我建议永远不要用算术构造一个数字索引,如果你能避免的话。
第三:io.input很危险,因为你正在设置全局状态。我没有看到它正在引起你现在看到的特定问题的证据,但你最好使用io.open来创建一个文件对象,而不是根据假设它们在字面上改变各个函数中的默认stdin。将按特定顺序调用,处理此错误可能会导致您遇到的各种错误。
这是对代码的重写,修复了这些特定问题。看看它是否解决了你的问题。如果没有,请检查您的数据,然后再次检查代码。
#!/usr/bin/env lua
function lista()
local tab = {}
morseFile=io.open("morse.txt", "r")
local lines ={}
for line in morseFile:lines() do
lines:insert(line)
end
for i=1,#lines, 1 do
local x; local y; local s;
x, y = string.find(lines[i], " ")
s=string.sub(lines[i], y+1, -1)
local c=string.sub(lines[i], 1, 1)
table[s]=c
io.write(c, " ", s, "\n")
end
return tab
end
function mensagem_cifrada()
print("Mensagem cifrada")
local words= {}
local msgFile = io.open("mensagem.txt", "r")
for w in string.gmatch(msgFile.read("*all"), "%a+") do
print(#words)
words:insert(w)
end
io.input(stdin)
for i=1, (#words) do
print(i)
io.write(i, words[i], " ")
end
io.write("\n")
return words
end
function conversao(mensagem, table)
print("Conversao")
msg = {}
for i=1, (#mensagem) do
print(i)
if mensagem[i] == "/" then
msg[i] = " "
else
local s = mensagem[i]
msg[i] = table[s]
end
end
for i=1, #msg do
print(i)
io.write(i, msg[i])
end
io.write("\n")
return msg
end
--Main Function
mensagem = {}
tab = {}
tab=lista()
mensagem=mensagem_cifrada()
conversao(mensagem, tab)