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