О многочастотной кодовой модуляции

Магнитофон - слабое место БК-0010: низкая плотность записи и низкая надёжность считывания информации делают работу с длинными файлами довольно мучительной. Файл длиной 15,5 Кбайт, т.е. занимающий всю память БК в обычном режиме, загружается почти 2 мин и занимает ленту длиной около 5 м! А на таком отрезке ленты весьма вероятно присутствие дефектов, делающих чтение невозможным. Про расход ленты нечего и говорить - на одной кассете МК-60 можно записать (на двух дорожках) не более 512 Кбайт, что с учётом необходимости дублирования информации и места, занимаемого паузами и оглавлениями файлов, даёт реальную ёмкость не более 200 Кбайт на кассету.

Что представляет собой формат магнитной записи БК-0010? Прежде всего, запись производится в так называемом ЧМ-формате - с частотной модуляцией, т.е. информационная последовательность рассматривается побитно, причём двум возможным состояниям каждого бита (0 и 1) соответствуют две различные частоты импульсов (на БК - 3120 и 1560 Гц соответственно).

В начале файла записывается 10000(8) «нулевых» импульсов - так называемая установочная (или настроечная) последовательность. По ней компьютер находит начало файла и подстраивает драйвер чтения под конкретную скорость воспроизведения данного магнитофона.

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

После маркера следует оглавление файла. Оно состоит из 10 машинных слов: 1-е - адрес файла, 2-е - длина файла в байтах, остальные 16 байтов - имя файла. Оглавление обеспечивает идентификацию и правильную загрузку файла.

Далее следует тело файла - собственно информационная последовательность, имеющая указанную в оглавлении длину. По окончании тела файла на МЛ записывается ещё одно слово - контрольная сумма (КС) файла: результат сложения всех байтов файла с учётом разряда переноса. При подсчёте КС учитывается только тело файла, оглавление и сама КС в расчёт не входят. Наличие КС на МЛ позволяет после загрузки файла с достаточной уверенностью определить, не возникли ли ошибки при чтении - вероятность случайного совпадения КС для файлов среднего размера не превышает 0,002%.

Информационная последовательность нулей и единиц представлена на МЛ последовательностью коротких и длинных импульсов, разделённых синхроимпульсами, равными по длительности нулевому информационному импульсу. Предполагалось, что это повысит надёжность чтения информационных импульсов, но эффект оказался обратным - для получения при таком способе записи той же плотности информации среднюю частоту следования импульсов пришлось увеличить примерно в 1,67 раза, а это в свою очередь привело к снижению надёжности вследствие низкого качества магнитных лент и значительных фазовых искажений бытовых магнитофонов. Кроме того, при единичном сбое компьютер легко путает последовательность информационных импульсов с последовательностью синхроимпульсов; вся информация после такого сбоя теряется - читаются только нули.

Как улучшить работу БК с магнитофоном? Простейший путь повышения плотности записи (уменьшение скорости МЛ при записи и/или увеличение её при чтении) чреват снижением надёжности. Можно исключить синхроимпульсы, что позволит увеличить плотность в 1,67 раза, а при некоторых дополнительных мерах и в два раза. Такой приём с успехом применён С. Ивашинниковым в копировщиках «ТУРБО». А нет ли других резервов?

Вспомним, что при частотной модуляции информационная последовательность кодируется побитно, причём каждому из двух состояний бита соответствует своя частота. Два состояния - две частоты. А если кодировать не отдельный бит, а пару? Два бита имеют четыре возможных состояния - 00, 01, 10 и 11. Припишем каждому из состояний свою частоту. Если среднюю частоту полученных импульсов выбрать равной средней частоте ЧМ-формата, плотность записи повысится вдвое - ведь каждый импульс теперь кодирует не один, а два бита и при равном числе импульсов количество кодируемой информации удваивается. Способ этот, описанный А. Молчановым в «ИНФО» № 3 - 91, может быть назван многочастотной кодовой модуляцией (МКМ), так как каждый импульс на МЛ не просто отображает, а кодирует определённое слово из 2 битов. МКМ реализована в популярных копировщиках HELP4S и HELP7, обеспечивает увеличение плотности записи в 3-4 раза при заметном повышении надёжности.

