Книга: Песни о Паскале
Глава 12 Цикл с проверкой в конце
Разделы на этой странице:
- Подтянем дисциплину
- Рис.27 – Блок-схема циклического часового
- Нанимаем репетитора
- Рис.28 – Блок-схема оператора цикла с проверкой в конце
- Вежливый часовой
- Рис.29 – Блок-схема часового с корректным завершением
- Досрочный выход из цикла
- Рис.30 – Блок-схема циклической программы с оператором Break
- Итоги
- А слабо?
Глава 12
Цикл с проверкой в конце
Подтянем дисциплину
Продолжим воспитывать нашего часового, он ещё нуждается в этом. Проверяя каждого встречного-поперечного, мы принуждены вновь и вновь запускать свою программу. А все потому, что часовой покидает свой пост без команды, самовольно. Пусть программа проверяет посетителей одного за другим до тех пор, пока мы не скомандуем «отставить!».
Для этого заставим программу «бегать по кругу» так, чтобы она возвращалась к операторам, исполнявшимся ранее. Повторение одних и тех же действий называют циклом. Иногда цикл называют переходом назад. Блок-схема предстоящей программы показана на рис. 27.
Рис.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 следующим образом:
if условие_выхода_из_цикла then Break;
Внимание: вызов процедуры BREAK допустим только внутри циклов!
Посмотрите, как изменится блок-схема с оператором BREAK (рис. 30), здесь оператор принятия решения я заменил пунктирным прямоугольником.
Рис.30 – Блок-схема циклической программы с оператором Break
Согласно схеме, оператор BREAK передаст управление в точку, следующую за UNTIL. Применительно к нашей программе условие досрочного выхода из цикла будет таким.
if S=’’ then break;
Слегка изменив предыдущую версию программы, я получил вариант, показанный ниже.
{ P_12_3 – часовой с досрочным выходом из цикла }
var S : string;
begin
repeat
Writeln(’Пароль?’); Readln(S);
{ если строка пуста, то выход из цикла }
if S=’’ then break;
if S = ’pascal’
then Writeln(’Проходите!’)
else Writeln(’Стойте!’)
until S=’’;
Writeln(’До встречи! Нажмите Enter’); Readln;
end.
Досрочный выход из цикла упрощает программу, но пользоваться им надо аккуратно, с умом. Не забывайте, что после BREAK программа переходит к оператору, следующему за UNTIL.
Итоги
• Оператор цикла REPEAT-UNTIL организует многократное повторение операторов, вставленных между этими ключевыми словами.
• Условие выхода из цикла следует за ключевым словом UNTIL, цикл повторяется до тех пор, пока условие НЕ соблюдается.
• Оператор BREAK выполняет досрочный выход из цикла с обходом условия в UNTIL.
А слабо?
А) Сколько операторов можно вставить между REPEAT и UNTIL?
Б) Будет ли проверяться условие в UNTIL при досрочном выходе из цикла?
В) Возьмите за основу программу «P_11_1» и переделайте ее в циклический вариант. Или слабо?
Г) Напишите программу для угадывания слова. Она должна запрашивать от пользователя строки, пока тот не введет слово, предусмотренное в программе.
- Только для взрослых
- Детям до 16–ти
- Глава 1 Путь далек у нас с тобою…
- Глава 2 Вместо теории
- Глава 3 Консольный интерфейс
- Глава 4 Оружие – к бою!
- Глава 5 Программа номер один
- Глава 6 Подготовка к следующему штурму
- Глава 7 Развиваем успех
- Глава 8 Постоянные и переменные
- Глава 9 Переменные: продолжение знакомства
- Глава 10 Условный оператор
- Глава 11 Операторный блок
- Глава 12 Цикл с проверкой в конце
- Глава 13 Правда и кривда
- Глава 14 Дважды два – четыре
- Глава 15 Айда в Монте-Карло!
- Глава 16 Делу время, а потехе час
- Глава 17 И вновь за парту
- Глава 18 Аз, Буки
- Глава 19 Процедуры и функции: разделяй и властвуй
- Глава 20 Процедуры: первый опыт
- Глава 21 Отладка
- Глава 22 О передаче параметров
- Глава 23 Функции
- Глава 24 Криптография
- Глава 25 Текстовые файлы
- Глава 26 Я не читатель, – я писатель!
- Глава 27 Дайте кораблю минутный отдых!
- Глава 28 Редактор и справочная система
- Глава 29 Читайте по-новому
- Глава 30 Журнальная история
- Глава 31 Финал журнальной истории
- Глава 32 Порядковые типы данных
- Глава 33 Вещественные числа
- Глава 34 Структура программы
- Глава 35 Множества
- Глава 36 Множества в Паскале
- Глава 37 Ввод и вывод множеств
- Глава 38 Множества в «бою»
- Глава 39 Командная игра (массивы)
- Глава 40 Пристрелка на знакомых мишенях
- Глава 41 По порядку, становись!
- Глава 42 Кто ищет, тот всегда найдет
- Глава 43 Сортировка по-взрослому
- Глава 44 Строки
- Глава 45 Очереди и стеки
- Глава 46 Огромные числа
- Глава 47 Системы счисления
- Глава 48 Железная логика
- Глава 49 Сложные массивы
- Глава 50 Неспортивные рекорды (записи)
- Глава 51 Указатели в море памяти
- Глава 52 Динамические переменные
- Глава 53 Массив указателей
- Глава 54 Односвязные списки
- Глава 55 Слова, слова, слова…
- Глава 56 И снова очереди, и снова стеки…
- Глава 57 Графомания
- Глава 58 По графу шагом марш!
- Глава 59 Крупные проекты
- Глава 60 Мелкие хитрости
- Глава 61 «Кубики» программиста (ООП)
- Глава 62 Самое интересное только начинается!
- Приложение А Установка и настройка IDE Borland Pascal
- Приложение Б Консольная программа в среде Delphi
- Приложение В Особенности IDE Pascal ABCNet
- Приложение Г Зарезервированные слова
- Приложение Д Ошибки компиляции
- Приложение Е Ошибки исполнения
- Приложение Ж Директивы управления компиляцией
- Приложение З Назначение пунктов меню
- Приложение И Стандартная кодировка символов MS–DOS
- Приложение К Некоторые встроенные процедуры и функции
- Приложение Л Перечень программ
- Приложение М Пример олимпиадной задачи
- Библиография
- Содержание книги
- Популярные страницы
- 7 Система Цикл: долгосрочные цели
- 4.2. Формирование концепции репутационного менеджмента
- Цикл создания программы
- Этапы аутсорсинга в цикле прицельного маркетинга
- Существуют ли интернет-версии энциклопедий?
- 7.10. Концепция Сепира-Уорфа
- Глава 2 Первый уровень трехуровневой концепции мерчандайзинга. Внешний вид магазина и территория вокруг него
- Примеры концептуальных положений и целей проекта
- Определение терминов и понимание концепции
- Управление проектом на этапе концептуального планирования
- Ключевые концепции
- 1.2.6. Циклы и ветвление