Цикл do-while

🔥 🚀 Важно для всех, кто работает с Java! 🔥
На JavaRocks ты найдешь уникальные туториалы, практические задачи и редкие книги, которых не найти в свободном доступе. Присоединяйся к нашему Telegram-каналу JavaRocks — стань частью профессионального сообщества!

Сегодня мы рассмотрим, как работает цикл do-while в Java.

Что такое цикл do-while?

Иногда бывает необходимо запустить какой-то код хотя бы один раз без всяких предварительных условий, «но» и «если». Например, при создании интерактивного меню в интерфейсе важно учитывать, что пользователь сначала должен увидеть предлагаемые варианты, а потом ввести свои данные (наглядный пример: когда мы подходим к банкомату, чтобы снять деньги, нам предлагаются различные опции; только выбрав одну из них, мы можем ввести нужную сумму). Другой пример – когда нам нужно получить корректный ввод, но проверить его можно только после того, как пользователь введет данные. В подобных ситуациях на помощь приходят циклы do-while.

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

Используя цикл do-while, мы как бы говорим: «сделай это хотя бы один раз, а затем продолжай делать, пока заданное условие остается истинным».

Синтаксис

Вот как это выглядит:

do {
    // Место для ваших фантазий
} while (condition);
Run Code

Обратите внимание на точку с запятой в конце: её нельзя пропускать! С её помощью вы как бы даете понять, что закончили.

Что происходит:

  • Сначала выполняется код внутри { }.
  • Затем происходит проверка условия.
  • Цикл повторяется, если условие истинно.
  • Если условие ложно, мы выходим из цикла.

Простой пример:

int count = 1;
do {
    System.out.println("Count's at: " + count);
    count++;
} while (count <= 5);
Run Code

На выводе получим:

Count's at: 1
Count's at: 2
Count's at: 3
Count's at: 4
Count's at: 5

Даже если изначально count = 10, код все равно выполнится один раз:

int count = 10;
do {
    System.out.println("Count's at: " + count);
    count++;
} while (count <= 5);
Run Code

Вывод:

Count's at: 10

Блок-схема, позволяющая наглядно продемонстрировать работу цикла do-while, выглядит так:

Start → Run the code → Check condition? → Yes → Back to run code
No
                         Exit
Run Code

Наглядный пример

Изучим такой код для работы с числами:

int number = 1;
do {
    System.out.println("Number's at: " + number);
    number *= 2;
} while (number < 20);
Run Code

Пройдемся по нему, как будто вместе занимаемся отладкой:

Номер циклаЧисло доВыводЧисло послеЧисло < 20?Следующий ход
11Выводит “Number’s at: 1”, удваивает его2Да (2 < 20)Продолжить
22Выводит “Number’s at: 2”, удваивает его4Да (4 < 20)Продолжить
34Выводит “Number’s at: 4”, удваивает его8Да (8 < 20)Продолжить
48Выводит “Number’s at: 8”, удваивает его16Да (16 < 20)Продолжить
516Выводит “Number’s at: 16”, удваивает его32Нет (32 < 20)Остановиться

Вывод:

Number's at: 1
Number's at: 2
Number's at: 4
Number's at: 8
Number's at: 16

Пример проверки достоверности пользовательского ввода

Цикл do-while очень удобен, например, когда нужно вежливо, но настойчиво требовать корректный ввод:

import java.util.Scanner;

public class InputCheck {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int userNumber;

        do {
            System.out.print("Gimme a positive number: ");
            userNumber = scanner.nextInt();
            if (userNumber <= 0) {
                System.out.println("C'mon, that's not positive. Try again!");
            }
        } while (userNumber <= 0);

        System.out.println("Sweet! You gave me: " + userNumber);
        scanner.close();
    }
}
Run Code

Сравнение циклов do-while и while

Синтаксис

Цикл while выглядит так:

while (condition) {
    // Stuff happens here
}
Run Code

А цикл do-while – так:

do {
    // Stuff happens here
} while (condition);
Run Code

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

Когда использовать какой?

  • Цикл while можно использовать, когда вам даже не нужно запускать код: например, для проверки наличия файла перед его чтением.
  • Цикл do-while лучше применять, когда необходимо выполнить код один раз: например, показать меню, прежде чем спросить, чего хочет пользователь.

Наглядное сравнение:

int i = 10;
System.out.println("With while:");
while (i < 5) {
    System.out.println("i is: " + i);
    i++;
}

i = 10;
System.out.println("\nWith do-while:");
do {
    System.out.println("i is: " + i);
    i++;
} while (i < 5);
Run Code

Выводы соответственно:

With while:

With do-while:
i is: 10

Два способа решения одной задачи

Задача довольно классическая: пользователю предстоит выбрать и ввести число от 1 до 10.

При использовании цикла while код будет выглядеть так:

import java.util.Scanner;

public class WhileWay {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int number = 0;

        System.out.print("Pick a number 1-10: ");
        number = scanner.nextInt();

        while (number < 1 || number > 10) {
            System.out.println("Nope, that's off!");
            System.out.print("Try again (1-10): ");
            number = scanner.nextInt();
        }

        System.out.println("Nice one! You picked: " + number);
        scanner.close();
    }
}
Run Code

А при использовании цикла do-while – так:

import java.util.Scanner;

public class DoWhileWay {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int number;

        do {
            System.out.print("Pick a number 1-10: ");
            number = scanner.nextInt();
            if (number < 1 || number > 10) {
                System.out.println("Hey, stick to the rules!");
            }
        } while (number < 1 || number > 10);

        System.out.println("Awesome! You picked: " + number);
        scanner.close();
    }
}
Run Code

