Программирование на языке Форт в среде AFS.
Часть 5. Цикл в программе. Простые рисунки на экране терминала.


В предыдущих статьях мы научились управлять терминалом с помощью команд ANSI и создали несколько слов, открывающих новые возможности в генерации изображений.

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

Самый простой и часто используемый способ "декорирования" выводимого на терминал текста – печать разделительной строки из "звездочек" или символа "минус".

Можно просто создать слово, выводящее строку из звездочек необходимой длины:

:  BAD-STARS  ."  ******************************"  ;

Безусловно, это очень плохой пример, состоящий из одних недостатков. Забудьте, что вы это видели и никогда так не делайте.

Мы можем выводить на терминал любые символы с помощью EMIT , например, "звездочку":

:  STAR  [CHAR]  *  EMIT  ;

Теперь нужно найти способ повторения этой операции необходимое число раз. Рассмотрим основной метод организации счетного цикла в программе:

Организация счетного цикла

Для выполнения какого-либо действия некоторое количество раз требуется счетчик повторений. Каждый раз, когда повторяемое действие выполняется, счетчик должен увеличиваться на 1. Для того, чтобы понять, когда необходимо прекратить повторения и заняться чем-то еще, программа должна помнить требуемое число повторов. Это число называется пределом цикла. После увеличения счетчика повторений программа сравнивает его с пределом цикла. Если счетчик стал равен пределу или превысил его, выполнение цикла прекращается и программа переходит к выполнению следующих действий.

На рисунке присутствует еще один параметр – начальное значение счетчика цикла. Для правильного счета необходимо установить счетчик в известное значение, обычно в ноль, но часто бывает полезным начинать счет с другого числа.

Теперь мы можем использовать средства Форта и создать слово, содержащее цикл:

:  10STARS  10  0  DO  STAR  LOOP  ;

Выполните 10STARS и на экране появятся 10 "звездочек".

Новые слова DO и LOOP, которые появились в определении 10STARS , используются для повторного выполнения слов, находящихся между ними, другими словами, они организуют цикл. Поищем известные нам параметры цикла в определении:

Счетный цикл в определении слова

Перед словом DO в стек помещаются два числа. Слово DO извлекает число с вершины стека, в нашем случае это 0, и использует его для установки начального значения счетчика цикла.

Затем слово DO извлекает из стека следующее число, в нашем определении это 10 - требуемое число повторений или предел цикла. Таким образом слово DO используется для инициализации параметров цикла, необходимых слову LOOP .

После того, как слово DO выполнило свою работу, выполняются слова между DO и LOOP. В нашем определении это единственное слово STAR, но на самом деле их может быть сколько угодно. Когда приходит очередь слова LOOP, оно увеличивает счетчик цикла и сравнивает его новое значение с пределом цикла. Если счетчик меньше предела, программа вернется к слову, следующему за DO. Если счетчик стал равен пределу, выполнение перейдет к слову, стоящему после LOOP.

Слово 10STARS имеет серьезный недостаток. Слово выводит строку только из 10 "звездочек", а нам хотелось бы выводить линии различной длины, в зависимости от числа, находящегося на вершине стека.

Нужно изменить определение таким образом, чтобы предел цикла задавался не внутри определения, а мы сами помещали его в стек перед выполнением слова:

:  STARS  \  n  --  \  0  DO  STAR  LOOP  ;

Теперь в определении присутствует только начальное значение счетчика цикла (0), а вот предел цикла вам необходимо помещать в стек перед каждым выполнением слова STARS , о чем нам также подсказывает стековая диаграмма в комментарии.

Убедитесь, что все работает как надо:

Вывод заданного числа звездочек

Вернемся к наработкам из прошлых статей. Загрузите слова из файла или наберите на клавиатуре.

У нас уже есть слово, перемещающее курсор по экрану терминала. Используем его для создания слова, рисующего горизонтальную линию заданной длины len с началом в координатах x и y:

:  H-LINE  \  len  x  y  --  \
   GO-XY
   0  DO  [CHAR]  -  EMIT  LOOP  ;

Для рисования линии используем символ "минус". Если возникли ошибки, сравните свой ввод с текстом на снимке окна терминала:

Слово для вывода горизонтальной линии

Посмотрим, что у нас получилось. Наберите (в одну строку)

CLRSCR  28  12  6  H-LINE  24  16  8   H-LINE  20  20  10  H-LINE

и нажмите Enter. На экране терминала должны появится три горизонтальные линии:

Вывод горизонтальных линий словом H-LINE

Сохраните слово H-LINE вместе с другими словами, оно еще пригодится.

Аналогичное слово для построения вертикальных линий будет сложнее и потребует знакомства с несколькими новыми словами – разберемся с ними в следующей статье.

Спасибо за внимание.


[Начало статьи] [Следующая статья] [Предыдущая статья]

Вы можете оставить комментарий к статье и задать вопросы на нашей странице в соцсети ВКонтакте

Вы можете оставить комментарий к статье и задать вопросы на нашей странице в соцсети Facebook