Урок 6. Управление выполнением программы в Java ( 2 часть )
Циклы
Любой цикл можно разделить на 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- i++)
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.»)-
} } }
При выполнении эта программа выводит следующие строки:
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)-
}
} }
Вывод этой программы показывает, что цикл выполняется всего два раза.
а = 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
4 5
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. В процессе работы эта программа выводит следующие строки:
С:\->- 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
Исключения
Последний способ вызвать передачу управления при выполнении кода — использование встроенного в Java механизма обработки исключительных ситуаций. Для этой цели в языке предусмотрены операторы try, catch, throw и finally. -Глава 10 -целиком посвящена -изучению механизма обработки исключительных ситуаций.
Вниз по течению
В последних четырех главах вы узнали о Java довольно много. -Если бы это была книга по Фортрану, курс обучения можно было считать законченным. Однако по сравнению с Фортраном Java обладает дополнительными широкими возможностями. Поэтому давайте будем двигаться дальше и перейдем, наконец, к объектно-ориентированному программированию.
—