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

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

18

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

5 **2

25 Ok

В итоге получаем тот же ответ, но оформление, стиль изменились. Не забывайте «**2» – это слово, а значит он отделяется пробелом от операнда «5» (до и после, если за ним будут другие инструкции). Это одно из самых главных отличий Форта от других языков.

Для начала этого достаточно. Далее при решении конкретных задач, процесс станет более понятным и осознанным. Приступим.

BEGIN 1-10

Практиковаться программированию на Форте будем с задач из книги М. Э. Абрамян "1000 задач по программированию Часть I Скалярные типы данных, управляющие операторы, процедуры и функции" 2004. Автор пишет, что получить задачник можно по e-mail: mabr@math.rsu.ru или за подробностями обращайтесь к веб ресурсу ptaskbook.com. Текст задач я приводить не буду, дабы исключить плагиат. Думаю, пояснения к коду с описанием слов (функций-программ) должно быть достаточно, в противном случае обращайтесь к первоисточнику за текстом задач.

Пример 1. Итак, начнем, (для простоты вначале мы будем рассматривать все входные параметры как целые числа, далее мы перепишем код для вещественных аргументов, где об этом указано в условии задачи). Вот и решение первой задачи:

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

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

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

3 B1 .

12 Ok

Рис 7

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

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

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

Пример 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 * ;      \ отличие только в названии

Рис 8

Результат тот же, так как слова делают одно и тоже. Имя слову можно давать любое – area, square (не только заглавными буквами, так просто исторически сложилось на Форте, что все операторы языка пишутся не строчными буквами), в зависимости от контекста. Какой вариант нравится, тот и можете использовать. Или все сразу, так тоже можно.

Пример 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». Слово работает корректно и вычисляются площадь и периметр соответственно стековой нотации, а выводятся по условию задачи.

Перепишем слово «B3» более красиво:

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

2DUP       \ A B -> A B A B

*             \ A B A B -> A B A*B=S

ROT ROT       \ A B S -> S A B

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

;

Удалены лишние комментарии, оставлена только стековая нотация.

Слово «B3» считает площадь и периметр и ничего не выводит на экран. Его можно использовать, как и первый вариант, результат будет тот же:

1 2 B3 SWAP . .

Проверьте этот факт самостоятельно.

рис 9

Последний вариант выглядит более профессионально, первый (с максимальным количеством комментариев) только для учебных целей, чтобы освоится с новыми словами языка.

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

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

Ответ буде в 100 раз больше для целочисленных данных («Пи» вместо 3,14 взяли 314), таким образом избавились от дробной части. Так себе решение. Напишем слово:

: .2 ( A -> {[A/100],[A%100]} )

100 /MOD . 8 EMIT 44 EMIT .

;

Слово «.2» печатает результат, который в 100 раз больше, как два разных числа «склеенных» вместе (целая часть от «A/100» и его дробная часть – 2 знака десятичной дроби) с запятой. Теперь вычислим длину окружности диаметром 1 – результат точный для «Пи»=3,14:

1 B4 .2

3,14 Ok

Рис 10

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

S" lib\include\float.f" INCLUDED

S" lib\include\float2.f" INCLUDED

Можно только вторую строчку (вызов второй, после первой выводит много сообщений типа «isn't unique (lib\include\float2.f)» – это не ошибки, означает, что слова с таким именем ранее были введены в систему).

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