Однако существующие программы, работающие с МКМ-форматом, хороши прежде всего для архивного хранения информации. Хотя они и позволяют не только копировать, но и запускать загруженные в МКМ-формате файлы, работать с ними неудобно - нужно сначала загрузить копировщик (длиной от 10000(8) до 22000(8)) и только потом можно загрузить и запустить файл. HELP7Z позволяет отчасти исправить положение - он записывает перед файлом МКМ-формата программу-загрузчик с автозапуском, которая уже грузит и запускает файл. Но этот способ хорош лишь для исполняемых программ - ну какой, скажите, смысл «запускать» текстовый файл? Таким образом, остаётся множество сфер деятельности, в которых МКМ-формат пока неудобен: работа с магнитофоном из текстовых и графических редакторов, языков высокого уровня, программ пользователя, формирующих собственные файлы, и т.п.

Кроме всего прочего, HELP4S и HELP7 идентифицируют МКМ-форматность файла с помощью символов-спецификаторов, вводимых в имя файла (14-16-й символы имени). Однако именно эти символы используются для спецификации во многих программах - Бейсике-MSX, файлах данных Фокала, блоках файлов графредактора Р1.0М Бакерина и т.д. Записывать такие файлы с помощью HELP4S и HELP7, естественно, нельзя. Ещё одним недостатком этих программ является то, что оглавление файла и КС записываются на МЛ с повышенной скоростью в ЧМ формате, что заметно снижает общую надёжность чтения.

Автором статьи разработан способ записи на МЛ, позволяющий устранить перечисленные недостатки.

В основе способа лежит 4-частотная МКМ, причём установочная последовательность и оглавление файла записываются в обычном ЧМ-формате и могут читаться на БК без всяких дополнительных средств; отличие от формата А. Молчанова в том, что запись ведётся с обычной скоростью - 1200 бод. Имя исходного файла (в отличие от всех известных способов, включая HELP7 и ТУРБО) не искажается - идентификатором МКМ-файла служит не символ имени, а длина файла; она принимается на 100000(8) превышающей истинную. КС записывается после тела файла в МКМ-формате, благодаря чему надёжность её чтения заметно повышается.

В состав разработанного пакета программ входят три основных программы - копировщик, каталогизатор и резидентный драйвер.

Копировщик КМКМ позволяет загружать файлы как в стандартном, так и в МКМ-формате без объявления имени, записывать на МЛ заданное число копий в выбранном формате, работать с одним или двумя магнитофонами в ручном и автоматическом режимах. Копировщик имеет весь ассортимент известных сервисных функций - поиск на МЛ, изменение любых параметров файлов, ввод и удаление автозапуска. Автозапуск вводится корректный, т.е. исключающий запуск неправильно загруженного файла, и перемещающий - автозапуском может быть снабжён файл любой длины, рассчитанный на работу по любому адресу, при этом длина файла возрастает лишь на длину блока автозапуска (206(8)). Копировщик имеет встроенный символьный дамп и возможность запуска загруженных кодовых программ, причём запуск не является принудительным, а осуществляется вручную после выхода из копировщика. Кроме того, копировщик позволяет «оснастить» любой текстовый файл программой чтения текста READER.4. Загрузка файла в КМКМ производится с визуальным контролем, а возможность зависаний при загрузке, порча копировщика или случайная запись копий с ошибкой полностью исключены. Тип загружаемого файла (ЧМ или МКМ) определяется автоматически. Максимальная длина копируемых файлов при размещении КМКМ в ОЗУ пользователя может достигать 60000(8); длина КМКМ равна 6400(8).

