Песни о Паскале
Шрифт:
Для освобождения часового можно ввести специальную фразу. Например, вместо пароля напечатать фразу «отставить!» или «марш на кухню!». Ещё проще сделать это пустой строкой, которая попадет в переменную S, если в ответ на запрос пароля пользователь, ничего не печатая, нажмет клавишу Enter. Тогда условие завершения программы будет таким.
if S = ’’ then …
Здесь справа от знака равенства стоят два апострофа, – это пустая строка (между апострофами нет пробела!).
Мы ответили на первый вопрос, но как перейти к началу программы? Не надейтесь на условный оператор, он тут не поможет! Обе его ветви следуют после
Нанимаем репетитора
Итак, условный оператор тут не помощник, но Паскаль не оставит вас в беде. Для организации циклов в нём предусмотрены три оператора, с одним из которых мы ознакомимся немедля. Программистам он известен как цикл с проверкой в конце, и записывается двумя ключевыми словами: REPEAT – «повторять» и UNTIL – «вплоть до».
Отчасти «репетитор» похож на операторный блок BEGIN-END, рассмотренный нами в предыдущей главе. Вам надо повторять выполнение ряда операторов? Тогда поставьте слово REPEAT перед первым из них, а проверку условия UNTIL – за последним, и получите следующую конструкцию.
REPEAT
<Оператор 1>;
<Оператор 2>;
...
<Оператор N>
UNTIL условие
По-русски действие оператора можно изъяснить так: ПОВТОРЯТЬ следующие далее операторы, ПОКА условие НЕ соблюдается. На рис. 28 показана блок-схема такой циклической конструкции; здесь операторы 1 и 2 будут исполняться до тех пор, пока НЕ соблюдается условие в конце цикла. При соблюдении условия цикл прекратится, и выполнится оператор 3.
Примечание. Сходство оператора цикла с блоком BEGIN-END состоит в том, что REPEAT-UNTIL тоже скрывает внутри себя разделители операторов – точки с запятой. Стало быть, он тоже формирует единый блок.
Рис.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.
Рис.29 – Блок-схема часового с корректным завершением
На этой блок-схеме оператор проверки пароля обведен пунктиром; получив команду о завершении работы, программа должна обойти его. Этому служит ещё один условный оператор, проверяющий, не пуста ли строка S.
if S <> ’’ then …
Пара знаков «меньше»–«больше» в Паскале означает неравенство. Здесь положительная ветвь THEN будет выполнена, если строка S не будет пустой. Стало быть, это условие по смыслу противоположно условию IF S=’’.
А напоследок программа должна вежливо попрощаться, для чего добавим ещё пару операторов печати. Итак, создайте файл «P_12_2», скопируйте в него предыдущую версию программы и попытайтесь сами внести необходимые изменения, – нет ничего полезней самостоятельной работы! Справившись с задачей, взгляните на мой вариант, он показан ниже. А если не совладаете, тоже посмотрите.
{ P_12_2 – вежливый часовой }
var S : string;
begin
repeat
Writeln(’Пароль?’); Readln(S);
{ если строка не пуста, проверяем пароль }
if S<>’’ then
if S = ’pascal’
then Writeln(’Проходите!’)
else Writeln(’Стойте!’);
until S=’’;
Writeln(’До встречи! Нажмите Enter’); Readln;
end.
Я расположил операторы с надлежащими отступами, выделяющими структуру программы. Проверьте, работает ли она?
Досрочный выход из цикла
С какой бы стороны придраться к нашему часовому? Ведь программа делает все, что положено. Но рассмотрим ещё один её вариант. Дело в том, что условные операторы внутри цикла порой загромождают и запутывают его. Это не относится к нашей теперешней программе, но мы ведь только в начале пути… Ждать ли, пока гром грянет? Или подготовиться к нему заранее? Познакомьтесь с процедурой по имени BREAK – «прервать» (боксерам знакомо это слово).
Условие завершения цикла, как вам известно, проверяется в точке UNTIL. Но порой это условие удобней проверить где-то в середине цикла, и тогда цикл лучше прервать досрочно, вызвав процедуру BREAK следующим образом:
if условие_выхода_из_цикла then Break;
Внимание: вызов процедуры BREAK допустим только внутри циклов!
Посмотрите, как изменится блок-схема с оператором BREAK (рис. 30), здесь оператор принятия решения я заменил пунктирным прямоугольником.
Рис.30 – Блок-схема циклической программы с оператором Break
Согласно схеме, оператор BREAK передаст управление в точку, следующую за UNTIL. Применительно к нашей программе условие досрочного выхода из цикла будет таким.
if S=’’ then break;
Слегка изменив предыдущую версию программы, я получил вариант, показанный ниже.