High Arsen Gonian Academy. Arsen Gonian

Читать онлайн.
Название High Arsen Gonian Academy
Автор произведения Arsen Gonian
Жанр
Серия
Издательство
Год выпуска 2023
isbn



Скачать книгу

набрать слово SWAP, который меняет местами 2 числа на вершине стека ( A B -> B A), т.е., например чтобы вычислить площадь и периметр прямоугольника со сторонами 1 и 2 введём следующее:

      1 2 B3 SWAP . .

      2 6 Ok

      Площадь равна 1*2=2, а периметр равен 2*(1+2)=6. Слово работает корректно и вычисляются площадь и периметр соответственно стековой нотации, а выводятся по условию задачи.

      Пример 4. Нужно вычислить длину круга зная его диаметр:

      : B4 ( D -> L ) 314 * ; \ L=Pi*D*100

      Ответ буде в 100 раз больше для целочисленных данных, таким образом избавимся от дробной части. Перепишем код, чтобы можно было работать с вещественными числами. Для этого в SP-Forth нужно подключить соответствующие библиотеки. Скопируйте и вставьте следующие две строчки:

      S" lib\include\float.f" INCLUDED

      S" lib\include\float2.f" INCLUDED

      Но можно только вторую строчку.

      Теперь чтобы ввести вещественное число, скажем 0,5, нужно набрать на клавиатуре следующее:

      5E-1

      До E – это мантисса (число), после экспонента (степень). Мантисса и экспонента могут быть как положительными (знак не требуется), так и отрицательными (в данном случае степень -1, что значит 10 в минус первой степени).

      После ввода, вещественное число размещается на соответствующем ей стеке, поэтому мы не видим его после вывода слова Ok в скобках, так как это другой стек для целых чисел. Чтобы его увидеть нужно ввести «F.». Итак, чтобы проверить, что всё работает как надо, введём код:

      5E-1 F.

      В ответ увидим:

      0.5000000 Ok

      Слово «F.», аналогично, как и «.» выводит число на экран, только не с целочисленного стека, а с вещественного.

      Теперь мы можем переписать пример 4 для вещественных аргументов:

      : B4 ( D -> L )            \ L=Pi*D

      314E-2 F* ;

      Посчитаем длину окружности диаметром 0,5, набрав следующее:

      5E-1 B4 F.      \ вызываем слово, которое считает длину и «F.» печатает ответ

      1.5700000 Ok

      Переделаем таким же образом первые 3 примера для случая с вещественными аргументами, сделав их более универсальными.

      Пример 1:

      : B1 ( A -> P ) 4E F* ; \ P=4*A

      Знак «*» заменяется на «F*», четверка вводится как вещественное число (операция «F*», в отличие от «*» производит операцию над вещественными числами на вещественном стеке). Теперь проверим, посчитаем периметр квадрата со стороной 0,5:

      5E-1 B1 F.

      2.0000000 Ok

      Ответ 2 (0,5*4=2) что является правдой.

      Данный пример, так же можно преобразовать, написав в стиле:

      : B1 ( A -> P )      \ P=4*A

      4E F*

      ;

      Но он настолько маленький и примитивный, что едва ли это необходимо, проще и лаконичней всё оставить на одной строчке. В более сложных и больших примерах код нужно писать структурированным, понятным и разумеется в едином стиле.

      Пример 2:

      : B2 ( A -> S ) FDUP F* ; \ S=A^2

      Опять DUP превращается в FDUP, умножение как в первом случае. Проверим работу слова. Посчитаем площадь квадрата со стороной 0,5:

      5E-1 B2 F.

      0.2500000 Ok            \ 0,5*0,5 = 0,25

      Пример 3:

      : B3 ( A B -> S P )      \ ( S=A*B P=2*(A+B) )

      FOVER FOVER      ( A B -> A B A B )

      \ Слово FOVER, дублирует слово под вершиной стека на ее вершину т.е.