Каталогизатор ТМКМ позволяет проверять файлы на наличие ошибок чтения. В процессе работы ТМКМ формирует протокол проверки, который можно просмотреть на экране, записать на МЛ, распечатать на принтере МС 6313 (или аналогичном). Возможны фиктивное чтение файлов, редактирование протокола, ввод заголовков и номера первого файла, загрузка протоколов с МЛ для просмотра или продолжения (с сохранением нумерации файлов). Процесс чтения файла индицируется. Длина ТМКМ - 3500(8).

Резидентным драйвер ДМКМ предназначен для обеспечения работы любых программ пользователя, обращающихся к магнитофону через стандартное системное прерывание ЕМТ 36 и не изменяющих в процессе работы вектор 30, в том числе из Фокала, Бейсика, пускового монитора и МСД, почти всех известных на БК редакторов текста, графических редакторов, ассемблер систем и т.п. Возможна запись на МЛ как в стандартном формате БК, так и в МКМ-формате; при чтении тип файла определяется автоматически. Обеспечивается загрузка (или запись) файлов по адресу и с именем, указанными в блоке параметров ЕМТ 36, а после загрузки (или записи) файла обеспечивается установка системных признаков в соответствии с принятым для ЕМТ 36 стандартом (т.е. полностью эмулируется работа ЕМТ36 БК-0010). Кроме того, имеется возможность загрузки первого найденного файла без объявления имени (в любом формате). Никаких дополнительных сообщений драйвер на экран не выдаёт и работу подавляющего большинства программ пользователя не нарушает. Перехват прерывания ЕМТ 36 в ДМКМ выполнен таким образом, что при его запуске на фоне других системных программ, перехватывающих прерывание по вектору 30 (отладчиков, драйверов принтеров и т.п.), он не нарушает их работу, являясь как бы «суперрезидентной» программой. Длина ДМКМ, включая блок для выхода в коды, Фокал или Бейсик, всего 2000(8).

В КМКМ и ДМКМ принят односкоростной способ записи - в ЧМ-формате с обычной скоростью - порядка 1200 бод, а в МКМ-формате - со скоростью около 4000 бод, выбранной из соображений достаточной плотности записи, высокой надёжности и пониженных требований к магнитофону и МЛ. Все три программы написаны в перемещаемом формате, могут работать как в ОЗУ пользователя (ДМКМ - с учётом свободной зоны, не используемой другими программами), так и в дополнительном ОЗУ или ПЗУ по любому адресу.

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

 

Ю. ЗАЛЬЦМАН

Ещё раз о защите

Многие пользователи БК-0010 хотели бы защитить свои программы на Бейсике от внесения изменений, а оригинальные алгоритмы, используемые в этих программах, от изучения другими программистами. Для этого используются хитрости с вызовом подпрограмм в машинных кодах или внесение в исходный текст символов, препятствующих его распечатке по команде LIST. Я предлагаю более радикальное решение этой проблемы.

Транслятор с Бейсика перед выполнением программы компилирует её в «шитый» код; после этого можно уничтожить исходный текст программы (оставив необходимые для её выполнения «шитый» код и системную область). Восстановить исходный текст по «шитому» коду крайне трудно даже для опытного программиста, а в случае большой и сложной программы это практически невозможно

Предлагаемая здесь программа BASCOD выполняет все необходимые действия по преобразованию отлаженной Бейсик-программы в файл с «шитым» кодом, который можно загружать и запускать в мониторе как обычную программу в машинных кодах. Программа BASCOD полностью перемещаема. Текст написан на ассемблере (Микро-11 или более ранние версии).

        MOV #3052,R1        ;Начало текста
        MOV #1000,SP
        MOV @#2002,R0       ;Адрес конца Бейсик-программы
        BIT #1,R0
        BEQ 1
        INC R0
1:      CMP (R0)+,#154754   ; * Поиск первого STOP
        BNE 1               ; *
        MOV R0,-(SP)
        MOV #104014,(R1)+   ; * Запись программы
                            ; * останова
        MOV #12706,(R1)+    ; *
        MOV #1000,(R1)+     ; *
        CLR (R1)+           ; *
