Kodomo

Пользователь

Общие сведения о языке Lua. Типы данных. Выражения. Операторы ветвления и цикла. Комментарии. Утилиты lua и luaprompt

План рассказа

История Lua

Основные особенности языка и отличия от других языков. Применение в народном хозяйстве.

Организационные моменты

Как установить Lua на машину под Windows, Linux и MacOS:

В классе под Linux доступна утилита luaprompt (команда luap) - интерпретатор Lua с подсветкой, кнопкой TAB, историей команд и прочими удобствами. Желающие могут скопировать luaprompt себе или скомпилировать его самостоятельно. Способы исполнять Lua: интерактивный режим, запуск скрипта (команда lua имя_скрипта.lua).

Типы данных

Все несуществующие переменные равны nil. Всё, кроме nil и false считается истинным. Числа в Lua только нецелые. Способы задать строку. Многострочная строка. Операция ".." (конкатенация строк). Числа автоматически превращаются в строки при конкатенации и в некоторых других случаях. Функция tonumber(x) переводит строку в число. В случае ошибки возвращает nil. Функция tostring(x) переводит числа и другие типы в строку. Функция type(x) возвращает тип своего аргумента в виде строки: "number", "string", ...

Выражения и операции

and or not
+ - * / % ^
== ~= < <= > >=

Таблицы

Таблицы - единственный составной тип языка. Обладают свойствами списков и словарей, классов и объектов. Способы задать элементы таблицы. Как добавить и удалить элемент из таблицы. Способы получения членов таблиц. Синтаксис xxx.yyy. Индексация начинается с 1. Обход при помощи pairs и ipairs. Как узнать число элементов таблицы, если она - список. Если таблица - словарь, то узнать число элементов можно только путем их перебора в цикле и подсчёта.

Присваивание переменных. Типы переменных

Переменные бывают трёх типов: локальные, глобальные и члены таблиц.

Чтобы удалить переменную, достаточно присвоить её к nil.

Операторы

Ветвление:

if cond1 then
        ...
elseif cond2 then
        ...
elseif cond3 then
        ...
else
        ...
end

Циклы (4 варианта):

Перебор членов арифметической прогрессии:

for i = 1, 1000 do
        -- 1, 2, ..., 1000
end

for i = 2, 1000, 2 do
        -- 2, 4, ..., 1000
end

for i = 1000, 1, -1 do
        -- 1000, 999, ... 1
end

Обход членов словаря:

for key, value in pairs(dictionary) do
        ...
end

Обход членов списка:

for index, value in ipairs(list) do
        ...
end

Обход строк файла:

for line in io.lines() do
        ...
end

Повторение действия, пока условие истинно

while cond do
        ...
end

Повторение действия, пока условие ложно (проверка выполняется после итерации, поэтому первая итерация всегда выполняется)

repeat
        ...
until cond

Прервать цикл - break. Аналога continue нет.

Взаимодействие с пользователем в командной строке

Функция print - вывод данных на экран. Таблицы печатает в виде их адресов, а не содержимого (в утилите luaprompt это исправлено). Функция io.read() - ввод данных с клавиатуры (возвращает строку). io.read('*n') - ввод данных с клавиатуры, возвращает число.

Комментарии в Lua начинаются со знаков "--" до конца строки.

Домашнее задание

0. Установить на свой компьютер софт для редактирования и исполнения Lua-файлов, с которым вам будет удобно.

1. Пройти тест "lua1hw" на http://kodomoquiz.tk хотя бы на 95% от максимального балла.

2. Написать программу "Калькулятор услуг". Программа спрашивает у пользователя имя и максимальное количество денег на покупки. Затем программа спрашивает название услуги и её цену. Программа печатает следующую фразу "You can order service XXX at most YYY times. It will cost ZZZ". XXX - название услуги. YYY - максимальное количество раз, которое можно заказать услугу на имеющиеся средства. ZZZ - суммарная стоимость заказанных услуг.

Если пользователь вводит некорректные данные (например, ерунду вместо чисел или отрицательные числа), программа должна спрашивать ещё раз, пока пользователь не введёт как следует.

Что будет, если цена услуги равна 0?

*3. Написать программу, которая находит пересечение генов. Программа спрашивает у пользователя начало и конец двух генов (всего 4 числа). (Конец - это последний нуклеотид в гене, он тоже принадлежит гену.) Координаты могут быть отрицательными. (Будем считать, что ДНК продолжается в обе стороны и все введенные координаты имеют место быть.) Распечатать число нуклеотидов, которые принадлежат одновременно двум генам. (Если гены не пересекаются, распечатать 0.)

*4. Написать программу, которая принимает натуральные числа X и Y и находит последнюю цифру в сумме квадратов натуральных чисел от X до Y. В программе запрещается использовать циклы из 10 итераций или более.

*5. Написать программу, которая принимает натуральное число и выводит два неотрицательных целых числа, разность квадратов которых равна входному числу. Запрещается использовать циклы.