Циклы: нц…кц, нц пока, нц N раз, нц для
Циклы избавляют от копипасты команд. Разбираем все виды циклов КуМира — это самый важный урок раздела.
Цикл — конструкция, повторяющая команды. В КуМире цикл всегда в рамке
нц … кц, а вид повторения указывается рядом снц.
Зачем нужны циклы
Чтобы пройти Роботом 20 клеток вправо, писать 20 раз вправо утомительно и ненадёжно (а если стена сдвинется — программа сломается). Циклы решают обе проблемы: повторяют команды компактно и могут зависеть от обстановки.
Цикл «нц N раз»
Повторяет тело заданное число раз:
нц 5 раз
вправо
закрасить
кц
Робот пять раз сделает «шаг вправо и закрасить». Подходит, когда число повторов известно заранее.
Цикл «нц для»
Параметрический цикл со счётчиком, который пробегает значения от начального до конечного:
цел i
нц для i от 1 до 5
вывод i, " "
кц
Вывод:
1 2 3 4 5
Переменная i доступна внутри цикла — это удобно для вычислений (сумма, факториал). Можно идти и по убыванию: нц для i от 5 до 1 шаг -1.
Цикл «нц пока»
Главный цикл для Робота и для ОГЭ. Повторяет тело, пока условие истинно. Условие проверяется перед каждым повтором:
нц пока <условие>
<команды>
кц
Самый частый пример: Робот идёт вправо, пока не упрётся в стену, закрашивая клетки по пути:
использовать Робот
алг
нач
нц пока справа свободно
закрасить
вправо
кц
закрасить | закрасить последнюю клетку у стены
кон
Гениальность в том, что алгоритм работает при любой длине коридора — Робот сам остановится у стены. Именно за универсальность ценят «нц пока» на экзамене.
Цикл с постусловием
Иногда тело надо выполнить хотя бы раз, а условие проверить в конце. Тогда условие выхода пишут после кц со словом при:
нц
вправо
кц при справа стена
Здесь Робот делает шаг и продолжает, пока не окажется у стены справа (кц при — выйти, когда условие истинно). Эта форма используется реже.
Имитация «нц пока» на Python
Смоделируем коридор и движение Робота вправо до стены, закрашивая клетки. Стена — за пределами поля:
cols = 6
field = [0] * cols
c = 0
def sprava_svobodno():
return c < cols - 1
while sprava_svobodno():
field[c] = 1 # закрасить
c += 1 # вправо
field[c] = 1 # закрасить последнюю клетку у стены
print("".join("#" if x else "." for x in field))
Вывод:
######
Весь коридор закрашен — цикл сам остановился у правой стены, как и Робот в КуМире.
Опасность: бесконечный цикл
Если условие нц пока никогда не станет ложным, цикл зациклится навсегда. Самая частая причина — забыть команду движения внутри тела. В примере выше без вправо Робот вечно красил бы одну клетку. Всегда спрашивайте себя: «что в теле приближает условие к ложному?»
Попробуй сам
Напишите алгоритм: Робот идёт вниз до нижней стены, закрашивая каждую клетку. Подсказка: нц пока снизу свободно … закрасить … вниз … кц и закрасить последнюю клетку.
Частые ошибки
- Забыть
кц— цикл не закрыт. - Нет движения в теле
нц пока— бесконечный цикл. - Закрасить на одну клетку меньше или больше: продумайте, нужна ли закраска последней клетки после цикла.
- Использовать
нц N раз, когда длина поля неизвестна — алгоритм не будет универсальным.
Итог
- Любой цикл — в рамке
нц … кц. нц N раз— фиксированное число повторов;нц для— со счётчиком.нц пока условие— главный цикл Робота: работает при любом размере поля.- Следите, чтобы тело приближало условие к выходу, иначе будет вечный цикл.