3:      CMP @R0,#154722     ; Начало цикла перекодировки
        BEQ 10
        CMP @R0,#154754
        BNE 30
        MOV #3052,@R0       ;STOP заменен на Выход
30:     CMP (R0)+,#156156   ; * Проверяется
        BNE 3               ; * подозрение на
        CMP @R0,@SP         ; * использование
        BGE 3               ; * текстовой константы
        CMP @R0,#3052       ; *
        BLE 3               ; *
        CMP 2(R0),#400      ; *
        BHI 3               ; *
        TST 2(R0)           ; *
        BEQ 3               ; *
        MOV @R0,R2          ;Найдена текстовая
        MOV R1,(R0)+        ; константа, перемещаем
        MOV (R0)+,R3        ; её в начальные адреса кода
4:      MOVB (R2)+,(R1)+
        SOB R3,4
        BR 3
10:     MOV R0,R2           ; Найден END
        MOV #3052,(R0)+     ;END заменен на Выход
        BIT #1,R1
        BEQ 5
        INC R1
5:      MOV #1000,R0        ; * Перенос программы
        MOV PC,R3           ; * начального запуска
        ADD #216,R3         ; *
20:     MOV (R3)+,(R0)+     ; *
        TST @R3             ; *
        BNE 20              ; *
        MOV #12704,(R0)+    ; *
        MOV @SP,(R0)+       ; *
        MOV #134,@R0        ; *
        MOV (SP)+,R0
6:      MOV #377,(R1) +     ; *   Забитие бывшего
        CMP R1,@#2002       ; *   текста
        BLT 6               ; *
7:      MOV #14,R0          ;Начинается запись файла
        EMT 16              ; с перекодированной программой
        MOV #232,R0
        EMT 16
        MOV #25,R0
        EMT 16
        EMT 16
        MOV #320,R1
        MOV #2,(R1)+
        MOV #1000,(R1)+
        MOV @#2030,@R1
        SUB #774,(R1)+
        MOV R1,-(SP)
        MOV #100724,R3      ; * Ввод имени файла
        JSR PC,@#100460     ; *
        MOV (SP)+,R1        ; *
        MOV #5020,R2        ; *
        EMT 10              ; *
        DEC R1              ; *
14:     MOVB #40,(R1)+      ; *
        DEC R2              ; *
        BPL 14              ; *
15:     MOV #320,R1
        EMT 36
        CLR R2              ;Вопрос "Повторять?"
        MOV PC,R1
        ADD #22,R1
        EMT 20
        EMT 6
        CMP R0,#116
        BNE 15
        JMP @#100000        ;Выход
        .B:25.A:Ещё копию?
        .E
A:      EMT 14              ;Программа начального запуска
        MOV #146404,@#34
        MOV #100274,@#4     ;<СТОП> заменен на Выход
        MOV #232,R0
        EMT 16
        INC R0
        EMT 16
        MOV #2000,SP
        HALT
        END

Для правильной работы BASCOD необходимо выполнить некоторые подготовительные действия:

  1. Отлаженную Бейсик-программу привести в следующий вид:
    DIM ... (все операторы DIM, которые есть в программе)
    STOP
    ...

    Все остальные операторы. Среди них не должно быть операторов DIM и END. Все операторы END которые встречаются в тексте, надо заменить на

    STOP
    ...
    END

    Наличие STOP между описанием массивов и остальными операторами (перед самым первым, если нет массивов) и END самым последним в программе обязательно!

  2. Задать с помощью CLEAR верхнюю границу доступной Бейсику памяти. В любом случае надо оставить свободным место, куда будет загружена BASCOD, но желательно установить границу как можно ближе к фактическому концу программы.
  3. Выполнить команду RUN. При этом возможно сообщение об ошибке 7 (переполнение памяти). Тогда следует увеличить в CLEAR верхнюю границу и повторить запуск. Если же памяти хватило, транслятор сформирует «шитый» код и начнёт выполнение программы, но сразу остановится на операторе STOP в начале текста.

