2015-12-23 2 views
1

Просто, чтобы все было ясно, это мой первый раз, когда я использовал сайт в качестве участника. Я пытаюсь сделать код в Lua, чтобы прочитать файл, содержащий диаграмму шифрования morse, прочитать файл, содержащий сообщение, а затем расшифровать его и распечатать в stdout. Я пробовал использовать вышеприведенный код и дебютировать, но пока не добился успеха. Первая функция работает правильно, однако цикл в двух следующих функциях, по-видимому, ничтожно. В качестве наблюдения: я уже сделал аналогичный код в C для назначения Data Structue.Функция не печатается в стандартном режиме

> 

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 [email protected] E MARQUE A APRESENTACAO DO TRABALHO! 
+2

Вы предоставили нам стену без каких-либо намеков относительно того, где проблема. – warspyking

+0

Какой цикл не работает? Работает ли это так, как вы планировали? Каково содержимое 'morse.txt'? Как насчет 'mensagem.txt'? –

+0

@ EtanReisner. Следующие циклы не работают: ** для i = 1, (#words) do ** и ** для i = 1, #msg do **. Функция lista() работает так, как я предполагал. Файл morse.txt содержит в каждой строке (% c% s), где c - символ и s строка морзе, связанная с этим символом. Меньше.txt-файл содержит только последовательность строк алфавитно-морзе, разделенных пробелом. – lfmc

ответ

0

Это немного трудно сказать, являются ли проблемы из-за вашего кода или из-за вашего ввода. Например, если «mensagem.txt» не содержит букв, вы увидите точно такой же результат. Однако есть некоторые проблемы с вашим кодом, которые могут объяснить, что вы видите.

Прежде всего: не используйте «таблицу» в качестве имени переменной. «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) 
+0

Спасибо за обратную связь. Я новичок в программировании Lua. Я попытаюсь включить ваши советы в будущие программы. Я описал текстовые файлы в другом комментарии. Я видел ваши шансы. Они генерируют следующее сообщение, когда я пытался его запустить: 'lua: morse.lua: 6: попытка вызвать значение nil (метод' insert ') stack traceback: \t morse.lua: 6: в функции' lista ' \t morse.lua: 61: в основном куске \t [C]: in? ' – lfmc

+0

Технически таблица представляет собой библиотеку, а не модуль. Модули '' 'required''''d. – warspyking

+0

@warspyking. Все встроенные функции - это модули (или библиотеки). Вы можете «потребовать (« table »)' просто отлично, а также проверить 'package.loaded [" table "]'. И интерпретаторы, не используемые по умолчанию, не обязаны предварительно загружать модуль 'table' так, как это делает интерпретатор запаса. –

Смежные вопросы