Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
delphi / песни о паскале.pdf
Скачиваний:
62
Добавлен:
26.03.2016
Размер:
5.16 Mб
Скачать

Глава 16 Делу время, а потехе час

Наши программы — и часовой, и экзаменатор — такие любопытные! Всё спрашивают что-то: то пароль им подавай, то таблицу умножения! Не поменяться ли с компьютером местами? Теперь мы будем спрашивать, а он — отвечать.

Вот веселая и глупая игра: «вопрос-ответ», суть которой такова. Две колоды карточек — одну с вопросами, а другую с ответами — тасуют и кладут рубашками вверх. Кто-то из сидящей вокруг стола компании берет наугад карточку из «вопросительной» колоды и читает вопрос своему соседу. Тот вынимает наугад карточку из колоды с ответами и оглашает его. К примеру, на вопрос «Как пройти в библиотеку?» можно получить ответ: «Волк, коза и капуста».

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

Потемкинская лестница

В первую минуту эта задачка представится вам легкой забавой, — я попробую угадать ход ваших мыслей. Во-первых, не будем обращать внимание на вопрос пользователя, — для подготовки ответа он не важен. После ввода вопроса сгенерируем случайное число и выберем один из заранее подготовленных ответов, согласуясь с этим числом. А как организовать выход из программы? Вот тут вопрос пользователя будет кстати, — приняв пустой вопрос, мы завершим программу. Этим мыслям отвечает блок-схема на рис. 38.

106

Глава 16 Делу время, а потехе час

REPEAT

Ввести вопрос

Если вопрос пуст

Выход из цикла

Break

Сгенерировать случайное число R

R=1

Ответ № 1

R=2

Ответ № 2

R=3

Ответ № 3

Ответ № 4

Until FALSE

Рис. 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’;

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

107

Глава 16 Делу время, а потехе час

Эта проблема — типичный случай в программировании. На сей случай в Паскале запасен оператор выбора 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 применить к нашей шуточной (или нешуточной) программе, то получится вот что.

108

Глава 16 Делу время, а потехе час

{ 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.

Каждая ветвь оператора CASE начинается с числовой метки, за которой следует выполняемый оператор.

Метки могут следовать в любом порядке (не только по возрастанию).

Ветвь оператора CASE выбирается в зависимости от числового выражения в условии. Если ни одна метка не соответствует условию выбора, выполняется оператор, указанный после ELSE. Если ветвь ELSE не указана, то ничего не выполняется.

Для исполнения внутри ветви нескольких операторов их объединяют в блок

BEGIN-END.

109

Соседние файлы в папке delphi