☕ Java

Цикл while и do-while в Java 17: подробное руководство

Цикл while и do-while в Java

Что такое цикл и зачем он нужен?

Представь, что ты даёшь роботу команду: «Шагай вперёд, пока не дойдёшь до стены». Робот делает шаг, проверяет, есть ли стена. Если стены нет — делает ещё шаг. И так снова и снова, пока условие не выполнится. Это и есть цикл — повторение одного и того же действия до тех пор, пока верно (истинно) некоторое условие.

В Java есть два похожих цикла: while и do-while. Они помогают автоматизировать повторяющиеся задачи, когда мы заранее не знаем, сколько раз нужно повторить действие.

Цикл while: «Сначала проверь, потом делай»

Синтаксис цикла while очень простой:

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

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

  1. Проверяется условие в круглых скобках.
  2. Если условие истинно (true), выполняется тело цикла (код в фигурных скобках).
  3. После выполнения тела снова проверяется условие.
  4. Если условие стало ложным (false), цикл завершается.

Важно: Если условие сразу ложное, тело цикла не выполнится ни разу!

Пример 1. Выведем числа от 1 до 5:

int count = 1;
while (count <= 5) {
    System.out.println("Число: " + count);
    count++; // увеличиваем счётчик на 1
}

Вывод:

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

Пример 2. Считываем числа с клавиатуры, пока не введём 0:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int number = -1; // любое число, кроме 0
        
        while (number != 0) {
            System.out.print("Введи число (0 для выхода): ");
            number = scanner.nextInt();
            System.out.println("Ты ввёл: " + number);
        }
        System.out.println("Цикл завершён!");
    }
}

Ввод-вывод:

Введи число (0 для выхода): 7
Ты ввёл: 7
Введи число (0 для выхода): 3
Ты ввёл: 3
Введи число (0 для выхода): 0
Ты ввёл: 0
Цикл завершён!

Цикл do-while: «Сначала сделай, потом проверь»

Цикл do-while — младший брат while. Отличие в том, что тело цикла выполняется хотя бы один раз, а условие проверяется после выполнения.

Синтаксис:

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

Обрати внимание на точку с запятой в конце!

Пример 3. Игра «Угадай число» (робот загадал число 7, ты угадываешь):

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int secret = 7;
        int guess;
        
        do {
            System.out.print("Угадай число (от 1 до 10): ");
            guess = scanner.nextInt();
            if (guess != secret) {
                System.out.println("Не угадал! Попробуй ещё.");
            }
        } while (guess != secret);
        
        System.out.println("Поздравляю! Ты угадал!");
    }
}

Ввод-вывод:

Угадай число (от 1 до 10): 3
Не угадал! Попробуй ещё.
Угадай число (от 1 до 10): 7
Поздравляю! Ты угадал!

Разбор типичных задач

Задача «Робот-шахтёр»

Робот собирает кристаллы, пока энергия в сумке не станет 100 или больше. Каждый кристалл даёт разное количество энергии.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int energy = 0;
        
        while (energy < 100) {
            System.out.print("Сколько энергии даёт кристалл? ");
            int crystal = scanner.nextInt();
            energy = energy + crystal;
            System.out.println("Энергия в сумке: " + energy);
        }
        
        System.out.println("Сумка полна! Энергия: " + energy);
    }
}

Задача «Юный садовод»

Алекс посадил росток высотой 5 см. Каждый день росток увеличивается в 2 раза. Нужно узнать, через сколько дней он достигнет высоты 80 см.

public class Main {
    public static void main(String[] args) {
        int height = 5;
        int target = 80;
        int days = 0;
        
        while (height < target) {
            height = height * 2;
            days++;
            System.out.println("День " + days + ": высота " + height + " см");
        }
        
        System.out.println("Росток достиг высоты " + target + " см за " + days + " дней");
    }
}

Вывод:

День 1: высота 10 см
День 2: высота 20 см
День 3: высота 40 см
День 4: высота 80 см
Росток достиг высоты 80 см за 4 дней

Задача «Обратный отсчёт»

Доктор Вэнс запускает машину времени с координаты n и уменьшает её на 1 каждый шаг, пока не дойдёт до 0.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Введи начальную координату: ");
        int n = scanner.nextInt();
        
        while (n >= 0) {
            System.out.println("Текущая координата: " + n);
            n--;
        }
        
        System.out.println("Машина остановилась!");
    }
}

Ввод-вывод (n = 3):

Введи начальную координату: 3
Текущая координата: 3
Текущая координата: 2
Текущая координата: 1
Текущая координата: 0
Машина остановилась!

Частые ошибки новичков

  • Бесконечный цикл. Если забыть изменить переменную в условии, цикл будет выполняться вечно. Например:
    int i = 0;
    while (i < 5) {
        System.out.println("Привет!");
        // забыли i++ — программа зависнет
    }
  • Путаница while и do-while. Если нужно, чтобы действие выполнилось хотя бы один раз (например, меню с выбором), используй do-while. Если действие может не выполниться ни разу — используй while.
  • Забытая точка с запятой после do-while. В while точки с запятой нет, а в do-while — есть!
  • Условие, которое никогда не станет ложным. Например, если ты проверяешь while (x != 0), но x всегда положительное и никогда не становится 0.

Итоговый пример: «Волшебная экспедиция»

Юный исследователь нашёл Артефакт Силы. Артефакт начинает светиться с силой 1. Каждую секунду его сила удваивается, но если сила превышает 1000, артефакт перегревается и отключается. Нужно вывести силу артефакта каждую секунду, пока он работает.

public class Main {
    public static void main(String[] args) {
        int power = 1;
        int second = 1;
        
        System.out.println("Артефакт активирован!");
        
        while (power <= 1000) {
            System.out.println("Секунда " + second + ": сила " + power);
            power = power * 2;
            second++;
        }
        
        System.out.println("Артефакт перегрелся и отключился!");
        System.out.println("Максимальная сила: " + power);
    }
}

Вывод:

Артефакт активирован!
Секунда 1: сила 1
Секунда 2: сила 2
Секунда 3: сила 4
Секунда 4: сила 8
Секунда 5: сила 16
Секунда 6: сила 32
Секунда 7: сила 64
Секунда 8: сила 128
Секунда 9: сила 256
Секунда 10: сила 512
Секунда 11: сила 1024
Артефакт перегрелся и отключился!
Максимальная сила: 2048

Запомни главное: while проверяет условие перед выполнением, do-while — после. Оба цикла повторяют действия, пока условие истинно. Используй их, когда не знаешь точное количество повторений!