В Ada таким механизмом является инструкция case. Эта инструкция сначала вычисляет значение выражения, а затем, сравнивая его со списком значений, определяет, что выполнять дальше. Ниже приведен пример:
case A is -- выполнение действий в зависимости от значения A:
when 1 => Fly; -- если A=1, выполнить Fly.
when 3 .. 10 => Put(A); -- если A от 3 до 10, вывод значения А на экран.
when 11 | 14 => null; -- если A равно 11 или 14, ничего не делать.
when 2 | 20..30 => Swim; -- если A равно 2 или от 20 до 30, выполнить Swim.
when others => Complain; -- если A имеет другое значение, выполнить Complain.
end case;
Заметим, что после каждого "when" следует список одного или нескольких возможных значений. Спецификатор "when others" является указанием на все значения, которые не приведены ни в одном из списков. Оператор case осуществляет выбор одной, и только одной альтернативы; все варианты должны быть исчерпывающими (охватывать все возможные случаи) и уникальными ( не может быть двух выражений "when 5 =>"). Компилятор Ada определит наличие пропущенных или повторяющихся вариантов во время компиляции.
Далее приведена полная BNF инструкции case:
инструкция_case ::=
"case" выражение "is"
альтернатива
{альтернатива}
"end case;"
альтернатива ::=
"when" список_дискретных_значений "=>" последовательность_инструкций
список_дискретных_значений ::= дискретное_значение { | дискретное_значение }
дискретное_значение ::= выражение | дискретный_диапазон | "others"
Инструкция case в Ada функционально идентична инструкции "switch" языка С. В отличие от С, Ada допускает диапазоны значений и не требует в конце каждой последовательности инструкции "break", являющейся источником частых ошибок в программах на С.
Инструкции case полезны, однако большое количество инструкций case может служить показателем того, что, скорее всего, необходимо применить объектно-ориентированный подход. Возможности объектно-ориентнированного программирования в Ada будут рассмотрены в следующих уроках.
Если, в приведенном выше примере инструкции case, А равно 12, то что будет выпонено?
|
|
|
|
|---|
David A. Wheeler (dwheeler@ida.org)
Исходная копия этого документа находится по адресу
"http://www.adahome.com/Tutorials/Lovelace/s5s2.htm".
Исходная копия перевода размещена на сайте http://www.ada-ru.org
Перевод: Юрий Королев
Общая редакция перевода: Г.Ю. Сисюк