Пять уроков Великого Магистра, или повесть о том, как Петя Бочкин изучал программирование

Рябченко Виктор

Урок второй

 

 

КУЛИНАРНО-АРТИЛЛЕРИЙСКАЯ УСТАНОВКА: ВЕЛИКОЕ ИЗОБРЕТЕНИЕ ВЕЛИКОГО МАГИСТРА

На другой день ровно в восемь утра стена в 96-й квартире дрогнула и раздвинулась. И морским ветром дунуло!

И клипер под всеми парусами замер на рейде!

И шлюпка, и весла: Вшеп-шлеп! — и гребцы: под музыку Вивальди! И Кристина, и Казимир — вот он, во фраке, со шпагой, с седыми висками, строгий и с моноклем в глазу.

— Привет, Петя! — сказал Казимир.

— Привет, Казимир, — ответил Петя и увидел, что на корме шлюпки установлена пушка, похожая на ту, которая стояла вчера. — А это что у вас? Пушка?

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

— А для чего?

— Чтобы стрелять.

— А когда?

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

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

— Хохех хохху?

— Что?

— Магистр спрашивает: хочешь ножку? — перевела Кристина.

— Нет, спасибо, — сказал Петя. — Я только что позавтракал.

Магистр в мгновение ока обглодал курицу, извлек из воздуха лист газеты, завернул туда кости, скомкал сверток и мял его в могучих своих руках до тех пор, пока тот превратился в пылинку.

— Нравится? — спросил он и показал на пушку.

— У, сила, — сказал Петя.

— Кулинарно-артиллерийская установка. Сокращенно — КАУ. Сам изобрел. Имею патент. Не сочти за бахвальство, голубчик… но — пройдут года, настанут дни такие, когда великий, мудрый наш народ вот эти руки, руки молодые — руками золотыми назовет! — и Казимир показал Пете свои руки. — Ведь золотые же? Правда — золотые? — спросил он.

— Золотые, — подтвердил Петя.

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

— Таким образом, проблема обеденного перерыва решена, — объявил Казимир. — Теперь Кристине не придется писать доносы на матросов. Приступаем к трапезе!

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

— Одно другому не помешает, — сказал Казимир. — Совместим приятное с полезным.

 

КРИСТИНА ОПЯТЬ ПРЕВРАЩАЕТСЯ В РОБОТА

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

— Распорядок дня существует только для одной цели — чтобы его нарушать, — сказал Казимир.

— Что вы такое говорите, Магистр? — возмутилась Кристина. — Да еще при ребенке? Вы отдаете себе отчет, какой нравственный урок он сейчас получает?

— Нет, она мне надоела, — проговорил Казимир. — Вот зануда…

В мгновение ока он выхватил шпагу и со словами «шаварган-бух!» перевел зеленую в другое состояние. Лицо у нее окаменело, на голове появился поварский колпак с артиллерийской эмблемой — двумя скрещенными мортирами.

— Она стала Исполнителем? — спросил Петя.

— Да. Сейчас это — кок-артиллерист. Будет кормить команду.

— А ей не больно, когда вы ее превращаете?

— Нет, — сказал Казимир уверенно. — Только щекотно.

 

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

— Ну-с, приступим, — сказал Казимир. — Вчера мы с тобой изучили самый простой способ программирования. Кстати, как он называется?

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

— Правильно. А сегодня мы узнаем еще один способ. Он называется «разветвление». Но перед этим я задам тем один вопрос. Ты помнишь, как вчера Кристина-Исполнитель поила нас чаем?

— Конечно.

— А ты помнишь, там была команда «вскипятить воду»?

— Помню.

— А теперь ответь: чем эта команда отличается от остальных?

— Тем, что сама Кристина воду не нагревала. Она поставила чайник на газ — и все.

— Ну, а сама-то она что-нибудь делала в это время?

— Нет… то есть да. Она стояла и смотрела на чайник.

— Для чего?

— Чтобы снять его с плиты, когда вода закипит.

— Другими словами, она проверяла, как нагревается вода. Правильно?

— И какой же вывод мы должны из этого сделать? Что еще умеет Исполнитель, кроме выполнения команд?

— Он умеет выполнять проверки! — догадался Петя.

— Вот именно — проверки, — сказал Казимир. — И сразу запомним: команда и проверка — не одно и то же. Выполнение команды изменяет ситуацию, в которой находится Исполнитель. А выполнение проверки — что?

— Не изменяет.

— Потрясающая сообразительность! — похвалил Казимир. — А теперь скажи: для чего нужны проверки Исполнителю?

— Ясное дело: чтобы знать, когда приступать к выполнению новой команды…

— …и приступать ли к ней вообще? — подхватил Казимир.

— К нему, — сказал Петя.

— Что — к нему?

— Если «выполнение», то — к нему.

— А если «команда», то — к ней.

— А если «выполнение команды», то — к нему. К выполнению.

— А кто ты такой, чтобы указывать?

— Я — Петя, — сказал Петя.

— А я — Великий Магистр, — сказал Великий Магистр. — Я — лингвист-универсал, понял? По шестому разряду работаю. Красный диплом имею. У меня жена профессор.

— А все-таки я прав, — сказал Петя. — А вы, Казимир, должны научиться признавать свои ошибки. И вообще — пора перестраиваться.

— Знаешь что, пацан? — спросил Казимир. — Вот возьму сейчас и уеду…

— Не уедете.

— Это почему?

— А я вам командировку не подпишу.

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

— Для чего нужны проверки.

— Так вот, представь себе, что чайник не закипел бы. Ну, скажем, потух газ. Что в таком случае сделала бы Кристина?

— Она бы его снова зажгла.

— Ничего подобного! Исполнитель выполняет только то, что написано в программе, а в твоей программе команды зажечь газ во второй раз не было. И значит, вода в чайнике никогда бы не закипела. И, следовательно, Кристина не смогла бы перейти к выполнению следующей команды. Программисты говорят, что в таких случаях с Исполнителем происходит авария. Он останавливается и прекращает работу.

Так вот, использование проверок позволяет программисту так составить программу, что Исполнитель знает, I как ему поступать в том или ином случае. Тебе это понятно?

— Нет, — сказал Петя. — Не очень. Я не понимаю, как можно в программе использовать проверки.

— Сейчас поймешь, — сказал Казимир, — Приступим к обеду.

Повернувшись к гребцам, он скомандовал:

— Орудие на берег!

Те живо выволокли пушку на берег.

— Объявляю меню, — сказал Казимир. — На первое — жареная курица. На второе — жареная курица. На третье — жареная курица.

— А на сладкое? — спросил кто-то.

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

— Ура! Ура! Ура! Ура! — восторженно прокричали матросы. По одному «ура» — на каждое блюдо. (Не знаю почему, но моряки любят жареных куриц).

— Обед готов. Кок-артиллерист — Кристина. Петя, составляй программу.

— А какой у нее набор стандартных команд? — спросил Петя.

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

В последней фразе Казимира слышалось какое-то тайное значение, но Петя не обратил на него внимание и начал диктовать:

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

Через миг была отпечатана такая программа:

ПОДОЙТИ К ОРУДИЮ

ЗАРЯДИТЬ ОРУДИЕ

ВЫСТРЕЛИТЬ

КОНЕЦ

— Вводи программу, — приказал Казимир.

Петя сунул листок под поварский колпак Кристины и прихлопнул его сверху.

Кристина-Исполнитель понеслась к орудию, остановилась возле него и вдруг монотонно заговорила:

— Авария. Авария. Авария. Авария.

— В чем дело? — растерянно спросил Петя.

— Я же предупреждал, — сказал Казимир. — Кулинарно-артиллерийская установка у меня — многозарядная.

— Ну и что?

— Это я у тебя должен спросить: ну и что? Догадайся, о какой аварии говорит Исполнитель?

— Наверное, орудие уже заряжено?

— Совершенно верно. Сам же видел, как оно только что стреляло.

— Значит, Кристина сделала проверку и увидела, что в орудии остались заряды?

— Правильно.

— А какие проверки она умеет делать?

— Наконец-то! — воскликнул Казимир. — Наконец-то ты об этом спросил! Кристина-Исполнитель может проверять заряжено орудие или нет. Я отвечаю на твой вопрос!

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

— И что?

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

— Логично, — сказал Казимир. — Следовательно, в этом и есть причина аварии.

— Выходит, я неправильно составил программу?

— Выходит, так. Ты не использовал умения Кристины-Исполнителя делать проверку. Кристина, ко мне!

Кристина послушно приблизилась к Казимиру.

— Слушайте, Казимир, — сказал Петя, — а почему она вам подчиняется без всякой программы?

. — Пусть только попробует не подчиниться. Я ведь, братец ты мой, — Великий Магистр. У меня жена — профессор… Впрочем, я об этом уже говорил. — Ну что, попробуешь еще раз составить программу?

— А как? — спросил Петя. — Я ведь не знаю, как составлять программы с проверками.

