.. _chapter_4: Глава 4: Циклы и повторение кода ================================ Циклы позволяют выполнять один и тот же блок кода многократно — это важно, когда вы не знаете заранее, сколько раз нужно повторить действие, или когда необходимо обрабатывать набор данных поэлементно. Они являются фундаментальным инструментом для написания эффективных и динамичных программ. В языке C доступны три основных типа циклов, каждый из которых имеет свои особенности и сценарии применения: .. contents:: :local: :depth: 2 Цикл ``while`` -------------- Цикл ``while`` выполняет блок кода **до тех пор, пока заданное условие является истинным**. Условие проверяется *перед каждой итерацией*. Если условие изначально ложно, тело цикла не выполнится ни разу. **Синтаксис:** .. code-block:: c while (условие) { // Код, который будет повторяться } **Пример (`while_example.c`):** .. code-block:: c int i = 0; while (i < 5) { printf("%d\n", i); i++; } Этот код напечатает числа от 0 до 4. Переменная ``i`` увеличивается на 1 в каждой итерации, пока не достигнет значения 5. Цикл ``do...while`` ------------------- Цикл ``do...while`` отличается от ``while`` тем, что **тело цикла выполняется хотя бы один раз**, а затем уже проверяется условие. Если условие истинно, цикл продолжает выполняться. Если условие ложно после первого выполнения, цикл завершается. **Синтаксис:** .. code-block:: c do { // Код, который будет повторяться } while (условие); **Пример (`do_while_example.c`):** .. code-block:: c int i = 0; do { printf("%d\n", i); i++; } while (i < 5); Этот пример также напечатает числа от 0 до 4. Однако, если бы ``i`` изначально было равно 5, ``printf("%d\n", i);`` все равно выполнился бы один раз (напечатав 5), прежде чем цикл завершился бы. Цикл ``for`` ------------ Цикл ``for`` — это наиболее компактная и часто используемая форма цикла, особенно когда **количество итераций известно заранее**. Он объединяет инициализацию переменной, условие продолжения цикла и операцию шага (изменение переменной) в одной строке. **Синтаксис:** .. code-block:: c for (инициализация; условие; шаг) { // Код, который будет повторяться } **Пример (`for_example.c`):** .. code-block:: c for (int i = 0; i < 5; i++) { printf("%d\n", i); } Этот код также напечатает числа от 0 до 4. Это наиболее чистый способ для фиксированного количества итераций. Прерывание и продолжение циклов: ``break`` и ``continue`` --------------------------------------------------------- Иногда внутри цикла возникает необходимость изменить его обычное поведение: либо полностью выйти из него, либо пропустить текущую итерацию и перейти к следующей. Для этого используются операторы ``break`` и ``continue``. * ``break;`` — **Немедленно выходит** из ближайшего объемлющего цикла (`while`, `do...while`, `for` или `switch`). Код, следующий за оператором ``break`` в теле цикла, не выполняется. * ``continue;`` — **Пропускает оставшуюся часть текущей итерации** цикла и переходит к следующей итерации (проверяет условие цикла заново). **Пример (`break_continue_example.c`):** .. code-block:: c for (int i = 0; i < 5; i++) { if (i == 2) continue; // Пропускаем итерацию, когда i равно 2 if (i == 4) break; // Прерываем цикл, когда i равно 4 printf("%d\n", i); } Этот код напечатает `0`, `1`, `3`. Объяснение: - Когда `i` равно 0, `0` выводится. - Когда `i` равно 1, `1` выводится. - Когда `i` равно 2, `continue` пропускает `printf`, и цикл переходит к следующей итерации. - Когда `i` равно 3, `3` выводится. - Когда `i` равно 4, `break` срабатывает, и цикл немедленно завершается до того, как `printf` успевает вывести 4. Практика: Подсчёт суммы чисел ----------------------------- Один из классических примеров использования циклов — подсчёт суммы последовательности чисел. **Пример (`sum_numbers.c`):** .. code-block:: c // Подсчёт суммы чисел от 1 до 100 int sum = 0; for (int i = 1; i <= 100; i++) { sum += i; } printf("Сумма чисел от 1 до 100: %d\n", sum); --- Циклы делают программы динамичными, мощными и позволяют избежать рутинного повторения кода. Освоение их является ключевым шагом в изучении любого языка программирования.