Цикл while
Каждый вечер Эмма собирает яйца у своих кур. Программа, которая выводит её план на неделю, могла бы состоять из семи почти одинаковых строк print. На целый сезон их понадобилось бы сто. Программы постоянно повторяют такую работу: проходят по каждому дню сезона, по каждой грядке поля или перерисовывают экран игры 60 раз в секунду. Для этого и нужны циклы. Цикл — это фрагмент кода, который выполняется снова и снова.
Самый простой цикл в Lua — while. Он повторяет блок кода, пока его условие истинно:
local day = 1
while day <= 5 do
print("День " .. day)
day = day + 1
endОн выводит:
День 1
День 2
День 3
День 4
День 5Цикл while похож на if: ключевое слово, условие и блок кода, который заканчивается словом end. Только вместо then здесь стоит do. Разница в том, что if выполняет свой блок не больше одного раза, а while снова и снова возвращается к условию. По шагам:
- Программа создаёт переменную
dayсо значением1. - Она проверяет условие
day <= 5. Оно истинно, поэтому программа выполняет блок: выводитДень 1, аday = day + 1увеличиваетdayдо2. - Она возвращается к условию.
2 <= 5всё ещё истинно, поэтому она выводитДень 2и увеличиваетdayдо3. - И так далее, пока
dayне станет равно6. Тогда условие ложно, цикл заканчивается, и программа продолжает работу послеendцикла.
Каждое выполнение блока называется итерацией. В этом цикле пять итераций. Чтобы пройти сезон в 100 дней, достаточно заменить 5 на 100.
Делайте отступ блока в 4 пробела, как и в if, чтобы с первого взгляда было видно, что повторяется. Код после end выполняется только один раз, когда цикл уже закончился:
local plot = 1
while plot <= 3 do
print("Полив грядки " .. plot)
plot = plot + 1
end
print("Все грядки политы.")Полив грядки 1
Полив грядки 2
Полив грядки 3
Все грядки политы.Обратите внимание на строку plot = plot + 1. В Lua нет ни +=, ни ++, поэтому переменную приходится увеличивать «длинным» способом. Что-то в блоке должно менять переменную из условия, чтобы в какой-то момент условие стало ложным. Иначе цикл никогда не закончится. Что тогда будет, вы увидите в следующем упражнении.
Две ошибки, которые вы, скорее всего, сделаете поначалу. Если написать then, как в if, программа не запустится:
local day = 1
while day <= 3 then
print("День " .. day)
day = day + 1
endmain.lua:2: 'do' expected near 'then'А если забыть end, Lua даже скажет, к какому циклу оно относится:
local day = 1
while day <= 3 do
print("День " .. day)
day = day + 1main.lua:4: 'end' expected (to close 'while' at line 2) near <eof><eof> означает «конец файла»: Lua дошёл до конца программы, а end так и не дождался.
Задание
- 1
Удалите три строки с
print. Вместо них создайте локальную переменнуюdayсо значением1. С её помощью цикл будет считать дни. - 2
Под ней напишите цикл
while, который выполняется, покаdayменьше или равно7. Внутри цикла выведите день так же, как это делали удалённые строки, а затем увеличьтеdayна 1. Программа выводит:День 1: сбор яиц День 2: сбор яиц День 3: сбор яиц День 4: сбор яиц День 5: сбор яиц День 6: сбор яиц День 7: сбор яиц - 3
После цикла, под его
end, выведитеПосле цикла day равнои значениеday. Вывод заканчивается так:День 7: сбор яиц После цикла day равно 8Переменная оказывается равной 8, а не 7, потому что цикл останавливается только тогда, когда условие ложно.