— Ты ей скажи по-человечески, чего ты хочешь, а на машинный язык твой приказ она переведет сама. Кстати, изложение программы «по-человечески» у программистов называется «спецификация».

— Ну, если по-человечески, то значит, так…

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

— Представил.

— Тогда командуй. И Петя начал:

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

Петя сказал это, а Кристина тут же отстучала на машинке такой текст:

 

РАЗВЕТВЛЕНИЕ. УСЛОВНЫЙ ОПЕРАТОР

— Тебе здесь все понятно? — спросил Казимир.

— По правде говоря, не все.

— Тогда давай разберемся. В первой строчке программы — твоя первая команда. С ней, надеюсь, все ясно?

— Да. «Подойти к орудию». Стандартная команда.

— Дальше идет слово «если». В нем-то как раз и содержится команда для проверки. Если условие подтвердится, то Исполнитель должен выполнить команды, идущие после слова «то». В противном случае он выполняет команды, следующие после слова «иначе». Все команды, находящиеся между словами «если» и «конец условия», называются в программировании конструкцией разветвления. Может, догадаешься, почему она так называется?

— Наверное, все зависит от проверки — по какому пути пойдет выполнение команд, да?

— Совершенно верно. Действия Исполнителя имеют два варианта. А по какому варианту они пойдут, — это зависит от «если». И последнее. Слова «если… то… иначе…» в алгоритмических языках называются «условным оператором». Условный оператор — это единая конструкция, состоящая из трех этих слов. Очень часто программисты обозначают условный оператор по-английски: «if» «then»… «else».

— А мне еще одно не понятно. Для чего в программе рядом стоят слова «конец условия» и «конец»? Разве не хватило бы одного «конца»?

— Этого требуют правила грамматики алгоритмического языка. «Конец условия» говорит Исполнителю том, что в программе на этом месте заканчивается действие одного условного оператора и можно переходить к выполнению новых команд, если они есть. Ну, а слово «конец» в конце программы как бы говорит Исполнителю: «Молодчина! Ты хорошо поработал, дружище. Программа выполнена. Можешь отключиться и отдохнуть». Слово «конец в программах может быть написано и по-английски «end».

Тут Казимир подтолкнул пальцем пишущую машинку, которая почему-то не исчезла, как обычно, а качнувшись как лодка на волнах, подплыла по воздуху к Пете и остановилась перед ним.

— Ну-ка, напиши программу для Исполнителя «Пешеход».

— Самому написать?

— Самому.

— А что должен сделать «Пешеход»?

— Перейти улицу на перекрестке, где горит светофор.

— А что, он, это… умеет делать?

— Задай вопрос правильно.

— Какой у Исполнителя набор стандартных команд?

— «Стоять» и «Перейти улицу».

— А проверки?

— «Пешеход» различает зеленый цвет светофора.

— И все?

— И все.

Петя подумал и одним пальцем отстучал:

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

— А когда матросов кормить будем? — поинтересовался Петя.

— Программа готова. Вводи.

 

СКОЛЬКО РАЗ НУЖНО ПЕРЕПИСАТЬ ПРОГРАММУ, ЧТОБЫ НАКОРМИТЬ ВСЕХ ГРЕБЦОВ?

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

— Погоди. Сколько жареных куриц вылетит из пушки после выполнения этой программы?

— Столько же, сколько будет выстрелов.

— А сколько будет выстрелов?

— А пушка у вас автоматическая… или какая?

— Или какая.

— То есть выстрелы у нее одиночные?

— Одиночные.

— Значит, Кристина выстрелит один раз.

— Следовательно?

— Следовательно, из пушки вылетит только одна курица.

— А сколько у нас матросов?

Петя пересчитал.

— Шестеро.

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

— Двадцать четыре курицы, — подсчитал Петя. — Поэтому Кристина должна сделать двадцать четыре выстрела.

— И что ты хочешь? После каждого выстрела писать новую программу?

— Да.

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

— А что делать?

— Есть способ, — Казимир дернул головой, подбросил монокль кверху, заговорщицки подмигнул Пете и поймал стекляшку глазом. — Можно так написать программу, что Исполнитель будет повторять ее столько раз, сколько ты захочешь!

— Да ну!

— Точно. Этот способ называется… Впрочем, об этом завтра.

— А как же матросы?

— Перекусят на корабле.

Казимир повернулся к матросам.

— Гребцам — за весла! В шлюпку, Кристина! До завтра, Петя.

— До завтра, Казимир!