В этой главе вы научитесь писать программы таким образом, чтобы компьютер мог «принимать решения». Теперь вы будете воспринимать свой компьютер как довольно сложное устройство, а не просто как обычный калькулятор.
Запишем на Форте простой оператор принятия решения. Допустим, вы программируете механический упаковщик яиц в картонные коробки. Некоторое механическое устройство уже подсчитало число яиц, находящихся в ленте конвейера, и поместило это число в стек. В соответствии со следующим предложением на Форте:
12 = IF УПАКОВАТЬ THEN
осуществляется проверка: равно ли число в стеке 12, и ЕСЛИ (IF) да, ТО (THEN) выполняется слово УПАКОВАТЬ. Если число не равно 12, то выполняются слова, которые следуют за THEN.
Слово = выбирает два значения из стека и сравнивает их, чтобы проверить, равны ли они.
Если условие истинно (да), то будут выполнены слова, следующие за IF, если ложно — то слова, следующие за THEN.
Попытаемся выполнять этот оператор. Определим, например, следующее слово:
: ?ПОЛНА ( число-яиц ) 12 - IF . " КОРОБКА ПОЛНА " THEN ; ok 11 ?ПОЛНА ok 12 ?ПОЛНА КОРОБКА ПОЛНА ок
Заметим, что оператор IF ... THEN должен содержаться только внутри определения (через двоеточие), так что вы не можете использовать его в режиме калькулятора.
Абстрагируйтесь от всех значений, которые заключены в словах IF (ЕСЛИ) и THEN (TO) в естественном языке В Форте они выражают то, что операторы, следующие за IF. выполняются лишь в случае, если условие истинно, а операторы, следующие за THEN, всегда. Это равносильно тому, что вы прикажете компьютеру после принятия решения (выполнять или не выполнять слова, следующие за IF, в зависимости от того, истинно условие или ложно) продолжить выполнение остальной части определения (следующей за THEN). В нашем примере после THEN находится единственное слово ;, которое означает конец определения.
Если вам удобно, сразу представляйте запись в постфиксной форме. Вместо традиционного применения выражения IF:
IF ( условие ) THEN ( действие ) ENDIF
мы имеем
( условие ) IF ( действие ) THEN
Помните, что каждому слову IF должно соответствовать свое THEN, причем в пределах одного и того же определения
В результате выполнения операции сравнения флаг1 на самом деле вверх не выбрасывается, как это показано на рисунках, а его значение заносится в стек, подобно любому другому аргументу. Истина представляется -1 (отрицательной единицей), а ложь - 0 (нулем)2. Слово IF берет флаг из стека и использует его.
Попытайтесь ввести следующую фазу с терминала и пусть слово . выведет значение; представляющее флаг:
12 12 = . -1 ok Да, 12 равно 12 11 12 = . 0 ok Нет, 11 не равно 12
Можно вводить знаки операций сравнения непосредственно с вашего терминала, как в приведенном выше примере, но помните, что оператор IF ... THEN должен целиком находиться в пределах одного определения, поскольку его выполнение сопряжено с ветвлением программы. Слово IF будет воспринимать -1 как значение флага «истина», а 0 — как «ложь». Перед IF может стоять еще одно слово NOT3, которое меняет значение флага в стеке на противоположное:
О NOT .-1 ok -1 NOT . 0 ok
Слово NOT позволяет изменить условие IF на обратное. Таким образом, мы можем записать
: ?ДВЕНАДЦАТЬ ( n -- ) 12 = NOT IF . " Не двенадцать. " THEN ;
1 Для начинающих. На компьютерном жаргоне значение, которое один фрагмент программы оставляет другому в качестве сигнала, называется флагом.
2 Для пользователей систем, созданных до введения Стандарта-83. В более ранних системах истина представлялась как 1.
3 Для систем фаг-Форт. Используйте в этих целях 0 = .
и если параметр n не будет равен 12, на печать будет выводиться фраза «Не двенадцать».
Использование стека в Форт-системе для передачи значений флага — одно из наиболее удачных решений, привлекательных прежде всего своей простотой. Вы можете, например, передать флаг в качестве аргумента другому слову (если нужно, то за пределы определения):
: .ДА? ( ? — ) IF ." Да " THEN ; 12 12 = .ДА? Да ok
(Знак вопроса в стековом комментарии означает флаг.) Можете ли вы назвать еще такой язык, который дает возможность записывать условие в одной процедуре, а оператор IF — в другой?
Ниже приводится неполный список операций сравнения, которые вы можете применять перед выполнением оператора IF ... THEN1
= равно <> не равно < меньше > больше 0= равно-нулю 0< меньше—нуля 0> больше-нуля
Слова < и > требуют такого же расположения аргументов в стеке, как и арифметические операции:
Рассмотрим другой пример. Проверим, не превышает ли температура лабораторного бойлера допустимого значения. Значение температуры нужно получить в стеке
: ?ЖАРКО ( температура — )
220 > IF ." ОПАСНО! Уменьшите нагрев" THEN ;
1 Для тех, у кого нет <>. Используйте— (минус). См. разд. «Секреты оператора IF» в данной главе.
Если значение, находящееся в стеке больше, чем 220, то на терминал будет выведено сообщение об опасности. Вы можете выполнить это слово автономно, наорав на клавиатуре сначала определение, а затем и само слово. Перед словом вы должны набрать значение температуры:
290 ?ЖАРКО ОПАСНО! Уменьшите нагрев ok 130 ?ЖАРКО ок
Вы можете проверить, является ли некоторое число нулем, отрицательным или положительным, с помощью трех следующих слов: 0=, 0<, 0>.. Они эквивалентны выражениям 0 = , 0 <, 0 > и отличаются лишь эффективностью предлагаемых операций.
Форт позволяет вам написать в рамках оператора IF с помощью слова ELSE (ИНАЧЕ) альтернативное выражение, В приведенном ниже примере дается определение, которое проверяет, является ли заданное число правильной календарной датой:
: ?ДЕНЬ ( день) 32 < IF ." Путь открыт " ELSE ." Объезд " THEN ;
Если число в стеке меньше 32, то будет выдано сообщение «ПУТЬ ОТКРЫТ». В противном случае выдается сообщение «ОБЪЕЗД».

