Управление циклами в Delphi

В этом примере запускается цикл, в котором переменная i будет изменяться от -3 до 3. На каждом шаге делится 10 на значение i и сохраняется результат в пе­ременной r.

При делении используется функция round, которая округляет переданное ей значение. В качестве исходного значения мы передаем ей результат деления 10 на переменную i, т.е. round(io/i). Таким образом, в переменную г будет записан округленный до целого результат деления.

Следующим действием является добавление результата в ListBox1, с одновре­менным преобразованием переменной г в строку.

 

Давайте посмотрим, что произойдет, когда переменная i будет равна 0. В этом случае число 10 будет делиться на 0, а значит, произойдет ошибка, потому что на 0 делить нельзя. Как же тогда выйти из этой ситуации? Можно на каждом этапе цикла проверять значение i, и если оно равно 0, то не выполнять никаких действий. Два возможных решения приведены в листингах:

 

procedure TForml.CalculateButtonclick(Sender: TObj ect); var

i, r:Integer;

begin for i:=-3 to 3 do

begin 11 Это начало для оператора for if i<>0 then

begin // Это начало для оператора if

г:=round(10/i);

ListBoxi.Items.Add(40/'+IntToStr(i)+'='+IntToStr(r)); end;// Этот end для оператора if end; // Этот end для оператора for end;

В этом примере на каждом этапе проверяется значение i, и если оно не равно 0, то только в этом случае производятся вычисления.

 

Это очень простое решение для маленьких и простых программ. Но если ваш цикл большой и выполняет много действий, то такое решение будет как минимум неудобно и может потеряться "читабельность" кода. В худшем случае, вообще мо­жет ничего не получиться. Вот тут на помощь приходит оператор continue.

 

procedure TFormi.CalculateButtonclick(Sender: TObj ect); var

i, r:Integer; begin for i:=-3 to 3 do

begin // Это начало для оператора for if 1=0 then

begin /./ Это начало для оператора if

ListBoxi.Items.Add('На ноль делить нельзя');

Continue; end;// Этот end для оператора if

г:=round(10/i);

ListBoxi.Items.Add('10/'+IntToStr(i) +' ='VlntToStr(r)); end; // Этот end для оператора for end;


Управление циклами в Delphi

В этом примере мы также проверяем на каждом этапе значение переменной i. Если оно равно нулю, то выводится сообщение в ListBox1 о том, что на ноль де­лить нельзя, и выполняется оператор continue. Как только программа встречает такой оператор, она сразу прерывает дальнейшее выполнение цикла и переходит на следующий шаг. Это то же самое, что выполнить команду "Остановить дальнейшее выполнение программы, 

увеличить значение переменной i и начать выполнение цикла со следующим значением".

 

Как только программа встречает опера­тор continue, она перескакивает на конец цикла, где увеличивается значение счетчи­ка (в данном случае переменная i) и про­должается выполнение уже со следующего шага.

На рис. показана форма с результа­том работы нашего примера.

 

Использование continue вместе с циклом for достаточно удобно  и безопасно, в отличие ОТ ЦИКЛОВ while или repeat.. .until. Посмотрим на следую­щий пример: 

i: =-3

while i<3 do begin if i=0 then continue;

r:=round(10/i);

ListBox1.Items.Add('10/'+IntToStr(i)+'=+IntToStr(r));

i:=i+1; end;

 

 

В этом примере также 10 делится на числа от -3 до 3, но на этот раз задача ре­шается с помощью цикла while. Чтобы не встретить ошибку деления на 0, в цикле проверяется переменная i на равенство нулю, и если это так, то выполняется опе­ратор continue. А теперь подумайте, что произойдет, когда i действительно будет равна нулю. В начале цикла произойдет проверка, которая даст истину, и выпол­нится оператор continue. Шаг цикла прервется и начнется с самого начала, при этом переменная i не изменится, и она снова будет равна 0. Вот оно классическое зацикливание, которое приведет к зависанию программы.

 

Когда выполняете оператор continue в цикле while, убедитесь что счетчик из­меняется. В данном случае нужно было сделать следующую проверку:

if i=0 then begin i:=i+l; continue; end;

В этом случае перед прерыванием шага цикла значение переменной i увеличи­вается на единицу, а значит, на следующем шаге она уже не будет равна нулю.

 

Теперь давайте разберемся с оператором break. Как только программа встречает такой оператор, цикл прерывается и выполнение передается следующему операто­ру после оператора цикла. Давайте возьмем наш предыдущий пример и заменим В нем continue на break:

 

procedure TForml.CalculateButtonclick(Sender: TObj ect); var

i, r:Integer; begin for i:=-3 to 3 do

begin // Это начало для оператора for if 1=0 then

begin // Это начало для оператора if ListBoxl.Items.Add('Ha ноль делить нельзя'); break;

end;// Этот end для оператора if r:=round(10/i);

ListBoxl.Iterns.Add('10/'+IntToStr(i)+'='+IntToStr(r)); end; // Этот end для оператора for ListBox1.Items.Add('Расчет окончен'); end;

В этом случае если значение iбудет равно нулю, то выводится сообщение о том, что на ноль делить нельзя и цикл прерывается. После этого управление передается следующему оператору по­сле цикла.

Как видите, после встречи с нулем в цикле больше ничего не выполняется и оператор break просто завершает его работу.

 

 

dle

Помоги проекту! Расскажи друзьям об этом сайте: