Цикл for
У большинства циклов со счётчиком одни и те же три части: переменная, созданная до цикла, условие и шаг в конце блока:
local day = 1 -- начало
while day <= 5 do -- условие
print("День " .. day)
day = day + 1 -- шаг
endСчитать так приходится настолько часто, что в Lua есть цикл, который делает всё три действия в одной строке, — цикл for:
for day = 1, 5 do
print("День " .. day)
endОба цикла выводят одно и то же:
День 1
День 2
День 3
День 4
День 5Первую строку читайте так: «для day от 1 до 5 выполнить». Цикл присваивает переменной day значения 1, 2, 3, 4 и 5, по одному на каждую итерацию. Оба числа включены: цикл начинается с первого и заканчивается последним. Вам не нужно создавать переменную до цикла, писать условие и самим увеличивать переменную: for делает всё это сам. Поэтому нельзя забыть шаг и получить бесконечный цикл.
Начало и конец разделяются запятой. Запись for day = 1 to 5 do даёт main.lua:1: ',' expected near 'to'. Это могут быть и переменные, и вычисления, например for plot = 1, plots do.
Переменную цикла часто называют i, но подойдёт любое имя. Цикл for сам делает её локальной, поэтому local перед ней писать не нужно:
for local i = 1, 3 do
print(i)
endmain.lua:1: <name> expected near 'local'Переменная цикла существует только внутри цикла. После end цикла такое имя снова неизвестно, поэтому его значение — nil:
for i = 1, 3 do
print(i)
end
print(i)1
2
3
nilЕсли значение нужно и после цикла, используйте цикл while с переменной, созданной до него, как в предыдущих упражнениях. Зато у каждого цикла может быть своя i, потому что каждая i исчезает, когда её цикл заканчивается.
for или while? Используйте for, когда вы знаете, сколько раз выполнится цикл: от 1 до 10 или по разу на каждый день недели. Используйте while, когда заранее это неизвестно. Эмма наполняет поилку для коровы Беллы водой из колодца: в одном ведре 8 литров. Сколько вёдер нужно, чтобы набрать не меньше 50 литров?
local water = 0
local buckets = 0
while water < 50 do
water = water + 8
buckets = buckets + 1
end
print("Вёдер: " .. buckets)
print("Воды: " .. water .. " л")Вёдер: 7
Воды: 56 лЗадание
- 1
Перепишите цикл
whileиз редактора как циклforс переменнойplot. Удалите циклwhileи строку, которая создаётplot. Программа по-прежнему выводит отГрядка 1доГрядка 5. - 2
Эмма арендовала ещё земли. Измените свой цикл так, чтобы он выводил грядки с 1 по 8 включительно:
Грядка 1 Грядка 2 Грядка 3 Грядка 4 Грядка 5 Грядка 6 Грядка 7 Грядка 8 - 3
Подсолнух Эммы растёт на 4 см в день. Под первым циклом напишите второй цикл
forс переменнойdayот 1 до 7, который выводит, какого роста подсолнух после каждого дня. Высоту можно посчитать прямо вprint:day * 4. Второй цикл выводит:День 1: 4 см День 2: 8 см День 3: 12 см День 4: 16 см День 5: 20 см День 6: 24 см День 7: 28 см