Теперь можно загружать и запускать BASCOD, например, так:

BLOAD "BASKOD",R,&О37300

Если всё сделано правильно, на экране появится вопрос «ИМЯ?». Нужно ввести имя для файла с «шитым» кодом и записать на магнитофон нужное число копий. В дальнейшем этот файл можно будет загружать в мониторе командой М или M1000 и запускать командой S или S1000. Разумеется, запуск будет удачным, только если ПЗУ с Бейсиком не отключено.

Если же что-то не получилось, стоит проверить, правильно ли выполнены подготовительные действия.

Преобразование Бейсик-программ не исключает использования подпрограмм в машинных кодах, но для компоновки «шитого» кода и подпрограмм в один файл потребуется отладчик. Размещать подпрограммы в кодах можно не только после Бейсик-программы, но и на том месте, где раньше располагался исходный текст. Эта область заполнена кодом 377(8), и её начало находится где-то после текстовых констант, начинающихся с адреса 3062(8). Операторы DEF USR для таких подпрограмм должны располагаться до первого STOP вместе с описаниями массивов. Для компоновки «шитого» кода и подпрограмм следует в любом отладчике загрузить преобразованную Бейсик-программу, найти начало свободной области, разместить в ней Подпрограммы в кодах, занести для каждой из них в ячейку с адресом 2100(8)+ <удвоенный номер соответствующей функции USR> адрес подпрограммы в памяти и записать файл на магнитофон.

Надеюсь, что программа BASCOD будет полезна многим пользователям, работающим с вильнюсским Бейсиком-86.

 

М. ЕЖОВ


 

СМ 6337+БК

Работающим на отечественных IBM-совместимых ПЭВМ хорошо известен принтер СМ 6337. Чтобы подключить его к БК, необходимо немногое - соединительный кабель и программное обеспечение.

Контакты разъёма УП БК

Обозначение сигнала

Наименование сигнала

Контакты разъёма ИРПР-М СМ 6337

А16

ВД00

D0

3

А13

ВД01

D1

5

В12

ВД02

D2

7

В10

ВД03

D3

9

В5

ВД04

D4

11

В7

ВД05

D5

13

В6

ВД06

D6

13

А7

ВД07

D7

17

А28

ВД08

STROBE

1

А23

BB08

BUSY

21

В29

ВВ14

РЕ

23

А30

ВВ15

ERROR

28

А11

Общий

 

2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24

 

Схема кабеля приводится в таблице. Некоторые сигналы принтера, например, ACKNLG, не задействованы - они не нужны при работе. К БК подсоединены линии РЕ и ERROR (сигналы об ошибках), однако в большей части своих программ эти сигналы я не использую - для уменьшения объёма программы, да и нет в них особой необходимости.

На СМ 6337 необходимо установить тип интерфейса ИРПР-М, т.е. поставить переключатель S5.1 в положение «0» («на себя»).

К сожалению, интерфейс принтера не совместим со стандартным, каковым обычно считают интерфейс, необходимый для работы с подпрограммой печати, зашитой в ПЗУ Бейсика. Однако в целом интерфейсы очень схожи (используются лишь различные уровни сигналов), поэтому несложно доработать любую программу, имеющую в своём составе драйвер принтера, для работы с СМ 6337. Мной были доработаны такие программы, как ОТЛАДЧИК.9, BRED и др. Доработанные версии получили соответственно названия ОТЛАДЧИК.9П, BRED.6337 и т.д. Доработка заключалась в замене «родного» драйвера принтера на разработанный мной драйвер 6337. Это достаточно просто. Хуже, если заменить драйвер невозможно, например, когда программа находится в ПЗУ (в первую очередь это относится к Бейсику). Для этого случая мной написаны специальные программы.

