Песни о Паскале - [20]

Шрифт
Интервал



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

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

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


>      if S = ’’ then …


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

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

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

Итак, условный оператор тут не помощник, но Паскаль не оставит вас в беде. Для организации циклов в нём предусмотрены три оператора, с одним из которых мы ознакомимся немедля. Программистам он известен как цикл с проверкой в конце, и записывается двумя ключевыми словами: 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 следующим образом:


Рекомендуем почитать
Другая Земля Наследие Дружан

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


Антидот для мага. Дилогия

1.Как быть, если в полностью магическом мире ты - единственная в ком нет этой самой магии? Никакой. Совершенно. Что делать, если даже для родителей ты являешься наказанием, а все окружающие маги обходят стороной и презирают?  Конечно же беги! Вот только куда бежать немагу в мире магов? А что, если всё же найдется тот, кому ты будешь нужна? Вот только для чего именно? Ответы на все эти вопросы и предстоит мне узнать. Если только выживу... 2.Мне казалось, что все проблемы позади: враги, преследовавшие меня и желающие воспользоваться моей силой – уничтожены, моя тайна – сохранена, и есть тот, кто не бросил на произвол судьбы, дав кров и даже работу. Но что делать, если внезапно понимаешь, что твой благодетель небезразличен тебе? Как скрыть свои чувства, если живешь с ним под одной крышей? Тем более, если эти чувства не нужны ему.


Дороги своих любят

Четыре противоположности, чьи судьбы однажды удивительным образом переплелись – наемник, монах, воришка и маг – седлают коней. Что там, за горизонтом? Погони, разнесенные трактиры и странствующие музыканты да не оставят вас! Верные мечи, молитвы богам, ловкие руки, магия, и, конечно, верное плечо друга – и дороги будут благосклонны к своим любимцам, можете мне поверить.У менестрелей тяжелая работа. Но что на счет тех, кто им ее создает?


Зазеркалье. Фея для демона

Добрая и наивная сказка о любви.


Ли Кахори: Космическая любовь

На календаре 2283г. и у тебя светлое будущее.Ты — сын Советника Земного Союза и красивый парень. Отличник на курсе и прекрасный спортсмен. Просто тебе не повезло, Ли Кахори. Первой твоей ошибкой было влюбиться в сестру близкого друга, ну а второй — не отказаться от ваших взаимных чувств в угоду ее будущему жениху.Ты думал, что потерять ногу — это самое плохое в твоей жизни? Ты глубоко заблуждался, Лирой, мясорубка только начинается. Но ты ведь пройдешь этот путь до конца, так, Кахори? История про сильных духом, чья любовь разрушает любые преграды.Присутствует сёнэн-ай среди второстепенных героев.


Правила экстрасенса

Дело происходит в Питере. Молодой оперативник одного из убойных отделов Леонид Воронцов вызывает на допрос некоего бизнесмена Рыбкина с целью весьма низкой, а именно, получение взятки. Однако у Рыбкина, обвиняющегося в организации убийства своего зама, на этот счет совсем другие планы. Он подстраивает всё так, чтобы Воронцов получил сильный удар током, обычно в таких случаях ведущий к смерти. И Лёня действительно оказывается в морге. Однако в то время, когда для остальных такое путешествие, как правило, является последним, Лёнина история с него только начинается...