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