end if;
условие : : = логическое—выражение
Выражение, задающее условие, должно быть логического типа. Для выполнения условного оператора вычисляются последовательно условия после if и elsif (трактуя заключительное else как elsif TRUE then) до тех пор, пока одно из них не скажется истинным или не будут исчерпаны все условия. При нахождении условия со значением TRUE выполняется соответствующая последовательность операторов, в противном случае не выполняется ни одна из последовательностей операторов.
Примеры:
if МЕСЯЦ = ДЕКАБРЬ and ДЕНЬ = 31 then
МЕСЯЦ : = ЯНВАРЬ;
ДЕНЬ:= 1;
ГОД: = ГОД+1;
end if;
if СТРОЧКА_СЛИШКОМ_КОРОТКА then
raise LAYOUT-ERROR;
elsif СТРОЧКА-ЗАПОЛНЕНА then
NEW_LINE,
PUT (ЭЛЕМЕНТ);
else PUT (ЭЛЕМЕНТ);
end if;
if МОЙ _АВТО.ВЛАДЕЛЕЦ.МАШИНА/ = МОЙ.АВТО then
СООБЩЕНИЕ (’’НЕПРАВИЛЬНЫЕ ДАННЫЕ”); - - см. 3.8
end if;
Операторы выбора •
Оператор выбора выбирает для выполнения одну из нескольких альтернативных последовательностей операторов; выбор альтернативы осуществляется в зависимости от значения выражения.’
оператор—выбора : : =
case выражение is
альтернатива—оператора_вы бора
{ альтернатива_оператора_выбора }
end case ;
альтернатива_оператора_выбора : : =
when выбор -С Iвыбор} =>
последовательность-операторов
Выражение должно быть дискретного типа, который должен быть определимым независимо от контекста выражения, но с учетом того факта, что тип выражения должен быть дискретным. Более того, тип этого выражения не должен быть настраиваемым формальным типом. Каждый выбор в альтернативе оператора выбора должен быть того же типа, что и выражение; перечень выборов определяет, для каких значений выражения выбирается соответствующая альтернатива.
Если выражение является именем объекта статического подтипа, то каждое значение этого подтипа должно быть представлено один и только один раз в наборе выборов оператора выбора, и никакие другие значения недопустимы; это правило применяется также, если выражение является квалифицированным выражением или преобразованием типа, обозначение типа которого указывает статический подтип. В остальных случаях, для других форм выражения, каждое значение (базового) типа выражения должно быть представлено только один раз в наборе выборов, и никакие другие значения недопустимы.
Используемые в качестве выборов в операторе выбора простые выражения и дискретные диапазоны должны быть статическими. Выбор, являющийся дискретным диапазоном, задает все значения из этого диапазона (ни одного значения в случае пустого диапазона). Выбор others допустим только в качестве единственного выбора для последней альтернативы и задает все значения (возможно и ни одного), не заданных в выборах предыдущих альтернатив. В качестве выбора в альтернативе оператора выбора не допускается использование простого имени компонента.
Выполнение оператора выбора заключается в вычислении выражения, в выборе последовательности операторов и в выполнении выбранной последовательности операторов.
Примеры:
case СЕНСОР is
when ВЫСОТА => ЗАПИСАТЬ.ВЫСОТУ (ПОКАЗАНИЕ.СЕНСОРА) ;
when АЗИМУТ => ЗАПИСАТЬ.АЗИМУТ (ПОКАЗАНИЕ.СЕНСОРА);
when РАССТОЯНИЕ => 3АПИСАТЬ.РАССТОЯНИЕ (ПОКАЗАНИЕ.СЕНСОРА); when others => null;.
end case;
case СЕГОДНЯ is
when ПНД => ПОДСЧИТАТЬ. ИСХОДНЫЙ.БАЛАНС;
when ПТН => ПОДСЧИТАТЬ. ИТОГОВЫЙ.БАЛАНС;
when ВТР. .ЧТВ => ВЫДАТЬ.ОТЧЕТ (СЕГОДНЯ);
when СББ.. ВСК => null;
end case;
case ДВ.ЧИСЛО (СЧЕТЧИК) is
when 1 => ЗАМЕНИТЬ.ДВ (lj;
when 2 = > ЗАМЕНИТЬ.ДВ (2);
when3|4 => ОБНУЛИТЬ.ДВ (1); ОБНУЛИТЬ.ДВ (1);
when others => raise ОШИБКА;
end case;
Примечание. При выполнении оператора выбора выбирается одна и только одна альтернатива, так как выборы являются исчерпывающими и взаимно исключающими. Квалификацией выражения в операторе выбора статическим подтипом можно ограничить количество выборов, которые необходимо указать явно.
Выбор others обязателен в операторе выбора, если выражение имеет тип универ- сальный_целый (например, выражение является целым литералом), так как это единственный способ учесть все значения типа универсальный _целый.
Операторы цикла
Оператор цикла содержит последовательность операторов, выполнение которой повторяется несколько раз или ни одного раза.
оператор_цикла : : =
[простое..имя_цикла. ]
[схема_итерации] loop
последовательность—операторов
end loop [простое—имя_цикла] ;
схема_итерации : : = while условие
I for спецификация—параметра—цикла спецификация—параметра—цикла : : = идентификатор in [reverse] дискретный—диапазон
Если в операторе цикла используется простое имя цикла, то оно должно задаваться как в начале, так и в конце этого оператора.
Оператор цикла без схемы итерации определяет повторяемое выполнение последовательности операторов. Выполнение такого оператора цикла заканчивается выходом из цикла вследствие выполнения оператора выхода или какой-либо другой передачи управления (см. 5.1).
Для оператора цикла со схемой итерации while перед каждым выполнением последовательности операторов вычисляется условие; если значением условия является TRUE, то последовательность операторов выполняется, если - FALSE, то выполнение оператора цикла заканчивается.
Для оператора цикла со схемой итерации for спецификация параметра цикла является описанием параметра цикла с заданным в схеме итерации идентификатором. Параметр цикла — это объект, типом которого является базовый тип значений дискретного диапазона (см. 3.6.1). В пределах последовательности операторов параметр цикла считается константой. Поэтому его использование в качестве переменной в левой части оператора присваивания недопустимо. Параметр цикла не должен использоваться в качестве параметра вида out или in out оператора вызова процедуры (или входа) или в качестве параметра вида in out конкретизации настройки.
Для выполнения оператора цикла со схемой итерации for сначала пред- выполняется спецификация параметра цикла. При этом создается параметр цикла и вычисляется дискретный диапазон.
Если дискретный диапазон пуст, то выполнение оператора цикла заканчивается. В противном случае последовательность операторов выполняется по одному разу для каждого значения из дискретного диапазона (при условии, что не происходит выхода из цикла из-за выполнения оператора выхода или какой-либо другой передачи управления). Перед каждой такой итерацией параметру цикла'присваивается соответствующее значение из дискретного диапазона. При отсутствии зарезервированного слова reverse эти значения присваиваются в порядке возрастания, при наличии этого слова — в порядке убывания.
Пример оператора цикла без схемы итерации:
loop
GET (ТЕКУЩИЙ_СИМВОЛ);
exit when ТЕКУЩИЙ-СИМВОЛ =
end loop;
Пример оператора цикла со схемой итерации while:
while ЗАЯВКА (К). ЦЕНА < ПРЕДЕЛ. ЦЕНА loop
ЗАПИСАТЬ_ЗАЯВКУ (ЗАЯВКА (К). ЦЕНА) ;
К: = К+Г,
end loop;
Пример оператора цикла со схемой итерации for:
for J in БУФЕР' RANGE loop - - правильно даже для пустого диапазона
if БУФЕР (J) / = ПРОБЕЛ then
РШ (БУФЕР (J));
end if;
end loop;
Пример оператора цикла с простым именем цикла:
СУММИРОВАНИЕ:
while СЛЕДУЮЩИЙ/ = ГОЛОВА loop - - см. 3.8.1
СУМ: = СУМ + СЛЕДУЮЩИЙ. ЗНАЧЕНИЕ;
СЛЕДУЮЩИЙ : = СЛЕДУЮЩИЙ. СЛЕД;
end loop СУММИРОВАНИЕ;
Примечание. Область действия параметра цикла простирается от спецификации параметра цикла до конца оператора цикла, а правила видимости таковы, что параметр цикла видим только в пределах последовательности операторов в цикле.
Дискретный диапазон цикла вычисляется только один раз. Использование зарезервированного слова reverse не изменяет дискретный диапазон, так что следующие схемы итерации не эквивалентны (в первой - диапазон пуст) :
for J in reverse 1., О
for J in 0. .1
Имена циклов используются также в операторах выхода и в расширенных именах (в качестве префикса имени параметра цикла) .
Операторы блока
Оператор блока содержит последовательность операторов, которой может предшествовать раздел описаний и за которой могут следовать обработчики исключений.
оператор_блока : : =
[простое_имя_б/гокя :]
[declare
раздел „описаний ]
begin
последовательность_операторов
[exception
обработчик_исключения
{обработчик_исключения}] end [простое„имя_блокл] ;
Если в операторе блока используется простое имя блока, то оно должно Задаваться как в начале, так и в конце.
Выполнение оператора блока заключается в предвыполнении раздела описаний (при его наличии) и последующем выполнении последовательности операторов. Если оператор блока содержит обработчики исключений, то они выполняются при возбуждении соответствующих исключений во время выполнения последовательности операторов (см. 11.2).
Пример:
ОБМЕН:
declare
РАБОЧАЯ_ЯЧЕЙКА: INTEGER;
begin
РАБОЧАЯ_ЯЧЕЙКА: = А; А: = В; В: = РАБОЧАЯ-ЯЧЕЙКА; end ОБМЕН;
Примечание. Если в операторе блока, выполнение последовательности операторов которого окончено, описаны объекты заданного типа, то оператор блока не заканчивается до тех пор, пока не будут завершены все его подчиненные задачи (см. 9.4). Эго правило применяется также при окончании из-за выполнения операторов выхода, возврата или перехода, или из-за возбуждения исключения.
Внутри оператора блока его имя может использоваться в расширенных именах локальных понятий, таких как ОБМЕН.РАБОЧАЯ_ЯЧЕЙКА в приведенном выше примере (см. 4.1.Зе). 1
Операторы выхода
Оператор выхода используется для окончания выполнения объемлющего оператора цикла (называемого в дальнейшем просто циклом) ; окончание может быть условным, если оператор выхода содержит условие.
оператор_выхода : : = exit [простое_имя_цмкля] [when условие] ;
Оператор выхода с именем цикла допустим только в именованном цикле и применяется к этому циклу; оператор выхода без имени цикла допускается в некотором цикле и применяется к самому внутреннему объемлющему циклу (именованному или нет). Кроме этого, применяемый к конкретному циклу оператор выхода не должен появляться в теле подпрограммы, теле пакета, теле задачи, в настраиваемом теле или в операторе принятия, если эта конструкция вложена в рассматриваемый цикл.
При выполнении оператора выхода сначала вычисляется условие, если оно есть. Выход из цикла происходит, если значением условия является TRUE или условие отсутствует.
Примеры:
for К in 1. ,МАКС_КОЛ_ ЭЛЕМЕНТОВ loop
ВВЕСТИ_НОВЫЙ_ЭЛЕМЕНТ (НОВЫЙ_ЭЛЕМЕНТ) ;
ПРИСОЕДИНИТЬ_ЭЛЕМЕНТ (НОВЫЙ_ЭЛЕМЕНТ, ФАЙЛ_ПАМЯТИ);
exit when НОВЫЙ_ЭЛЕМЕНТ = ЗАКЛЮЧИТЕЛЬНЫЙ-ЭЛЕМЕНТ;
end loop;
ГЛАВНЫЙ_ЦИКЛ:
loop;
- - начальные операторы
exit ГЛАВНЫЙ_ЦИКЛ when НАЙДЕНО;
- - заключительные операторы
end loop ГЛАВНЫЙ _ЦИКЛ:
Примечание. Выход из нескольких вложенных циклов можно осуществить с помощью оператора выхода с именем внешнего цикла.
Операторы возврата
Оператор возврата используется для окончания выполнения самой внутренней объемлющей конструкции, которая может быть функцией, процедурой или оператором принятия.
оператор_возврата : : = return [выражение] ;
Оператор возврата допустим только в теле подпрограммы (или настраиваемой подпрограммы) или в операторе принятия и применяется к самой внутренней из объемлющих его таких конструкций; оператор возврата недопустим в теле модуля-задачи, пакета или настраиваемого пакета, объем- лемого одной из указанных конструкций (с другой стороны, он допустим в составном операторе, вложенном в такую конструкцию и, в частности, в операторе блока).
Оператор возврата в операторе принятия, в теле процедуры или настраиваемой процедуры не должен содержать выражения. Оператор возврата в теле функции или настраиваемой функции должен содержать выражение.
Значение выражения определяет результат, возвращаемый функцией. Тип этого выражения должен быть базовым для обозначения типа, приводимого после зарезервированного слова return в спецификации функции или настраиваемой функции (это обозначение типа определяет подтип результата) .
При выполнении оператора возврата сначала вычисляется выражение (при его наличии) и проверяется принадлежность его значения подтипу результата. При положительном итоге проверки заканчивается вычисление оператора возврата и одновременно подпрограммы или оператора принятия, при отрицательном — в месте оператора возврата возбуждается исключение CONSTRAINT_ERROR.
Примеры:
return; - - в процедуре
return ЗНАЧЕНИЕ_КЛЮЧА (ПОСЛЕДНИЙ_ИНДЕКС); - - в функции
Примечание. Если выражение является числовым литералом, именованным числом или атрибутом, который вырабатывает результат типа универсальный _це- лый или универсальный-вещественный, то выполняется неявное преобразование результата, как описано в разд. 4.6.
Операторы перехода
Оператор перехода определяет явную передачу управления на помеченный меткой оператор.
оператор-перехода : : = goto тля_метки;
Самая вложенная последовательность операторов, объемлющая помеченный меткой оператор, должна также охватывать и оператор перехода на эту метку (в частности, оператор перехода может входить в еще более вложенную последовательность операторов). Кроме того, если оператор перехода содержится в операторе принятия или теле программного модуля, то соответствующий помеченный оператор не должен быть вне этой конструкции, и наоборот (как следует из предыдущего правила), если помеченный оператор содержится в такой конструкции, то оператор перехода не может быть вне ее.