6. ЦИКЛЫ
6. ЦИКЛЫ
Циклами называются конструкции, в которых один и тот же блок программного кода многократно выполняется до тех пор, пока не будет выполнено условие окончания цикла. Любой цикл можно разделить на 4 части: инициализацию, тело, итерацию и условие завершения. Инициализация — это код, определяющий начальные условия цикла. Тело - это оператор, выполнение которого необходимо повторить несколько раз. Итерация - код, который требуется выполнить сразу после очередного выполнения тела. Код итерации часто используется для увеличения (уменьшения) значений счетчиков и индексов. Завершение - это логическое выражение, которое вычисляется на каждом проходе цикла. В зависимости от его значения цикл или завершается или продолжает выполняться. В Java есть три циклические конструкции: while, do-while и for.
6.1. Цикл while
Цикл while - это основная циклическая конструкция в Java. Этот цикл многократно выполняется до тех пор, пока значение логического выражения равно true. Ниже приведена общая форма оператора while:
[ инициализация; ]
while ( завершение) {
тело;
[итерация;]
}
Инициализация и итерация необязательны. Пока значение логического выражения равно true, продолжается выполнение тела цикла. Ниже приведен пример цикла while для печати пяти строк «while».
class WhileDemo {
public static void main(String args[]) {
int n = 5;
while (n > 0) {
System.out.println("while " + n);
n--;
}
}
}
В результате исполнения программы вы получите следующий результат:
while 5
while 4
while 3
while 2
while 1
6.2. Цикл do-while
Иногда возникает потребность выполнить тело цикла по крайней мере один раз, даже в том случае, когда логическое выражение с самого начала принимает значение false. Для таких случаев в Java используется циклическая конструкция do-while. Ее общая форма записи такова:
[ инициализация; ]
do {тело; [итерация;] } while ( завершение);
В следующем примере тело цикла выполняется до первой проверки условия завершения. Это позволяет совместить код итерации с условием завершения:
class Do While {
public static void main(String args[]) {
int n = 5;
do {
System.out.println("do-while " + n);
} while (--n>0);
}
}
6.3. Цикл for
Опреатор for предназначен для компактной записи циклов. В этом операторе предусмотрены места для всех четырех частей цикла. Ниже приведена общая форма оператора записи for:
for (инициализация; завершение; итерация ) тело;
Любой цикл, записанный с помощью оператора for, можно записать в виде цикла while и наоборот. Если начальные условия таковы, что при входе в цикл условие завершения не выполнено, то операторы тела и итерации не выполняются ни одного раза. В канонической форме цикла for происходит увеличение целого значения счетчика с минимального значения до определенного предела.
class ForDemo {
public static void main(String args[]) {
for (int i = 1; i <= 10; i++)
System.out.println("i = " + i);
}
}
Следующий пример — вариант программы, ведущей обратный отсчет.
class ForTick {
public static void main(String args[]) {
for (int n = 10; n > 0; n—)
System.out.println("n= " + n);
}
}
Обратите внимание — переменные можно объявлять внутри раздела инициализации оператора for. Переменная, объявленная внутри оператора for, действует в пределах этого оператора.
6.3.1. Оператор запятая
Иногда возникают ситуации, когда разделы инициализации или итерации цикла 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);
}
}
}
Вывод этой программы показывает, что цикл выполняется всего два раза,
а= 1
b = 4
а = 2
b = 3
6.4. Оператор continue
В некоторых ситуациях возникает потребность досрочно перейти к выполнению следующей итерации, проигнорировав часть операторов тела цикла, еще не выполненных в текущей итерации. В этом случае необходимо сделать переход из текущей точки в конец цикла, т.е. в точку после последнего оператора тела цикла. Для этой цели в Java предусмотрен оператор continue. В случае циклов while и do-while оператор continue приводит к пропуску операторов тела цикла, не выполненных на данной итерации, и к передаче управления на код, проверяющий условие завершения цикла. Оператор continue, стоящий в цикле for, приводит к тому, что управление немедленно передается третьей части заголовка цикла, т.е. коду, который, выполняется на каждой итерации после операторов тела цикла. Ниже приведен пример, в котором оператор 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("");
}
}
}
Если индекс четный, цикл продолжается без вывода символа новой строки. Результат выполнения этой программы таков:
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; j++) {
if(j>i){
System.out.println("");
continue outer;
}
System.out.print(" " + (i * j));
}
}
} }
Оператор continue в этой программе приводит к завершению внутреннего цикла со счетчиком j и переходу к очередной итерации внешнего цикла со счетчиком i. В процессе работы эта программа выводит следующие строки:
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