11 страница из 14
Тема
из комнаты далеко на морской берег.

— Адмирал, — сказал он, вытирая пальцы белоснежным платком, — мы должны покарать кракелюров. Команду сжигает ярость.

— А что я должен делать? — поинтересовался Петя.

Казимир зачем-то полез к Пете за шиворот и достал оттуда эскимо на палочке.

— Ангина прошла? — спросил он.

— Прошла.

— Тогда это тебе.

Потом он снова полез к Пете за шиворот и извлек оттуда вазу с букетом благоухающих роз.

— Это — твоей маме, — сказал Казимир и поставил вазу на телевизор. Затем он вытащил у Пети из-за шиворота огромную книгу под названием «Краткий философский словарь».

— Ну, это — моей жене, — сказал Казимир и пояснил: — Она у меня профессор.

Он в четвертый раз полез к Пете за шиворот, приговаривая: «Где же она? Где?»

— Что вы там ищете, Казимир, — возмутился Петя. — У меня там ничего нет!

— Ну да — ничего! А это что? — И Казимир вытянул из-под Петиной рубашки офицерский планшет с вложенной в него картой. Он развернул карту и расстелил ее на столе.

— Смотри сюда, — сказал Казимир.

ПЕТЯ СОСТАВЛЯЕТ ПРОГРАММУ ПРОХОДА КЛИПЕРА ПО МИННОМУ ПОЛЮ

Карта была такая:

— Вот — бухта, где стоит наш клипер, — пояснил Казимир. — Выход из нее заминирован кракелюрами. Здесь, к востоку, мины стоят гуще, видишь? Ты должен вывести корабль в открытое море.

— Сам?

— Зачем же? У руля будет стоять Кристина. То есть бывшая Кристина, а в настоящий момент Исполнитель-рулевой. Ты должен составить для нее программу выхода в открытое море.

— А потом?

— Потом — видно будет. Сначала проход через минные поля. Подчеркиваю: нужно провести корабль через минные поля так, чтобы ни разу не столкнуться с миной.

— Какие команды можно использовать в программе?

— Стандартных команд три: «курс — норд» (то есть на север) «право руля» и «полный вперед».

— А проверки?

— Только одна: «прямо по курсу мина».

— Все ясно, — сказал Петя. — Я выдам программу одной левой!

— Сначала спецификацию, — предупредил Казимир.

— Чтобы выйти в открытое море, нужно идти на север, — начал Петя. — Значит, первые две команды в программе должны быть: «курс — норд» и «полный вперед». Так?

— Продолжай, — сказал Казимир.

— Предположим, что впереди по курсу появится мина. Если Исполнитель ее увидит, то должен выполнить команду «право руля». Так?

— Продолжай, — сказал Казимир. — Но учти, что после этой команды мы повернем с норда на ост. С севера на восток. А открытое море у нас — на норде.

— Ясное дело, — сказал Петя. — Мы повернем на восток, чтобы не столкнуться с миной. После поворота, когда мы проедем мину, Кристина выполнит новую команду: «курс — норд». И мы снова повернем к открытому морю. Проедем мину — и повернем.

— Пиши программу, — сказал Казимир и, открыв Краткий философский словарь, погрузился в изучение слова «плюрализм».

А Петя напечатал такую программу:

  •  ПОВТОРЯТЬ 1000000 РАЗ     ЕСЛИ     ПО КУРСУ МИНА     ТО        ПРАВО РУЛЯ        ПОЛНЫЙ ВПЕРЕД     ИНАЧЕ        КУРС НОРД        ПОЛНЫЙ ВПЕРЕД     КОНЕЦ УСЛОВИЯ КОНЕЦ ЦИКЛАКОНЕЦ

— Готово, — сказал Петя.

Казимир дернул головой и перекинул монокль из правого глаза в левый.

— Так, — сказал он. — Ты использовал конструкцию разветвления и цикла…

— Да.

— А почему ты написал: «повторять миллион раз»? Почему не полмиллиона? Или не десять миллионов?

— Для ровного счета, — ответил Петя. — Откуда я знаю, сколько мин нам встретится, пока мы не выйдем в открытое море? Но уж не больше миллиона…

— А если миллиард?

— Тогда мы взорвемся, — хладнокровно ответил Петя. — Миллион мин объедем, а на миллион первой — взорвемся.

— А мы с твоей программой еще раньше взорвемся, — заметил Казимир. — Или сядем на мель.

— Это почему?

— Гляди, — и Казимир начертил на карте курс корабля:

