Познакомимся еще с одной командой ГРИС. Она называется командой ветвления. Формат команды ветвления такой:

если <условие>, то <серия 1> иначе <серия 2> конец ветвления

По-прежнему ГРИС может проверять только два условия: «впереди край?» или «впереди не край?». <Серия> – это одна или несколько следующих друг за другом команд. Если <условие> справедливо, то выполняется <серия 1>, в противном случае – <серия 2>. Например:

Рис. 5.1. Блок-схема полного ветвления

Такое ветвление называется полным в его блок-схема показана на рисунке ниже.

В некоторых случаях используется неполная форма команды ветвления. Вот, например:

Рис. 5.2. Блок-схема неполного ветвления

Неполная команда ветвления имеет следующий формат:

если <условие>, то

<серия>

конец ветвления

Здесь <серия> выполняется, если <условие> справедливо.

Раньше мы предполагали, что Кенгуренок движется по неограниченному листу бумаги. Это, конечно, нереально. Будем считать, что лист бумаги ограничен. Тогда Кенгуренок должен уметь проверять, не находится ли он в «опасной» близости к краю листа (на самом краю он находиться не может). Опишем это действие более четко: Кенгуренок может определять, находится ли край листа на расстоянии одного шага впереди него. В развилках будем писать так:

Если впереди край

или так:

Если впереди не край

Для примера разберем следующую задачу.

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

Сразу заметим, что совершенно неважно, около какого края стоит Кенгуренок: поверните лист бумаги, и левый край окажется нижним, правым или верхним. А вот положение Кенгуренка относительно края существенно. Если он находится в положении в, то ему достаточно прыгнуть; в остальных положениях ему надо сначала несколько раз повернуть налево, чтобы стать в положение в, и только затем прыгнуть. Понятно, что для каждого исходного положения написать свой (линейный) алгоритм несложно. Однако алгоритм, «обслуживающий», скажем, положение а, не годится для остальных положений. Конечно, можно было бы попытаться составить из этих четырех алгоритмов единый алгоритм для всех случаев... Но может ли Кенгуренок сразу узнать, в каком из четырех положений он находится? Увы, не всегда! Это возможно лишь в положении а – достаточно проверить условие впереди край». Возникает идея: сначала составить алгоритм, приводящий Кенгуренок из любого исходного положения в положение а. Один из возможных алгоритмов таков: поворачиваем Кенгуренка налево, пока впереди него не окажется край листа. Ясно, что при этом надо будет сделать не более трех поворотов: из положения а – 0 поворотов, из положения б – 1 поворот, из положения в – 2 поворота, из положения г – 3 поворота. Запишем этот алгоритм, демонстрируя движение Кенгуренка: первый рисунок показывает движение Кенгуренка из первого положения, второй – из второго положения, третий – из третьего, четвертый – из четвертого.

если впереди не край, то

поворот

конец ветвления

Теперь несложно завершить составление алгоритма отхода от края, дописав еще три строки:

поворот

поворот

прыжок

№ 16. Что нарисует Кенгуренок, выполнив следующий алгоритм из исходных положений, показанных на рисунке?

если впереди край, то

поворот

конец ветвления

если впереди край, то

поворот

шаг

поворот

шаг

иначе

шаг

поворот

шаг

налево

шаг

поворот

шаг

конец ветвления

№ 17. Составьте алгоритм, с помощью которого Кенгуренок отойдет от края листа, если первоначально он находится в одном из следующих положений:

1. слева от Кенгуренка находится край листа, и Кенгуренок не находится в углу листа;

2. Кенгуренок находится в углу листа, и впереди него – край листа (где другой край – справа или слева – неизвестно);

3. Кенгуренок находится в углу листа, и слева от него – край листа (где второй край – впереди или сзади – неизвестно);

4. Кенгуренок находится в углу листа, и неизвестно, с какой стороны от него края листа;

5. Кенгуренок находится у края листа, но неизвестно, в углу или нет.

№ 18. Сократите запись решений задач 17 (2-5), используя циклы.

Хостинг от uCoz