Учебное пособие по языку ФОРТ
- Автор: ИТФ «Технофорт»
- Жанр: Современные российские издания / Литература ХX века (эпоха Социальных революций) / Программирование: прочее / Forth
- Дата выхода: 1993
Читать книгу "Учебное пособие по языку ФОРТ"
14. Форматный вывод чисел
В языке Форт можно просто менять систему счисления, используемую при вводе и выводе информации. Переменная "BASE" хранит основание текущей системы счисления. Для установки текущей системы имеются слова:
"HEX" - шестнадцатеричная,
"DECIMAL" - десятичная.
Иногда к ним добавляют:
"BINARY" - двоичная,
"OCTAL" - восьмеричная.
Например, слово "HEX" определено так
: HEX 16 BASE ! ;
Установленная система счисления остается текущей до следующего изменения. При загрузке Форт-системы устанавливается десятичная система.
Описываемые ниже слова работают с буфером вывода, в котором формируется внешнее представление числа в виде строки символов. Основным преобразователем разрядов числа в символы является слово "#". Оно делит двойное число с вершины стека на основание текущей системы счисления, заменяет его на стеке получившимся частным (тоже двойной длины), а остаток переводит в литеру и записывает в буфер при помощи слова "HOLD". При этом указатель буфера продвигается на одну позицию. Форматное преобразование должно начинаться словом "<#", которое устанавливает указатель на конец буфера, так как формирование строки идет от конца. Слово "HOLD" можно использовать и для вставки во внешнее представление числа желаемых дополнительных символов. Слово "#>" завершает преобразование и помещает в стек адрес сформированной в буфере строки литер и ее длину.
Полный перевод числа сразу выполняет слово "#S", которое оставляет на стеке двойной нуль — результат последнего деления.
Для примера можно разобрать определение слова "D." :
: #S ( d --> 0 0 )
BEGIN # 2DUP 0 0 D= UNTIL ;
: SIGN ( n --> ) ( вывод знака минус )
0< IF C" - HOLD THEN ;
: D. ( d --> )
2DUP DABS
<# #S ROT SIGN #>
TYPE SPACE DROP ;
Слово "TYPE" выводит символы, которые составляют число. Для того, чтобы вставить пробел между числом и приглашением ok, добавлено слово "SPACE".
Для примера создадим два слова форматного вывода.
Первое печатает номер телефона в стандартном виде:
: .PHONE ( d --> )
<# # # C" - HOLD
# # C" - HOLD #S #> TYPE ;
То есть при вводе
2333410. .PHONE
получим 233-34-10
При помощи второго слова ".TABLEAU" можно выводить результаты марафонского забега, замеренного с точностью до сотых долей секунды; например, при вводе
946293. .TABLEAU
получим 2ч37м42.93с
Введем два вспомогательных слова. Слово "SIXI" устанавливает шестеричную систему счисления. Слово "#MS" выдает минуты или секунды
: SIXI ( --> )
6 BASE ! ;
: #MS ( d --> d/60 )
# SIXI # DECIMAL ;
Слово ".TABLEAU" собственно и выводит результаты забега
: .TABLEAU ( d --> )
<# C" с HOLD # #
C" . HOLD #MS
C" м HOLD #MS
C" ч HOLD #S #> TYPE ;