— При каждой встрече с миной, — начал объяснять Казимир, — Исполнитель будет выполнять команду «право руля». Поскольку в восточной части бухты минное поле очень густое, то «Котангенс» будет стремительно отклоняться к востоку. А так как береговая дуга бухты в этом месте круто уходит на север, то мы сядем на мель раньше, чем пересечем минное поле. Но это — в лучшем случае. А в худшем — мы столкнемся с миной сразу после команды «право руля». Ведь у Исполнителя отсутствует проверка «справа по борту мин нет», и поворачивать корабль Кристина будет вслепую. А вдруг как раз в том месте, куда она повернет, — стоит мина? Разве можно вслепую разъезжать по минным полям? Нет, адмирал, ваша программа никуда не годится.

— А что же делать? — спросил Петя.

— Как что? — удивился Казимир. — Нужно делать то, что говорит нам карта. А она говорит: в западной части бухты мин гораздо меньше, чем в восточной. Значит, идти по западной части безопаснее. А тебя почему-то несет в восточную.

— Но ведь прокладывать курс по западной части я не могу, — сказал Петя.

— Почему?

— А разве вы не понимаете? У меня не хватает для этого команд.

— Хватает, — сказал Казимир. — Нужно, Петя, нужно, чтобы «Котангенс» выходил в море по западной части бухты.

— Казимир, вы меня прямо удивляете. Не может «Котангенс» идти по западной части. Для этого Исполнитель должен понимать команду «Лево руля». Но она же не входит в набор стандартных команд. Корабль может идти или на север, или на восток. Неужели это не понятно?

— Корабль может идти на запад, — упрямо сказал Казимир. — При этом Рулевой не обязан понимать команду «лево руля». Достаточно двух команд «право руля» и «полный вперед».

— Как это? — спросил Петя.

— Сдаешься? — спросил Казимир.

— Нет, — сказал Петя, — подумаю.

ОПИСАНИЕ НЕСТАНДАРТНЫХ КОМАНД

— Казимир, — сказал Петя. — А что если после команды «право руля» и «полный вперед» перед кораблем опять появится мина?

— Прекрасный вопрос! — воскликнул Великий Магистр. — В самом деле, что — тогда?

— Тогда стандартная проверка обнаружит эту мину, и, значит, рулевой снова выполнит команду «право руля»…

— И…

— …и корабль пойдет в обратную сторону!

— Следовательно, рулевой выполнит команду «развернуться», верно?

— Верно.

— А ведь эта команда не входит в набор стандартных команд, так?

— Так. Просто рулевой два раза выполнит стандартную команду «право руля».

— Выходит, для того, чтобы повернуть корабль влево, рулевой должен…

— …Три раза выполнить команду «право руля»! — радостно ответил Петя.

— Вот мы с тобой и подошли к одному из самых интересных разделов программирования — описанию нестандартных команд через стандартные, — объявил Казимир.

Он щелкнул пальцами, и машинка сама напечатала текст:

  •   ПРАВО РУЛЯ  ПРАВО РУЛЯ  ПРАВО РУЛЯКОНЕЦ

— Что здесь написано? — спросил Казимир.

— Команда «лево руля», — ответил Петя.

— Хорошо. Тогда составь программу выхода в открытое море вдоль западного побережья бухты.

Петя напечатал текст:

  • ПОЛНЫЙ ВПЕРЕДЕСЛИПО КУРСУ МИНАТО  ПРАВО РУЛЯ  ПРАВО РУЛЯ  ПРАВО РУЛЯИНАЧЕ  КУРС — НОРДКОНЕЦ УСЛОВИЯКОНЕЦ

Казимир прочитал программу и сказал:

— Мы с тобой знаем, что программы могут состоять из трех программных конструкций. Скажи — каких?

— Из последовательных выполнений команд, из разветвлений и из циклов.

— Правильно. Так вот, кроме конструкций, в тексты программ могут входить и ОПИСАНИЯ нестандартных команд. Вот как, например, описывается команда «лево руля».

Машинка затрещала, и из нее вылетел текст:

  • ЛЕВО РУЛЯГДЕКОМАНДА ЛЕВО РУЛЯОЗНАЧАЕТ  ПРАВО РУЛЯ  ПРАВО РУЛЯ  ПРАВО РУЛЯКОНЕЦ ОПИСАНИЯ

— Описание состоит из названия нестандартной команды, — оно, как видишь, занимает первую строку и из служебных слов «где… означает…»

Добавить цитату