— Отлично![4] — сказал Казимир. — Перейдем к Кристине.
Через секунду Кристина открыла беглый огонь из кулинарно-артиллерийской установки, и шестеро наших тружеников весла и уключин обрели, наконец, то, о чем они так неистово мечтали.
— Не будем им мешать, — сказал Казимир, — пусть едят.
— Казимир, — спросил Петя, — покатайте меня на вашем клипере, а?
— Что значит покатайте? — строго спросил Казимир. — На боевых кораблях не катают. На них воюют. Кстати, я тебе не говорил, что завтра у нас морской бой с кракелюрами?
В это время стена дрогнула и начала медленно сдвигаться.
Последнее, что услышал Петя из своей комнаты, были слова Казимира:
— Ты назначен адмиралом!
Второе авторское отступление
Итак, мы познакомились с основными конструкциями алгоритмических языков.
Их, если вы помните, пять: последовательное выполнение команд, конструкция разветвления, конструкция цикла, конструкция перехода и конструкция присвоения значения.
Но вот вопрос: а почему эти конструкции именно такие, а не какие-то иные?
Чтобы ответить на этот вопрос, нужно ответить еще на один: почему машинные языки называются алгоритмическими языками?
А для этого мы должны разобраться еще с одним вопросом:
ЧТО ТАКОЕ АЛГОРИТМ?
В математике существует несколько определений алгоритма. Я не стану их здесь приводить. Смысл этих определений, максимально упрощая дело, сводится к тому, что под словом «алгоритм» подразумевается порядок действий, которые необходимо выполнить, чтобы решить ту или иную задачу.
В нашей повседневной жизни мы то и дело используем самые различные алгоритмы.
Сегодня утром, перед тем, как выйти на улицу, я поглядел в окно. Шел дождь, и я надел плащ. Таким образом, почти не раздумывая, автоматически я решил задачу, которую можно сформулировать так: что делать, когда за окном идет дождь? А вот и алгоритм его решения: ЕСЛИ за окном идет дождь, ТО перед выходом на улицу нужно надеть плащ. Ба, да ведь это же старая наша знакомая — конструкция РАЗВЕТВЛЕНИЯ!
Для того, чтобы попасть на работу, мне нужно повернуть за угол моего дома, пройти квартал, сесть на автобус, проехать четыре остановки, выйти из автобуса, перейти улицу, повернуть направо и пройти еще один квартал. Чувствуете, как я описываю алгоритм для решения еще одной задачи? «Как от моего дома попасть к месту моей работы?» — так сформулировал бы я ее. Для ее решения нужно ПОСЛЕДОВАТЕЛЬНО выполнять все указанные действия — и задача решена.
Тоже знакомая конструкция, не правда ли?
А знаете, чем я занимался весь сегодняшний день? Копал картошку. Не один, конечно, а вместе со всем своим родным коллективом. Привезли нас на поле, раздали ведра и — вперед! Из земли — в ведро, из ведра — в мешок, мешок — в грузовик. Была у нас женщина-бригадир из местных, красивая, с перстнем на пальце. Она картошку не копала, а только командовала.
— А домой нас скоро отпустят? — спросил у нее кто-то.
— А вот, миленькие, десять машин в город отправите тогда и сами поедете, — словоохотливо ответила женщина.
Так составилась задача под названием «Когда домой?» Вот алгоритм ее решения: из земли — в ведро, из ведра — в мешок, мешок — в машину. Повторять, ПОКА не нагрузим десять машин.
Узнаете? Правильно, это конструкция ЦИКЛА.
Надо сказать, что алгоритмы решения не только житейских, но и любых других задач сводятся к последовательности выполнения некоторых действий (программисты часто называют их «шагами»). А любая последовательность шагов может быть описана на языке вот этих самых только что перечисленных конструкций. Можно сказать, что любая программа, введенная в машину, представляет из себя не что иное, как алгоритм, записанный на языке таких конструкций. Поэтому-то машинные языки называются алгоритмическими.
А все ли задачи имеют алгоритмы для решения? Далеко не все.
Те, кто читал роман В. Гюго «Собор Парижской богоматери», помнят историю урода Квазимодо, который полюбил красавицу Эсмеральду. Понятно, что Квазимодо очень хотелось бы, чтобы и Эсмеральда полюбила его. Однако, увы, эта задача решения не имела. Какие бы действия ни предпринимал Квазимодо, в какой бы последовательности он ни выстраивал их, сердце красавицы (вообще говоря, весьма глупой барышни, лично я отказываюсь понимать, что в ней такого нашел Квазимодо) навсегда осталось закрытым для него.
Существуют такие задачи и в науке. В 1900 году в Париже состоялся Всемирный математический конгресс. Со своим докладом на нем выступил знаменитый математик Давид Гильберт. Для того, чтобы «проникнуть в предстоящие успехи нашей науки и тайны ее развития в начинающемся столетии», Гильберт выбрал двадцать три математические проблемы. С тех пор эти проблемы называются задачами Гильберта. До сегодняшнего дня они привлекают внимание всех математиков мира. Вот, например, как формулируется десятая проблема Гильберта. Дано: произвольное алгебраическое уравнение с целыми коэффициентами. Требуется: выяснить, существует ли у данного уравнения решение в целых числах? Оказывается, нет. Нет такого алгоритма, который позволил бы решить эту задачу. Это доказал советский математик Ю. В. Матиясевич.
А существуют ли задачи, которые имеют решения, но алгоритм которого невозможно записать? Странный вопрос, подумаете вы. Ведь если есть решение, то должен быть и алгоритм этого решения, то есть указание, каким способом решать данную задачу.
Но вот я спрашиваю: кто знает, как написать гениальный роман? Или хотя бы гениальное стихотворение? Ага, никто не знает! Тем не менее, гениальные произведения создавались и будут создаваться. Но алгоритм, или, что то же самое, рецепт, инструкцию для их написания создать невозможно. Итак, составление алгоритма — это первое, с чего начинается процесс программирования.
Второй шаг — запись алгоритма в виде программы. В одном из алгоритмических языков (их множество: фортран, алгол, пи-эл, бэйсик, паскаль…).
Третий шаг — ввод программы в машину. Этот способ сколько отличается от того, каким пользовались Великий Магистр и Петя. Во-первых, существует так называемый «памятный режим». При этом способе программа пробивается в виде дырочек на специальных бланках-перфокартах, которые затем вставляются в машину. Однако в последние годы все большее распространение получает второй способ ввода программы — «диалоговый режим». Здесь программа набирается на клавиатуре дисплея, а на экране тут же возникают точки, по которым можно проверить правильность ввода.
Кто может писать без ошибок? Никто. В том числе и программисты.
Введенную программу нужно отладить, то есть найти и устранить все ошибки.
Поэтому — четвертый шаг — отладка программы.
Вот, пожалуй, и все. Дальше начинается работа непосредственно самой машины.
Урок пятый
КТО ТАКИЕ КРАКЕЛЮРЫ?
— Казимир, кто такие кракелюры? — спросил Петя, когда на другой день ровно в девять часов стена вновь раздвинулась, и в комнату упругой, спортивной походкой вошел Великий Магистр. Высокий, строгий, с седыми висками, с орлиным взором, во фраке. Монокль в его глазу сиял, как бриллиант, и с каждым шагом по его левой ноге била волшебная шпага.
Впрочем, что-то появилось в облике Казимира. С левого плеча у него свисало нечто белое, непонятное, вроде аксельбанта. Это нечто источало запах. Запах был не то чтобы слишком отвратительным, нет, но и ничего ласкающего обоняние в нем также не ощущалось.
— Кракелюры?!! — зарычал Казимир. — Кто такие кракелюры?!! Это — кракелюры!!!
Когда он успокоился, Петя узнал от него следующее. Население планеты Занге-Зонге-Зунге-Зунд было, в общем, миролюбивым. На 99 % — гуманисты. Половина оставшегося процента — философы. А полпоследнего процента — кракелюры. То есть жители герцогства Кракелюр. Сплошь — бандиты и агрессоры. И дубье-дубьем. Интеллекта — ноль. Духовная жизнь на точке замерзания. Ученые планеты установили, что перевоспитать кракелюров можно только одним способом — забросать герцогство солеными огурцами. Оказывается, соленые огурцы обладают, одним загадочным свойством: стоит даже самому буйному кракелюру не то чтобы съесть, а только взглянуть на соленый огурец, как сразу теряется вся его агрессия. Вместо того, чтобы пакостить прогрессивному человечеству, у них возникает желание выращивать хризантемы и играть на мандолине. Вот почему кракелюры не любят соленых огурцов. Они объявили войну соленым огурцам. Единственное место для соленых огурцов — это трансформаторные будки. Все нормальные люди рисуют на них череп с костями, а кракелюры — с соленым огурцом. На этом месте Петя перебил Великого Магистра.
4
Автор опять врёт. Этот алгоритм неправильный. Во-первых, конца метки не бывает. Во-вторых, этот алгоритм зациклится бесконечно переходя на метку L. Видимо, автор путает подпрограмму с переходом на метку. В этот раз Казимир решил закидать вcех бесконечным запасом тушёнки после 3 банок сгущёнки. Видимо, тушёнки ему не жалко, в отличие от сгущёнки.