Циклы (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
}

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