Код «1234E-2» нам уже знаком, он просто переносит число «1234E-2» в вещественный стек, FVAR оставляет адрес вещественной переменной с этим именем, и в итоге «F!» – записывает значение в адрес. Целочисленное присвоение выглядит по проще, но суть та же. Сначала число идет в стек. Слово VAR также оставляет адрес целочисленной переменной на стеке. А записывает значение по адресу оператор «!» – восклицательный знак. А считывает – «F@» и «@» соответственно. Теперь считаем и выведем на экран значения созданных и инициализированных выше переменных.
VAR @ .
4552249 Ok
Оператор «.» – точка, печатает на экран целочисленное число, а «F.» – вещественное. Вы можете заметить логику Форта по названию операторов, добавив большую букву «F», многие операции становятся применимы к вещественным операндам. Покажем вышесказанное на примере вывода значения вещественной переменной.
FVAR F@ F.
12.340000 Ok
VAR и FVAR – это просто названия, они могут быть любыми – это просто удобное обозначение в стиле Форта. Теперь можем приступить к очередной задачке.
Пример 21. По координатам трех точек, образующих треугольник вычислить его периметр и площадь. Сначала создадим переменные для координат и сторон треугольника.
FVARIABLE FX1
FVARIABLE FY1
FVARIABLE FX2
FVARIABLE FY2
FVARIABLE FX3
FVARIABLE FY3
FVARIABLE FA
FVARIABLE FB
FVARIABLE FC
Так как здесь мы используем только вещественные переменные, то «F» можно опустить и переписать все в одну строку, не забывая о пробелах, но мы этого делать не будем, чтобы следовать единой стилистике обозначения переменных, в учебных целях.
FVARIABLE FX1 FVARIABLE FY1 FVARIABLE FX2 FVARIABLE FY2 FVARIABLE FX3 FVARIABLE FY3
FVARIABLE FA FVARIABLE FB FVARIABLE FC
: B21 ( X1 Y1 X2 Y2 X3 Y3 -> P S ) \ P=(A+B+C)/2 S=SQRT{P*(P-A) *(P-B) *(P-B)}
FY3 F! FX3 F! FY2 F! FX2 F! FY1 F! FX1 F! \ FX1 FY1 FX2 FY2 FX3 FY3 ->
FX1 F@ FY1 F@ FX2 F@ FY2 F@ B20 FDUP FA F! \ A
FX2 F@ FY2 F@ FX3 F@ FY3 F@ B20 FDUP FB F! \ A B
FX1 F@ FY1 F@ FX3 F@ FY3 F@ B20 FDUP FC F! \ A B C
F+ F+ FDUP \ A+B+C=P P
2E F/ \ P (A+B+C)/2=p
FDUP FA F@ F- \ P p p-A
FOVER FDUP FB F@ F- \ P p p-A p p-B
FSWAP FC F@ F- \ P p p-A p-B p-C
F* F* F* FSQRT \ P SQRT{p*(p-A)*(p-B)*(p-C)}=S
;
Строка №1 название слова с комментариями.
Вторая – сохранение координат в соответствующих переменных.
С третьей по пятую – вычисление сторон треугольника с сохранением в переменных A, B, C. Здесь мы не высчитаем расстояния между точками (стороны треугольника), а пользуемся предыдущей задачей, в которой эта проблема решена, просто вызвав ее с параметрами задачи №21.
Шестая строка вычисление периметра и его дублирование
Седьмая вычисление полупериметра.
С восьмой по десятую – вычисление сомножителей в формуле площади.
Одиннадцатая – вычисление площади.
Проверим работу слова на координатах: (1,1; 1,1) (6,1; 1,1) (6,1; 4,1). Это прямоугольный треугольник с катетами 3 и 5.
11E-1 11E-1 61E-1 11E-1 61E-1 41E-1 B21 F. F.
7.5000000 13.830952 Ok
S=3*5/2=15/2=7.5. Гипотенуза равна sqrt(3^2+5^2)= sqrt(9+25)= sqrt(34)= 5,83095. P= 5,83095+3+5= 13,83095.
Что является истиной, то есть задачка запрограммирована корректно.
Если у вас будут проблемы и ошибки введите код в нижеприведенной последовательности.
S" lib\include\float2.f" INCLUDED
: B20 ( X1 Y1 X2 Y2-> R )
FROT F- FDUP F*
FSWAP FROT F- FDUP F*
F+ FSQRT ;
FVARIABLE FX1 FVARIABLE FY1 FVARIABLE FX2 FVARIABLE FY2 FVARIABLE FX3 FVARIABLE FY3
FVARIABLE FA FVARIABLE FB FVARIABLE FC
: B21 ( X1 Y1 X2 Y2 X3 Y3 -> P S ) FY3 F! FX3 F! FY2 F! FX2 F! FY1 F! FX1 F! FX1 F@ FY1 F@ FX2 F@ FY2 F@ B20 FDUP FA F! FX2 F@ FY2 F@ FX3 F@ FY3 F@ B20 FDUP FB F! FX1 F@ FY1 F@ FX3 F@ FY3 F@ B20 FDUP FC F! F+ F+ FDUP S" 2E" >FLOAT DROP F/ FDUP FA F@ F- FOVER FDUP FB F@ F- FSWAP FC F@ F- F* F* F* FSQRT ;
11E-1 11E-1 61E-1 11E-1 61E-1 41E-1 B21 F. F.
Здесь нет комментариев в коде, чтобы избежать ошибок при копировании. Первая строка подключение библиотеки для работы с вещественными числами (тип float2). Далее идет код предыдущего примера, который мы используем (в других языках это называется функция). Затем объявляются переменные где мы сохраняем координаты и вычисляемые длины сторон. И, наконец сжатый код слова, производящий вычисления периметра и площади треугольника, и его вызов с заранее подготовленными параметрами.
Пример 22. Довольно классическая задача по обмену содержимым между двумя переменными. В Форте создание переменных в данном случае даже не обязательна.
: B22 ( A B -> B A) SWAP ;
5 4 B22
Ok ( 4 5 )
Для вещественных аргументов.
: B22 ( A B -> B A) FSWAP ;
Теперь напишем с переменными:
VARIABLE A
VARIABLE B
: B22 ( -> ) \ обмен содержимым двух переменных A и B
A @ B @ A ! B ! ;
Как проверить работу?
15 A ! 50 B ! \ Сначала инициализируем переменные. A=15, B=50
Ok
B22 \ Вызов функции обмена переменных
Ok