21 | 08 | 2017

Приложение 3

ПРИЛОЖЕНИЕ J.
ПРИМЕРЫ ПРОГРАММ
В этом приложении представлены несколько пользовательских
программ и функций, служащих примерами, а также являющиеся задачами,
с которыми сталкиваются многие программисты.

Совместимость с dBASE III PLUS
Dbf() - имя текущей рабочей области.
FlLabel() - имя функциональной клавиши.
FxMax() - число функциональных клавиш.
Mod() - модуль двух чисел.
Os() - имя операционной системы.
ReadKey() - аналогична таковой из dBASE III PLUS.
Version() - версия Clipperа.

Интерфейс пользователя
Dup_Chk() - дублирование.
Multi_Form() - многостраничные форматы экрана.

- 273 -
ValidTime() - проверка правильности времени.
AcceptAT() - ввод с клавиатуры в заданном месте экрана.

Ввод/вывод низкого уровня
Philes.prg - копирование файлов.

Стринговые функции
Currency() - число в формате доллара.
StrZero() - числовой стринг с ведущими нулями.

Функции времени
AmPm() - стринг времени 12-часового формата.
Days() - секунды в днях.
ElapTime()- разница между временными стрингами.
Secs() - секунды с полуночи до данного момента (в стринге).
Tstring() - секунды в стринге времени.

Числовая функция (FUNC)
LenNum() - суммарная длина числа.

Массивы
Dim2() - двумерный массив.



Совместимость с dBASE III PLUS
Следующие функции обеспечивают дополнительные возможности
совместимости с dBASE III PLUS. Эти процедуры находятся в файле
Examplep.prg и в библиотеке EXTEND.LIB.

FUNCTION Dbf
* Написание ...: string = Dbf()
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
RETURN ALIAS()


FUNCTION FkLabel
* Написание.: string = FkLabel(<Числовое выражение>)
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
PARAMETERS cl_1
RETURN IF(cl_1 <= 40 .AND. cl_1 > 0, "F" + LTRIM(STR(cl_1)), [])

FUNCTION FkMax
* Написание.: n = FkMax()
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
RETURN 40 && IBM specific

FUNCTION Mod
* Написание.: n = Mod(<Числовое выражение1>, <Числовое выражение2>)
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86

- 274 -
*
PARAMETERS cl_num, cl_base
PRIVATE cl_result
cl_result = cl_num % cl_base
RETURN IF(cl_base = 0, cl_num,;
IF(cl_result * cl_base<0, cl_result + cl_base, cl_result))

FUNCTION Os
* Написание.: string = Os()
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
RETURN "MS/PC-DOS" && определяет DOS , MicroSoft или IBM

FUNCTION ReadKey
* Написание.: n = ReadKey()
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
DO CASE
CASE LASTKEY() = 18 && PgUp
RETURN 6 + IF(UPDATED(), 256, 0)
CASE LASTKEY() = 3 && PgDn
RETURN 7 + IF(UPDATED(), 256, 0)
CASE LASTKEY() = 27 && Esc
RETURN 12 + IF(UPDATED(), 256, 0)
CASE LASTKEY() = 23 && Ctrl-W
RETURN 14 + IF(UPDATED(), 256, 0)
CASE LASTKEY() = 13 && Enter
RETURN 15 + IF(UPDATED(), 256, 0)
CASE LASTKEY() = 31 && Ctrl-PgUp
RETURN 34 + IF(UPDATED(), 256, 0)
CASE LASTKEY() = 30 && Ctrl-PgDn
RETURN 35 + IF(UPDATED(), 256, 0)
CASE LASTKEY() >= 32 && type past end
RETURN 15 + IF(UPDATED(), 256, 0)
ENDCASE


FUNCTION Version
* Написание.: string = Version()
*
RETURN "Clipper, Лето '87"


*** Интерфейс пользователя

* Следующие функции демонстрируют различные
* приложения интерфейса пользователя.