Существует четыре подхода к написанию таких программ - аппаратный, программно-аппаратный и два чисто программных. Расскажу лишь о программных. Первый - «поимка» вызова драйвера, очень медленный, а главное, порождающий очень объёмные программы метод. Второй - написание подпрограмм в кодах, которые будут выбиваться Бейсиком. Использовать их ненамного более сложно, чем оператор LPRINT, они невелики и быстро работают. Пользовательский интерфейс навеян работой на ДВК-2 в среде BASIC-OSDVK. Вывод программы производится оператором записи SAVE вот так:

SAVE "LP:"

А подпрограмма печати перехватывает обращение к магнитофону и выводит «записываемое» на принтер.

Приведу одну из самых простых программ, работающих с 6337.

        MOV     #177714,R4      ;Адрес порта ввода-вывода
BEG:    MOV     '>’,R0          ;Вывод ">"
        EMT     16              ;
        MOV     PC,R1           ;Вычисление адреса буфера
        ADD     (PC)+,R1        ;текста, расположенного
        .@BUF+2                 ;сразу после программы
        MOV     R1,R0           ;Ввод строки (до 63 симв.)
        MOV     #5077,R2        ;
        EMT     16              ;
1:      MOV     #400, (R4)      ;Сброс STROBE
        MOVB    (R0)+,R3        ;Выделение следующего символа строки
        BIC     #177400,R3      ;Выделение младшего байта 
        COMB    R3              ;Инверсия передаваемого байта
        MOV     R3,(R4)         ;Передача на принтер
2:      BIT     #400,(R4)       ;Проверка сигнала BUSY
        BEQ     2               ;(ожидание готовности принтера)
        CMP     R0,R1           ;Конец строки?
        BNE     1               ;
        BR      BEG             ;Возврат к началу программы
BUF:    END                     ;Начало буфера текста

В программное обеспечение принтера входят как уже упомянутые доработки известных программ, так и оригинальные разработки - печать текстов различных форматов (на ассемблере, Бейсике, Фокале), печать дампов, твёрдой копии экрана, подпрограммы для работы в Бейсике, многие другие.

Заинтересовавшиеся могут обратиться по адресу: 432012, Ульяновск пр. Гая, 23а, 44. Тел. 37-10-57.

 

П. НИКОНОВ


 

Каталожная информационно-поисковая система

Профессиональные пользователи БК всю основную информацию об имеющихся у них программах хранят обычно в так называемых каталожных файлах, которые создаются с помощью программ CATALOG, CATALOGM, VERIFY2, VERIFY+ и т.п. Однако разрозненность этих файлов (свой для каждой кассеты) мешает систематизации каталога в целом.

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

Для каждого фиксируемого в архиве файла системой сохраняются и обрабатываются параметры, перечисленные в таблице.

Параметр

Значение

Имя файла

16 символов

Адрес загрузки

0-177777(8)

Длина файла

0-177777(8)

Контрольная сумма

0-177777(8)

Номер кассеты

0-99

Сторона кассеты

А, В

Номер записи на стороне

0-99

Система единовременно позволяет хранить в памяти БК параметры более 1000 (!) файлов без обмена с магнитофоном.

Ядром системы является файл CAT, к которому по мере надобности могут подзагружаться файлы CAT.LOAD, CAT.EDIT, CAT.SORT и CAT.FIND. CAT обеспечивает:

CAT.LOAD обеспечивает подстыковку файлов в формате VERIFY+ к уже имеющимся в памяти БК по запросу имени файла. При успешном чтении запрос повторяется. По клавише СТОП можно выйти в монитор системы.

CAT.EDIT обеспечивает процесс редактирования одной строки списка, перемещение по списку, вставку пустой строки, удаление целой строки.

CAT.SORT обеспечивает сортировку каталога по всем параметрам (как в неубывающем, так и в невозрастающем порядке), причём при сортировке по именам русский алфавит отсортировывается в естественном порядке.

