#lua
#lua
Вопрос:
** На самом деле я работаю над программой, в которой используется ввод строки, содержащей имя и номер, например, отрицание 40, я должен поместить его в таблицу, где Отрицание является ключом, а 40 — значением, чтобы я мог выполнить дальнейший процесс с таблицей.. **
local class = {}
for i=1,N or 0 --N enter by user no. of classmember
local name=io.read() --takes the key
local credit = io.read("*n","*l")--takes the credit as value
class[name] = credit --assign the credit to the key
end
Комментарии:
1. Хорошо. И что вы пытались до сих пор?
2. Я отредактировал, но при переключении с помощью ключа и значения я должен нажать enter, но я нахожу способ, при котором ключ и значение берутся в одной строке, разделенной пробелом, и присваиваются соответствующим образом..
Ответ №1:
Я предлагаю это:
local credits = {}
while true do
io.write 'Type name and credit or just press Enter to finish: '
local name, credit = io.read():match '^([^%d%s] )%s*(%d )$'
if name then
credits [name] = tonumber (credit)
else
break
end
end
-- Show credits:
for name, credit in pairs (credits) do
print (name .. "'s credit is " .. tostring (credit))
end
- Пользователю будет предложено ввести строки, содержащие имя и число, в бесконечном цикле. Он завершится только тогда, когда пользователь введет пустую или неразличимую строку.
- условие, которое завершает цикл, отсутствует в его заголовке (после
while
илиuntil
), потому что это довольно сложно, включая печать приглашения и возврат двух переменных, которые необходимы в теле цикла. В более простых случаях это было бы не лучшим выбором (кроме того, присваивания в Lua не являются выражениями и не возвращают значение, в отличие от C или PHP), - но смотрите Обновление ниже!
- условие, которое завершает цикл, отсутствует в его заголовке (после
- Ввод пользователя немедленно анализируется на два захвата с помощью регулярного выражения.
[^%d%s]
не означает ни цифры, ни пробела (мы не хотим, чтобы в именах были конечные пробелы);%s
, пробел;%d
, цифра; и
name
(иcredit
) будетnil
, как только пользователь введет что-то другое, чемAlice 10
или подобное; иbreak
завершит цикл,- и если
name
это неnil
так и, следовательно, не является ложным, значениеcredit
будет записаноcredits
под ключомname
.
UPD: это более элегантное, но несколько эзотерическое решение, основанное на общем для:
local credits = {}
local function get_credit ()
io.write 'Type name and credit or just press Enter to finish: '
return io.read():match '^([^%d%s] )%s*(%d )$'
end
for name, credit in get_credit do -- note the absence of ().
credits [name] = tonumber (credit)
end
-- Show credits:
for name, credit in pairs (credits) do
print (name .. "'s credit is " .. tostring (credit))
end