FUNCTION Dup_Chk
* Написание.: logical = Dup_Chk(<переменная>, <рабочая область>)
* Автор ...: Ray Love
* Дата .....: Июнь 1, 1986 модифицировано Сентябрь 1, 1987
*
PARAMETERS dup_no, workarea


- 275 -
* Приемлемо пустое значение.
IF EMPTY(dup_no)
RETURN .T.
ENDIF

* Проверка целостности.
IF LEN(TRIM(dup_no)) < LEN(dup_no)
Err_msg("Поле не полностью заполнено")
RETURN .F.
ENDIF

* Проверка на дублирование.
lastarea = SELECT()
SELECT workarea
SEEK dup_no
IF FOUND()
Err_msg("Уже в файле")
validation = .F.
ELSE
validation = .T.
ENDIF
SELECT (lastarea)
RETURN validation

FUNCTION Err_msg
PARAMETERS msg
SAVE SCREEN
row = 7
msg = msg + ", нажать любую клавишу..."
col = INT((80 - LEN(msg))/2) - 2
@ row, col CLEAR TO row + 2, col + LEN(msg) + 4
@ row, col TO row + 2, col + LEN(msg) + 4 DOUBLE
@ row + 1, col + 2 SAY msg
INKEY(0)
RESTORE SCREEN
RETURN ""


FUNCTION Multi_Form
* Написание.: n = Multi_Form(<Символьный массив>)
* Автор ...: Ira Emus
* Дата .....: Декабрь 3, 1986, модифицировано Сентябрь 1, 1987
* Note(s) ..: Страничный механизм экранного формата.
*
PARAMETERS scr_arry
PRIVATE pg_count, form
*
maxpage = LEN(scr_arry)
pg_count = 1
DO WHILE .T.
CLEAR
form = scr_arry[pg_count]
SET FORMAT TO &form.
READ
DO CASE
CASE LASTKEY() = 27
*

- 276 -
* Esc клавиша.
EXIT
CASE LASTKEY() = 18
*
* PgUp key.
IF pg_count > 1
pg_count = pg_count - 1
ELSE
EXIT
ENDIF
OTHERWISE
*
* Любая другая клавиша.
IF pg_count < maxpage
pg_count = pg_count + 1
ELSE
EXIT
ENDIF
ENDCASE
ENDDO
RETURN pg_count

FUNCTION ValidTime
* Написание.: logical = ValidTime(<стринг времени>)
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
PARAMETERS timestring
RETURN VAL(timestring) < 24 .AND.;
VAL(SUBSTR(timestring, 4)) < 60 .AND.;
VAL(SUBSTR(timestring, 7)) < 60

FUNCTION AcceptAt
* Написание.: string = AcceptAt(<строка>, <столбец>, <приглашение>)
* Автор (s).: Ray Love и Fred Ho
* Дата .....: Декабрь 1, 1986 модифицировано Сентябрь 1, 1987
*
PARAMETERS row, col, prompt
PRIVATE char, string
*
STORE "" TO char, string
@ row,col SAY prompt
DO WHILE .T.
char = INKEY(0)
DO CASE
CASE char = 13
*
* Возвращает клавишу.
EXIT
CASE char > 31 .AND. char < 127
*
* Печатуемые символы.
string = string + CHR(char)
@ ROW(), COL() SAY CHR(char)
CASE (char = 8 .OR. char = 19) .AND. LEN(string) > 0
*
* Backspace или Стрелка влево клавиши.

- 277 -
@ ROW(), COL() - 1 SAY " "
@ ROW(), COL() - 1 SAY ""
string = SUBSTR(string, 1, LEN(string) - 1)
ENDCASE
ENDDO
RETURN string

* Program ...: Philes.prg
* Date ......: September 1, 1987
* Note(s) ...: This program demonstrates the use of the low-level
* file I/O functions to a copy a file.
*
? "Copy a file..."

size = 512
buffer = SPACE(size)
total = 0
remaining = 0

ACCEPT "Source file: " TO source
ACCEPT "Target file: " TO target
?

shandle = FOPEN(source)
IF FERROR() = 0

