4. Глава 4: Циклы и повторение кода

Циклы позволяют выполнять один и тот же блок кода многократно — это важно, когда вы не знаете заранее, сколько раз нужно повторить действие, или когда необходимо обрабатывать набор данных поэлементно. Они являются фундаментальным инструментом для написания эффективных и динамичных программ.

В языке C доступны три основных типа циклов, каждый из которых имеет свои особенности и сценарии применения:

4.1. Цикл while

Цикл while выполняет блок кода до тех пор, пока заданное условие является истинным. Условие проверяется перед каждой итерацией. Если условие изначально ложно, тело цикла не выполнится ни разу.

Синтаксис:

while (условие) {
    // Код, который будет повторяться
}

Пример (`while_example.c`):

int i = 0;
while (i < 5) {
    printf("%d\n", i);
    i++;
}

Этот код напечатает числа от 0 до 4. Переменная i увеличивается на 1 в каждой итерации, пока не достигнет значения 5.

4.2. Цикл do...while

Цикл do...while отличается от while тем, что тело цикла выполняется хотя бы один раз, а затем уже проверяется условие. Если условие истинно, цикл продолжает выполняться. Если условие ложно после первого выполнения, цикл завершается.

Синтаксис:

do {
    // Код, который будет повторяться
} while (условие);

Пример (`do_while_example.c`):

int i = 0;
do {
    printf("%d\n", i);
    i++;
} while (i < 5);

Этот пример также напечатает числа от 0 до 4. Однако, если бы i изначально было равно 5, printf("%d\n", i); все равно выполнился бы один раз (напечатав 5), прежде чем цикл завершился бы.

4.3. Цикл for

Цикл for — это наиболее компактная и часто используемая форма цикла, особенно когда количество итераций известно заранее. Он объединяет инициализацию переменной, условие продолжения цикла и операцию шага (изменение переменной) в одной строке.

Синтаксис:

for (инициализация; условие; шаг) {
    // Код, который будет повторяться
}

Пример (`for_example.c`):

for (int i = 0; i < 5; i++) {
    printf("%d\n", i);
}

Этот код также напечатает числа от 0 до 4. Это наиболее чистый способ для фиксированного количества итераций.

4.4. Прерывание и продолжение циклов: break и continue

Иногда внутри цикла возникает необходимость изменить его обычное поведение: либо полностью выйти из него, либо пропустить текущую итерацию и перейти к следующей. Для этого используются операторы break и continue.

  • break;Немедленно выходит из ближайшего объемлющего цикла (while, do…while, for или switch). Код, следующий за оператором break в теле цикла, не выполняется.

  • continue;Пропускает оставшуюся часть текущей итерации цикла и переходит к следующей итерации (проверяет условие цикла заново).

Пример (`break_continue_example.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.

4.5. Практика: Подсчёт суммы чисел

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

Пример (`sum_numbers.c`):

// Подсчёт суммы чисел от 1 до 100
int sum = 0;
for (int i = 1; i <= 100; i++) {
    sum += i;
}
printf("Сумма чисел от 1 до 100: %d\n", sum);

Циклы делают программы динамичными, мощными и позволяют избежать рутинного повторения кода. Освоение их является ключевым шагом в изучении любого языка программирования.