Циклы: нц…кц, нц пока, нц 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 раз — фиксированное число повторов; нц для — со счётчиком.
  • нц пока условие — главный цикл Робота: работает при любом размере поля.
  • Следите, чтобы тело приближало условие к выходу, иначе будет вечный цикл.
Проверьте себя
1. Какой цикл лучше подходит, когда длина коридора заранее неизвестна?
Aнц 10 раз
Bнц для i от 1 до 10
Cнц пока справа свободно
Dлинейная последовательность команд вправо
2. Почему может возникнуть бесконечный цикл «нц пока справа свободно»?
AЕсли забыть слово кц
BЕсли в теле нет движения, меняющего обстановку (например, вправо)
CЕсли поле слишком большое
DЕсли условие написано по-русски
3. Сколько раз выполнится тело цикла «нц для i от 2 до 5»?
A3 раза
B4 раза
C5 раз
D2 раза
Поддержать проект