Инструкция (цикл) while
Эта инструкция применяется в том случае, когда нужно выполнить несколько раз определенные действия. Причем заранее не известно, сколько раз этот цикл выполнять – это становится ясно только во время работы программы.
Синтаксис инструкции такой:
while условие do инструкция;
или расширенный вариант:
while условие do begin
инструкция 1;
инструкция 2;
...
инструкция n;
end;
Здесь условие – переменная или выражение логического типа. Сначала вычисляется условие. Если условие ложно (False), то цикл не выполняется и сразу заканчивает работу. Если же условие истинно (True), то цикл выполняет инструкции, затем вновь возвращается к условию. Если условие опять возвращает True, цикл выполняется еще раз, и так до тех пор, пока условие не вернет False. Будьте осторожны с этим циклом! Не включайте туда условие, которое никогда не станет False. Компьютер в таком случае "зациклится", то есть зависнет. Обычно для этого внутрь цикла помещают счетчик – переменную целого типа. Только в отличие от цикла for, здесь переменная не увеличивает свое значение автоматически, за этим должен следить сам программист. Пример применения инструкции:
i := 1;
while i < 10 do begin
ShowMessage('Число равно ' + IntToStr(i));
i := i + 1;
end;
В этом простом примере мы целой переменной i присваиваем значение 1. Затем выполняем цикл while до тех пор, пока i не станет больше или равно 10. Если бы мы внутри цикла не указали "i := i + 1;", то этого никогда бы не произошло, и мы зациклили бы программу! Попробуйте выполнить этот пример в новом проекте, привязав код к обработке нажатия кнопки. В дальнейшей практике Вам не раз придется использовать этот цикл с куда более полезными примерами.
Оператор цикла repeat...Until
Мы уже знаем условный цикл while, изучим еще один. Синтаксис цикла несложный:
repeat <тело цикла> until <условие>;
Если цикл while имел предусловие, то цикл repeat имеет постусловие, которое выполняется после тела цикла. Есть еще отличие – цикл while выполняется до тех пор, пока условие истинно, а цикл repeat будет выполняться, пока условие ложно. В цикле while, если условие изначально ложно, тело цикла никогда не будет выполняться. Repeat выполнит тело цикла по крайней мере, один раз. Затем оператор проверяет условие, и если оно ложно, выполняет тело цикла еще раз, и так до тех пор, пока <условие> не вернет истину. Еще одно замечание: зарезервированные слова repeat..until работают как скобки begin...end, поэтому в теле цикла может быть сколько угодно инструкций, которые уже не нужно заключать в begin..end. Пример:
i := 3;
repeat
i := i + 1;
ShowMessage('i = ' + IntToStr(i));
until i > 10;
Управление циклами
Вы знаете уже практически все циклы – for..do, while..do, repeat..until. Однако этими циклами можно еще и управлять. Для этого служат директивы break и continue.
Break – прерывание цикла. Если внутри цикла встретится такой оператор, происходит немедленный выход из цикла. Как правило, этот оператор используют совместно с управляющей структурой if, например:
if a <> b then break;
Следовательно, если возникнет какое-то недопустимое для цикла условие, вы всегда имеете возможность прервать цикл досрочно.
Continue – прерывание текущего шага цикла. В отличие от break, continue не прекращает цикл вовсе, а лишь прерывает дальнейшую обработку этого шага цикла, после чего цикл сразу начинается со следующего шага. Способ применения такой же, как у break. Рассмотрим работу continue на практическом примере.
Нам нужно разделить число 10 на число от -3 до 3 включительно, и результат вывести в ListBox. Поскольку выводить будем также целые числа, нам поможет функция Round(), которая принимает вещественное число, округляет его до ближайшего целого и это целое возвращает. Также мы знаем, что на ноль делить нельзя, это ошибка. Для того, чтобы не допустить это деление, мы прервем этот шаг цикла с помощью директивы continue.
Создайте новое приложение. Установите на форму ListBox, а под ним – кнопку:
Рис. 12.4. Внешний вид приложения
При нажатии на кнопку, напишите следующий код:
procedure TForm1.Button1Click(Sender: TObject);
var
i, r : Integer;
begin
for i := -3 to 3 do begin
if i = 0 then begin
ListBox1.Items.Add('На ноль делить нельзя!');
Continue;
end; //if
r := Round(10/i);
ListBox1.Items.Add('10/'+IntToStr(i)+'='+IntToStr(r));
end; //for
end;
В тот момент, когда счетчик i станет равным 0, выполнится тело условия if, и после оператора Continue цикл сразу перейдет на новый виток, пропустив деление.