Цикл do-while

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

do { // тело цикла
} while {условие);

При каждом повторении цикла do-while программа вначале выполняет тело цикла, а затем вычисляет условное выражение. Если это выражение истинно, цикл повторяется. В противном случае выполнение цикла прерывается. Как и во всех циклах Java, выражение должно быть булевским.

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

// Демонстрация использования цикла do-while.
class DoWhile {
public static void main(String args[]) {
int n = 10;
do {
System.out.println("такт " + n);
n—;
} while(n > 0) ;
}
}

Хотя с технической точки зрения в приведенной программе цикл записан правильно, его можно переписать в более эффективном виде:

do {
System.out.println("такт " + n) ;
} while(—n > 0);

В этом примере операции декремента переменной п и сравнения результирующего значения с нулем объединены в одном выражении (—n>0). Программа работает следующим образом. Вначале она выполняет оператор —n, уменьшая значение n на единицу и возвращая новое значение переменной n. Затем программа^ сравнивает это значение с нулем. Если оно больше нуля, выполнение цикла продолжается. В противном случае цикл прерывается.

Цикл do-while особенно удобен при выборе пункта меню, поскольку обычно в этом случае требуется, чтобы тело цикла меню выполнялось, по меньшей мере, один раз. Рассмотрим следующую программу, которая реализует очень простую систему справки по операторам выбора и цикла Java:

// Использование цикла do-while для выбора пункта меню.
class Menu {
public static void main(String args[])
throws java.io.IOException {
char choice;
do {
System.out.println("Справка no:");
System.out.println(" 1. if");
System.out.println (" 2. switch");
System.out.println (" 3. while");
System.out.println(" 4. do-while");
System.out.println (" 5. for\n");
System.out.println("Выберите интересующий пункт:");
choice = (char) System.in.read();
} while ( choice < '1' || choice > '5');
System.out.println("\n");
switch(choice) {
case '1':
System.out.println("if:\n");
System.out.println("if(условие) оператор;");
System.out.println("else оператор;");
break;
case '2':
System.out.println("switch:\n");
System.out.println("switch(выражение) (") ;
System.out.println(" case константа:");
System.out.println(" последовательность операторов");
System.out.println(" break;");
System.out.println(" // ...");
System.out.println("}");
break;
case '3':
System.out.println("while:\n");
System.out.println("while(условие) оператор;");
break;
case '4':
System.out.println("do-while:\n");
System.out.println("do (");
System.out.println(" оператор;");
System.out.println (" } while (условие);
"); break;
case '5':
System.out.println("for:\n");
System.out.print("for(инициализация; условие; повторение)");
System.out.println (" оператор;");
break;
}
}
}

Пример вывода выполнения этой программы выглядит следующим образом:

Справка по:
1. if
2. switch
3. while
4 . do-while
5. for
Выберите интересующий пункт: 4
do-while: do {
оператор;
} while (условие);

В этой программе в цикле do-while осуществляется проверка допустимости введенного пользователем значения. Если это значение недопустимо, программа предлагает пользователю повторить ввод. Поскольку меню должно отобразиться, по меньшей мере, один раз, цикл do-while является прекрасным средством решения этой задачи.

Отметим еще несколько особенностей приведенного примера. Обратите внимание, что считывание символов с клавиатуры выполняется посредством вызова метода System, in. read (). Это — одна из функций консольного ввода Java. Хотя мы и отложим подробное рассмотрение методов консольного ввода-вывода до главы 13, покамест отметим, что в данном случае метод System, in. read () используется для выяснения выбора, осуществленного пользователем. Этот метод считывает символы из стандартного ввода (возвращаемые в виде целочисленных значений — именно потому тип возвращаемого значения был приведен к char). По умолчанию данные из стандартного ввода помещаются в буфер построчно, поэтому, чтобы любые введенные символы были пересланы программе, необходимо нажать клавишу .

Консольный ввод Java может вызывать некоторые затруднения при работе. Более того, большинство реальных Java-программ будут графическими и ориентированным на работу в оконном режиме. Поэтому в данной книге консольному вводу уделяется не очень много внимания. Однако в данном случае он удобен.