thandle = FCREATE(target)
IF FERROR() = 0


* Get total source file size.
total = FSEEK(shandle, 0, 2)
remaining = total

* Reset file position.
FSEEK(shandle, 0)

DO WHILE (remaining > 0)

IF (remaining < size)
size = remaining && Last part of file.
ENDIF

scount = FREAD(shandle, FWRITE(thandle, buffer, size)
IF tcount <> size
? "Error writing", target
EXIT
ENDIF

remaining = remaining - size

ENDDO

FCLOSE(thandle)

ELSE
? "Cannot create", target, ", DOS error", FERROR()

- 278 -
ENDIF

FCLOSE(shandle)

ELSE
? "Cannot open", source, ", DOS error", FERROR()
ENDIF

? "Total of", total - remaining, "bytes transfered."

* EOP Philes.prg


*** Стринговые функции

FUNCTION Currency
* Написание.: string = Currency(<Числовое выражение>)
* Дата ...: Сентябрь 1, 1987
*
PARAMETERS p1
PRIVATE outstr
outstr = LTRIM(TRANSFORM(p1, "999,999,999,999.99"))
RETURN(SPACE(LEN(STR(p1)) - LEN(outstr) + 1) + "$" + outstr)

FUNCTION StrZero
* Написание.: string = StrZero(<Числовое выражение1>
* [,<Числовое выражение2> [,<Числовое выражение3>]])
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
PARAMETERS cl_num, cl_len, cl_dec
PRIVATE cl_str
*
DO CASE
CASE PCOUNT() = 3
cl_str = STR(cl_num, cl_len, cl_dec)
CASE PCOUNT() = 2
cl_str = STR(cl_num,cl_len)
OTHERWISE
cl_str = STR(cl_num)
ENDCASE

IF "-" $ cl_str
* Отрицательное число, минус помещает перед нулями.
RETURN "-" + REPLICATE("0", LEN(cl_str) - LEN(LTRIM(cl_str))) +;
SUBSTR( cl_str, AT("-", cl_str) + 1)
ELSE
* Положительное число.
RETURN REPLICATE("0", LEN(cl_str) - LEN(LTRIM(cl_str))) + LTRIM(cl_str)
ENDIF

*** Функции времени

FUNCTION AmPm
* Написание.: string = AmPm(<стринг времени>)
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86

- 279 -
*
PARAMETERS cl_time
RETURN IF( VAL(cl_time) < 12, cl_time + " am",;
IF( VAL(cl_time) = 12, cl_time + " pm",;
STR(VAL(cl_time) - 12, 2) + SUBSTR(cl_time, 3) + " pm" ))

FUNCTION Days
* Написание.: n = Days(<Числовое выражение>)
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
PARAMETERS cl_secs
RETURN INT(cl_secs / 86400)

FUNCTION ElapTime
* Написание.: timestring =
* ElapTime(<символьной выражение1>, <символьное выражение2>)
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
PARAMETERS cl_start, cl_end
RETURN Tstring(IF(cl_end < cl_start, 86400 , 0) +;
Secs(cl_end) - Secs(cl_start))

FUNCTION Secs
* Написание.: n = Secs(<символьное выражение>)
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
PARAMETERS cl_time
RETURN VAL( cl_time ) * 3600 +;
VAL(SUBSTR(cl_time,4)) * 60 +;
VAL(SUBSTR(cl_time,7))

FUNCTION Tstring
* Написание.: time string = Tstring(<Числовое выражение>)
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
PARAMETERS cl_secs
RETURN StrZero(INT(Mod(cl_secs/3600, 24)), 2, 0) + ":" +;
StrZero(INT(Mod(cl_secs/ 60, 60)), 2, 0) + ":" +;
StrZero(INT(Mod(cl_secs , 60)), 2, 0)

FUNCTION LenNum
* Написание.: n = LenNum(<Числовое выражение>)
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
PARAMETERS cl_number
RETURN LEN(LTRIM(STR(cl_number)))

*** Массивы

FUNCTION Dim2
* Написание: n = Dim2(<Числовое выражение1>, <Числовое выражение2>)
* Автор ...: Fred Ho

- 280 -
* Дата ....: Сентябрь 9, 1986
*
PARAMETERS x, y
RETURN (((x - 1) * rows) + y)



ГЛОССАРИЙ.
----------

Algorithm
- описание последовательности шагов для решения поставленной
задачи.

Allias
- имя рабочей области; синоним имени файла; это понятие часто
используется для того, чтобы дать файлам базы данных описательные
имена, причем присваивается открытому файлу; если это понятие не
определено для открытого файла, то им становится само имя файла.

Application
- система программ, предназначенных для решения класса
взаимосвязанных задач.
Argument
- величина или переменная, являющаяся входом процедуры или
функции.

Array
- структура данных фиксированной длины к элементам которых можно
обращаться по номеру позиции.
Assignment
- оператор, который копирует величину в переменную; в Clipperе
этот оператор задается знаком = или командой STORE.
Atribute
- 1) при цветном дисплее соответствует интенсивности,
инверсности, подчеркиванию;
2) в формализме СУБД описывает столбец в таблице или поле в базе
данных.

