Начальный курс программирования на языке Форт

   водосчетчики турбинные, ось. |       

ИСПОЛЬЗОВАНИЕ МАССИВА СЧЕТЧИКОВ


Вернемся на нашу птицеферму. Приведем еще один пример на использование массива. Каждый его элемент служит как бы отдельным счетчиком. Следовательно, мы можем дифференцирование вести подсчет числа коробок «очень крупных» яиц, «крупных» яиц и т. д., упакованных машиной.

Вспомните, что в приведенном выше определении РАЗМЕР-ЯИЦ (см. гл. 4) у нас было четыре категории стандартных яиц и две категории нестандартных. 0 БРАК 1 МЕЛКИЕ 2 СРЕДНИЕ 3 КРУПНЫЕ 4 ОЧЕНЬ КРУПНЫЕ 5 ОШИБКА

Давайте создадим массив из шести ячеек: CREATE СЧЕТЧИКИ 12 ALLOT

Счетчики будут увеличиваться с помощью слова +!, так что мы должны иметь средства «обнуления» всех элементов массива перед началом процесса подсчета. Выражение СЧЕТЧИКИ 12 0 FILL

заполняет нулями 12 байтов, начиная с адреса СЧЕТЧИКИ. Если в вашей Форт-системе имеется слово ERASE, то в данной ситуации лучше воспользоваться им. Это слово заполняет заданное число байтов нулями. Ниже показан пример его использования. СЧЕТЧИКИ 12 ERASE

FILL (ЗАПОЛНИТЬ) ( a u b -- ) Заполнение n байтов памяти, начиная с заданного адреса, значением Ь.

ERASE (ОЧИСТИТЬ) ( а n -- ) Заполнение n байтов памяти, начиная с заданного адреса, нулями.

Иногда удобно помещать это выражение внутрь определения: : УСТАНОВИТЬ СЧЕТЧИКИ 12 ERASE ;

Далее определим слово, которое по заданному номеру категории яиц (от 0 до 5) даст нам адрес одного из счетчиков, например: : СЧЕТЧИК ( номер-категории -- а) 2* СЧЕТЧИКИ + ;

и еще одно слово для добавления единицы к счетчику с заданным номером:: УЧЕТ ( номер-категории --) СЧЕТЧИК 1 SWAP +! ;

Здесь 1 служит приращением для слова +!, a SWAP располагает его аргументы в требуемом порядке, т. е. ( n адрес --).

Теперь, например, выражение 3 УЧЕТ увеличит значение счетчика, соответствующего категории крупных яиц.

Определим слово, которое переводит вес на дюжину в номер категории1: : КАТЕГОРИЯ ( вес—на-дюжину — номер-категории) DUP 18 < IF в ELSE DUP 21 < IF I ELSE DUP 24 < IF 2 ELSE DUP 27 < IF 3 ELSE DUP З0 < IF 4 ELSE 5 THEN THEN THEN THEN THEN SWAP DROP ;




1 для специалистов. В конце главы будет приведено более простое определение.

(К тому времени, когда процесс вычисления подойдет к выражению SWAP DROP, в стеке будут находиться два значения: вес, который мы размножили с помощью команды DUP, и номер категории, расположенный в вершине. Нам требуется только номер категории. Выражение SWAP DROP убирает вес.)

Например, выражение 25 КАТЕГОРИЯ оставит в стеке число 3. Приведенное выше определение слова КАТЕГОРИЯ напоминает наше прежнее определение РАЗМЕР-ЯИЦ, но, следуя стилю Форта (слова должны создаваться по возможности более короткими), мы убрали из этого определения выдаваемые сообщения и определили еще одно слово, которое по заданному номеру сорта яиц выдает сообщение1: : МАРКИРОВКА ( номер-категории — ) DUP 0= IF ." Брак " ELSE DUP 1 = IF ." Мелкие " ELSE DUP 2 = IF ." Средние " ELSE DUP 3 = IF ." Крупные " ELSE DUP 4 = IF ." Очень крупные " ELSE ." Ошибка " THEN THEN THEN THEN THEN BROP ;

Например: 1 МАРКИРОВКА Мелкие ok

Теперь мы можем определить слово РАЗМЕР-ЯИЦ, используя три наших собственных слова: : РАЗМЕР-ЯИЦ ( вес-на-дюжину — ) КАТЕГОРИЯ DUP МАРКИРОВКА УЧЕТ ;

Таким образом, выражение 23 РАЗМЕР-ЯИЦ выведет на вашем дисплее сообщение

Средние ok

и обновит счетчик яиц среднего размера.

Каким образом мы узнаем содержимое счетчиков в конце дня? Придется проверить по отдельности каждую ячейку массива, например, с помощью выражения 3 СЧЕТЧИК? (которое выведет число упакованных коробок с «крупными» яйцами). Однако можно

1 для специалистов Более элегантный вариант этого определения приводится в следующей главе.

попытаться для печати результирующей таблицы за день в приведенном ниже формате определить свое собственное слово:КОЛИЧЕСТВО РАЗМЕР 1 Брак 112 Мелкие 132 Средние 143 Крупные 159 Очень крупные 0 Ошибка

Так как вы уже научились получать номера категорий, можно просто использовать цикл DO с номером категории в качестве индекса:: СВОДКА РАGЕ ." КОЛИЧЕСТВО РАЗМЕР" CR CR 6 0 DO I СЧЕТЧИК @ 5 U.R 7 SPACES I МАРКИРОВКА CR LOOP ;

(Выражение I СЧЕТЧИК @ 5 U.R

выбирает номер категории, подготовленный словом I, как индекс массива и выводит содержимое соответствующего элемента последнего в виде поля из пяти значений.)


Содержание раздела