Начальный курс программирования на языке Форт

         

ФОРМИРОВАНИЕ ЧИСЕЛ ДВОЙНОЙ ДЛИНЫ БЕЗ ЗНАКА


Приведенные ниже слова: 8200.00 12/31/86 372-8493 6:32:59 98.6

иллюстрируют типы форматов вывода, которые вы можете создать, определив ваши собственные слова «форматного вывода» Форта. Рассмотрим этот вопрос подробнее.

Самое простое определение форматного вывода вы можете написать следующим образом: : UD. ( ud -- ) <# #S #> TYPE ;

UD. предназначено для вывода числа двойной длины без знака. Слова <# и #> (СКОБКА-ЧИСЛО и ЧИСЛО-СКОБКА) означают начало и конец процесса преобразования числа. В данном определении весь перевод осуществляется единственным словом #S (ЧИСЛА). #S преобразует значение из стека в символы кода ASCII. По этой команде формируется столько цифр, сколько их необходимо для представления числа: незначащие нули она не выводит. Однако всегда выводится по крайней мере одна цифра: если значение равно нулю, то выводится нуль, например: 12,345 UD. 12345ok

12, UD. 12ok 0. UD. 0ok

Слово TYPE (ПЕЧАТЬ) выводит символы, которые составляют число. Заметьте, что между числом и приглашением ok нет пробела. Для того чтобы вывести пробел, вы должны просто добавить слово SPASE, как это сделано в приведенном ниже примере:: UD. ( ud -- ) <# #S #> TYPE SPACE ;

Предположим, что у вас в стеке имеется номер телефона, выраженный 32-разрядным целым числом, скажем 372-8493 (помните, что дефис указывает NUMBER на то, что число нужно воспринимать как значение двойной длины. В вашей системе это может быть точка). Вы хотите определить некоторое слово, которое будет представлять такое число снова в виде телефонного номера. Назовем его .ТЕЛЕФОН (для вывода номера телефона) и запишем следующее определение:: .ТЕЛЕФОН ( ud - ) <# # # # # 45 HOLD #S #> TYPE SPACE ;

Ваше определение .ТЕЛЕФОН содержит все компоненты слова UD. и некоторые другие. Слово Форта #(ЧИСЛО) выводит только одну цифру. Определение форматного вывода числа берет цифры выводимого числа в обратном порядке, поэтому выражение «# # # #» выводит четыре крайние правые цифры номера телефона.
Определение в данном случае может выглядеть следующим образом1:: SEXTAL 6 BASE ! ; : :00 ( ud -- ud) # SEXTAL # DECIMAL ASCII : HOLD ; : СЕКУНДЫ <# :00 :00 #S #> TYPE SPACE ;

Для форматного вывода секунд и минут вы используйте слово :00. Как секунды, так и минуты вычисляются по модулю 60, значит, правой цифрой может быть любая цифра до девяти, а левой - цифра от нуля до пяти включительно. Поэтому в своем определении :00 вы преобразуете первую цифру (она является правой) как десятичное число, затем переходите по слову SEXTAL в шестиричную систему (с основанием 6) и преобразуете левую цифру, после чего возвращаетесь в десятичную систему и вставляете символ двоеточия. После того как слово :00 преобразует секунды и минуты, #S переведет оставшиеся часы. Так, если у вас в стеке время задано как 4500 с, то в результате вы получите: 4500. .СЕКУНДЫ 1:15:00 ok

1 Для начинающих. См. полезный прием, описанный на с. 164.

(Если продолжительность дня измерять в секундах, то 86400 с - это слишком много для 16-разрядного числа.)

В табл. 7.2 сведены слова Форта, использующиеся при форматизации чисел. (Обратите внимание на условные обозначения в конце таблицы, которые напоминают вам о смысле символов "n", "d" и т. д.)

Таблица 7.2



Форматирование чисел
<# Начало процесса преобразования числа. В стеке должно находиться

число двойной длины без знака # Преобразование одной цифры и помещение ее в выходную символьную строку. # доставляет цифру в ЛЮБОМ СЛУЧАЕ - если вы подали этому слову на вход неверное цифровое значение, то и в этом случае вы получите нуль для каждого # #S Преобразование числа (цифры за цифрой) до тех пор, пока в результате не получится нуль. Всегда доставляется по крайней мере одна цифра (нуль, если число равно нулю) с HOLD Вставка в форматируемую символьную строку на текущую позицию символа, значение которого в коде ASCII находится в стеке n SIGN Вставка знака "-" в выходную строку в том случае, если третье число в стеке отрицательное (это число из стека выбирается - см.


сноску в следующем разделе) #> Завершение преобразования числа и помещение в вершине стека счетчика символов и адреса (именно эти аргументы требуются для TYPE)

ВЫРАЖЕНИЕ СОСТОЯНИЕ СТЕКА ТИП АРГУМЕНТОВ <# ... #> ( d -- а u) или 32-разрядный без знака ( u 0 - а и) 16-разрядный без знака

<# ... ( |d| -- а u) 32-разрядный со знаком, n SIGN #> где |d| является абсолют- или мым значением d, a n - верхней ячейкой d ( |n| 0 -- а u) 16-разрядный со знаком, где |n| - абсолютное значение n

Условные обозначения: n, n1 ... - 16-разрядные числа со знаком; а - адрес; d, d1 ... - 32-разрядные числа со знаком; u, u1 ... - 16-разрядные числа без знака; с - значение символа в коде ASCII.


Содержание раздела