Вложенные циклы
До сих пор каждый print завершал строку. Чтобы записать несколько значений рядом на одной строке, в Lua есть io.write. Он записывает значения как есть: без перевода строки в конце и без табуляций между ними:
io.write("Яйца: ", 12)
io.write(" и молоко")
print()
print("Яйца:", 12)Яйца: 12 и молоко
Яйца: 12Пустой print() выводит только перевод строки: здесь он завершает строку, начатую через io.write. Ещё два отличия: io.write записывает дробное число 5.0 как 5 (а print выводит 5.0), и он принимает только строки и числа. Для всего остального сначала используйте tostring:
io.write(true)main.lua:1: bad argument #1 to 'write' (string expected, got boolean)Теперь про циклы. Внутри цикла может быть другой цикл. Это называется вложенным циклом: в каждой итерации внешнего цикла внутренний цикл проходит целиком. На подсолнуховом поле Эммы 3 ряда по 5 подсолнухов:
for row = 1, 3 do
for column = 1, 5 do
io.write("*")
end
print()
end*****
*****
*****Внешний цикл начинает с ряда 1, а внутренний записывает пять звёздочек рядом. После внутреннего цикла print() завершает ряд. Только потом внешний цикл переходит к ряду 2, и внутренний снова записывает пять звёздочек. Внутренний блок выполняется 3 × 5 = 15 раз. Давайте переменным двух циклов разные имена (здесь row и column), чтобы было понятно, какая из них какая.
Посмотрите, где стоит print(): после end внутреннего цикла, но всё ещё внутри внешнего. Внутри внутреннего цикла он выводил бы каждую звёздочку на отдельной строке. После внешнего цикла все 15 звёздочек оказались бы на одной длинной строке.
Внутренний цикл может использовать переменную внешнего. С column = 1, row в первом ряду будет одна звёздочка, во втором — две, и так далее:
for row = 1, 4 do
for column = 1, row do
io.write("*")
end
print()
end*
**
***
****Вместо io.write можно собирать каждый ряд как строку: начните с пустой строки "", дописывайте к ней через .. во внутреннем цикле и выводите после внутреннего цикла. Это тот же шаблон, что и суммирование, только со строками:
for row = 1, 2 do
local line = ""
for column = 1, 3 do
line = line .. "*"
end
print(line)
end***
***И ещё одно: break во внутреннем цикле завершает только внутренний цикл. Внешний продолжает со своей следующей итерации.
Задание
- 1
Нарисуйте поле Эммы: 4 ряда по 6 подсолнухов
*в каждом. Используйте два вложенных циклаfor: внешний с переменнойrowи внутренний с переменнойcolumn. Внутренний цикл записывает одну*черезio.write. После него, всё ещё внутри внешнего цикла,print()завершает ряд.****** ****** ****** ****** - 2
Под полем пронумеруйте грядки Эммы: 3 ряда по 4 грядки, номера от 1 до 12, ряд за рядом. До циклов создайте локальную переменную
plotсо значением0. Во внутреннем цикле увеличивайте её на 1 и записывайте черезio.write(plot, " "). Каждый ряд завершайте черезprint(). Номера выглядят так:1 2 3 4 5 6 7 8 9 10 11 12В конце каждого ряда после последнего номера остаётся пробел. Его не видно, и это не важно.