CAT.FIND обеспечивает поиск по модели с возможностью печати найденных файлов на принтере. Это, пожалуй, самый важный файл системы. В режиме редактора строки вводится модель поиска (для всех или для части параметров). Она может включать инверсные символы «?» и «*» (они, в отличие от обычных символов «?» и «*», вводятся клавишами СТРЕЛКА ВВЕРХ и СТРЕЛКА ВНИЗ): первый заменяет любой символ, второй - любую (в частности, «нулевую») группу символов. Например, модель *С* задаёт поиск всех имён, содержащих символ С, модель ??С* - имён, в которых символ С стоит в третьей позиции.

 

А. ЛОБАНОВ

Форматировка результатов вычислений в Бейсике БК

Результаты вычислений в Бейсике получаются зачастую не только с чрезмерным числом знаков, но и с ошибками. Например, результатом сложения 76 и 0.14 будет 76.140000000000001, а деление 8912 на 100 даст 89.11999999999999. Оператор же формата представления числа при выводе отсутствует.

Использование функции DEF FNA(X) = INT(X*Q+.5)/Q, стандартно применяемой для форматировки результатов вычислений с заданной точностью Q, не позволяет преодолеть отмеченные недостатки.

Между тем перевод результата вычислений Р в строковую форму и дальнейшая работа с ней позволяют достаточно легко организовать процедуру форматировки представления числа без округления.

В строке 60 приведённой программы определена пользовательская функция, переводящая результаты вычислений в «строковый образ» FNP$(P), корректирующая «шалости» функции MID$() и успешно справляющаяся с такими каверзными числами, как 2.9999999999999. Многозадачность этой функции делает её внешний вид весьма эффектным.

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

Формат представления чисел в данной программе определяется параметром Q; число нулей в нем устанавливает число цифр, сохраняемых после запятой при печати числа.

Особую роль играют функции STRING$ в строке 160: они дополняют столбцы таблицы до требуемой ширины и в конечном счёте формируют всё поле таблицы.

В программе предусмотрено выравнивание чисел в графе по правому краю; для выравнивания по левому краю достаточно поменять местами функции STRING$ и FNP в строке 160. Уменьшаемое в первом аргументе функции STRING (в нашей программе 12) задаёт ширину графы.

Недостатком предлагаемого способа является медленная работа пользовательской функции. Но, как говорится, за неимением гербовой...

1 ' ФОРМАТИРОВКА (БЕЗ ОКРУГЛЕНИЯ!) РЕЗУЛЬТАТОВ ВЫЧИСЛЕНИЯ ПЕРВОГО десятка СТЕПЕНЕЙ ЧИСЕЛ пи, е,
    ln пи, ln 10
10 CLS
20 INPUT "ТОЧНОСТЬ";Q
30 ?
40 ?
50 ?
60 DEF FNP$(P)=""+MID$(STR$(FIX(P+SGN(P)*5D-7)),1,LEN(STR$(FIX(P+SGN(P)*5D-7)))-1)+
   "."+MID$(STR$(FIX(Q*(ABS(P+SGN(P)*5D-7-FIX(P+SGN(P)*5D-7))+1))),3,LEN(STR$(FIX(Q*(ABS(P+SGN(P)*
   5D-7-FIX(P+SGN(P)*5D-7))+1))))-3)
70 A=1
80 B=1
90 C=1
100 D=1
110 FOR K=1 TO 10
120 A=A*PI
130 B=B*EXP(1)
140 C=C*LOG(PI)
150 D=D*LOG(10)
160 ? STRING$(12-LEN(FNP$(A)),32);FNP$(A);STRING$(12-LEN(FNP$(B)),32);FNP$(B);STRING$(12-
    LEN(FNP$(C)),32);FNP$(C);STRING$(12-LEN(FNP$(D)),32);FNP$(D)
170 NEXT K
180 END

 

А. ГУСЕЙНОВ

 

Performed by © gid, 2012-2022.