Beginning-of-file
- начало файла; в Clipperе нет строки, соответствующей началу
файла; начало файла индицируется посредством функции BOF(), которая
возвращает значение (.T.) при попытке продвинуть поинтер выше первой
строки или в случае пустого файла.
Buffer
- временное хранилище данных в памяти.

Clause
- режим или требуемый раздел в команде Clipperа, начинающаяся с
ключевого слова, которая модифицирует или улучшает команды.
Column
- число, соответствующее позиции столбца на дисплее или
принтере.

Comment
- часть строки или вся строка, игнорируемая компилятором.
Concatenate

- 281 -
- объединение двух групп символьных данных в одну группу.

Condition
- логическое выражение, которое используется в операторах WHILE
или FOR для определения множества записей, которые обрабатываются
командой.

Constant
- конкретное значение, например, .T. для логической изменяемой,
за исключением переменных типа MEMO.
Control Structure
- любая структура программы, изменяющая выполнение, например, DO
WHILE...ENDDO, DO CASE... ENDCASE, FOR...NEXT, IF...ELSE...ENDIF.
Controlling Master Index
-индекс, который идентифицирует строки по ключу или
последовательность выполнения команды.
Crash Master
- член команды разработки развития программного обеспечения,
который ищет неопределенные граничные условия и фундаментальные
направления разработки программ.

Data Type
- в Clipperе имеется пятть типов данных: символьный, числовой,
тип даты, логический и тип MEMO; переменные могут быть любого типа
кроме MEMO; все операторы с символьными данными, однако, могут
выполняться и с полями типа MEMO.
Database
- совокупность связанных данных, используемая прикладной
системой; база данных может содержать один или несколько файлов.
DBMS
- аналог русской абревиатуры СУБД.

Decrement
- уменьшение величины на фиксированное значение.
Delimeter
- символ для пометки границы.

Destination
- рабочая область или устройство, куда пересылаются данные.
Drive
- буква для обозначения накопителя.

Element
- единичная компонента массива, на которую обычно ссылаются по
индексу.

End-of-file
- конец файла базы данных; в Clipperе это LASTREC()+1 и
индицируется функцией EOF(), возвращающей значение (.T.).

Escape key
- любая клавиша для завершения работы.

Evaluate
- процесс выполнения выражения и возвращения результата.
ExpC
- обозначение символьного выражения.

- 282 -

ExpD
- обозначение выражения типа даты.

ExpL
- обозначение логического выражения.

ExpN
- обозначение числового выражения.

Expression
- комбинация из символов, операторов, идентификаторов, которые
нужно вычислить.

Ext
- расширение имени файла.

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

Filename
- имя файла на диске, которое может включать или не включать имя
накопителя, а также расширение.
Function
- в Clipperе есть два типа функций - внутренние и определенные
пользователем; определенная пользователем функция (FUNC) начинается со слова
FUNCTION и содержит RETURN в качестве аргумента.
Identifier
- определенное пользователем имя.

Increment
- увеличение значения на фиксированное число.

Index
- множество ключевых величин, организованных в виде древовидной
структуры, каждый из которых указывает на определенную запись в
реляционной базе данных; в Clipperе индекс содержится в специальном
файле с расширением (.NTX), один индекс в одном файле.
Integer
- число без десятичной точки; в Clipperе нет целого типа.
Iteration
- один из трех основных компонент алгоритма (другие -
последовательность и выбор); итерация это повторение операции,
которая как выбор, позволяет управлять выполнением программы в
зависимости от обстоятельств.
Join
- операция над двумя таблицами, дающая в результате одну
таблицу; это комбинация двух операций - выбора и проекции.
Key expression
- выражение, которое используется в командах INDEX и TOTAL.

Kludge
- неэлегантное решение из-за выхода за основные пределы
программного обеспечения.
List

- 283 -
- список объектов, разделенных запятыми; объектами могут быть
переменные, поля, выражения, имена файлов.
Macro
- идентификатор перемнной, который подставляется по его
содержимому.

Memvar
- имя изменяемой.

Mnemonic
- при вычислениях является идентификатором, который дает
логическое имя объекту.
Module
- самостоятельная процедура или алгоритм, которые имеют
независимые данные и общие функции.
Natural order
- порядок записей, вводимых в базу данных; в таком же порядке,
как без индекса.

Normalization
- процесс выявления и объединения выпадающих элементов данных.
Operand
- терм, существующий по другую сторону оператора.

Operator
- символы, определяющие операции над данными; в Clipperе имеется
четыре класса операторов: логические, математические, реляционные и
стринговые; кроме того, имеется два типа операторов: одинарные и
двоичные: одинарные требуют только одного операнда, а двоичные два.

Parameter
- параметры подразделяются на формальные и фактические;
формальные - переменные, определенные командой PARAMETERS;
фактические - аргументы команды DO...WITH или определенной
пользователем функции.
Существует два метода передачи параметров: по значению и по
ссылке. При передаче по значению фактические параметры принимают
значения из памяти. При выполнении команды PARAMETERS значения
передаются получающим переменным. Передача по ссылке означает, что
передается указатель на фактическое значение, а не само значение. В
Clipperе нет проверяющих аргументов, поэтому нет требования о
совпадении числа формальных и фактических параметров.

Path
- указатель директории. Включает в себя список всех директорий
из корневой, отделенных обратной наклонной чертой.
Procedure
- любая выполнимая последовательность команд, начинающаяся с
оператора PROCEDURE <имя процедуры>.
Procedure file
- файл, содержащий процедуры или определенные пользователем
функции.
Projection
- Термин СУБД, определяющий подмножество полей.

Prompt
- последовательность символов, высвеченных на дисплее,

- 284 -
указывающих на ожидание ввода с клавиатуры.
Queue
- структура данных изменяемой длины, в которой добаляются в один
конец, а извлекаются с другого. Часто описывается как "первый пришел,
первый вышел".

Record
- строка базы данных, состоящая из одного или большего числа
полей.
Recursion
- процесс вызова процедуры или функции самой себя.

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

Row
- числовое выражение, указывающее позицию строки на дисплее или
принтере.
Runtime error
- ошибка при выполнении программы.

Scope
- 1. Часть команды, определяющая диапазон записей к которым
адресуется команда. Для этого используются слова ALL, NEXT, RECORD,
REST.
2. Часть программы, где определяется переменная. В Clipperе есть
две разновидности этого понятия: публичные и приватные переменные.
Публичные переменные определяются в процедурах и функция (FUNC)х,
определенных пользователем. Приватные переменные, определенные в
процедурах или функция (FUNC)х после их выполнения теряются.

Scoreboard
- область экрана на 0 строке, начинающаяся с 60 колонки, где
высвечивается сообщение "<insert>", когда включен режим вставки при
выполнении команд READ и MEMOEDIT(). Здесь же высвечивается сообщение
об ошибке оператора RANGE. Цвет соответствует цвету оператора SAY.

