Выход из цикла

Выход из цикла

Иногда бывают случаи , когда нам неизвестно, сколько конкретно шагов цикла необходимо для выполнения условия задачи. Конечно, мы можем
подождать, пока цикл завершится полностью, но это нерационально, да и в некоторых случаях недопустимо вовсе. Тогда логично возникает вопрос: «Как выйти из цикла?». Для этого в паскале есть три оператора, функции которых — прервать текущий цикл / шаг цикла. Итак знакомьтесь — это оператор break ,оператор continue и оператор goto. А теперь о каждом в отдельности.

Оператор break

Этот оператор необходим для полного выхода из цикла. То есть если в цикле встретился оператор break — цикл прерывается сразу. Приведу пример.
Имеем массив, состоящий из 10 чисел ( 4 1 3 2 6 8 9 10 11 2 ). Сколько чисел можно сложить, чтобы их сумма была меньше 20. Сложение начинаем с начала массива.

const
s: array [1.. 10] of integer = (4, 1, 3, 2, 6, 8, 9, 10, 11, 2);

var
i, x, y: integer;

begin
for i := 1 to 10 do
if x + s[i] < 20 then begin
x := x + s[i];
y := y + 1;
end
else break;
writeln(‘Максимальная сумма первых чисел , не превышающая 20 = ‘, x);
writeln(‘Количество чисел ,которые можно сложить по условию задачи = ‘, y);
end.

В результате мы получим

Максимальная сумма первых чисел, не превышающая 20 = 16
Количество чисел, которые можно сложить по условию задачи = 5

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

Оператор continue

Оператор также обеспечивает прерывание, но не цикла, а шага цикла. То есть если в цикле встретился оператор continue — происходит прерывание текущего шага цикла и выполняется переход к следующему шагу. Разберем на примере. Пусть у нас есть список работников на предприятии. Каждый месяц подсчитывается их средняя трудовая активность и на основе этого решается
вопрос о выдаче премии. Размер премии зависит от трудовой активности, а необходимая трудовая активность для получения премии 95%. Необходимо составить статистику за один месяц на 10 рабочих. Все данные вводятся с клавиатуры. Напишем простенькую программу, использую цикл,условие и оператор continue

const
n = 5;

var
i: integer;
p, a: array [1..n] of integer;
s: array [1..n] of string;

begin

for i := 1 to n do
begin
writeln(‘Введите данные ‘);
readln(s[i], a[i]);
if a[i] < 95 then continue else readln(p[i]);
end;
for i := 1 to n do
begin
write(‘Фамилия : ‘, s[i]);writeln;
write(‘Активность : ‘, a[i], ‘%’);writeln;
write(‘Премия : ‘, p[i], ‘ руб’);writeln;
end;
end.

Вобьем произвольные данные. Пусть это будут фамилии Петров, Сидоров, Васечкин, Корненко, Усманов. Забьем также данные по активности работы и премиям. Имеем на выходе

Фамилия: петров
Активность: 99%
Премия: 500 руб
Фамилия: сидоров
Активность: 89%
Премия: 0 руб
Фамилия: васечкин
Активность: 95%
Премия: 400 руб
Фамилия: корненко
Активность: 100%
Премия: 600 руб
Фамилия: усманов
Активность: 91%
Премия: 0 руб

Что мы видим? Очередность ввода такая: имя, активность, премия. Причем следует заметить, что если при вводе активность оказалась ниже 95%, то ввода премии просто не происходит (действует оператор continue). Шаг цикла заканчивается и происходит переход к следующему шагу.

Оператор goto

Оператор goto отличается двух предыдущих тем, что его применение гораздо шире. Если операторы break и continue используются только в цикле, то оператор goto можно использовать во всем теле программы. Суть заключается в том, что в каком-нибудь месте ставится метка и, если в процессе выполнения компилятор встретит ссылку на метку — он вернется к метке. Теперь как
применять goto в паскале. Необходимо сделать три вещи: объявить метку, установить метку, поставить ссылку на метку. Здесь есть только один момент. Объявление метки происходит до var (до объявление обычных переменных), используя label т.к. переменная особая. Все же остальное происходит уже в теле цикла.

label: <имя метки>; {объявление метки}
var;
begin;
goto <имя метки>; {ссылка на метку}
<имя метки>: <какое-нибудь действие>; {установка метки}

Пример использования оператора goto в паскале

label metka;
var
i: integer;

begin
for i := 1 to 10 do
begin
write(i:3);
if i = 5 then goto metka;
end;
metka:
end.

Как вы видите здесь цикл прерывается как только i:=5 и оператор goto переносит процесс компиляции к метке (metka). Таким образом на экран выводится

1  2  3  4  5

На этом все. Статья про выход из цикла завершена. Если нашли какие-либо ошибки / опечатки, или у Вас есть интересная информация по этой статье — отписывайтесь в комментариях ниже.

7 комментариев

  • Topcoder

    Ответить 18.01.2012 01:43

    Да goto — это зло. Если вы пишите много goto в своей программе, то другому программисту будет очень сложно разобраться что куда ведет, и в каком порядке выполняется программа.

  • Mr.Cheater

    Ответить 19.01.2012 01:43

    Поэтому попытайтесь при программмировании свести использование goto к минимуму ,а лучше вообще не используйте , благо обычно без него можно спокойно обойтись.

  • UnlimNET

    Ответить 19.01.2012 22:39

    go to — это зло, правда? Почему?

  • Сеятель

    Ответить 20.01.2012 01:43

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

  • Mr.Cheater

    Ответить 02.03.2013 01:44

    ibzh,
    Спасибо, поправил

  • ibzh

    Ответить 25.03.2013 01:44

    если в процессе выполнения компилятор встретит ссылку на метку — он вернется к метке . Таким образом компиляция продолжает выполняться с уже пройденного этапа.

    Это не верно

  • Арслан

    Ответить 15.01.2015 01:45

    Спасибо за информацию, пригодилось

Post a Reply to Арслан Cancel Reply