Короткие алгоритмы могут описывать длинные последовательности действий
Использование цикла позволяет очень коротко записать довольно длинные последовательности действий. Рассмотрим пример.
|
дано| на поле Робота стен нет
надо| Робот закрасил 10 клеток вправо и вернулся
| в исходное положение
нач
нц 10 раз
I закрасить; вправо
кц
нц 10 раз
I влево
кц
Кон
При выполнении этого короткого алгоритма компьютер даст Роботу 30 команд: сначала 10 раз будет выполнена пара команд закрасить; вправо, а затем 10 команд влево.
Если вместо числа 10 поставить 100, Робот выполнит уже 300 команд, а ведь длина алгоритма при этом не увеличится!
Таким образом, короткие алгоритмы могут описывать очень длинные последовательности действий.
|
алгзакрасить прямоугольник
дано| на поле Робота стен нет
надо| закрашен прямоугольник размером 10х6
| Робот в исходное положение (рис. 9)
нач
нц 6 раз
закрасить ряд из 10 клеток
вниз
кц
нц 6 раз
I вверх
кц
Кон
Рис. 9
Внутри цикла могут быть другие циклы
Задачу из алгоритма А15 можно решить и без использования вспомогательного алгоритма, вставив текст алгоритма "закрасить ряд из 10 клеток" А14 непосредственно в текст основного алгоритма.
|
дано| на поле Робота стен нет
надо| закрашен прямоугольник размером 10х6
| Робот в исходное положение
нач
нц 6 раз
нц 10 раз
закрасить; вправо
кц
нц 10 раз
влево
кц
вниз
кц
нц 6 раз
I вверх
кц
Кон
Цикл, который находится внутри другого, называется вложенным циклом.
ЗАДАЧИ И УПРАЖНЕНИЯ
1. Решите задачи 6 и 9 из § 7 с использованием цикла n раз.
2. Решение каких задач из § 8 можно упростить, воспользовавшись циклом n раз?Составьте соответствующие алгоритмы.
10. Цикл пока
10.1. Команды-вопросы Робота
До сих пор все составленные нами алгоритмы управления Роботом приводили к выполнению определенной, заранее известной последовательности действий. Компьютер лишь приказывал Роботу выполнить какие-то действия, но никак не анализировал их результаты и обстановку на поле Робота.
Представьте себе начальника, который отдает приказы, но не получает никаких донесений о результатах их выполнения; повара, который не имеет возможности попробовать блюдо; шофера, ведущего автомобиль с закрытыми глазами. Понятно, что так далеко не уедешь; если мы хотим составлять алгоритмы для решения сложных задач, то надо уметь не только командовать исполнителем, но и анализировать обстановку, в которой он оказался.
У Робота для этого есть 12 команд-вопросов, отвечая на которые он сообщает информацию об обстановке вокруг себя. В этом параграфе мы рассмотрим 10 из них. Вот они:
сверху стена сверху свободно
снизу стена снизу свободно
справа стена справа свободно
слева стена слева свободно
клетка закрашена клетка чистая
Смысл этих вопросов ясен из их названий. Получив команду-вопрос, Робот проверяет соответствующее условие и отвечает да или нет.
10.2. Цикл пока
Задача. Где-то ниже Робота на неизвестном расстоянии есть стена. Нужно подвести Робота к ней вплотную.
Спросим у Робота снизу свободно?. Если Робот ответит, нет, значит, он уже у стены и задача решена. Если же Робот ответит да, то можно скомандовать вниз и опять спросить снизу свободно?. Если Робот ответит да — снова скомандовать вниз, спросить снизу свободно? и т. д., пока Робот не ответит, нет. Скомандуем ли мы при этом вниз 0, 3, 8 или 2000 раз, заранее неизвестно — это зависит от начального расположения Робота относительно стены
Наша цель, однако, не ручное управление Роботом, а составление алгоритма для компьютера. Поэтому приведенную выше последовательность действий надо описать на алгоритмическом языке. Алгоритм должен быть универсальным, т. е. не должен зависеть от расстояния между Роботом и стеной. Для этого в алгоритмическом языке есть специальная составная команда — цикл пока:
|
нач
нцпокаснизу свободно
вниз
Кц
Кон
Аналогично можно составить алгоритмы "влево до стены", "вправо до стены", "вверх до стены", которыми мы далее часто будем пользоваться как вспомогательными.
10.3. Диалог Компьютер — Робот при выполнении цикла пока
Пусть в начальный момент Робот находится в клетке А (рис. 10). Тогда при выполнении алгоритма "вниз до стены" (А18) диалог Компьютер (ЭВМ) — Робот будет таким:
ЭВМ: снизу свободно? Робот: да
ЭВМ: вниз Робот: смещается вниз (в клетку Б)
ЭВМ: снизу свободно? Робот: да
ЭВМ: вниз Робот: смещается вниз (в клетку В)
ЭВМ: снизу свободно? Робот: нет
Рис. 10
Поскольку Робот ответил нет,т. е. записанное после пока условие не соблюдается, то на этом выполнение цикла покаи алгоритма "вниз до стены" заканчивается.
10.4. Общий вид цикла пока
В общем виде цикл показаписывается так:
нц покаусловие
I тело цикла (последовательность команд)
кц
Слова нц и кц имеют тот же смысл, что и в цикле n раз— они отмечают начало и конец цикла.
Графическая схема выполнения цикла покаизображена на рисунке 11.
При выполнении цикла компьютер повторяет следующие действия:
а) проверяет записанное после служебного слова пока условие;
б) если условие не соблюдается (Робот ответил нет),то выполнение цикла завершается и компьютер начинает выполнять команды, записанные после кц.Если же условие соблюдается (Робот ответил да), то компьютер выполняет тело цикла и снова проверяет условие и т. д.
Рис. 11
10.5. Цикл n раз и цикл пока
Циклы n рази покаоформляются в алгоритмическом языке почти одинаково. Это неудивительно, ведь обе эти команды задают цикл — повторяющуюся последовательность команд. Служебные слова нцикцуказывают, что исполняется цикл, а заголовок цикла задает конкретный механизм его выполнения.
Однако у этих двух циклов есть одно существенное отличие. Начиная выполнять цикл n раз,компьютер знает, сколько раз придется повторить тело цикла. При исполнении цикла покаэто не так: компьютер каждый раз проверяет условие цикла и не может заранее определить, когда выполнение закончится. Узнать количество повторений цикла покаможно только после того, как цикл завершен.
Отсюда ясно, в каких случаях, какой цикл следует использовать. Если к моменту начала цикла количество повторений известно, удобно воспользоваться циклом n раз.Если же количество повторений заранее определить нельзя, необходим цикл пока.
10.6. Условия в цикле пока
В цикле покамогут использоваться простые и составные условия.
Простое условие — это обычно какая-то проверка. Примером может служить любая команда-вопрос Робота или операции сравнения: >, <, =, ≤, ≥, ≠. Позже мы познакомимся с ними.
Составное условие формулируется из одного или нескольких простых с использованием служебных слов и, или, не. Смысл этих слов и правила построения с их помощью составных условий те же, что и в случае запросов к базе данных.
Рассмотрим подробнее проверку составного условия с или.Сначала проверяется первое простое условие. Если оно выполнено, то составное условие заведомо выполнено и второе простое условие даже не проверяется. Если же первое условие не выполнено, проверяется второе условие и результат этой проверки становится результатом всего составного условия.
Например, если Робот стоит в углу (рис. 12), то при проверке условия "сверху стена или
справа стена" окончательный ответ ясен уже после первой проверки (сверху стена), поэтому второе условие не проверяется, компьютер даже не будет задавать Роботу вопрос "справа стена". Если записать то же самое составное условие как "справа стена илисверху стена", то после первой проверки окончательный результат может оказаться любым, поэтому будет проверено и второе условие.
Если между простыми условиями стоит и, то для выполнения составного условия необходимо, чтобы верными оказались оба простых.
Если в составном условии с ипервое условие оказалось неверным, второе уже не проверяется, так как результатом все равно будет, нет.
10.7. Свойства цикла пока