Selection
- 1. Одна из трех компонент алгоритма (другие -
последовательность и итерация). Выбор позволяет управлять выполнением
программы наряду с числом возможных действий, причем действие зависит
от случившихся обстоятельств.
2. Термин СУБД, который определяет подмножество записей в
условии. Выбор задается специальным оператором (в Clipperе -
оператором FOR).
Separator
- Символ или множество символов, котрые определяют поля или
строки друг от друга.
Sequence
- Одна из трех компонент алгоритма (другие два - выбор и
итерация), которая имеет два свойства - дискретность и порядок. В
алгоритме имеется, во-первых, множество дискретных шагов, необходимых
для достижения цели и, во-вторых, некоторое множество шагов, которые
должны быть сделаны перед другими, то есть, устанавливается порядок.
Для примера, перед работой с полями необходимо открыть файл оператором

- 285 -
USE.

Skeleton
- Шаблон, использующийся для определения группы имен полей или
переменных. Символ "*" используется для определения одного или
болшего числа символов, а символ "?" - для одного.

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

String
- Последовательность символов, включающая числа, буквы и
символы.

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

Subscript
- Числовое выражение, результат которого указывает на
определенный элемент массива. Его также называют индексом.


Tuple
- Термин СУБД, который относится к строке таблицы или строки в
базе данных. В файлах типа DIF относится также к эквиваленту
строки.

Unary
- Относится к оператору с одним операндом. Типичный пример -
оператор .NOT., который имеет синтаксис .NOT. <условие>.

Undefined
- переменная, которая существует, но которой не присвоено
значение.

User Function
- Определенная пользователем функция (FUNC), которая вызывается командами
ACHOICE() или DBEDIT(). Пользовательская функция (FUNC) передается
посредством стринга.

User-defined function
- Выполняемая совокупность команд, начинающаяся словом FUNCTION
<имя> и содержащая команду RETURN с аргументом. В Clipperе все
определенные пользователем функции должны возвращать значения,
хотя внутренние функции этого не делают.

Value
- Способ, по которому передаются переменные в процедуру и
определенные пользователем функции. Передача по значению
подразумевает, что фактический параметр получает значение и
помещается в память. Когда выполняется команда PARAMETERS,
значение передается получающей изменяемой.


- 286 -
Variable
- идентификатор, имеющий некоторое содержимое;
в Clipperе - переменная или поле.

Vector
- компонента файла типа DIF; эквивалентен полю Clipperа.

View
- термин СУБД для виртуальной таблицы;
физически эта таблица не существует, но определяется по
существующим таблицам; записывается в отдельный файл или как
элемент в системный словарь-файл.

Wait State
- состояние ожидания ввода с клавиатуры; определяется командой
SET KEY; к этому состоянию приволят команды ACCEPT, INPUT, MENU
TO, READ, WAIT.

Work Area
- рабочая область, в которой могут содержаться файлы базы данных
и индексы; именуются по ALIAS, номеру, символу.




HALO-ГРАФИЧЕСКИЕ И ДОПОЛНИТЕЛЬНЫЕ МАТЕМАТИЧЕСКИЕ ФУНКЦИИ.
---------------------------------------------------------


Для использование в Clipperе HALO-графики необходимо при
линковке подсоединять следующие .OBJ-файлы:

HDX.OBJ
HPHACL.OBJ

и библиотеку HALOUL.LIB.
Кроме того, при выполнении программ Clipperа с графикой в
какой-либо поддиректории, на которую указан PATH или в текущей
должны находиться следующие файлы:

HALOIBM DEV - в случае CGA-адаптера,
HALOIBME DEV - в случае EGA-адаптера,
HALOHERC DEV - в случае HERCULES-адаптера,
HALO005 FNT - в случае использования кириллицы,
HALO_PRN CNF - для печати графиков на принтере.

Для использования дополнительных математических функций
необходимо прилинковывать .OBJ-файл MCL.OBJ и библиотеку
LLIBCA.LIB.