Цикл со счетчиком

Цикл со счетчиком повторяет команды заданное количество раз. Счетчик показывает, какой шаг выполняется сейчас, и помогает пройти по набору значений по порядку.
Зачем это нужно
Обычный цикл удобен, когда заранее неизвестно, сколько раз нужно повторять действие. Например, робот едет, пока не увидит препятствие. Но бывают задачи другого типа: мигнуть светодиодом 5 раз, проверить 6 датчиков, проехать 4 клетки, обработать 10 измерений. Здесь количество повторений известно заранее.
Если записать одинаковые команды вручную, программа станет длинной и хрупкой. Цикл со счетчиком делает такую работу аккуратной: меняется только номер шага, а правило остается одно.
Главная идея
Счетчик - это переменная, которая меняется при каждом повторении.
начать со счетчика 0
пока счетчик меньше нужного количества
выполнить действие
увеличить счетчик

Формальная схема отдельно показывает начальное значение, проверку границы и увеличение счётчика.

В языках программирования такой цикл часто записывают через for. В Python for умеет проходить по последовательности значений, а в C++/Arduino часто используют счетчик вида i = 0; i < n; i++.
Счетчик - это переменная, которая хранит номер текущего повторения или количество уже выполненных шагов.
Зачем начинать с нуля
В программировании счет часто начинается с нуля. Если в массиве 6 элементов, их индексы обычно идут так:
0, 1, 2, 3, 4, 5
Это непривычно после обычного счета "первый, второй, третий", но удобно для памяти и массивов. Индекс 0 означает первый элемент.
| Количество элементов | Последний индекс при счете с нуля |
|---|---|
| 1 | 0 |
| 3 | 2 |
| 5 | 4 |
| 6 | 5 |
| 10 | 9 |
Ошибка на один шаг - частая проблема. Если написать условие i <= 6 для массива из 6 элементов, счетчик попробует обратиться к индексам 0, 1, 2, 3, 4, 5, 6. Индекс 6 уже выходит за границу.
Пример: мигнуть светодиодом
Псевдокод:
повторить 5 раз
включить светодиод
подождать
выключить светодиод
подождать
После каждого мигания счётчик увеличивается. Когда i становится равен 5, программа выходит из цикла.

Здесь счетчик нужен не для расчета, а для контроля количества повторений. Робот не спрашивает датчик и не ждет события. Он делает ровно пять одинаковых циклов.
В Arduino-стиле это может выглядеть как цикл for:
for (int i = 0; i < 5; i++) {
// команды мигания
}
Переменная i сначала равна 0, потом 1, потом 2, 3, 4. После пятого выполнения она станет 5, условие i < 5 перестанет выполняться, и цикл завершится.
Обработка набора данных

Цикл со счетчиком особенно полезен для массивов. Пусть робот сохранил 6 измерений расстояния и хочет найти среднее значение.
сумма = 0
для каждого измерения
добавить измерение к сумме
среднее = сумма / количество измерений
Для массива из шести измерений алгоритм можно записать следующей блок-схемой:

Счетчик помогает пройти по каждой ячейке ровно один раз. Без цикла пришлось бы писать сложение вручную:
сумма = a0 + a1 + a2 + a3 + a4 + a5
Если измерений станет 20, ручная запись сразу станет неудобной.
Индекс - это номер элемента в массиве. По индексу программа выбирает, с каким элементом работать.
Как проверить количество повторений
Для цикла со счетчиком полезно выписать значения счетчика до запуска программы. Это занимает меньше минуты и часто находит ошибку раньше, чем робот начнет странно двигаться.
Например:
начало: i = 2
условие: i < 6
шаг: i = i + 1
Значения будут такими:
2, 3, 4, 5
Тело цикла выполнится четыре раза. Если ученик ожидал шесть повторений, значит начальное значение выбрано неверно. Если ожидал пройти индексы массива из шести элементов, то пропущены индексы 0 и 1.
Цикл со счетчиком и обычный цикл
Оба варианта повторяют действия, но отвечают на разные вопросы.
| Тип цикла | Главный вопрос | Пример |
|---|---|---|
| Цикл с условием | пока что-то остается верным? | ехать, пока нет препятствия |
| Цикл со счетчиком | сколько раз повторить? | мигнуть 5 раз |
| Проход по массиву | какой элемент сейчас обрабатываем? | проверить 6 датчиков |
Иногда они сочетаются. Например, робот может ехать по линии, пока не нажата кнопка, а внутри каждого повторения проходить по нескольким датчикам.
Что запомнить про счетчик
Счетчик делает повторение измеримым.
| Что проверить | Почему |
|---|---|
| начальное значение | откуда начинается счет |
| условие продолжения | когда цикл остановится |
| изменение счетчика | чтобы не получить бесконечный цикл |
| границы массива | чтобы не выйти за пределы данных |
| смысл индекса | какой элемент обрабатывается |
Если цикл должен выполниться 5 раз, полезно вручную выписать значения счетчика. Это быстро показывает ошибки в условии.
Практика
Задание 1
Запишите значения счетчика для цикла:
i = 0
пока i < 4
выполнить действие
i = i + 1
Сколько раз выполнится действие?
Задание 2
У робота есть массив из 5 измерений. Какие индексы нужно проверить, если счет начинается с нуля?
Задание 3
Составьте алгоритм, который мигает светодиодом 3 раза. Используйте счетчик, а не три одинаковых блока команд.
Проверьте себя
- Чем цикл со счетчиком отличается от цикла с условием?
- Зачем счетчик увеличивают внутри цикла?
- Почему массив из 6 элементов имеет последний индекс 5?
- Что такое ошибка "на один шаг"?
- Где в роботе можно использовать цикл со счетчиком?
Сначала ответьте без подсказки. Ответ можно считать полным, если вы:
- формулируете основную мысль своими словами;
- называете важные условия, ограничения или меры безопасности;
- для схемы, кода или расчёта показываете ход решения и ожидаемый результат.
Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.
Словарь статьи
- Цикл со счетчиком - повторение команд с переменной, которая считает шаги.
- Счетчик - переменная номера текущего повторения.
- Индекс - номер элемента в массиве.
- Массив - набор значений, расположенных по порядку.
- Граница массива - первый и последний допустимый индекс.
- Ошибка на один шаг - ситуация, когда цикл выполняется на один раз больше или меньше нужного.
- Итерация - одно повторение тела цикла.
Связанные темы
- Цикл - общий принцип повторения.
- Хранение данных в памяти - как массивы лежат в памяти.
- Математика в двоичной системе счисления - как счетчики и биты связаны с вычислениями.
- Декомпозиция задачи - как вынести повторяющуюся работу в отдельную часть алгоритма.
Источники
- Python Tutorial.
forStatements: https://docs.python.org/3/tutorial/controlflow.html#for-statements - Python Tutorial. The
range()Function: https://docs.python.org/3/tutorial/controlflow.html#the-range-function - Arduino Reference. for: https://www.arduino.cc/reference/en/language/structure/control-structure/for/
- Arduino Language Reference: https://docs.arduino.cc/language-reference/