Как остановить цикл for pascal
Перейти к содержимому

Как остановить цикл for pascal

  • автор:

Операторы goto, break, continue и прекращения программы

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

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

Необходимо знать, что всегда можно обойтись без оператора goto . Его использование затрудняет чтение и понимание программы.

Оператор goto осуществляет переход к оператору, помеченному специальной меткой, которая отделяется от самого оператора двоеточием. В качестве метки может быть использовано любое целое число без знака, содержащее более четырех цифр или любое имя. Чтобы можно было использовать метку, она должна быть в обязательном порядке объявлена в разделе меток в описательной части программы. Этот раздел начинается служебным словом label, после которого через запятую перечисляются метки.

Чтобы перейти к помеченному оператору, используется оператор перехода, имеющий следующий вид: goto метка;

label goback; var num: real; begin goback: write('Введите число: '); readln(num); if num < 0 then goto goback; num := sqrt(num); writeln('Квадратный корень: ', num:5:2); end.

Операторы break и continue

Бывает, что цель выполнения цикла достигается раньше, чем он будет прекращен по условию выхода. Так, например, в программе для определения простоты числа цикл будет выполняться n div 2-1 раз, хотя то, что число не является простым, может быть обнаружено на первых шагах цикла. Чтобы уменьшить количество шагов цикла, можно воспользоваться оператором goto, либо сформировать сложное условие выполнения (прекращения) цикла.

Однако существуют специальные операторы, использующиеся для прерывания хода выполнения цикла. Оператор break выполняет полный выход из цикла, т.е. все возможные итерации цикла прерываются. Оператор continue прерывает только текущую итерацию. Break и continue являются процедурами, хотя обычно их называют операторами.

Операторы break и continue выполняются в любом из видов циклов ( repeat , while , for ) и действительны только для внутреннего цикла. Например, если нужно обеспечить принудительный выход из двойного цикла, оператор break должен быть расположен как во внутреннем, так и во внешнем цикле. Операторы break и continue по сути являются видоизмененными операторами goto с известной точкой, в которую осуществляется переход.

В примере у пользователя пять раз запрашивается число только в том случае, если он не вводит ноль.

var num: real; i: integer; begin for i := 1 to 5 do begin write('Введите число: '); readln(num); if num = 0 then break; writeln(num) end; end.

В примере запрашиваются пять чисел и суммируются только положительные из них.

var num, sum: real; i: integer; begin sum := 0; for i := 1 to 5 do begin write('Введите число: '); readln(num); if num < 0 then continue; sum := sum + num end; write(sum:10:2); end.

Принудительное прекращение программы

Обычно программа завершает свою работу по достижении последнего оператора (т.е. при выходе на оператор end с точкой). Если возникает необходимость прекратить выполнение программы где-либо внутри нее, то можно воспользоваться процедурой halt, которая вызывается как отдельный оператор. Эту процедуру можно вызвать, задав в круглых скобках параметр в виде целого неотрицательного числа от 0 до 255. Это значение возвращается в операционную систему в виде кода ошибки ( ERRORLEVEL ) и может быть проанализирована операционной системой. Отсутствие параметра в процедуре halt соответствует значению 0 (нормальное завершение программы).

Второй процедурой, с помощью которой можно прекратить выполнение программы, является процедура без параметров exit при ее размещении в исполнимой части программы (а не в теле подпрограммы). Чаще эта процедура применяется для выхода из подпрограммы без прекращения выполнения вызывающей программы.

Как остановить цикл for pascal

При работе с циклами есть две полезных команды — break и continue. Здесь я опишу, что они делают и как их использовать.

Понятие тела цикла и итерации

Сначала введу несколько терминов, которые полезны при обсуждении циклов.

Тело цикла — это собственно те команды, которые находятся внутри цикла. Например, в цикле

for i:=1 to n do begin a:=i*i; writeln(i,' ',a); end;

тело цикла состоит из двух команд: присваивания и вывода.

Итерацией называется каждый отдельный проход по телу цикла. Цикл всегда повторяет команды из тела цикла несколько раз — вот каждое такое повторение и называется итерацией. В примере выше можно сказать, что цикл сделает n итераций. Можно, например, сказать, что на пятой итерации цикла будет выведена строка "5 25".

Команда break

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

for i:=2 to n do begin if n mod i=0 then begin writeln(i); break; end; writeln('Попробовали ',i,', не подходит'); end; writeln('Конец!');

— как только условие if'а выполнится, на экран будет выведено соответствующее i, и выполнение цикла будет прервано — дальше будет выведено слово "Конец!" и т.д. При этом строка "Попробовали. " будет выводиться для всех i, не включая то, на котором выполнилось условие цикла.

Например, для n=9 вывод будет следующий:

Попробовали 2, не подходит 3 Конец!

(Правда, данный конкретный код было бы проще написать через while — подумайте, как)

Команду break можно также применять и с циклами while и repeat, один из примеров — ниже.

Команда continue

Команда continue обозначает прервать выполнение текущей итерации цикла и начать следующую итерацию. Т.е. как будто бы, не доделывая то, что написано ниже в теле цикла, прыгнуть на начало цикла, при этом выполнив все действия, которые должны быть выполнены после очередной итерации — т.е. в цикле for увеличив значение счетчика цикла на 1, а в циклах while/repeat проверив условие и, если оно не выполняется, то вообще прервав работу.

for i:=2 to n-1 do begin if n mod i<>0 then begin writeln('Попробовали ',i,', не подходит'); continue; end; writeln(n,' делится на ',i); end;

— здесь цикл пройдется по всем числам от 2 до n-1 и для каждого выведет, делится ли n на i или нет. Например, при n=9 вывод будет такой:

Попробовали 2, не подходит 9 делится на 3 Попробовали 4, не подходит . Попробовали 8, не подходит

Пройдем подробнее по началу выполнения этого кода. Сначала i становится равным 2. Смотрим: 9 mod 2<>0 --- значит, идем внутрь if. Выводим на экран "Попробовали. ", и далее идет команда continue. Значит, сразу идем на следующую итерацию: увеличиваем i (!), оно становится равным 3, и идем на начало цикла. 9 mod 3=0, поэтому в if не идем, выводим "9 делится на 3", итерация закончилась — увеличиваем i и идем на следующую итерацию. И так далее.

Конечно, в этом примере можно было бы обойтись и без continue, просто написать else. Это было бы проще. Но бывает, что вам надо перебрать числа, и есть много случаев, когда какое-то число вам не надо рассматривать. Тогда писать кучу else было бы намного сложнее, чем несколько continue. Например (пример выдуман из головы, но подобные случаи бывают):

for i:=1 to n do begin // нам не нужны числа, делящиеся на 5 if i mod 5=0 then continue; // нам не нужны числа, квадрат которых дает остаток 4 при делении на 7 // обратите внимание, что мы можем делать какие-то действия до проверки условий p:=i*i; if p mod 7=4 then continue; // все оставшиеся числа нам нужны, // поэтому здесь делаем какую-нибудь сложную обработку из многих команд . end;

— тут намного более понятно, что вы имели в виду, чем если бы вы писали с else. С else тому, кто будет читать ваш код, пришлось бы смотреть, где else заканчивается, и вдруг после конца else идут еще какие-нибудь команды, а здесь все понятно: если if выполняется, то пропускается все оставшееся тело цикла.

while true do и break

Один важный случай применения команды break состоит в следующем. Часто бывает так, что вам надо повторять какую-то последовательность действий, и проверять условие окончания вам хочется в середине этой последовательности. Например, вам надо считывать с клавиатуры числа, пока не будет введен ноль. Все числа, кроме нуля, надо как-то обрабатывать (для простоты будем считать, что выводить на экран — это нам не существенно).

Естественная последовательность действий следующая:

считать число если ноль, то прерваться вывести это число на экран считать число если ноль, то прерваться вывести это число на экран .

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

У вас будет несколько вариантов: например, так

read(a); while a<>0 do begin writeln(a); read(a); end;

Фактически вы "разрезали" циклическую последовательность действий на проверке условия окончания цикла, и в результате были вынуждены команду считывания числа задублировать: она у вас один раз перед циклом, и один раз в конце цикла. Дублирование кода — это не очень хорошо (если вам придется его менять, вы можете забыть, что один и тот же код в двух местах); если у вас вместо считывания числа будет чуть более сложный код, то будет еще хуже. Кроме того, в этой реализации не очень хорошо, что у вас в пределах одной итерации цикла есть разные значения переменной a, было бы проще, если бы каждая итерация цикла соответствовала работе только с одним введенным числом.

Второй вариант, который вам может придти в голову, такой:

a:=1; while a<>0 do begin read(a); if a<>0 then writeln(a); end;

Этот вариант лучше в том смысле, что каждая итерация работает только с одним числом, но у него все равно есть недостатки. Во-первых, есть искуственная команда a:=1 перед циклом. Во-вторых, условие a<>0 дублируется; если вам придется его менять, вы можете забыть, что оно написано в двух местах. В-третьих, у вас основная ветка выполнения цикла, ветка, по которой будет выполняться большинство итераций, попала в if. Это не очень удобно с точки зрения кода: все-таки все числа, кроме последнего, будут не нулевыми, поэтому хотелось бы написать такой код, в котором обработка случая a=0 не потребует заворачивания основного варианта в if — так просто читать удобнее (особенно если бы у нас было бы не просто writeln(a), а существенно более сложный код обработки очередного числа, сам включающий несколько if'ов и т.п.).

Но можно сделать следующим образом:

while 0=0 do begin read(a); if a=0 then break; writeln(a); end;

Искуственная констракция 0=0 — это условие, которое всегда верно: нам надо, чтобы while выполнялся до бесконечности, и мог бы завершиться только по break. На самом деле в паскале есть специальное слово true, которое обозначает условие, которое всегда верно (и симметричное слово false, которое обозначает условие, которое не верно никогда). Соответственно, еще лучше писать while true do.

Этот вариант свободен от всех указанных выше недостатков. Каждая итерация работает с очередным числом, код считывания не дублируется, код проверки не дублируется, общая последовательность действий понятна, и основная ветка выполнения цикла находится в основном коде.

Вот так и следует писать любые циклы, в которых проверка условия нужна в середине тела цикла:

while true do begin что-то сделали if надо завершить работу then break; сделали что-то еще end;

Операторы break, continue и exit

Операторы break и continue используются только внутри циклов.

Оператор break предназначен для досрочного завершения цикла. При его выполнении происходит немедленный выход из текущего цикла и переход к выполнению оператора, следующего за циклом. Оператор continue завершает текущую итерацию цикла, осуществляя переход к концу тела цикла. Например:

for var i:=1 to 10 do

begin

if x=5 then

begin

break; // выход из цикла

end;

end;

Использование операторов break и continue вне тела цикла ошибочно.

Оператор exit предназначен для досрочного завершения процедуры или функции. Например

function Analyze(x: integer): boolean;

begin

begin

exit

end;

end;

Вызов exit в разделе операторов основной программы приводит к ее немедленному завершению.

Следует отметить, что в PascalABC.NET (в отличие от Borland Pascal и Borland Delphi) break, continue и exit являются не процедурами, а именно операторами.

Читайте также

Оператор continue

Оператор continue Оператор continue прерывает текущую итерацию цикла и начинает новую. В различных видах циклов этот оператор производит следующие действия:? в циклах while и do…while проверяется условие цикла и если оно равно true, то вновь выполняется тело цикла;? в цикле for изменяется

R.6.6.2 Оператор continue

R.6.6.2 Оператор continue Оператор continue может встретиться только в операторе цикла и приводит к передаче управления в заголовок ближайшего из объемлющих операторов цикла, т.е. в конец цикла. Более точно можно сказать, что в каждом из операторов: while (foo) < do < for

ДРУГИЕ УПРАВЛЯЮЩИЕ ОПЕРАТОРЫ: break, continue, goto

ДРУГИЕ УПРАВЛЯЮЩИЕ ОПЕРАТОРЫ: break, continue, goto Операторы, определяющие циклические вычисления, которые только что обсуждались, и условные операторы (if, if-else, switch) являются важнейшими средствами управления выполнением программы на языке Си. Они должны использоваться для

ВЫХОД: exit( )

ВЫХОД: exit( ) Функция exit( ) даст вам удобный способ "покинуть" программу. Она часто используется для прекращения работы программы при появлении ошибки. Если к exit( ) обратились из функции, вызванной главной программой, то прекращает работу вся программа, а не только эта

continue

continue Команда continue может использоваться с любыми тремя формами цикла, но не со switch. Она приводит к тому, что управление программой игнорирует оставшиеся операторы цикла. Для цикла while или for начинается следующий шаг цикла. Для цикла do while проверяется условие выхода, а затем,

Оператор продолжения continue

Оператор продолжения continue Синтаксис:continue;Действие:Оператор продолжения continue передает управление на следующую итерацию в операторах цикла do, for, while. Он может появиться только в теле этих операторов. Остающиеся в теле цикла операторы при этом не выполняются. В операторах

21.3.5. Команда exit — выход из системы

21.3.5. Команда exit — выход из системы Для завершения сеанса работы в системе (при условии, что вы работаете в консоли) нужно использовать команду exit. Если не завершить сеанс работы, кто угодно сможет работать в системе под вашим именем (понятно, что во время вашего отсутствия

9.9 Оператор Continue

9.9 Оператор Continue Операторcontinue ;вызывает передачу управления на управляющую продолжением цикла часть наименьшего охватывающего оператора while, do или for; то есть на конец петли цикла. Точнее, в каждом из оперторовwhile (. ) (* do (* for (. ) (* . . . contin: ; contin: ; contin: ; *) *) while (. ); *)continue

18.8. Управление ходом выполнения циклов с помощью команд break и continue

18.8. Управление ходом выполнения циклов с помощью команд break и continue Иногда в процессе работы возникает необходимость в прерывании или пропуске отдельных итераций цикла. При этом применяются определенные критерии. Для обеспечения подобных возможностей интерпретатор shell

18.8.3. Команда continue

18.8.3. Команда continue Команда continue по своему действию напоминает команду break, за исключением одной существенной детали: она не прерывает цикл, а лишь приводит к пропуску текущей итерации

Save & Exit Setup

Save & Exit Setup Данный пункт служит для сохранения изменений, выполненных в BIOS Setup. При его выборе BIOS запоминает настройки, сделанные в BIOS Setup, в CMOS-памяти с таким расчетом, чтобы они вступили в силу при следующей загрузке системы. Если выйти из BIOS, не воспользовавшись данным

Exit Without Saving

Exit Without Saving Выбрав данный пункт, можно отменить сделанные изменения. При этом в CMOS-память загрузится предыдущая рабочая конфигурация

Exit

Exit В данной секции содержится несколько пунктов, позволяющих перед выходом из BIOS сохранить все измененные данные, отменить сделанные настройки или загрузить значения, принятые по умолчанию.• Exit & Save Changes. Служит для записи всех сделанных изменений. Нужно нажать

Exit

Exit В данной секции содержится несколько пунктов, с помощью которых перед выходом из BIOS можно сохранить все измененные данные, отменить их или загрузить настройки по умолчанию.• Save & Exit Setup. Позволяет выйти из BIOS, записав сделанные изменения.• Exit Without Saving. Служит для

Меню Exit

Меню Exit В меню Exit (рис. 3.7) вы найдете следующие команды:? Exit Saving Changes – выйти с сохранением изменений;? Exit Discarding Changes – выйти без сохранения изменений;? Load Setup Defaults – загрузить настройки по умолчанию;? Discard Changes – отменить изменения, но не выходить;? Save Changes – сохранить

Операторы break, continue и exit

Операторы break и continue используются только внутри циклов.

Оператор break предназначен для досрочного завершения цикла. При его выполнении происходит немедленный выход из текущего цикла и переход к выполнению оператора, следующего за циклом. Оператор continue завершает текущую итерацию цикла, осуществляя переход к концу тела цикла. Например:

flag := False;
for var i:=1 to 10 do
begin
read(x);
if xthen continue; // пропуск текущей итерации цикла
if x=5 then
begin
flag := True;
break; // выход из цикла
end;
end;

Использование операторов break и continue вне тела цикла ошибочно.

Оператор exit предназначен для досрочного завершения процедуры или функции. Например

function Analyze(x: integer): boolean;
begin
if xthen
begin
Result := False;
exit
end;
.
end;

Вызов exit в разделе операторов основной программы приводит к ее немедленному завершению.

Более точно, break , continue и exit в PascalABC.NET являются операторами вызова специальных внутренних процедур.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *