В 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, то что будет выпонено?
Перейти к предыдущему разделу | Перейти к следующему разделу | Вернуться к содержанию Урока 5 |
---|
David A. Wheeler (dwheeler@ida.org)
Исходная копия этого документа находится по адресу
"http://www.adahome.com/Tutorials/Lovelace/s5s2.htm".
Исходная копия перевода размещена на сайте http://www.ada-ru.org
Перевод: Юрий Королев
Общая редакция перевода: Г.Ю. Сисюк