Цикл while

Циклы while используются для повторяющегося выполнения определенного кода в случае выполнения заданного условия.

Чаще всего используется следующая форма цикла:

while( <условие продолжения> ) {
<код>
}

Приведенный ниже фрагмент кода проверяет, содержится ли фигура shape в группе group (либо напрямую, либо в одной из ее подгрупп). Функция getGroup() класса Shape возвращает группу, которая является непосредственным контейнером этой фигуры. Для фигуры, находящейся на самом верхнем уровне иерархии (не содержащейся ни в одной группе), она возвращает null. В этом цикле мы начинаем проверку с непосредственного контейнера фигуры и затем движемся на каждой итерации на один уровень выше по иерархии до тех пор, пока не найдем group или не достигнем самого верхнего уровня:

ShapeGroup container = shape.getGroup(); //начинаем с непосредственного контейнера фигуры
while( container != null ) { //если он существует
if( container == group ) //проверяем, равен ли он искомой группе group
return true; //если да, то фигура содержится в этой группе
container = container.getGroup(); //иначе перемещаемся на уровень выше
}
return false; //если мы здесь, то фигура точно не содержится в группе group

Условие в первой форме цикла while проверяется перед каждой итерацией; если оно изначально не выполняется (равно false), то тело цикла выполняться не будет.

Существует и вторая форма цикла – do…while:

do {
<код>
} while( <условие продолжения> );

Разница между циклами do…while и while заключается в том, что do…while вычисляет свое условие после выполнения итерации, и следовательно тело цикла выполняется по крайней мере один раз. Это имеет смысл, например, в том случае, если условие зависит от переменных, чьи значения подготовляются во время итерации.

Рассмотрим следующий пример. Пусть у нас есть карта местности прямоугольной формы 1000*1000 пикселов. Границы города на карте отмечены замкнутой ломаной citybounds. Нам нужно найти случайную точку в пределах города. Поскольку форма ломаной может быть любой, мы используем метод Монте-Карло: будем генерировать случайные точки на карте до тех пор, пока точка не окажется внутри городской границы. Это пример естественного использования цикла do…while:

//объявляем две переменные
double x;
double y;
do {
//выбираем случайную точку из всей области
x = uniform( 0, 1000 );
y = uniform( 0, 1000 );
} while( ! citybounds.contains( x, y ) ); //если точка не находится внутри ломаной, делаем новую попытку