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

Глава 12 Цикл с проверкой в конце

Подтянем дисциплину

Продолжим воспитывать нашего часового, он ещё нуждается в этом. Проверяя каждого встречного-поперечного, мы принуждены вновь и вновь запускать свою программу. А всё потому, что часовой покидает свой пост без команды, самовольно. Пусть программа проверяет посетителей одного за другим до тех пор, пока мы не скомандуем «отставить!».

Для этого заставим программу «бегать по кругу» так, чтобы она возвращалась к операторам, исполнявшимся ранее. Повторение одних и тех же действий называют циклом. Иногда цикл называют переходом назад. Блок-схема предстоящей программы показана на рис. 27.

Запросить и ввести

Пароль верный?

пароль

Да

Нет

Решение: Решение: «Проходите!» «Стойте

Завершить работу?

Нет

Да

Рис. 27 – Блок-схема циклического часового

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

Для освобождения часового можно ввести специальную фразу. Например, вместо пароля напечатать фразу «отставить!» или «марш на кухню!». Ещё проще сделать это пустой строкой, которая попадет в переменную S, если в ответ на

79

Глава 12

Цикл с проверкой в конце

запрос пароля пользователь, ничего не печатая, нажмет клавишу Enter. Тогда условие завершения программы будет таким.

if S = ’’ then ...

Здесь справа от знака равенства стоят два апострофа, — это пустая строка (между апострофами нет пробела!).

Мы ответили на первый вопрос, но как перейти к началу программы? Не надейтесь на условный оператор, он тут не поможет! Обе его ветви следуют после проверки условия IF, поэтому условный оператор передает управление только

вперед.

Нанимаем репетитора

Итак, условный оператор тут не помощник, но Паскаль не оставит вас в беде. Для организации циклов в нём предусмотрены три оператора, с одним из них мы ознакомимся немедля. Программистам он известен как цикл с проверкой в

конце, и записывается двумя ключевыми словами: REPEAT — «повторять» и UNTIL — «вплоть до».

Отчасти «репетитор» похож на операторный блок BEGIN-END, рассмотренный нами в предыдущей главе. Вам надо повторять выполнение ряда операторов? Тогда поставьте слово REPEAT перед первым из них, а проверку условия UNTIL — за последним, и получите следующую конструкцию.

REPEAT

<Оператор 1>;

<Оператор 2>;

. . .

<Оператор N>

UNTIL условие

По-русски действие оператора можно изъяснить так: ПОВТОРЯТЬ следующие далее операторы, ПОКА условие НЕ соблюдается. На рис. 28 показана блок-схема такой циклической конструкции; здесь операторы 1 и 2 будут исполняться до тех пор, пока НЕ соблюдается условие в конце цикла. При соблюдении условия цикл прекратится, и выполнится оператор 3.

Примечание. Сходство оператора цикла с блоком BEGIN-END состоит в том, что REPEAT-UNTIL тоже скрывает внутри себя разделители операторов — точки с запятой. Стало быть, он тоже формирует единый блок.

80

Глава 12

Цикл с проверкой в конце

REPEAT

Оператор 1

Оператор 2

Условие соблюдается?

Нет

UNTIL

Да

Оператор 3

Рис. 28 – Блок-схема оператора цикла с проверкой в конце

Воспользуемся циклом для очередной версии «киберчасового». За основу возьмем простейшую из предыдущих версий — программу P_10_1. Поместив внутрь цикла REPEAT-UNTIL все исполняемые там операторы, получим желаемое

— программу P_12_1.

{ P_12_1 – программа-часовой с циклом } var S : string;

begin

repeat

Writeln(’Пароль?’); Readln(S); if S = ’pascal’

then Writeln(’Проходите!’) else Writeln(’Стойте!’);

until S=’’; { окончание цикла, если строка S пуста }

end.

Проверьте наше новое творение. Обратите внимание на комментарии внутри фигурных скобок, — я буду снабжать ими все последующие программы.

Вежливый часовой

Программа работает? Прекрасно! Но одна шероховатость меня удручает. Покидая пост, часовой почему-то поднимает лишний шум: «Стойте!» — кричит он. Кому он это кричит? своему командиру? Безобразие! Пусть при оставлении поста часовой не проверяет пароль. С этой целью добавим ещё один условный оператор, как показано на рис. 29.

81

Глава 12

Цикл с проверкой в конце

Repeat

 

 

Запросить и ввести пароль

 

 

Продолжить работу?

 

 

 

 

 

 

 

 

Нет

 

 

 

 

 

 

 

 

 

 

 

Да

IF

 

 

 

 

 

 

 

 

 

 

 

 

 

Пароль верный?

 

 

Да

IF

 

Нет

 

 

 

 

 

 

 

 

 

 

 

Условный оператор

 

 

 

 

 

 

 

 

 

 

 

Решение:

 

Решение:

 

 

 

 

«Проходите

 

«Стойте

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Нет

 

Завершить работу?

 

Until

 

 

Да

Прощальное сообщение

 

 

 

До встречи!

 

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

На этой блок-схеме оператор проверки пароля обведен пунктиром; получив команду о завершении работы, программа должна обойти его. Этому служит ещё один условный оператор, проверяющий, не пуста ли строка S.

if S <> ’’ then ...

Пара знаков «меньше»—«больше» в Паскале означает неравенство. Здесь положительная ветвь THEN будет выполнена, если строка S не будет пустой. Стало быть, это условие по смыслу противоположно условию IF S=’’.

А напоследок программа должна вежливо попрощаться, для чего добавим ещё пару операторов печати. Итак, создайте файл «P_12_2.PAS», скопируйте в него предыдущую версию программы и попытайтесь сами внести необходимые изменения, — нет ничего полезней самостоятельной работы! Справившись с задачей, взгляните на мой вариант, он показан ниже. А если не совладаете, тоже посмотрите.

82

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