Цикл do-while работает более “гладко” – в коде нет повторяющихся запросов за пределами цикла.

Несколько полезных примеров

1. Упорядоченное меню

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

import java.util.Scanner;

public class ShopMenu {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int choice;

        do {
            System.out.println("\n=== Shop Menu ===");
            System.out.println("1. Check Stock");
            System.out.println("2. Add Item");
            System.out.println("3. Update Item");
            System.out.println("4. Remove Item");
            System.out.println("5. Quit");
            System.out.print("What's your pick (1-5)? ");

            choice = scanner.nextInt();

            switch (choice) {
                case 1: System.out.println("Checking stock..."); break;
                case 2: System.out.println("Adding item..."); break;
                case 3: System.out.println("Updating item..."); break;
                case 4: System.out.println("Removing item..."); break;
                case 5: System.out.println("See ya!"); break;
                default: System.out.println("Huh? Try again.");
            }
        } while (choice != 5);

        scanner.close();
    }
}
Run Code

2. Повторные попытки подключения к сети

Вам когда-нибудь приходилось пинговать сервер, который работает нестабильно? Вот как можно было бы реализовать повторные попытки:

import java.io.IOException;
import java.net.Socket;

public class NetworkPing {
    public static void main(String[] args) {
        String host = "example.com";
        int port = 80;
        int tries = 0;
        int maxTries = 5;
        boolean connected = false;

        do {
            System.out.println("Trying " + host + ":" + port + " (Try " + (tries + 1) + " of " + maxTries + ")");
            try {
                Socket socket = new Socket(host, port);
                connected = true;
                System.out.println("Got it!");
                socket.close();
            } catch (IOException e) {
                System.out.println("No dice: " + e.getMessage());
                tries++;
                try {
                    Thread.sleep(1000); // Chill for a sec
                } catch (InterruptedException ie) {
                    Thread.currentThread().interrupt();
                }
            }
        } while (!connected && tries < maxTries);

        if (!connected) {
            System.out.println("Couldn't connect after " + maxTries + " shots.");
        }
    }
}
Run Code

Распространенные ошибки и советы по отладке

1. Пропущенная точка с запятой

// Неверно
do {
    System.out.println("This flops");
} while (true)  // Отсутствие точки с запятой - большая ошибка!

// Верно
do {
    System.out.println("This works");
} while (true);  // Всё супер!
Run Code

2. Бесконечные циклы

int count = 1;
do {
    System.out.println("Count's: " + count);
    // Здесь мы кое-что забыли
} while (count < 10);
Run Code

Нам нужен “сдвиг”, чтобы счетчик увеличивался:

int count = 1;
do {
    System.out.println("Count's: " + count);
    count++;
} while (count < 10);
Run Code

3. Перелет на единицу

int i = 1;
do {
    System.out.println(i);
    i++;
} while (i <= 10);  // Цикл выполнится на 1 итерацию больше, код выведет 11 элементов

// Исправим:
int i = 1;
do {
    System.out.println(i);
    i++; 
} while (i < 11); // Теперь количество итераций - 10
Run Code

Лайфхаки для отладки

Если код ведет себя странно:

  • Используйте System.out.println("count = " + count); для того, чтобы отслеживать переменные.
  • Используйте отладчик в вашей IDE для пошагового выполнения.
  • Добавьте счётчик-ограничитель, чтобы предотвратить бесконечный цикл:
int tries = 0;
do {
    // Код
    tries++;
    if (tries > 1000) {
        System.out.println("Whoa, too many loops!");
        break;
    }
} while (condition);
Run Code

Задача для читателей

Создайте игру, в которой:

  • Компьютер выбирает случайное число (1-100).
  • Попробуйте его угадать.
  • Каждый раз компьютер будет вам сообщать, загаданное число больше или меньше.

Вот как вы можете начать:

import java.util.Scanner;
import java.util.Random;

public class GuessGame {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Random random = new Random();

        int secret = random.nextInt(100) + 1;
        int guess;
        int tries = 0;

        System.out.println("I've got a number between 1 and 100. Guess it!");
        // Добавьте ваш код

        scanner.close();
    }
}
Run Code

Вариант решения

import java.util.Scanner;
import java.util.Random;

public class GuessGameSolution {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Random random = new Random();

        int secret = random.nextInt(100) + 1;
        int guess;
        int tries = 0;

        System.out.println("I've got a number between 1 and 100. Guess it!");

        do {
            System.out.print("Your guess: ");
            guess = scanner.nextInt();
            tries++;

            if (guess < secret) {
                System.out.println("Go higher!");
            } else if (guess > secret) {
                System.out.println("Go lower!");
            } else {
                System.out.println("You nailed it in " + tries + " tries!");
            }
        } while (guess != secret);

        scanner.close();
    }
}
Run Code

Заключение

Цикл do-while — это важная конструкция в Java, которая гарантирует хотя бы одно выполнение блока кода перед проверкой условия. Это идеальный выбор для разработки меню в пользовательском интерфейсе, проверки пользовательского ввода и в целом ситуаций, когда действие должно выполниться до проверки условия.

В отличие от обычного while, который может не выполниться ни разу (если условие изначально ложно), do-while всегда запускается как минимум один раз. Эта особенность часто делает код чище и понятнее.

Помните о ключевых моментах:

  • Используйте do-while, когда нужно хотя бы одно выполнение.
  • Не забывайте про точку с запятой.
  • Контролируйте переменные цикла, чтобы избежать бесконечного выполнения.
  • Следите за граничными условиями, чтобы количество итераций соответствовало ожидаемому.

Перевод статьи «Java Do While Loop».

Может пригодиться: «Цикл for в Java»

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх