Операторы 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 при ее размещении в исполнимой части программы (а не в теле подпрограммы). Чаще эта процедура применяется для выхода из подпрограммы без прекращения выполнения вызывающей программы.
Как остановить программу в паскале
Выход из цикла
Иногда бывают случаи , когда нам неизвестно, сколько конкретно шагов цикла необходимо для выполнения условия задачи. Конечно, мы можем
подождать, пока цикл завершится полностью, но это нерационально, да и в некоторых случаях недопустимо вовсе. Тогда логично возникает вопрос: «Как выйти из цикла?». Для этого в паскале есть три оператора, функции которых — прервать текущий цикл / шаг цикла. Итак знакомьтесь — это оператор 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 т.к. переменная особая. Все же остальное происходит уже в теле цикла.
Пример использования оператора 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). Таким образом на экран выводится
На этом все. Статья про выход из цикла завершена. Если нашли какие-либо ошибки / опечатки, или у Вас есть интересная информация по этой статье — отписывайтесь в комментариях ниже.
7 Replies to “Выход из цикла”
Topcoder :
Да goto — это зло. Если вы пишите много goto в своей программе, то другому программисту будет очень сложно разобраться что куда ведет, и в каком порядке выполняется программа.
Mr.Cheater :
Поэтому попытайтесь при программмировании свести использование goto к минимуму ,а лучше вообще не используйте , благо обычно без него можно спокойно обойтись.
UnlimNET :
go to — это зло, правда? Почему?
Сеятель :
Я обычно использую GOTO при отладке програмы, но это всего лишь дань традиции, взятой со времен студенчества. Вообще его лучше не использовать, это точно.
Mr.Cheater :
ibzh,
Спасибо, поправил
если в процессе выполнения компилятор встретит ссылку на метку — он вернется к метке . Таким образом компиляция продолжает выполняться с уже пройденного этапа. Это не верно
Арслан :
Спасибо за информацию, пригодилось
Добавить комментарий Отменить ответ
Рубрики
- C++ (27)
- STL (2)
- Арифметические операции (1)
- Ввод-вывод (1)
- Дополнительная информация (1)
- Задачи (2)
- Массивы (1)
- Сортировки (2)
- Типы данных (1)
- Условные операторы (1)
- Циклы (1)
- Задачи читателей (6)
- Одномерные массивы (2)
- Простые операции (10)
- Символьные строки (1)
- Сортировка (3)
- Типы данных (1)
- Условные операторы (3)
- Циклы (5)
- Поисковая оптимизация для интернет-магазинов (25)
Создание и продвижение интернет-магазинов. Предприниматель и автор книг Артур Мазитов. ООО "ГКТ" ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ "ГРУППА КОМПАНИЙ "ТЕКСТ" ООО "ГКТ" ИНН 0275927174, ОГРН 1220200002582 Юридический адрес 450076, Республика Башкортостан, г.о. Город Уфа, г Уфа, ул Коммунистическая, д. 16, кв. 41 |
2014 © Copyright Все права защищеныОператоры 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 являются операторами вызова специальных внутренних процедур.
Остановить выполнение программы
Добрый день. Есть консольная программа.
В ней есть условный оператор, который проверяет правильно ли введён пароль.
Так вот, когда я ввожу левый пароль, программа мне пишет "Стойте" но продолжает выполняться дальше.
Подскажите, как сделать что бы при вводе не правильного пароля, программа завершала свою работу и не предпринимала ни каких действий.
Спасибо.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
Program lil; var a, b, c, d, e: string; var s: string; begin writeln('Город вашего проживания'); readln(a); writeln('Улица на которой вы живёте'); readln(b); writeln('Номер вашего дома'); readln(c); writeln('Номер вашей квартиры'); readln(d); e:= 'Город:' + a + ' ' +'Улица:' + b + ' ' +'Дом:' + c + ' ' +'Квартира:' + d + ''; writeln('Пароль'); readln(s); if s = 'pascal' then writeln('Проходите') else writeln('Стойте'); writeln(e); readln end.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:Остановить выполнение программы
написал программу #include <iostream> #include <string> using namespace std; int main() < .Остановить выполнение программы. Sleep
Нужно остановить время на одну секунду. Пробовал Thread.sleep(), TimeUnit.SECONDS.sleep(), wait().Как остановить выполнение программы?
Если не вводишь цифры в Edit то вылазиет форма которую сам сделал типа "не введены данные", я.Можно ли остановить выполнение программы?
Всем привет! Подскажите плиз можно ли так сделать? Например есть мемо поле, в нем ну допустим 3000.
