Введение: Зачем нужны циклы?
Представьте, что вам нужно вывести на экран числа от 1 до 100, или обработать каждый элемент в списке, или ждать от пользователя ввода корректных данных.
Писать по 100 одинаковых строк кода — неэффективно и нерационально. Для
этого и существуют циклы.
Цикл — это конструкция языка программирования, которая позволяет многократно выполнять один и тот же блок кода.
В C++ есть три основных типа циклов:
- Цикл for — идеален, когда известно количество повторений.
- Цикл while — идеален, когда количество повторений неизвестно и зависит от условия.
- Цикл do...while — похож на while, но гарантирует хотя бы одно выполнение тела цикла.
В этой статье мы сосредоточимся на for и while.
Глава 1: Цикл for — предсказуемый и структурированный
Цикл for — ваш главный инструмент, когда вы заранее знаете (или можете вычислить), сколько итераций (шагов) нужно выполнить.
Синтаксис:
Инициализация: Выполняется один раз перед началом цикла. Здесь обычно объявляется и инициализируется счетчик цикла.
- Условие: Вычисляется перед каждой итерацией. Если условие истинно (true), тело цикла выполняется. Если ложно (false) — цикл завершается.
- Обновление: Выполняется после каждой итерации. Здесь обычно изменяется значение счетчика (например, увеличивается на 1).
Разберем на примере: Вывод чисел от 1 до 5
Как это работает:
- Инициализация: int i = 1. Создается переменная i со значением 1.
- Проверка условия: i <= 5. 1 <= 5 — истина. Входим в тело цикла.
- Тело цикла: Выполняется cout << "Число: " << i << endl;. На экране появляется "Число: 1".
- Обновление: Выполняется i++. Теперь i = 2.
- Снова проверка условия: 2 <= 5 — истина. Входим в тело цикла. Выводится "Число: 2".
- Этот процесс повторяется, пока i не станет равным 6.
- Проверка условия: 6 <= 5 — ложь. Цикл завершается.
Результат:
Число: 1
Число: 2
Число: 3
Число: 4
Число: 5
Вариации цикла for
- Обратный счет:
Изменение шага:
Цикл с несколькими счетчиками:
Глава 2: Цикл while — гибкий и универсальный
Цикл while используется, когда количество итераций заранее неизвестно и полностью зависит от выполнения какого-либо условия. Например, "пока пользователь вводит неверные данные, повторять запрос".
Синтаксис:
Условие проверяется перед каждой итерацией. Если оно истинно, выполняется тело цикла.
Разберем на примере: Ожидание правильного ввода от пользователя
Как это работает:
- Программа просит ввести число.
- Проверяется условие в while: number <= 0.
Если пользователь ввел, скажем, -5, условие истинно. Программа заходит в тело цикла и просит ввести число снова.
Этот процесс повторяется, пока пользователь не введет, например, 10. - Условие 10 <= 0 — ложно. Цикл завершается, и программа выводит благодарность.
Важный нюанс: Бесконечный цикл
Если условие в while никогда не станет ложным, цикл будет выполняться бесконечно.
Бесконечные циклы полезны в редких случаях (например, для серверов, которые должны работать постоянно), но чаще это ошибка. Чтобы избежать ее, убедитесь, что в теле цикла есть код, который может изменить переменную из условия.
Глава 3: Ключевые операторы break и continue
Эти операторы позволяют гибко управлять ходом выполнения цикла.
- break — немедленно завершает выполнение всего цикла.
- continue — немедленно завершает текущую итерацию и переходит к следующей (к проверке условия в while или к шагу обновления в for).
Пример с break (поиск числа):
Пример с continue (вывод только четных чисел):
Практическая часть: Задачи для закрепления
Уровень 1: Начальный
Задача 1.1: Сумма чисел
Напишите программу, которая использует цикл for для вычисления суммы всех целых чисел от 1 до N, где N вводит пользователь.
Подсказка
Создайте переменную `sum` (изначально равной 0) и на каждой итерации цикла прибавляйте к ней значение счетчика.
Задача 1.2: Факториал
Напишите программу, которая вычисляет факториал числа N. (N! = 1 * 2 * 3 * ... * N). Учтите, что 0! = 1.
Подсказка
Аналогично сумме, но начинайте переменную `factorial` с 1 и используйте умножение.
Задача 1.3: Таблица умножения
Используя вложенный цикл for (цикл внутри цикла), выведите на экран таблицу умножения от 1 до 10.
Подсказка
Внешний цикл `for (int i = 1; i <= 10; i++)` будет перебирать строки,
а внутренний `for (int j = 1; j <= 10; j++)` — столбцы. Внутри
выводите `i * j`.
Уровень 2: Средний
Задача 2.1: Угадай число
Напишите программу, где компьютер "загадывает" случайное число от 1 до 100 (используйте int secret_num = rand() % 100 + 1;), а пользователь пытается его угадать. Программа должна давать подсказки "больше" или "меньше". Используйте цикл while.
Подсказка
Цикл должен продолжаться, пока `user_guess != secret_num`. Не забудьте добавить `#include <cstdlib>` для `rand()`.
Задача 2.2: Простые числа
Напишите программу, которая проверяет, является ли введенное пользователем число простым (делится без остатка только на 1 и на себя). Используйте цикл for для перебора возможных делителей.
Подсказка
Перебирайте делители от 2 до `sqrt(N)` (или до `N/2`). Если хоть раз `N %
i == 0`, то число не простое. Используйте флаговую переменную `bool
isPrime = true;`.
Задача 2.3: Обработка последовательности
Напишите программу, которая читает числа, вводимые пользователем, до тех пор, пока не будет введен 0. После этого программа должна вывести сумму и
среднее арифметическое всех введенных положительных чисел. Используйте while (true) с break.
Подсказка
Внутри бесконечного цикла считывайте число. Если число == 0, делайте
`break`. Если число > 0, добавляйте его к сумме и увеличивайте
счетчик количества чисел.
Уровень 3: Продвинутый
Задача 3.1: Числа Фибоначчи
Напишите программу, которая выводит N первых чисел последовательности Фибоначчи. Каждое следующее число является суммой двух предыдущих (0, 1, 1, 2, 3, 5, 8...). N вводит пользователь.
Подсказка
Вам понадобятся три переменные: `a = 0`, `b = 1` и `next`. В цикле
вычисляйте `next = a + b`, затем обновляйте значения: `a = b`, `b =
next`.
Задача 3.2: Вывод шаблона (Pattern)
Используя вложенные циклы, напишите программу, которая выводит на экран следующий узор (пирамиду) высотой N:
*
***
*****
*******
*********
Подсказка
Вам понадобится три вложенных цикла: для строк, для пробелов и для
звездочек. Количество пробелов уменьшается, а количество звездочек
увеличивается с каждой строкой. Формула для звездочек в строке `i`: `2 *
i - 1`.
Задача 3.3: Алгоритм Евклида
Реализуйте нахождение наибольшего общего делителя (НОД) двух чисел, используя алгоритм Евклида и цикл while. Алгоритм: пока оба числа не равны нулю, если a > b, то a = a % b, иначе b = b % a. НОД будет равен оставшемуся ненулевому числу.
Подсказка
Цикл: `while (a != 0 && b != 0)`. После цикла НОД = `a + b` (т.к. одно из них станет 0).
Заключение
Вы освоили два фундаментальных инструмента C++: циклы for и while.
- for — ваш выбор для задач с известным количеством повторов.
- while — ваш выбор для ситуаций, зависящих от условий, которые нельзя предсказать заранее.
Практикуйтесь, решая задачи, и скоро использование циклов станет для вас абсолютно естественным. Удачи в изучении C++