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;

  1. Операторы выбора •

Оператор выбора выбирает для выполнения одну из нескольких альтер­нативных последовательностей операторов; выбор альтернативы осуществ­ляется в зависимости от значения выражения.’

оператор—выбора : : =

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 обязателен в операторе выбора, если выражение имеет тип универ- сальный_целый (например, выражение является целым литералом), так как это един­ственный способ учесть все значения типа универсальный _целый.

  1. Операторы цикла

Оператор цикла содержит последовательность операторов, выполнение которой повторяется несколько раз или ни одного раза.

оператор_цикла : : =

[простое..имя_цикла. ]

[схема_итерации] 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

Имена циклов используются также в операторах выхода и в расширенных именах (в качестве префикса имени параметра цикла) .

  1. Операторы блока

Оператор блока содержит последовательность операторов, которой мо­жет предшествовать раздел описаний и за которой могут следовать обработ­чики исключений.

оператор_блока : : =

[простое_имя_б/гокя :]

[declare

раздел „описаний ]

begin

последовательность_операторов

[exception

обработчик_исключения

{обработчик_исключения}] end [простое„имя_блокл] ;

Если в операторе блока используется простое имя блока, то оно долж­но Задаваться как в начале, так и в конце.

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

Пример:

ОБМЕН:

declare

РАБОЧАЯ_ЯЧЕЙКА: INTEGER;

begin

РАБОЧАЯ_ЯЧЕЙКА: = А; А: = В; В: = РАБОЧАЯ-ЯЧЕЙКА; end ОБМЕН;

Примечание. Если в операторе блока, выполнение последовательности операторов которого окончено, описаны объекты заданного типа, то оператор блока не заканчива­ется до тех пор, пока не будут завершены все его подчиненные задачи (см. 9.4). Эго правило применяется также при окончании из-за выполнения операторов выхода, воз­врата или перехода, или из-за возбуждения исключения.

Внутри оператора блока его имя может использоваться в расширенных именах ло­кальных понятий, таких как ОБМЕН.РАБОЧАЯ_ЯЧЕЙКА в приведенном выше при­мере (см. 4.1.Зе). 1

  1. Операторы выхода

Оператор выхода используется для окончания выполнения объемлюще­го оператора цикла (называемого в дальнейшем просто циклом) ; оконча­ние может быть условным, если оператор выхода содержит условие.

оператор_выхода : : = exit [простое_имя_цмкля] [when условие] ;

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

При выполнении оператора выхода сначала вычисляется условие, если оно есть. Выход из цикла происходит, если значением условия является TRUE или условие отсутствует.

Примеры:

for К in 1. ,МАКС_КОЛ_ ЭЛЕМЕНТОВ loop

ВВЕСТИ_НОВЫЙ_ЭЛЕМЕНТ (НОВЫЙ_ЭЛЕМЕНТ) ;

ПРИСОЕДИНИТЬ_ЭЛЕМЕНТ (НОВЫЙ_ЭЛЕМЕНТ, ФАЙЛ_ПАМЯТИ);

exit when НОВЫЙ_ЭЛЕМЕНТ = ЗАКЛЮЧИТЕЛЬНЫЙ-ЭЛЕМЕНТ;

end loop;

ГЛАВНЫЙ_ЦИКЛ:

loop;

- - начальные операторы

exit ГЛАВНЫЙ_ЦИКЛ when НАЙДЕНО;

- - заключительные операторы

end loop ГЛАВНЫЙ _ЦИКЛ:

Примечание. Выход из нескольких вложенных циклов можно осуществить с по­мощью оператора выхода с именем внешнего цикла.

  1. Операторы возврата

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

оператор_возврата : : = return [выражение] ;

Оператор возврата допустим только в теле подпрограммы (или на­страиваемой подпрограммы) или в операторе принятия и применяется к са­мой внутренней из объемлющих его таких конструкций; оператор возврата недопустим в теле модуля-задачи, пакета или настраиваемого пакета, объем- лемого одной из указанных конструкций (с другой стороны, он допустим в составном операторе, вложенном в такую конструкцию и, в частности, в операторе блока).

Оператор возврата в операторе принятия, в теле процедуры или настраи­ваемой процедуры не должен содержать выражения. Оператор возврата в теле функции или настраиваемой функции должен содержать выражение.

Значение выражения определяет результат, возвращаемый функцией. Тип этого выражения должен быть базовым для обозначения типа, приводи­мого после зарезервированного слова return в спецификации функции или настраиваемой функции (это обозначение типа определяет подтип резуль­тата) .

При выполнении оператора возврата сначала вычисляется выражение (при его наличии) и проверяется принадлежность его значения подтипу ре­зультата. При положительном итоге проверки заканчивается вычисление оператора возврата и одновременно подпрограммы или оператора приня­тия, при отрицательном — в месте оператора возврата возбуждается исклю­чение CONSTRAINT_ERROR.

Примеры:

return; - - в процедуре

return ЗНАЧЕНИЕ_КЛЮЧА (ПОСЛЕДНИЙ_ИНДЕКС); - - в функции

Примечание. Если выражение является числовым литералом, именованным числом или атрибутом, который вырабатывает результат типа универсальный _це- лый или универсальный-вещественный, то выполняется неявное преобразование результата, как описано в разд. 4.6.

  1. Операторы перехода

Оператор перехода определяет явную передачу управления на помечен­ный меткой оператор.

оператор-перехода : : = goto тля_метки;

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