Arsen Gonian – Язык программирования Форт (Forth). Решение задач по программированию. Версия 2. (страница 18)
Теперь мы решаем новую группу заданий с исключительно целочисленными параметрами. Все задания мы будем нумеровать с префиксом I, сокращение от Integer, означающее целое число.
Пример 1. Перевести см в м без округления. Здесь вы увидите всю красоту Форта.
Rm=Rcm/100 – целочисленно
: I1 ( Rcm -> Rm ) 100 / ;
503 I1
Ok ( 5 )
Что означает в 503 см содержится 5 полных метров.
Пример 2. Отличается от предыдущего заменой 100 на 1000.
Mt= Mkg/1000
: I2 ( Mkg -> Mt ) 1000 / ;
12683 I2
Ok ( 12 )
В 12683 кг 12 полных тонн.
Пример 3. Так же отличается от предыдущего константой. Теперь 1000 меняем на 1024.
DkB= DB/1024
: I3 ( DB -> DkB ) 1024 / ;
2050 I3
Ok ( 2 )
2050 B – это 2 полных kB.
Пример 4. Так же простейшая задачка на целочисленное деление.
Для определенности A>B, результат равен A/B.
: I4 ( A B -> A/B ) / ;
15 4 I4
Ok ( 3 )
В отрезке длиной 15 размещается 3 целых отрезка длиной 4.
Пример 5. Отличается от предыдущего примера заменой целочисленного деления на взятие остатка от деления.
: I5 ( A B -> остаток{A/B} ) MOD ;
15 4 I5
Ok ( 3 )
15/4 – остаток равен 3 – все верно, результат теста корректный.
Примеры 1-5 настолько просты, что даже нет необходимости создавать соответствующие слова. Можно просто ввести число-операнд затем тело слова. Результат получите в скобках на стеке. Чтобы распечатать его и не засорять стек нажмите «.» и «Enter». Перепишем эти примеры для наглядности.
«503 100 / .»
«12683 1000 / .»
«2050 1024 / .»
«15 4 / .»
«15 4 MOD .»
Но если вы будете часто пользоваться написанным кодом, крайне желательно создавать отдельные слова-функции, также дайте им легко запоминающиеся осмысленные названия.
Пример 6. Вывести число десятков и единиц двузначного числа. Для этого используем операцию /MOD, которая одновременно вычисляет и целую часть, и остаток от деления.
: I6 ( AB -> A B ) 10 /MOD SWAP ;
45 I6
Ok ( 4 5 )
Чтобы вывести в таком же порядке как на стеке слегка изменим код (помним, что сначала напечатается вершина стека, поэтому перед выводом используем команду SWAP)
45 I6 SWAP . .
4 5 Ok
Теоретически, последним штрихом, будет оформление вывода в отдельное слово, как говорилось ранее в предыдущей группе задач, по схеме:
: I6. I6 SWAP . . ;
Теперь окончательно задача будет решаться просто вызовом одного слова с одним аргументом:
45 I6.
4 5 Ok
Результат тот же, но решение выглядит более профессионально и красиво.
Разумеется, эти два слова можно объединить в одно по схеме:
: I6. 10 /MOD SWAP SWAP . . ;
: I6. 10 /MOD . . ;
Два слова SWAP уже будут не нужны, но так для сложных задач не рекомендуется делать, кроме того, как говорилось раннее интерфейс вывода и логику работы алгоритма крайне желательно отделять, так изменение в коде одного не повлияет на другое.
Пример 7. Вычислить сумму и произведение цифр двузначного числа. Дальнейшее развитие предыдущего примера.
: I7 ( AB -> A+B A*B )
10 /MOD \ AB -> A B
2DUP + \ A B -> A B A+B