Циклы (for и while)

Во многих задачах нужно повторять одно и то же действие много раз:
перебрать числа от 1 до 100, прочитать N значений, посчитать сумму, найти максимум и т.п.

Для этого в Java есть циклы. В базовых задачах почти всегда хватает двух:

  • while — повторять, пока условие истинно;
  • for — повторять фиксированное количество раз (обычно по счётчику.
for (int i = 0; i < 10; i++) {
    System.out.println(i);
}

Основное

Две основные формы цикла:

while (условие) {
    // тело цикла
}
for (инициализация; условие; изменение) {
    // тело цикла
}

Чаще всего:

  • for — когда заранее известно количество повторений (например, ровно N чисел);
  • while — когда повторяем «пока выполняется условие» (например, пока не встретили конец ввода или специальный знак).

Цикл while

Цикл while повторяет блок кода, пока условие истинно.

int x = 5;

while (x > 0) {
    System.out.println(x);
    x = x - 1;
}

System.out.println("Старт!");

Порядок работы:

  1. проверяется условие x > 0;
  2. если условие истинно — выполняется тело цикла;
  3. после тела снова проверяется условие, и так далее;
  4. если условие стало ложным — цикл заканчивается.

Важно, чтобы внутри цикла что‑то менялось, иначе можно получить бесконечный цикл.

Цикл for

Цикл for удобно использовать, когда нужно пройти по диапазону чисел.

for (int i = 0; i < 5; i++) {
    System.out.println(i);
}

Здесь:

  • int i = 0 — начальное значение счётчика;
  • i < 5 — условие продолжения цикла;
  • i++ — изменение счётчика после каждой итерации (то же, что i = i + 1).

В результате будут выведены числа 0, 1, 2, 3, 4.

Другой частый вариант — от 1 до N включительно:

int n = in.nextInt();

for (int i = 1; i <= n; i++) {
    System.out.println(i);
}

Здесь условие i <= n, поэтому последнее число — n.

Сумма и количество

Частый шаблон: прочитать N чисел и посчитать их сумму.

int n = in.nextInt();
int sum = 0;

for (int i = 0; i < n; i++) {
    int x = in.nextInt();
    sum = sum + x;    // или sum += x;
}

System.out.println(sum);

Здесь цикл for повторяется ровно n раз, каждый раз читается одно число.

Похожий шаблон для подсчёта количества:

int n = in.nextInt();
int countPositive = 0;

for (int i = 0; i < n; i++) {
    int x = in.nextInt();
    if (x > 0) {
        countPositive++;
    }
}

System.out.println(countPositive);

Минимум и максимум в последовательности

Ещё один стандартный приём — найти минимальное и максимальное значение.

int n = in.nextInt();

int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;

for (int i = 0; i < n; i++) {
    int x = in.nextInt();

    if (x < min) {
        min = x;
    }
    if (x > max) {
        max = x;
    }
}

System.out.println("min = " + min);
System.out.println("max = " + max);

Этот шаблон часто используется и для массивов.

Цикл while до конца ввода

Иногда заранее неизвестно, сколько чисел будет во входе. Тогда удобно использовать while с проверкой наличия следующего числа:

int sum = 0;

while (in.hasNextInt()) {
    int x = in.nextInt();
    sum = sum + x;
}

System.out.println(sum);

Цикл будет читать числа, пока во входе есть очередное целое (hasNextInt() возвращает true).
Когда числа закончатся, hasNextInt() даст false, и цикл завершится.

Что нужно запомнить

Цикл while повторяет тело, пока условие истинно:

while (условие) {
    // действия
}

Цикл for чаще всего используют для прохода по диапазону значений счётчику:

for (int i = 0; i < n; i++) {
    // действия с i
}

Для типичных задач по входным данным полезно запомнить шаблоны: сумма, количество, минимум/максимум и чтение до конца ввода.

В C++ основные циклы такие же: while и for.

  • while — выполнять, пока условие истинно.
  • for — выполнять по счётчику (обычно, когда заранее понятно количество повторений).
for (int i = 0; i < 10; i++) {
    std::cout << i << "\n";
}

Форма while

while (condition) {
    // тело цикла
}

Форма for

for (init; condition; step) {
    // тело цикла
}

Пример: отсчёт назад

int x = 5;

while (x > 0) {
    std::cout << x << "\n";
    x = x - 1;
}

std::cout << "Старт!\n";

Пример: сумма N чисел

int n;
std::cin >> n;

long long sum = 0;

for (int i = 0; i < n; i++) {
    int x;
    std::cin >> x;
    sum += x;
}

std::cout << sum << "\n";

Пример: чтение до конца ввода

long long sum = 0;
int x;

while (std::cin >> x) {
    sum += x;
}

std::cout << sum << "\n";

В Python есть while и for, но for чаще используют для прохода по диапазону или по элементам.

  • while — выполнять, пока условие истинно.
  • for — пройти по последовательности (например, по range(...)).
for i in range(10):
    print(i)

Форма while

while condition:
    # тело цикла

Форма for по range

for i in range(start, stop, step):
    # stop не включается

Пример: отсчёт назад

x = 5

while x > 0:
    print(x)
    x = x - 1

print("Старт!")

Пример: сумма N чисел

n = int(input())
s = 0

for _ in range(n):
    x = int(input())
    s += x

print(s)

Пример: чтение до конца ввода

import sys

s = 0

for token in sys.stdin.read().split():
    s += int(token)

print(s)

Запись цикла for

В Java и C++ for состоит из трёх частей: инициализация, условие, шаг. В Python for обычно проходит по range(...) или по элементам, а шаг и границы задаются в range.

Границы диапазона

Java/C++ часто пишут i < n, и тогда значения идут 0, 1, ..., n-1. В Python это ровно так же работает с range(n).

Скобки и отступы

В Java и C++ тело цикла обычно выделяют фигурными скобками { ... }. В Python тело цикла задаётся отступами.