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

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

Иногда бывают случаи , когда нам неизвестно , сколько конкретно шагов цикла необходимо для выполнения условия задачи. Конечно ,мы можем подождать , пока цикл завершится полностью , но это нерационально , да и в некоторых случаях недопустимо вовсе. Тогда логично возникает вопрос :"Как выйти из цикла?" . Для этого в паскале есть три оператора , функции которых - прервать текущий цикл / шаг цикла. Итак знакомьтесь - это оператор 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

На этом все. Статья про выход из цикла завершена . Если нашли какие-либо ошибки / опечатки ,или у Вас есть интересная информация по этой статье - отписывайтесь в комментариях ниже.
Понравилась новость? Добавь в закладки!
Хочешь получать свежие новости? Подпишись на обновления с сайта!
Рекомендуем посмотреть:
#1 | написал: UnlimNET | 19 января 2012 15:16 | ICQ: 408600480 | Пользователь offline

Группа: Читатели
Публикаций: 0
Комментариев: 5

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


#2 | написал: Topcoder | 19 января 2012 23:21 | ICQ: | Пользователь offline

Группа: Администраторы
Публикаций: 14
Комментариев: 9

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


#3 | написал: Mr.Cheater | 20 января 2012 14:15 | ICQ: 360239964 | Пользователь offline

Группа: Администраторы
Публикаций: 33
Комментариев: 68

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


#4 | написал: Сеятель | 11 ноября 2012 10:20 | ICQ: | Пользователь offline

Группа: Читатели
Публикаций: 0
Комментариев: 1

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


#5 | написал: ibzh | 25 февраля 2013 00:49 | ICQ: |

Группа: Гости
Публикаций: 0
Комментариев: 0
если в процессе выполнения компилятор встретит ссылку на метку - он вернется к метке . Таким образом компиляция продолжает выполняться с уже пройденного этапа.
 
Это не верно

#6 | написал: Mr.Cheater | 2 марта 2013 22:57 | ICQ: 360239964 | Пользователь offline

Группа: Администраторы
Публикаций: 33
Комментариев: 68
ibzh,
 Спасибо, поправил

#7 | написал: Арслан | 9 января 2015 16:11 | ICQ: |

Группа: Гости
Публикаций: 0
Комментариев: 0
Спасибо за информацию, пригодилось

Добавление комментария

Ваше Имя:
Ваш E-Mail:
Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Вставка исходного кода Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера

Введите два слова, показанных на изображении: