В этом примере запускается цикл, в котором переменная 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;
В этом примере мы также проверяем на каждом этапе значение переменной 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, убедитесь что счетчик изменяется. В данном случае нужно было сделать следующую проверку:
В этом случае перед прерыванием шага цикла значение переменной 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 просто завершает его работу.