Представьте себе, что IF переключает стрелку железнодорожной колеи в зависимости от результатов проверки условия, после чего выполнение пойдет по одному из двух маршрутов, но в любом случае рельсы сойдутся у слова THEN. В компьютерной терминологии изменение путей выполнения операторов называется ветвлением 1.
Рассмотрим еще один пример. Как известно, деление любого числа на нуль невозможно, поэтому если вы попытаетесь выполнить эту операцию на каком-нибудь компьютере, то получите неправильный ответ.
Можно определить некоторое слово, выполняющее деление в том случае, если делитель не равен нулю2:
: /ПРОВЕРКА ( числитель знаменатель -- результат )
DUP 0= IF ." Знаменатель нуль " DROP ELSE / THEN ;
Заметим, что сначала вы должны с помощью DUP создать копию знаменателя, так как выражение
0= IF
в процессе своего выполнения уничтожит его. Кроме того, слово DROP удаляет знаменатель, если деление не выполняется, так что независимо от того, будет ли выполняться деление, состояние стека в обоих случаях окажется одинаковым, т. е. независимо от того, выполнялась ли часть IF или ELSE, в стеке будет оставлен один аргумент. (Случай, когда указанные две части оставляют в стеке различное число аргументов, являются источником самых коварных ошибок: иногда при этом ваша программа работает, а иногда — нет.)
Имеется возможность помещать оператор IF ... THEN (или IF ... ELSE ... THEN) внутрь другого оператора IF ... THEN. Фактически вы можете создать оператор любой степени вложенности при условии, что каждый оператор IF будет иметь соответствующий оператор THEN.
1 Для специалистов. В Форте нет оператора GOTO. Если вы не можете обойтись без этого оператора немного подождите. К концу книги вам станут ясны отрицательные последствия его буквального применения. Вместо GOTO мы предложим вам средства, позволяющие сделать ваши программы более корректными.
2 Для специалистов. Как вы увидите ниже, существуют лучшие способы выполнения этих действий.
Рассмотрим следующее слово, которое определяет сорт яиц для продажи в зависимости от их размера (очень крупные, крупные и т. д.), по весу в унциях1 на дюжину2:
: РАЗМЕР-ЯИЦ ( унций-на-дюжину -- )
DUР 18 < IF . " Брак " ELSE
DUP 21 < IF ." Мелкие " ELSE
DUP 24 < IF ." Средние " ELSE
DUP 27 < IF ." Крупные " ELSE
DUP 30 < IF ." Очень крупные " ELSE
." Ошибка "
THEN THEN THEN THEN THEN DROP ;
Загрузив однажды слово РАЗМЕР-ЯИЦ, вы можете получать различные результаты, например3:
23 РАЗМЕР-ЯИЦ Средние ок 29 РАЗМЕР-ЯИЦ Очень крупные ок 40 РАЗМЕР-ЯИЦ Ошибка ок
Обратите внимание на некоторые особенности работы со словом РАЗМЕР-ЯИЦ. Все определение является совокупностью вложенных операторов IF ... THEN. Эти операторы вложены друг в друга, как матрешки. Пять слов THEN, расположенных внизу, соответствуют пяти словам IF, расположенным в обратном порядке:
Отметим также, что в конце определения должно быть слово DROP, которое позволит избавиться от лишнего исходного значения.
1 1 унция = 28,3 г. — Примеч. пер.
2 Для работающих за терминалом. Поскольку приведенное определение уже достаточно сложное, рекомендуется вводить его из блока на диске.
3 Для любознательных. Ниже приводится официальная таблица, согласно которой производится определение сорта яиц:
очень крупные 27—30 крупные 24—27 средние 21—24 мелкие 18—21
Можно ли удалить последний оператор DUР с тем, чтобы число убиралось из стека последней операцией сравнении, и оператор DROP? Нет, а почему?
Наше определение организовано таким образом, что оно легко воспринимается человеком. Большинство программирующих на Форте скорее смирятся с потерей памяти в блоке из-за пропусков между словами (блоков много), чем допустят то, чтобы их программы выглядели запутаннее, чем они есть на самом деле,
Мы уже знаем, что IF принимает -1 за истину. Программирующие на Форте часто пользуются тем, что на самом деле IF воспринимает как истину любое ненулевое значение и только нуль кал ложь . Обычно вы над этим не задумываетесь, но бывают ситуации, когда такая реализация представляет интерес.
Так, если вы проверяете некоторое число только на равенство нулю, то операция сравнения вам не нужна. Определение рассмотренного нами слова /ПРОВЕРКА может поэтому принять более прослою форму:
: /ПРОВЕРКА ( числитель знаменатель -- результат)
DUP IF / ELSE ." Знаменатель нуль " DROP THEN ;
Или, допустим, вам нужно узнать, является ли некоторое число в точности кратным десяти, например 10, 20, 30, 40 и т, д. Как известно, выражение
10 MOD
осуществляет деление на 10 и возвращает только остаток. А при вычислении кратного в остатке должен быть нуль, поэтому выражение
10 MOD 0=
соответствует флагу «истина» или «ложь».
1 Для сомневающихся. Чтобы проверить это, введите следующий текст:
: ТЕСТ ( ? ) IF ." He нуль " ELSE ." Нуль " THEN ;
Даже несмотря на то, что в данном определении нет операции сравнения, вы получите такой результат:
0 ТЕСТ Нудь ок 1 ТЕСТ Не нуль oк 8000 ТЕСТ Не нуль ok
Далее, слово — (минус) вы зачастую можете использовать в качестве операции сравнения, чтобы проверить на равенство два значения. Если вы выполняете операцию вычитания над двумя одинаковыми числами, то получаете нуль (ложь), но если при вычитании числа не равны, то вы получаете не нулевое значение (истину). В некоторых Форт-системах по этой причине отсутствует слово <>. Тем не менее <> не только более удобно, чем «не равно», но и оставляет на вершине стека в качестве истинного значения отрицательную единицу. Как вы увидите в гл. 7, операция сравнения имеет свои достоинства (в сравнении с арифметическим вычитанием).
Форт (как и большинство языков программирования) дает вам возможность комбинировать флаги. Возьмем, к примеру, комбинацию по принципу «или». Даны значения двух флагов. Если хотя бы одно из них истинно, то Форт-система выполнит действие, если оба значения ложны — не выполнит.
Поясним изложенное на следующем примере/Допустим, вы хотите вывести имя АРТИШОК в том случае, если исходное число либо отрицательно, либо кратно 10. Как это сделать на Форте? Рассмотрим выражение:
Ниже приводятся значения, которые получаются при исходном значении, скажем равном 30:
Флаги логически складываются? Что же происходит при таком сложении флагов? Вы получаете в результате истину, если хотя бы один из флагов (или сразу оба) истинны. Ниже приводятся четыре возможных сочетания двух флагов и результаты операции OR (ИЛИ) над ними.
Определение в нашем простом примере, следовательно, будет выглядеть так:
: ОВОЩ ( n) DUP 0< SWAP 10 MOD 0= OR IF ." Артишок " THEN ;
Ниже приводится улучшенный вариант приведенного выше оп-ределения слова ?ДЕНЬ. Предыдущее определение браковало только элементы, значение которых превышало 31, а отрицатель-ные значения не допускались вовсе.
: ?ДЕНЬ ( день) DUP 1 < SWAP 31 > OR IF ." Ошибка " ELSE ." Спасибо " THEN ;
(Во многих Форт-системах для таких случаев предусмотрено слово WITHING (В ИНТЕРВАЛЕ). См. вопросы в конце главы.)
Другой комбинацией флагов является комбинация по принципу И. Здесь для получения истины оба флага должны быть истинны. Например, чтобы сделать сквозняк, нужно открыть обе двери: входную И выходную. Сравните с комбинацией ИЛИ: если входная ИЛИ выходная дверь (или сразу обе) будут открыты, то налетят мухи1.
Форт включает слово AND (И), Ниже приводится таблица результатов операции AND над двумя флагами:
1 Для любознательных и начинающих. Применение слов, аналогичных «или»' и «и», при создании некоторых фрагментов прикладных программ называется логикой. Нотация для логических операций была разработана в XIX в. Дж. Булем. Этот раздел математики теперь называют булевой алгеброй. Таким образом, термин «булевский флаг» (или даже «булевская переменная») просто обозначает флаг, который будет использован в логической операции.
Иными словами, только пара значений «истина» дает в результате истину.
Допустим далее, что мы подбираем картонный ящик для дисковода, имеющего следующие параметры: высота — 6 дюймов, ширина — 19 дюймов, длина — 22 дюйма. Для того чтобы дисковод поместился в ящик, должны быть выдержаны все параметры: и высота, и ширина, и длина. Если параметры ящика заданы в стеке, то можно написать следующее определение:
: ОБЪЕМ ( длина ширина высота -- )
6 > ROT 22 > ROT 19 > AND AND
IF ." Подходит " THEN ;
Проверить слово ОБЪЕМ можно следующей фразой:
23 20 7 ОБЪЕМ Подходит ок
Третий вид комбинации флагов называется исключающим ИЛИ. В Форте эта операция выполняется словом XOR. Результат получается истинным только в тех случаях, когда хотя бы один из флагов истинен, но не оба сразу.
Ниже приводится пример применения такой операции. Слово ?ЗНАКИ выбирает из стека два числа. Если их знаки совпадают (оба числа положительны или оба отрицательны), то выдается сообщение «Знаки совпадают», в противном случае выдается сообщение «Знаки разные»:
: ?ЗНАКИ ( nl n2 — )
0< SWAP 0< XOR IF ." Знаки разные "
ELSE ." Знаки совпадают • THEN ;
По мере усложнения ваших прикладных программ вы можете писать операторы Форта в виде текста на естественном языке в постфиксной форме, что очень легко читается. Только определите где-нибудь отдельные слова, находящиеся внутри определения, которые будут проверять некоторое условие и оставлять в стеке флаг. Следующий пример: вам предстоит выполнить фотосъемку, но прежде необходимо проверить освещенность И наличие пленки в фотоаппарате:
: ФОТОСЪЕМКА ?СВЕТ ?ПЛEHKA AND IF СНИМОК THEN ;
Другой фрагмент, который мажет быть использован в программе обработки данных:
: СЛУЖБА-ЗНАКОМСТВ C-ЮМОPOM ОТЗЫВЧИВЫЙ AND
ЛЮБИТ-ИСКУССТВО ЛЮБИТ-МУЗЫКУ OR AND
КУРИТ NOT AND
IF ." У нас имеется подходящая для вас кандидатура " THEN ;
Здесь такие слова, как С-ЮМОРОМ и ОТЗЫВЧИВЫЙ, предназначены для выполнения проверки записи из дискового файла, содержащего информацию о возможных партнерах.
Обращаем ваше внимание на то. что до тех пор, пока мы не oбясним некоторые тонкости использования слов NOT, OR, AND, и XOR, их следует применять только с аргументами, являющимися логическими флагами, т.е. с нулем или отрицательной единицей. Все рассмотренные выше операции сравнения (за исключением операции « — », применяемой вместо «не равно») оставляют в стеке логические флаги Поэкспериментируйте, чтобы посмотреть, как выполняются команды NOT, OR, AND и XOR с числами, отличными от 0 и -1
DUP
Слово ?DUP дублирует вершину стека только в том случае, если там находится нулевое значение. Это помогает избавиться от лишних слов. Например, определение
: ?EMIT ( с -- ) DUP IF EMIT ELSE BROP THEN ;
выдает на печать символ с любым кодом (кроме 0) Применяя ?DUP, можно сократить наше определение:
: ?EMIT ( с -- ) ?DUP IF EMIT THEN ;
ABORT"
В каком-то месте сложной прикладной программы может быть обнаружена ошибка (например, деление на нуль), которая проявляется в одном из слов низкого уровня. Когда это происходит, вы, естественно, хотите, чтобы компьютер прекратил вычисления и чтобы из стека были удалены все данные.
Если вы предполагаете, что подобная ошибка может произойти, можно воспользоваться оператором аварийного прекращения выполнения задачи ABORT". Этот оператор проверяет значение флага я вершине стека и в случае его истинности прерывает вычисления. Оператор очищает стек и возвращает управление на терминал до поступления какого-либо сообщения. Оператор ABORT" также выводит имя последнего слова, обработанного текстовым интерпретатором, и предусмотренное вами для такой ситуации сообщение1.
Проиллюстрируем изложенное примером:
: /ПРОВЕРКА ( числитель -знаменатель — результат) DUP 0= ABORT" Знаменатель нуль " / ;
Р этом определении, если знаменатель равен нулю, то любое оказавшееся в вершине стека, удаляется из последнего, а на терминал выводится сообщение:
8 0 /ПРОВЕРКА /ПРОВЕРКА Знаменатель нуль
Теперь в порядке эксперимента попытайтесь поместить слово /ПРОВЕРКА внутрь другого определения:
: ОБОЛОЧКА /ПРОВЕРКА ." Ответ равен " . ;
1 Для профессионалов. В Форте, кроме того, имеются слова. QUIT (ОКОНЧИТЬ), которое вызывает прекращение работы программы, но не очищает стек, и ABORT (ПРЕРВАТЬ), которое выполняет те же действия, что и QUIT, очищает стек но не выводит сообщение Мы рассмотрим эти слова в гл 9
и введите
8 4 ОБОЛОЧКА Ответ равен 2 Ок 8 0 ОБОЛОЧКА ОБОЛОЧКИ Знаменатель нуль
Обратите внимание на то, что когда слово /ПРОВЕРКА аварийно прерывает работу с помощью оператора ABORT", оставшаяся часть ОБОЛОЧКА пропускается. Заметьте также, что выводится имя ОБОЛОЧКА, а не /ПРОВЕРКА.
Ниже приводится перечень слов Форта, рассмотренных в настоящей главе.
IF xxx IF: ( ? -- ) Выполнение ххх, вели ? истинно (не
EL5E yyy нулевое значение) , и yyy, - если ?
THEN zzz ложно, zzz выполняется независимо от
выбранного варианта. Выражение ууу
является необязательным.
== ( n1 n2 -— ? ) Занесение в стек истины если n1 и n2 равны.
<> ( n1 n2 -- ? ) Занесение в стек истины, если n1 и п2 не равны.
< ( n1 n2 -- ? ) Занесение в стек истины, если n1 меньше n2.
> ( n1 n2 -- ? ) Занесение в стек истины, если n1 больше n2.
0= ( n -- ? ) Занесение в стек истины, если n является нулем
(то есть истина меняется на ложь и наоборот).
0< ( n -- ? ) Занесение в стек истины, если n отрицательно.
0> ( n -- ? ) Занесение в стек истины, если n положительно.
NOT ( ? -- ? ) Изменение значения флага на противоположное.
AND ( n1 n2 -- И ) Доставление логического значения, согласно
таблице операции AND.
OR ( n1 n2 -- ИЛИ) Занесению в стек логического значения,
согласно таблице операции OR.
XOR ( n1 n2 -- Занесение в стек логического знамения,
ИСКЛЮЧ-ИЛИ ) согласно таблице операции XOR.
?DUP ( n -- n n ) или Дублирование вершины стека только в том слу-
( 0 -- 0 ) чае, если n является ненулевым значением.
ABORT" ххх" ( ? -- ) Если значение флага истинно, то вывод
последнего проинтерпретированного слова и
за ним заданного текста. Кроме этого очищает стеки
пользователя и возвращается управление на терминал.
Если в стеке ложь, то не предпринимается никаких действий.
Обозначения: n,n1 ... 16-раэрядные числа со знаком. ? - логическое значение (флаг)
ABORT. Часто встречающийся в информатике термин, обозначающий оператор, который моментально прекращает вычисления при возникновении аварийной ситуации. Его выполнение позволяет предотвратить получение бессмысленных результатов и, возможно, нарушение функционирования системы.
Ветвление. Изменение линейной последовательности вычислений в зависимости от условий, возникающих в процессе выполнения программы.
Вложенные структуры. Структуры ветвления, «вложенные» одна в другую.
Логика. Система представления условий в форме «логических переменных», которые могут быть либо истинными, либо ложными, и комбинаций этих переменных посредством таких логических операций, как «и», «или» и «не». Полученное в результате выражение может быть либо истинным, либо ложным.
Логическая операция AND. Два логических значения объединяются таким образом, что если оба они истинны, то и результат получается истинным, в противном случае результат ложный.
Логическая операция «ИСКЛЮЧАЮЩЕЕ-ИЛИ». Два логических значения объединяются таким образом, что если хогя бы одно из них (но не оба сразу) истинно, то результат является истинным, в противном случае результат ложный.
Логическая операция OR. Два логических значения объединяются таким образом, что если хотя бы одно из них истинно, то результат является истинным, в противном случае ложный.
Операция сравнения. Одно значение сравнивается с другим (например, определяется, не больше ли одно значение, чем другое) и устанавливается соответствующее значение флага. Последнее, как правило, проверяется условным оператором. В Форте при сравнении значение флага остается в стеке.
Условный оператор. Слово, такое, как IF, которое устанавливает последовательность вычислений в зависимости от некоторого условия (истина или ложь).
Флаг. Число, сигнализирующее о том, что некоторое известное условие является истинным или ложным.
4.1. Какое значение оставляет в стеке выражение 0= NOT при следующих значениях аргумента- 1, 0, 200?
4.2. Объясните, как поведет себя артишок при указанных выше значениях
4.3. Определите слово с именем РАЗРЕШЕНИЕ, которое берет из стека значение, соответствующее возрасту некоторого лица, и выводит одно из двух сообщений (согласно установленным в вашей местности порядкам)-
Употребление спиртных напитков разрешено По возрасту не положено
4.4. Определите слово с именем ПРОВЕРКА-ЗНАКА, которое проверяло бы число, находящееся в стеке, и выдавало бы одно из трех сообщений- «ПОЛОЖИТЕЛЬНОЕ», «НУЛЬ» или «ОТРИЦАТЕЛЬНОЕ».
4.5. Напишите определение <> (не равно), которое в отличие от определения — (минус) всегда оставляло бы в стеке значение «истина» или "ложь"
4.6. Напишите определение XOR, используя другие логические операторы, такие, как AND, OR и NOT.
4.7. В гл 1 мы определили слово с именем STARS, но оно не выполняется правильно с аргументом, равным нулю (В Форт-системах, соответствующих Стандаргу-83, будет выведено 65535 звездочек, в остальных— одна) предложите на основе старого определения новый вариант STARS, который был бы свободен от указанного недостатка.
4.8. Напишите определение слова NEGATE (оно, между прочим, входит о состав Форт-систем), которое меняло бы знак числа в стеке на противоположный (4 - пpи этом становится —4, и наоборот). После этого, используя NEGATE, создайте слово ABS, чтобы поместить в стек абсолютное значение заданного числа n (Слово ABS также есть в вашей системе.)
4.9. Напишите определение слова /UP, которое округляло бы остаток от деления, не равный нулю. (При решении задачи: «Сколько ящиков потребу ется для упаковки п предметов?», для размещения округленного остатка потребуется дополнительный ящик.)
4.10. Напишите определение для слова WITHIN (В ИНТЕРВАЛЕ) которое выбирает из стека три аргумента
( n нижняя-граница верхняя-граница -- )
и помещает в стек истинное значение только в том случае, когда n находится внутри диапазона:
нижняя-граница <= n < верхняя-граница
4.11. Существует игра с угадыванием числа (программируя ее, вы получите больше удовольствия, чем в нее играя). Вначале вы вводите некоторое число в стек, причем можете сохранить это число в тайне, выполнив слово PAGE - которое очищает экран терминала. Затем вы просите своего партнера попытаться угадать задуманное число. Предполагаемое значение играющий должен ввести вместе со словом УГАДАЙ например.
100 УГАДАЙ
Компьютер должен выдать ответ «Слишком большое», «Слишком маленькое» или «Правильно!». Напишите определение для слова УГАДАЙ в предположении, что после нескольких попыток ответа введенные числа будут находиться в стеке. После правильного ответа стек необходимо очистить
4.12. С помощью операторов IF ... ELSE ... THEN напишите определение с именем ПРОПИСЬ, которое выводит число, находящееся в стеке, в виде слов на естественном языке. Диапазон выводимых чисел — от -4 до 4. Если в стеке находится число вне этого диапазона, то должно выдаваться сообщение «Выходит за диапазон». Например:
2 ПРОПИСЬ Дра ок -4 ПРОПИСЬ Минус четыре ок 7 ПРОПИСЬ Выходит за диапазон ок
Создайте по возможности короткое определение. (Указание: слово ABS выдает абсолютное значение числа, находящегося в стеке).
4.13. Используя созданное в упр. 4.10. определение WITHIN, разработайте еще одну игру с угадыванием чисел и назовите ее ЛОВУШКА. По условию игры вы вводите значение, не известное вашему партнеру, после чего он пытается угадать заданное число, вводя два числа, между которыми, по его мнению, заключено искомое значение, например:
0 1000 ЛОВУШКА Между ок 330 660 ЛОВУШКА Между ок 440 550 ЛОВУШКА Вне ок 330 440 ЛОВУШКА Между ок
и т. д. до тех пор, пока ваш партнер не отгадает ответ:
391 391 ЛОВУШКА Вы угадали! ok
Совет: вы можете предусмотреть в своей программе следующее: когда с искомым числом совпадает только одно число из задаваемого интервала, она не будет выдавать «Между».