18+
реклама
18+
Бургер менюБургер меню

Arsen Gonian – Язык программирования Форт (Forth). Решение задач по программированию. Версия 2. (страница 9)

18

F+ FSQRT                   \ (Y2-Y1)^2 (X2-X1)^2 -> R

;

11E-1 15E-1 73E-1 62E-1 B20 F.

7.7801028 Ok

A=|1.5-6.2|=4.7; B=|1.1-7.3|=6.2; R= Квадратный_Корень(A^2+B^2)= Квадратный_Корень(22.09+ 38,44)= 7,7801.

рис 31

Полезные слова из предыдущих десяти примеров:

: Hypotenuse ( A B -> C P )             \ C=Квадратный_Корень(A^2+B^2) P=A+B+C

FDUP F* FSWAP FDUP F* F+ FSQRT ;       \ A B -> SQRT(A^2+B^2)

: RightTriangleP ( A B C -> P )             \ P=A+B+C

F+ F+ ;

: TriangleP ( A B C -> P )                   \ P=A+B+C

F+ F+ ;

Если даны только 2 катета, то можем вычислить периметр так:

3E 4E FOVER FOVER Hypotenuse TriangleP F.

12.000000 Ok

: R1 ( X1 X2 -> R1=|X1-X2| )             \ R1 – расстояние между двумя точками на прямой

F- FABS       \ X1 X2 -> |X1-X2|

;

: R2 ( X1 Y1 X2 Y2-> R )             \ R= SQRT{[X2-X1]^2+[Y2-Y1]^2}

\ R2 – расстояние между двумя точками на плоскости

FROT F- FDUP F*             \ X1 Y1 X2 Y2-> X1 X2 (Y2-Y1)^2

FSWAP FROT F- FDUP F*       \ X1 X2 (Y2-Y1)^2 -> (Y2-Y1)^2 (X2-X1)^2

F+ FSQRT                   \ (Y2-Y1)^2 (X2-X1)^2 -> R

;

BEGIN 21-30

Перед решением очередного примера рассмотрим, как объявляются и используются переменные в SP-Forth. Так как операции с большим количеством данных на стеке становится крайне затруднительным, нам они пригодятся. Для этого воспользуемся зарезервированными словами VARIABLE и FVARIABLE. Первое для целых чисел, второе для вещественных. Если кто-то не знает, что такое переменная, то это просто участок памяти, в которое записывается значение (число для целых переменных или вещественных, текст для строковых или их комбинация для структур), считывается и изменяется. На самом деле любые данные, неважно что: простые переменные, структуры или даже файлы, все они кодируется исключительно числами, причем в двоичном формате (нулями и единицами).

Создадим две переменные

FVARIABLE FVAR      \ FVAR переменная вещественного типа

VARIABLE VAR            \ VAR переменная целого типа

Теперь инициализируем эти переменные, то есть присвоим начальное значение.

1234E-2 FVAR F!

Ok

4552249 VAR !

Ok

Код «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 ( FX1 FY1 FX2 FY2 FX3 FY3 -> 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