Способ мышления-Форт


Глава 4. Детализированная разработка/решение задачи - часть 31


Теперь можно определить:

: ЕДИНИЧКА 0 .СИМВОЛ ; : ПЯТЕРКА 1 .СИМВОЛ ; : ДЕСЯТКА 2 .СИМВОЛ ;

Все, что нам остается - это разбить наше полное десятичное число на последовательность десятичных цифр. Благодаря уже сделанным наблюдениям это сделать несложно. На рисунке 4-9 показан наш законченный вариант.

Ура! От проблемы, через концептуальную модель - и к коду.

Замечание: это решение не оптимально. Данная книга не рассматривает фазу оптимизации.

Еще одно соображение: В зависимости от того, где используется эта задача, нам может понадобиться проверка на ошибочные ситации. Действительно, максимальная известная нам цифра - это М, и самое большое число, которое мы способны представить - это 3999 или MMMCMXCIX.

ПО-РИМСКИ можно было бы переопределить таким образом:

: ПО-РИМСКИ ( n) DUP 3999 > ABORT" Слишком велико" ПО-РИМСКИ ;

----------------------------------------------------------------

Мур:

Когда все сделано правильно, появляется вполне определенное ощущение этой правоты. Быть может, такое ощущение и отличает Форт от других языков, в которых никогда не почувствуешь, что действительно все сделано как надо. В Форте восклицаешь "Ага!", и хочется побежать и кому-нибудь об этом рассказать. Разумеется, никто другой не воспримет это так же, как Вы.

----------------------------------------------------------------

Рис.4-9. Решение задачи о римских цифрах.

Блок # 20 0 \ Римские цифры. 8/18/83 1 CREATE РИМСКИЕ ( единицы) ASCII I C, ASCII V C, 2 ( десятки) ASCII X C, ASCII L C, 3 ( сотни) ASCII C C, ASCII D C, 4 ( тысячи) ASCII M C, 5 VARIABLE #ПОЗИЦИИ 6 : ЕДИНИЦЫ 0 #ПОЗИЦИИ ! ; 7 : ДЕСЯТКИ 2 #ПОЗИЦИИ ! ; 8 : СОТНИ 4 #ПОЗИЦИИ ! ; 9 : ТЫСЯЧИ 6 #ПОЗИЦИИ ! ; 10 11 : ПОЗИЦИЯ ( -- адр-позиции) РИМСКИЕ #ПОЗИЦИИ @ + ; 12

Блок # 21 0 \ Римские цифры ... 8/18/83 1 : .СИМВОЛ ( смещение) ПОЗИЦИЯ + C@ EMIT ; 2 : ЕДИНИЧКА 0 .СИМВОЛ ; 3 : ПЯТЕРКА 1 .СИМВОЛ ; 4 : ДЕСЯТКА 2 .СИМВОЛ ; 5 6 : ЕДИНИЧКИ ( #-единичек -- ) 7 ?DUP IF 0 DO ЕДИНИЧКА LOOP THEN ; 8 : ПОЧТИ ( частное-от-5-/ -- ) 9 ЕДИНИЧКА IF ДЕСЯТКА ELSE ПЯТЕРКА THEN ; 10 : ЦИФРА ( цифра -- ) 11 5 /MOD OVER 4 = IF ПОЧТИ DROP ELSE IF ПЯТЕРКА THEN 12 ЕДИНИЧКИ THEN ; 13




Начало  Назад  Вперед



Книжный магазин