Песни о Паскале | страница 55





Рис.38 – Блок-схема выбора из четырех вариантов

Рассмотрим условный оператор, выбирающий один из четырех ответов на основе случайного содержимого переменной R.


>if R=1

>      then S:=’Ответ 1’

>else if R=2

>      then S:=’ Ответ 2’

>else if R=3

>      then S:=’ Ответ 3’

>else S:=’ Ответ 4’;


Вложенные друг в друга условные операторы образуют «лесенку», – такое расположение удобно для чтения программы. А если заготовить больше ответов? Тогда «лесенка» дорастет до потемкинской лестницы, что в чудном городе Одессе!

Эта проблема – типичный случай в программировании. На сей случай в Паскале запасен оператор выбора CASE (что так и переводится – «случай»). В отличие от оператора IF, содержащего лишь две ветви, в операторе CASE их много – на все случаи жизни. Оператор записывают следующим образом:


>case X of

>      n1: Оператор_1;

>      n2: Оператор_2;

>      ...

>      else Оператор_n

>end;


Конструкция построена на четырех ключевых словах CASE-OF-ELSE-END. Выражение целого типа X служит условием, по которому выбирается одна из числовых меток: n1, n2 и так далее (метки – это целые числа). Работает оператор так. Если выражение X = n1, то выполняется оператор_1, если X = n2, то выполняется оператор_2 и так далее. Если X не соответствует ни одной метке, сработает оператор, указанный после ELSE. А если ветвь ELSE отсутствует? Тогда ничего не выполняется.

Вот пример. Если в результате вычисления выражения Random(20)+1 будет получено число от 1 до 3, то переменной S будет присвоено соответствующее слово, а иначе она станет пустой.


>case Random(20)+1 of

>      1: S:= ’Первый’;

>      2: S:= ’Второй’;

>      3: S:= ’Третий’;

>      else S:= ’’;

>end;


Если оператор CASE применить к нашей шуточной (или нешуточной) программе, то получится вот что.


>{ P_16_1 – игра «вопрос – ответ» }

>var S: string;

>begin

>      Randomize; { чтобы случайный ряд не повторялся }

>      repeat

>      Write(’Ваш вопрос: ’); Readln(S);

>      if S=’’ then break; { завершение цикла, если строка пуста }

>      case Random(5) of

>      0: S:=’Когда рак на горе свиснет’;

>      1: S:=’После дождика в четверг’;

>      2: S:=’За углом налево’;

>      3: S:=’Это элементарно, Ватсон!’;

>      else S:=’Не знаю, я не местный’;

>      end;

>      Writeln(S); { печать ответа }

>      until false; { бесконечный цикл }

>end.


Добавьте несколько смешных ответов, увеличив соответственно параметр функции Random, а затем испытайте программу на своих приятелях.

Итоги

• Для условных переходов со многими ветвями в Паскале предусмотрен оператор выбора CASE-OF-ELSE-END.