Рассмотрим 2 цикла: do-while и for.
Скачать исходники для статьи можно ниже
Цикл do-while
Цикл do-while всегда выполняет свое тело по крайней мере один раз, потому что его условное выражение размещается в конце цикла. Общая форма цикла:
do { // тело цикла } while (condition);
Каждая итерация цикла do-while сначала выполняет тело цикла, а затем оценивает условное выражение. Если это выражение — true, цикл повторится. Иначе цикл заканчивается. Как и у всех Java-циклов, condition должно быть булевским выражением.
Ниже показана программы с “тиками”, которая демонстрирует цикл do-while.
// Демонстрирует do-while цикл. public class DoWhile { public static void main(String[] args) { int n = 10; do { System.out.println("тик " + n); n - -; } while (n > 0); } }
Вывод программы:
тик 10
тик 9
тик 8
тик 7
тик 6
тик 5
тик 4
тик 3
тик 2
тик 1
Цикл, for
Общая форма цикла for:
for (initialization; condition; iteration) statement;
Если повторяется только один оператор, фигурные скобки не нужны.
Цикл for работает следующим образом. В начале работы цикла выполняется выражение initialization. В общем случае это выражение устанавливает значение переменной управления циклом, которая действует как счетчик. Важно понять, что выражение инициализации выполняется только один раз. Затем оценивается condition. Оно должно быть булевским выражением и обычно сравнивает переменную управления циклом с некоторым граничным значением. Если это выражение — true, то отрабатывают операторы из тела цикла, если — false, цикл заканчивается. Далее выполняется часть цикла iteration. Обычно это выражение, которое осуществляет инкрементные или декрементные операции с переменной управления циклом. Затем цикл реализовывает итерации. В каждом проходе цикла — сначала оценивается условное выражение, потом выполняется тело цикла и затем — выражение iteration. Этот процесс повторяется до тех пор, пока управляющее выражение не станет false.
Ниже приводится программа вывода “тиков”, которая использует цикл for:
// Демонстрирует for-цикл. public class ForTick { public static void main(String[] args) { int n; for (n = 10; n > 0; n - -) { System.out.println("тик " + n); } } }
Вывод программы:
тик 10
тик 9
тик 8
тик 7
тик 6
тик 5
тик 4
тик 3
тик 2
тик 1
Объявление переменных управления внутри цикла for.
Часто переменная, которая управляет циклом for, необходима только для целей цикла и не используется в другом месте. Когда дело обстоит так, можно объявить переменную внутри инициализационной части for. Например, предшествующая программа перекодирована так, чтобы переменная управления циклом n объявлялась типом int внутри заголовка for:
// Определение переменной управления циклом внутри for. public class ForTick { public static void main(String[] args) { // здесь n объявлена внутри заголовка for-цикла for (int n = 10; n > 0; n - -) { System.out.println("тик " + n); } } }
Когда переменная объявляется внутри заголовка for-цикла, важно помнить, что область ее действия заканчивается там же, где и у for-оператора (т. е. область действия переменной ограничена циклом for). Вне цикла for переменная прекратит существование. Если нужно использовать управляющую переменную цикла в другом месте программы, ее не следует объявлять внутри цикла for.
Когда управляющая переменная цикла не нужна где-то в другом месте, большинство Java-программистов объявляет ее внутри for-заголовка. Ниже показана небольшая программа, которая проверяет, является ли число простым (Простым называется число, которое делится только на собственное значение и на 1 (например, простыми являются числа 1, 2, 3, 5, 7, 11, 13 и т. д.). Обратите внимание, что управляющая переменная цикла i объявлена внутри for-заголовка, т. к. она нигде больше не нужна.
// Проверка на принадлежность к категории простых чисел. public class FindPrim { public static void main(String[] args) { { int num; boolean isPrime = true; num = 14; for (int i = 2; i < num / 2; i++) { if ((num % i) == 0) { isPrime = false; break; } } if (isPrime) { System.out.println("Простое число"); } else { System.out.println("Число не является простым"); } } } }
Использование запятой
Может возникнуть желание включить более одного оператора в инициализационную и итерационную части цикла for. Например, рассмотрим цикл следующей программы:
public class Sample { public static void main(String[] args) { int a, b; b = 4; for (a = 1; a < b; a++) { System.out.println("a = " + a); System.out.println("b = " + b); b - -; } } }
He трудно заметить, что цикл зависит от взаимодействия двух переменных. Так как цикл управляется двумя переменными, было бы полезно включить их непосредственно в заголовок оператора for вместо того, чтобы обрабатывать переменную вручную. К счастью, в Java обеспечена такая возможность. Чтобы позволить двум или большему числу переменных управлять циклом for, Java разрешает вам включать множественные операторы как в инициализационную, так и в итерационную части for-заголовка. Каждый оператор отделяется от следующего запятой.
Используя запятую, предыдущий цикл for можно закодировать более эффективно:
// Использование запятой. public class Comma { public static void main(String[] args) { int a, b; for (a = 1, b = 4; a < b; a++, b - -) { System.out.println("а = " + a); System.out.println("b = " + b); } } }
В этом примере инициализационная часть устанавливает значения как для а, так и для b. Два разделенных запятыми оператора в итерационной части выполняются каждый раз, когда цикл повторяется. Программа генерирует следующий вывод:
а = 1
b = 4
а = 2
b = 3
Замечание. В Java запятая — это разделитель, который применяется только в цикле for.
Подобно всем другим языкам программирования Java допускает вложение циклов. То есть один цикл может быть внутри другого. Например, следующая программа вкладывает for-циклы:
// Циклы могут быть вложенными. public class Nested { public static void main(String[] args) { int i, j; for (i = 0; i < 5; i++) { for (j = i; j < 5; j++) { System.out.print("."); } System.out.println(); } } }
Вывод этой программы:
…..
….
…
..
.
Приведем более внятный пример этой программы:
public class NestedArray { public static void main(String[] args) { int i, j; for (i = 0; i < 5; i++) { for (j = i; j < 5; j++) { System.out.println("i = " + i + ",j = " + j); } } } }
Вывод этой программы
i = 0,j = 0
i = 0,j = 1
i = 0,j = 2
i = 0,j = 3
i = 0,j = 4
i = 1,j = 1
i = 1,j = 2
i = 1,j = 3
i = 1,j = 4
i = 2,j = 2
i = 2,j = 3
i = 2,j = 4
i = 3,j = 3
i = 3,j = 4
i = 4,j = 4
В этом примере более наглядно видно, что на каждый вывод i, приходится 5 выводов j.