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