Найти в Дзене

Циклы в C++: Полное руководство от for до while с практикой

Введение: Зачем нужны циклы? Представьте, что вам нужно вывести на экран числа от 1 до 100, или обработать каждый элемент в списке, или ждать от пользователя ввода корректных данных.
Писать по 100 одинаковых строк кода — неэффективно и нерационально. Для
этого и существуют циклы. Цикл — это конструкция языка программирования, которая позволяет многократно выполнять один и тот же блок кода. В C++ есть три основных типа циклов: В этой статье мы сосредоточимся на for и while. Цикл for — ваш главный инструмент, когда вы заранее знаете (или можете вычислить), сколько итераций (шагов) нужно выполнить. Инициализация: Выполняется один раз перед началом цикла. Здесь обычно объявляется и инициализируется счетчик цикла. Как это работает: Результат: Число: 1
Число: 2
Число: 3
Число: 4
Число: 5 Изменение шага: Цикл с несколькими счетчиками: Глава 2: Цикл while — гибкий и универсальный Цикл while используется, когда количество итераций заранее неизвестно и полностью зависит от выполнения какого-ли
Оглавление

Введение: Зачем нужны циклы?

Представьте, что вам нужно вывести на экран числа от 1 до 100, или обработать каждый элемент в списке, или ждать от пользователя ввода корректных данных.
Писать по 100 одинаковых строк кода — неэффективно и нерационально. Для
этого и существуют циклы.

Цикл — это конструкция языка программирования, которая позволяет многократно выполнять один и тот же блок кода.

В C++ есть три основных типа циклов:

  1. Цикл for — идеален, когда известно количество повторений.
  2. Цикл while — идеален, когда количество повторений неизвестно и зависит от условия.
  3. Цикл do...while — похож на while, но гарантирует хотя бы одно выполнение тела цикла.

В этой статье мы сосредоточимся на for и while.

Глава 1: Цикл for — предсказуемый и структурированный

Цикл for — ваш главный инструмент, когда вы заранее знаете (или можете вычислить), сколько итераций (шагов) нужно выполнить.

Синтаксис:

Инициализация: Выполняется один раз перед началом цикла. Здесь обычно объявляется и инициализируется счетчик цикла.

  • Условие: Вычисляется перед каждой итерацией. Если условие истинно (true), тело цикла выполняется. Если ложно (false) — цикл завершается.
  • Обновление: Выполняется после каждой итерации. Здесь обычно изменяется значение счетчика (например, увеличивается на 1).

Разберем на примере: Вывод чисел от 1 до 5

-2

Как это работает:

  1. Инициализация: int i = 1. Создается переменная i со значением 1.
  2. Проверка условия: i <= 5. 1 <= 5 — истина. Входим в тело цикла.
  3. Тело цикла: Выполняется cout << "Число: " << i << endl;. На экране появляется "Число: 1".
  4. Обновление: Выполняется i++. Теперь i = 2.
  5. Снова проверка условия: 2 <= 5 — истина. Входим в тело цикла. Выводится "Число: 2".
  6. Этот процесс повторяется, пока i не станет равным 6.
  7. Проверка условия: 6 <= 5 — ложь. Цикл завершается.

Результат:

Число: 1
Число: 2
Число: 3
Число: 4
Число: 5

Вариации цикла for

  • Обратный счет:
-3

Изменение шага:

-4

Цикл с несколькими счетчиками:

-5

Глава 2: Цикл while — гибкий и универсальный

Цикл while используется, когда количество итераций заранее неизвестно и полностью зависит от выполнения какого-либо условия. Например, "пока пользователь вводит неверные данные, повторять запрос".

Синтаксис:

-6

Условие проверяется перед каждой итерацией. Если оно истинно, выполняется тело цикла.

Разберем на примере: Ожидание правильного ввода от пользователя

-7

Как это работает:

  1. Программа просит ввести число.
  2. Проверяется условие в while: number <= 0.
    Если пользователь ввел, скажем, -5, условие истинно. Программа заходит в тело цикла и просит ввести число снова.
    Этот процесс повторяется, пока пользователь не введет, например, 10.
  3. Условие 10 <= 0 — ложно. Цикл завершается, и программа выводит благодарность.

Важный нюанс: Бесконечный цикл

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

-8

Бесконечные циклы полезны в редких случаях (например, для серверов, которые должны работать постоянно), но чаще это ошибка. Чтобы избежать ее, убедитесь, что в теле цикла есть код, который может изменить переменную из условия.

Глава 3: Ключевые операторы break и continue

Эти операторы позволяют гибко управлять ходом выполнения цикла.

  • break — немедленно завершает выполнение всего цикла.
  • continue — немедленно завершает текущую итерацию и переходит к следующей (к проверке условия в while или к шагу обновления в for).

Пример с break (поиск числа):

-9

Пример с continue (вывод только четных чисел):

-10

Практическая часть: Задачи для закрепления

Уровень 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++