44
Заочная школа программирования
Урок 4: Арфметические predписания языка Робик.
Условные и циклические predписания.
Процедуры с параметрами
В языке Робик можно выполнять arфметические действия над числами. Для этого предназначаемые predписания СЛОЖИТЬ и ВЫЧЕСТЬ, синтаксические диаграммы которых приведены в свойной таблице (с. 47). Смысл этих predписаний настолько очевиден, что мы не будем подробно описывать их работу, ограничившись одним небольшим примером: СЛОЖИТЬ 5 С 10 И ПРИСВОИТЬ А; ВЫЧЕСТЬ 3 ИЗ А И ПРИСВОИТЬ В; СЛОЖИТЬ А С В И ПРИСВОИТЬ В;
ОТПЕЧАТЬ ‘A-’, А, ‘B-’, В;
По этой программе будет отпечатана строка:
Многих может удивить отсутствие операций умножения и деления средних predписаний языка. Дело в том, что Робик — это учебный язык, а составление процедур для умножения и деления чисел — отличное учебное упражнение.
Задание 4.1. Описать процедур, которые увеличиваем значение и деления средних predписаний языка. А в чемре раза и присваиваем результатомому же имену.
Одно из самых важных predписаний в любом языке программирования — это условное predписание, структура которого изображена в свойной таблице.
Встретив в тексте программы условное predписание, ЭВМ прежде всего проверяет условия:
оно или ложно. Если условие истинно, будет использовано только predписание, стоящее после слова ТО. Если условие ложно, будет использовано только то predписание, которое стоит после слова ИНАЧЕ (если этого слова в predписании нет, то при ложном условии условное predписание в этом случае просто пропускается).
Например, если значения имен A и В являются какие-то числа, то predписание ЕСЛИ А БОЛЬШЕ В TO ОТПЕЧАТЬ А ИНАЧЕ ОТПЕЧАТЬ В; отпечатает большее из этих чисел (если числа равны между собой, отпечатается второе число, которое в прочеем, совпадает тогда с первым).
Задание о роботе-обходике
Робот РО-1 должен проверить прочность стыков на новый железнодорожной ветке. Обнаружив неисправный стык, робот должен сообщить об этом дежурному оператору, находящемуся на станции. РО-1 имеет выполнять все predписания языка Робик. Кроме того, в его СПР входит predписание:
а списк допустимых условий дополен двумя:
Расстояние между стыками — 24 метра. Ветка заканчивается тупиком. Перед началом работы робот устанавливает на первом стыке проверяемой ветки. Составим программу.
Решен ие.
ЗАПОМНИТЬ ПРОЦЕДУРУ ПРОВЕРКА;
10 ЕСЛИСТЫК НЕИСПРАВЕН TO ОТПЕЧАТЬ ‘ОБНАРУЖЕН НЕИСПРАВНЫЙ СТЫК’;
20 ПРОЕХАТЬ 24 М;
30 ВЫЗВАТЬ ПРОЦЕДУРУ ПРОВЕРКА;
ЗАКОНЧИТЬ ОПИСАНИЕ ПРОЦЕДУРЫ;
ВЫЗВАТЬ ПРОЦЕДУРУ ПРОВЕРКА;
Проследим, как выполнять эта программа. Будем считать, что первая и второй стыки исправны, а третьим что-то не в порядке. Когда
45
мы вызовем процедур ПРОВЕРКА в первый раз, робот начнет выполнять оператор с номером 10. Это — условный оператор, поэтому РО-1 в первую очередь проверит условия:
СТЫК НЕИСПРАВЕН
Как мы договорились, первый стык исправен, так что это условие ложно и не отводит поворять все сначала. Для второго, исправного, стыка все повторится в точности, а вот на третьем стыке условие в десятом операторе оказывается истинным и на экране терминала, установленного на станции, появятся слова:
ОБНАРУЖЕН НЕИСПРАВНЫЙ СТЫК
После этого робот вновь перейдет к двадцатому оператору, проедет еще 24 метра и опять начнет все сначала. Каждый все в порядке. Впрочем, один неясный вопрос остается: а до каких пор робот будет повторять выполнение этой процедуры? Судя по программе — до бесконечности. На самом деле, разумеется, ветка где-то кончится и робот налетит на тупик. Но это — ситуация авариная. Пробudem ее предотвращить: для этого, оченьно, нужно, чтобы операторы 20 и 30 выполнялись только в том случае, когда вперед нет тупика. Если же тупик обнаружен, можно, например, отпечать такое сообщение декурному оператору:
ЛИНИЯ ПРОВЕРЕНА. РО-1 РАБОТУ ЗАКОНЧИЛ
Ну, что же, попробudem написать такую программу:
ЗАПОМНИТЬ ПРОВЕРКА;
10 ЕСЛИ СТЫК НЕИСПРАВЕН TO ОТПЕЧАТЬ ‘ОБНАРУЖЕН НЕИСПРАВНЫЙ СТЫК’;
20 ЕСЛИ ВПЕРЕДИ ТУПИК TO ОТПЕЧАТЬ ‘ЛИНИЯ
ПРОВЕРЕНА. РО-1 РАБОТУ ЗАКОНЧИЛ. ИНАЧЕ…
СТОП!! А что, собственно, ИНАЧЕ?
Ведь если вперед нет тупика, нам нужно выполнить два оператора сразу: проехать 24 метра и вызвать процедуру ПРОВЕРКА, а, судя по диаграмме, после слов TO и ИНАЧЕ может стоять только одно предложение.
Впрочем, выход есть: опишем новую процедуру, состоящую из этих двух операторов, а после слов ИНАЧЕ поставим просто в зов этой процедуры:
ЗАПОМНИТЬ РЕЛЬС;
10 ПРОВЕРТАТЬ 24 М;
20: ПРОВЕРКА;
ЗАКОНЧИТЬ;
ЗАПОМНИТЬ ПРОВЕРКА;
10 ЕСЛИ СТЫК НЕИСПРАВЕН TO ОТПЕЧАТЬ ‘ОБНАРУЖЕН НЕИСПРАВНЫЙ СТЫК’;
20 ЕСЛИ ВПЕРЕДИ ТУПИК TO ОТПЕЧАТЬ ‘ЛИНИЯ ПРОВЕРЕНА. РО-1 РАБОТУ ЗАКОНЧИЛ’. ИНАЧЕ: РЕЛЬС;
ЗАКОНЧИТЬ;
:ПРОВЕРКА;
Усложним задание: предположим, что робот должен каждый раз печать номер неисправного стыка. Проверьте, что для этого подойдет такая, например, программа:
ЗНАЧЕНИЕ 1 ПРИСВОИТЬ ИМЕНИ Н;
ЗАПОМНИТЬ РЕЛЬС;
10 ПРОВЕРТАТЬ 24 М;
20 СЛОЖИТЬ 1 С Н И ПРИСВОИТЬ ИМЕНИ Н;
30: ПРОВЕРКА;
ЗАКОНЧИТЬ;
ЗАПОМНИТЬ ПРОВЕРКА;
10 ЕСЛИ СТЫК НЕИСПРАВЕН TO ОТПЕЧАТЬ ‘СТЫК НОМЕР’ ,Н, ‘НЕИСПРАВЕН’.
20 ЕСЛИ ВПЕРЕДИ ТУПИК TO ОТПЕЧАТЬ ‘ЛИНИЯ ПРОВЕРЕНА. РО-1 РАБОТУ ЗАКОНЧИЛ’. ИНАЧЕ: РЕЛЬС;
ЗАКОНЧИТЬ;
:ПРОВЕРКА;
Задание 4.2. Robot PO-1 должен проверить и социумь
46
Все стыки на новый ветке. Обнаружив неисправный стык, робот должен опмещать его номер и расстояние до него (в метрах). После окончания проверки нужно опмещать стык во время перемножения двух натуральных чисел в следующем виде:
ЗАПОМНИТЬ СЧЕТ;
10 СЛОЖИТЬ 1 С СЧ И ПРИСВОИТЬ СЧ;
20 СЛОЖИТЬ А С ПР И ПРИСВОИТЬ ПР;
30 ЕСЛИ СЧ РАВНО В ТО ОТПЕЧАТАТЬ ПР: ИНАЧЕ СЧЕТ;
ЗАКОНЧИТЬ;
ЗАПОМНИТЬ УМНОЖ;
10 0 ПРИСВОИТЬ СЧ;
20 0 ПРИСВОИТЬ ПР;
30 ЕСЛИ СЧ РАВНО В ТО ОТПЕЧАТАТЬ ПР ИНАЧЕ :СЧЕТ;
ЗАКОНЧИТЬ;
Эта процедура перемножает значения имен A и B и печатает произведение. Проверьте это на конкретных примерах.
Мы уже несколько раз встречали программы, в которых нужно было многократно повторять выполнение одного или нескольких предписаний. Это не случайно: именно такие повторяющиеся действия целесообразно поручать автоматам, поэтому среди задач, решаемых на ЭВМ, повторение встречается очень часто.
До схх пор мы организовали повторяющиеся действия при помощи условий оператора и вызова процедуры: многократно повторяющая процедура вызвала сама себя до тех пор, пока сравнитель успешный оператор. Однако в Робике и в большихстве других языков есть специальное предписание для организации повторения — Циклическое предписание (посмотрите соответствующее диаграмму — с. 47).
Работает эта конструкция так: предписание, стоящее после слова ПОВТОРЯТЬ, будет использоваться снова и снова до тех пор, пока условие остается истинным. Иначе говоря, машина работает с этим предписанием так: сначала, как и в условиях предписания, проверяется успешно. Если оно ложно, то предписание вообще не исполняется.
Если условие истинно, то предписание, стоящее после слова ПОВТОРЯТЬ, исполяется, после чего снова проверяется успешно. Если оно остается истинным, то предписание исполяется снова — и так повторяется до тех пор, пока условие не оказывается сгущенным. Если оно и ко гда не станет ложным (а такое случае при неправильном составлении программы), то машина будет вновь и вновь исполнять предписание до выключения или аварии — возникнет неприятная ситуация, называемая зацикливанцем. С примерами мы столкнемся на следующих уроках.
С помощью циклического оператора проверку умножения можно записать несколько изящнее:
ЗАПОМНИТЬ СЧЕТ;
10 СЛОЖИТЬ 1 С СЧ И ПРИСВОИТЬ СЧ;
20 СЛОЖИТЬ А С ПР И ПРИСВОИТЬ ПР;
ЗАКОНЧИТЬ;
ЗАПОМНИТЬ УМНОЖ;
10 ПРИСВОИТЬ СЧ;
20 ПРИСВОИТЬ ПР;
30 ПОКА СЧ МЕНЬШЕ В ПОВТОРЯТЬ :СЧЕТ;
40 ОТПЕЧАТАТЬ ПР:
ЗАКОНЧИТЬ;
Однако и у этой процедуры есть существенные недостатки: она переможает только значения имен A и B. Для того чтобы переможить значения других имен, или просто два числа, их необходимо преждевременно именам A и B.
Это не достаточно, если использовать механизм параметров. Параметры — это имена, которые перечисляются в скобках после имены процедуры в директиве ЗАПОМНИТЬ (посмотрите на диаграмму Запоминание процедуры в № 10, с. 57). Значения и этих имен перечисляются в таких же скобках при выборе процедуры. Например, если описана
47
Сложение:
СЛОЖИТЬ выражение С выражение
И ПРИСВОИТЬ имя ;
К
Вычитание:
ВЫЧЕСТЬ выражение ИЗ выражение
И ПРИСВОИТЬ имя ;
К
Условное предложение:
ЕСЛИ условие TO безусловное предложение
ИНАЧЕ предложение К
Циклическое предложение:
ПОКА условие ПОВТОРЯТЬ предложение К
Условие:
БОЛЬШЕ МЕНЬШЕ РАВНО НЕ РАВНО
нище проедуры КРОЛИК начинать так:
ЗАПОМНИТЬ КРОЛИК (А, В, С);
то при вызове этой проедуры мы можем написать:
ВЫЗВАТЬ ПРОЩЕДУРУ КРОЛИК
(10, ‘ХВОСТ’, НОМ);
В этом случае имя А получит значение 10, имя В — значение ‘ХВОСТ’, а имени С будет присвоено такое же значение, какое было у имени НОМ.
Попробуем снова описать проедру УМНОЖ — на этот раз с использованием параметров (procedура СЧЕТ остается без изменений):
ЗАПОМНИТЬ УМНОЖ (А, В);
10 0 ПРИСВОИТЬ СЧ;
20 0 ПРИСВОИТЬ ПР;
30 ПОКА СЧ МЕНЬШЕ В ПОВТОРЯТЬ : СЧЕТ;
40 ОТПЕЧАТАТЬ ПР;
ЗАКОНЧИТЬ;
Теперь для того чтобы переменность 47 и 34, достаточно написать:
УМНОЖ (47, 34);
А вызов этой же проедуры для пере-
множения значений имен Т и К будет выглядеть так:
:УМНОЖ (T, K);
Задание 4.3. Описать проедру ДЕЛ с двумя параметрами. Проедура должна печать и а с мное и остаток от деления первого параметра на второй, например, при вызове
:ДЕЛ (28,5);
ЭВМ должна отпечатать:
ЧАСТНОЕ=5, ОСТАТОК=3
Задание 4.4. Описать проедру НОД с двумя параметрами для вычисления наиболее общего делителя двух натуральных чисел (см. «Квант», 1970, № 9, с. 48).
Итак, мы познакомились с основными конструкциями языка Робик. Разумеется, это учебный, упрощенный язык, большой программы на нем не написшь, но также понятия, как операторы и директивы, и значения, проедуры и параметры, условия операторы и циклы, предписания присваивания и печати очень пригодятся нам при изучении более сервисных и интересных языков.
Г. Звеницородский