| Программирование на языке Java |
| Циклы |
| Любой цикл можно разделить на 4 части — инициализацию, тело, итерацию и условие завершения. В Java есть три циклические конструкции: while (с пред-условием), do-while (с пост-условием) и for (с параметром). while Этот цикл многократно выполняется до тех пор, пока значение логического выражения равно true. Ниже приведена общая форма оператора while: [ инициализация; ] while ( завершение ) { тело; [итерация;] } Инициализация и итерация необязательны. Ниже приведен пример цикла while для печати десяти строк «tick». class WhileDemo { public static void main(String args[]) { int n = 10; while (n > 0) { System.out.println("tick " n); n—; } } } do-while Иногда возникает потребность выполнить тело цикла по крайней мере один раз — даже в том случае, когда логическое выражение с самого начала принимает значение false. Для таких случаев в Java используется циклическая конструкция do-while. Ее общая форма записи такова: [ инициализация; ] do { тело; [итерация;] } while ( завершение ); В следующем примере тело цикла выполняется до первой проверки условия завершения. Это позволяет совместить код итерации с условием завершения: class DoWhile { public static void main(String args[]) { int n = 10; do { System.out.println("tick " n); } while (—n > 0); } } for В этом операторе предусмотрены места для всех четырех частей цикла. Ниже приведена общая форма оператора записи for. for ( инициализация; завершение; итерация ) тело; Любой цикл, записанный с помощью оператора for, можно записать в виде цикла while, и наоборот. Если начальные условия таковы, что при входе в цикл условие завершения не выполнено, то операторы тела и итерации не выполняются ни одного раза. В каноническая форме цикла for происходит увеличение целого значения счетчика с минимального значения до определенного предела. class ForDemo { public static void main(String args[]) { for (int i = 1; i <= 10; System.out.println("i = " i); } }Следующий пример — вариант программы, ведущей обратный отсчет. class ForTick { public static void main(String args[]) { for (int n = 10; n > 0; n—) System.out.println("tick " n); } } Обратите внимание — переменные можно объявлять внутри раздела инициализации оператора for. Переменная, объявленная внутри оператора for, действует в пределах этого оператора. А вот — новая версия примера с временами года, в которой используется оператор for. class Months { static String months[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; static int monthdays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; static String spring = "spring"; static String summer = "summer"; static String autumn = "autumn"; static String winter = "winter"; static String seasons[] = { winter, winter, spring, spring, spring, summer, summer, summer, autumn, autumn, autumn, winter }; public static void main(String args[]) { for (int month = 0; month < 12; month ) { System.out.println(months[month] " is a " seasons[month] " month with " monthdays[month] " days."); } } } При выполнении эта программа выводит следующие строки: С:\> Java Months January is a winter month with 31 days. February is a winter month with 28 days. March is a spring month with 31 days. April is a spring month with 30 days. May is a spring month with 31 days. June is a summer month with 30 days. July is a summer month with 31 days. August is a summer month with 31 days. September is a autumn month with 30 days. October is a autumn month with 31 days. November is a autumn month with 30 days. December a winter month with 31 days. Оператор запятая Иногда возникают ситуации, когда разделы инициализации или итерации цикла for требуют нескольких операторов. Поскольку составной оператор в фигурных скобках в заголовок цикла for вставлять нельзя, Java предоставляет альтернативный путь. Применение запятой (,) для разделения нескольких операторов допускается только внутри круглых скобок оператора for. Ниже приведен тривиальный пример цикла for, в котором в разделах инициализации и итерации стоит несколько операторов.class Comma { public static void main(String args[]) { int a, b; for (a = 1, b = 4; a < b; a , b—) { System.out.println("a = " a); System.out.println("b = " b); } } } Вывод этой программы показывает, что цикл выполняется всего два раза. С: \> java Comma а = 1 b = 4 а = 2 b = 3 continue В некоторых ситуациях возникает потребность досрочно перейти к выполнению следующей итерации, проигнорировав часть операторов тела цикла, еще не выполненных в текущей итерации. Для этой цели в Java предусмотрен оператор continue. Ниже приведен пример, в котором оператор continue используется для того, чтобы в каждой строке печатались два числа. class ContinueDemo { public static void main(String args[]) { for (int i=0; i < 10; i ) { System.out.print(i " "); if (i % 2 == 0) continue; System.out.println(""); } }} Если индекс четный, цикл продолжается без вывода символа новой строки. Результат выполнения этой программы таков: С: \> java ContinueDemo 0 1 2 3 5 7 8 9 Как и в случае оператора break, в операторе continue можно задавать метку, указывающую, в каком вложенных циклов вы хотите досрочно прекратить выполнение текущей итерации. Для иллюстрац служит программа, использующая оператор continue с меткой для вывода треугольной таблицы умножения для чисел от 0 до 9: class ContinueLabel { public static void main(String args[]) { outer: for (int i=0; i < 10; i ) { for (int j = 0; j< 10; { if (j > i) { System.out.println(""); continue outer; System.out.print(" " (i * j)); } } }} Оператор continue в этой программе приводит к завершению внутреннего цикла со счетчиком j и переходу к очередной итерации внешнего цикла со счетчиком i. В процессе работы эта программа выводит следующие строки: С:\> Java ContinueLabel 0 0 1 0 2 4 0 3 6 9 0 4 8 12 16 0 5 10 15 20 25 0 6 12 18 24 30 36 0 7 14 21 28 35 42 49 0 8 16 24 32 40 48 56 64 0 9 18 27 36 45 54 63 72 81 |
