AnyLogic
Развернуть
Размер шрифта

Цикл while

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

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

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

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

 ShapeGroup container = shape.getGroup(); //начинаем с непосредственного контейнера фигуры
while( container != null ) { // если он существует
  if( container == 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 ) ); //если точка не находится внутри ломаной, делаем новую попытку
Как мы можем улучшить эту статью?