Читаем High Arsen Gonian Academy полностью

B – это сокращение от BEGIN, что обозначает первую группу заданий (мы и далее будем использовать такой вид названий в последующих группах заданий), затем слитно пишется номер примера. Сразу после имени в скобках пишется комментарий стековой нотации. Так принято в Форте. В данном случае Слово-функция B1 берет один параметр A (четырехбайтовое целое число и оставляет другое того же типа). A – сторона квадрата – вход функции, P – его периметр – возвращаемое функцией значение. Тело – очень короткое, просто умножает число на вершине стека на 4 (не забываем, что в Форте обратная польская нотация, сначала идут операнды, затем операция).

Теперь чтобы воспользоваться нашим словом, например, чтобы посчитать периметр квадрата со стороной 3, используем следующий код:

3 B1 .

12 Ok

Точка «.» – это стандартное форт слово, которое печатает число на вершине стека на экран.

Напомним, общий вид определения нового слова в Форте:

: Название-Слова ( стек до выполнение –> после ) Код-Тела-Функции ; \ комментарий

Пример 2. Нам нужно посчитать площадь квадрата:

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

Мы просто дублируем содержимое на вершине стека число (для чего используем оператор языка Форт – DUP) и умножаем его на себя. Данный пример можно оформить более красиво для использования в ваших будущих программах:

: SQR ( A -> A^2 ) DUP * ;      \ A^2 – вычисление квадрата числа, или

: ^2 ( A -> A^2 ) DUP * ;            \ или

: **2 ( A -> A^2 ) DUP * ;      \ отличие только в названии

Какой нравится, тот и можете использовать. Или все сразу, так тоже можно.

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

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

2DUP ( A B -> A B A B )            \ Слово 2DUP, дублирует сразу два числа

* ( A B A B -> A B A*B=S )      \ Площадь вычислен – это просто произведение сторон

ROT ROT ( A*B=S A B ) \ оператор ROT вытаскивает 3-ий от вершины параметр на вершину

\ применив его два раза на вершине мы получаем A B и вычисленный под ним Площадь

+ 2* ; \ складываем A и B, и умножив на 2, оператором 2*, получаем периметр

Слово «2*» делает тоже самое что и два слова «2 *», только короче и проще.

В итоге на стеке мы получаем Площадь и Периметр. Чтобы напечатать результаты на экран из примеров нужно просто ввести точку с клавиатуры «.» и затем нажать «Enter». Сначала напечатается вершина, т. е. периметр, в данном примере, затем повторив действия площадь. Чтобы изменить порядок печати, можно набрать слово 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*

;

Перейти на страницу:

Похожие книги

1С: Управление небольшой фирмой 8.2 с нуля. 100 уроков для начинающих
1С: Управление небольшой фирмой 8.2 с нуля. 100 уроков для начинающих

Книга предоставляет полное описание приемов и методов работы с программой "1С:Управление небольшой фирмой 8.2". Показано, как автоматизировать управленческий учет всех основных операций, а также автоматизировать процессы организационного характера (маркетинг, построение кадровой политики и др.). Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, формировать разнообразные отчеты, выводить данные на печать. Материал подан в виде тематических уроков, в которых рассмотрены все основные аспекты деятельности современного предприятия. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов. Все приведенные в книге примеры и рекомендации основаны на реальных фактах и имеют практическое подтверждение.

Алексей Анатольевич Гладкий

Экономика / Программное обеспечение / Прочая компьютерная литература / Прочая справочная литература / Книги по IT / Словари и Энциклопедии