Author: Кетков Ю.Л.
Tags: вычислительная математика численный анализ математика программирование эвм языки программирования вычислительная техника микро эвм
ISBN: 5-02-013779-0
Year: 1988
Ю Л. КЕТКОВ
,налог
на языке
бейсик
для мини
и микро
ЭВМ
Ю. Л. КЕТКОВ
Диалог
на языке бейсик
для мини- и микро-
ЭВМ
МОСКВА «НАУКА»
ГЛАВНАЯ РЕДАКЦИЯ
ФИЗИКО-МАТЕМАТИЧЕСКОЙ ЛИТЕРАТУРЫ
19 8 8
ББК22.18
К 37
УДК519.6
К е т к о в Ю. Л. Диалог на языке бейсик для мини- и микро*
ЭВМ.—М.: Наука. Гл. ред. физ.-мат. лит., 1988.—368 с.
ISBN 5-02-013779-0
Последовательно излагаются вопросы программирования на наибо-
лее популярном диалоговом алгоритмическом языке бейсик. Этот язык
используется на всех современных мини- и микроЭВМ. В наиболее
развитых странах изучение бейсика составляет основу школьных кур-
сов программирования в старших классах.
Предлагаемая книга состоит из двух частей. В части 1 излагаются
основы программирования задач вычислительного характера, описы-
ваются средства обработки символьной и графической информации,
рассматриваются вопросы приложения матричных операций. Большое
внимание уделяется систематизации базовых средств языка и их по-
следующему развитию в различных отечественных и зарубежных
версиях. Часть 2 книги представляет собой справочное руководство
по реализациям бейсика на ЭВМ, выпускаемых в рамках СЭВ.
Книга ориентирована на многочисленных пользователей средств
современной вычислительной техники, студентов средних и высших
учебных заведений, преподавателей программирования.
Табл. 92. Ил. 47. Библиогр. 90 назв.
Рецензент
кандидат физико-математических наук А. В. Гиглавый
„ 1702070000-102 ол
К 053 (02)-88 24-88
ISBN 5-02-013779-0
© Издательство «Наука».
Главная редакция
физико-математической
литературы, 1988
ОГЛАВЛЕНИЕ
Предисловие................................... 7
Часть I. ПРОГРАММИРОВАНИЕ НА БЕЙСИКЕ 9
Глава 1. Введение в бейсик.............................. 9
1.1. Происхождение бейсика........................... 9
1.2. Как набирается программа на бейсике ,.......... 12
1.3. Режим непосредственных вычислений.............. 15
1.4. Алфавит бейсика.............*.................. 15
1.5. Объекты алгоритмического языка............, . 16
1.6. Анализ простой программы....................... 23
Глава 2. Основы программирования задач вычислительного
характера.............................................. 29
2.1. Как задать или изменить значение переменной ... 29
2.2. Как напечатать результаты вычислений 31
$.3. Как изменить ход вычислений 36
2.4. Повторное использование блока данных 47
2.5. Случайные числа в вычислительной математике ... 51
Глава 3. Основные форматы базовых операторов • . . . . 54
3.1. Оператор DATA...............•.................. 55
3.2. Оператор DEF................................... 55
3.3. Оператор DIM................................... 57
3.4. Оператор END................................... 58
3.5. Оператор FOR................................... 59
3.6. Оператор GOSUB................................. 60
3.7. Оператор GOTO.................................. 62
3.8. Оператор IF.................................... 63
3.9. Оператор INPUT................................. 64
3.10. Оператор LET.................................. 65
3.11. Оператор NEXT................................. 66
3.12. Оператор ON............................ . . 67
3.13. Оператор OPTION BASE.......................... 68
3.14. Оператор PRINT................................ 69
3.15. Оператор RANDOMIZE............................ 70
3.16. Оператор READ . .............................. 71
3.17. Оператор REM , . ............................. 71
3.18. Оператор RESTORE ............... 72
3
3.19. Оператор RETURN................................... 72
3.20. Оператор STOP..................................... 74
Глава 4. Элементы обработки символьной информации . . 74
4.1. Основные символьные объекты........................ 75
4.2. Как задать или изменить значение текстовой перемен-
ной ................................................... 77
4.3. Стандартные процедуры обработки символьных строк 79
4.4. Ввод символьных данных с помощью оператора LINPUT 82
4.5. Лексикографическое упорядочение текстовых данных 83
4.6. Типовые средства преобразования данных............. 87
Глава 5. Средства редактирования данных при выводе ... 92
5.1. Управление форматом вывода числовых данных ... 92
5.2. Печать с использованием формата выводной строки 96
5.3. Другие способы управления форматом вывода .... 105
Глава 6. Работа с файлами.................................. 111
6.1. Основные приемы работы с последовательными фай-
лами ................................................. 113
6.2. Организация обмена с файлами прямого доступа ... 116
6.3. Работа с виртуальными массивами на ЭВМ типа ДВК,
СМ-3, СМ-4............................................ 117
Глава 7. Матричные операции................................ 118
7.1. Специфика базовых операторов...................... 119
7.2. Приложение матричных операторов к расчету электри-
ческих цепей ......................................... 127
7.3. Новые функциональные возможности матричных про-
цедур ................................................ 138
Глава 8. Машинная графика.................................. 142
8.1. Основные сведения об аппаратных средствах .... 142
8.2. Некоторые математические аспекты машинной графики 147
8.3. Средства машинной графики на ЭВМ Искра-226 . . . 149
8.4. Цветная дисплейная графика........................ 157
8.5. Метод блуждающей маски............................ 164
Глава 9. Сегментация программ.............................. 168
9.1. Включение машинных команд в бейсик-программу , . 168
9.2. Использование библиотеки машинных подпрограмм . . 170
9.3. Использование программ, составленных на ассемблере 172
9.4. Доступ к ячейкам оперативной памяти............... 173
9.5. Использование подпрограмм, составленных на других
алгоритмических языках................................ 174
9.6. Статическая сборка бейсик-программы из библиотечных
заготовок............................................. 174
9.7. Организация цепочки последовательно работающих
программ.............................................. 176
9.8. Динамическая загрузка и выполнение подпрограмм,
написанных на бейсике................................. 178
Глава 10. Элементы программирования в режиме реального
времени .................................................. 180
10.1. События и прерывания. Управление процессами . . 180
10.2. Операции с битовыми шкалами 183
4
10.3. Обработка пультовых сигналов прерывания....... 187
10.4. Временные измерения и организация «будильника» 195
10.5. Обработка программных ошибок.................. 197
Глава 11. Язык системных команд.......................... 199
11.1. Изначальный ввод программы с терминала........ 199
11.2. Формирование исходной программы с использованием
архива............................................... 200
11.3. Корректировка текущей программы................ 201
11.4. Просмотр и распечатка текущей программы .... 203
11.5. Выполнение текущей программы................... 204
11.6. Отладочные средства............................ 205
11.7. Работа с архивом программ...................... 206
11.8. Управление внешними устройствами............... 208
11.9. Служебные директивы............................ 211
Глава 12. К вопросу стандартизации бейсика............. 212
12.1. Минимальный бейсик.............................. 213
12.2. В ожидании нового стандарта..................... 215
12.3. Общие сведения................................. 216
12.4. Расширение набора базовых операторов и модифика-
ция традиционных форм ............................... 218
12.5. Сегментация программ ........................... 221
12.6. Работа с файлами.............................., 223
12.7. Программные средства обработки особых ситуаций 229
12.8. Предложения по стандартизации графической компо-
ненты ............................................., 231
12.9. Редактирование исходной программы.............. 236
12.10. Управление реальными объектами и процессами , , 236
Часть II. СПРАВОЧНОЕ РУКОВОДСТВО
ПО КОНКРЕТНЫМ РЕАЛИЗАЦИЯМ
Глава 13. Основные этапы развития Дартмутской версии . . 239
Глава 14. Бейсик на отечественных ЭВМ 2-го поколения 242
14.1. Бейсик-система для ЭВМ типа М-20 .............. 242
14.2. Система разговорного программирования бейсик-гамма 246
14.3. Диалоговая система BASIC-6..................... 249
Глава 15. Реализация бейсика на ЕС ЭВМ................... 252
15.1. Система программирования бейсик-ЕС............. 252
15.2. Диалоговая система ИКИ АН СССР................. 256
15.3. Диалоговая система программирования Дисп-ЕС . . 258
Глава 16. Бейсик на миниЭВМ ............................. 262
16-1. Бейсик на миниЭВМ М-6000 (СМ-1) и М-7000 (СМ-2) 262
16.2. Бейсик в составе операционных систем ОС РВ и
Рафос (СМ-3, СМ-4).................................. 271
16.3. Бейсик-плюс на ЭВМ типа СМ-4.................. 279
16.4. Настольные миниЭВМ А5120 и А5130 ............. 287
Глава 17. Бейсик на микроЭВМ и персональных компьюте-
рах ..................................................... 292
17.1. Бейсик на микроЭВМ Электроника-60 ............ 292
5
17.2. Электроника ДЗ-28 ................................ 294
17.3. Диалоговые вычислительные комплексы (ДВК) . . . 300
17.4. МикроЭВМ Искра-226 ............................... 301
17.5. Персональная ЭВМ Агат............................. 320
Глава 18. MS-BASIC на персональных компьютерах 80-х го-
дов ...................................................... 326
18.1. Бейсик-80 ..................*..................... 326
18.2. Расширенный бейсик-80 ............................ 331
18.3. Персональный компьютер фирмы IBM............. 334
18.4. Бейсик на персональных компьютерах типа MSX . . 341
18.5. Особенности входного языка бейсик-изот....... 347
18.6. Особенности входного языка бейсик-роботрон .... 348
Указатель версий бейсика.................................... 351
Указатель операторов ....................................... 352
Указатель функций .......................................... 360
Указатель директив.......................................... 363
ПРЕДИСЛОВИЕ
В текущем году исполняется 10 лет с момента появления до-
ступной нашим читателям первой книги по бейсику. За это время
бейсик развился и стал настолько популярным, что его изучают даже
в школе. Именно поэтому автору пришлось решать две задачи.
Во-первых, хотелось подготовить своеобразную энциклопедию,
в которой можно найти исчерпывающие сведения о тех или иных
конструкциях языка, проследить и систематизировать основные тен-
денции развития бейсика.
Во-вторых, было необходимо познакомить читателя с достаточно
полным составом конкретной версии и подчеркнуть ее особенности,
с которыми приходится считаться при конвертировании программ,
работающих на ЭВМ другого типа. Отсюда и четкая граница, разде-
ляющая книгу на две части.
Часть 1 начинается с небольшого исторического обзора и зна-
комства с основными средствами так называемой базовой версии
бейсика. При этом последовательность изложения диктуется ответами
на три фундаментальных вопроса, возникающих при составлении про-
грамм на любом алгоритмическом языке:
— как задать или изменить значения переменных;
— как отпечатать (вывести) результаты вычислений;
— как изменить ход вычислительного процесса.
В главе 3 приводятся основные форматы базовых операторов и
их модификации, с которыми можно встретиться в различных вер-
сиях языка.
Семь следующих глав связаны с основными направлениями раз-
вития бейсика:
— средствами обработки символьной информации;
— управлением фор матом данных прЙ выводе;
— организацией работы с файлами;
— матричными процедурами;
— элементами машинной графики;
— сегментацией программ;
— управлением процессами.
Глава 11 посвящена описанию основных процедур обработки бей-
сик-программ в различных системах программирования. Хотя набор
директив и их форматы довольно сильно зависят от используемой
операционной системы, смысл этих процедур по существу своему на
разных ЭВМ мало чем отличается.
В главе 12 кратко описываются предложения по стандартизации
языка, опубликованные рабочей группой американского националь-
7
ного института стандартов (ANSI) и широко обсуждавшиеся в зару-
бежной печати в период 1983-85 гг.
Часть 2 книги представляет собой краткое справочное пособие
по конкретным реализациям бейсика на различных ЭВМ. Здесь до-
статочно важным в историческом аспекте нам представляется не-
большой фрагмент (главы 13—15), посвященный этапам развития
языка, по которым прошли его создатели, а также оригинальным
отечественным реализациям бейсика на ЭВМ 2-го и 3-го поколений.
В трех последних главах содержится информация о составе вход-
ного языка бейсик-интерпретаторов на мини- и' микроЭВМ, совмести-
мых по системе команд с машинами типа СМ-3(4), на ЭВМ Искра-226,
на 8- и 16-разрядных персональных компьютерах, использующих ту
или иную модификацию MS-BASIC (Изот-1031, Роботрон-1715, MSX,
IBM PC) и совместимых с последней отечественной ПЭВМ.
Всего в книгу включены описания 25 версий бейсика, в том
числе и проект нового стандарта. Для удобства поиска нужной инфор-
мации приведены алфавитные указатели операторов, функций и ди-
ректив с перечнем версий, в которых используется тот или иной
термин. Библиография приводится в конце разделов и глав для удоб-
ства читателей.
СПИСОК ЛИТЕРАТУРЫ
1. К emen у J. С., Kurtz Т. Е. BASIC programming.— N. Y.: John
Wiley, 1967.
2. Дьяконов В. П. Справочник по алгоритмам и программам на
бейсике для персональных ЭВМ.— М.: Наука, 1987.
3. Кетков Ю. Л. Программирование на бейсике.— М.: Финансы
и статистика, 1978.— 158 с.
4. Кнут Д. Искусство программирования: В 3 т. Т. 2.:—Полу-
численные алгоритмы.— М.: Мир, 1977.
5. К у л и к о в В. Д. Курс программирования.— Л.: Изд-во ЛГУ,
1982.—208 с.
6. Соболь И. М. Численные методы Монте-Карло.— М.: Наука,
1985.—80 с.
7. Трэктон К. Программы на бейсике для инженерно-технических
расчетов.— М.: Радио и связь, 1985.— 96 с.
8. Уолш Б. Программирование на бейсике.— М/. Радио и связь,
1987.— 336 с.
9. УортТ. Программирование на языке бейсик.— М.: Машино-
строение, 1981.— 225 с.
10. ФоксД., ФоксА. Бейсик для всех.— М.: Энергоатомиздат,
1986.— 176 с.
Часть I. ПРОГРАММИРОВАНИЕ НА БЕЙСИКЕ
Глава 1. ВВЕДЕНИЕ В БЕЙСИК
1.1. Происхождение бейсика
Трудно назвать другой алгоритмический язык, который бы имел
такое распространение, как бейсик, и в то же время привел к столь
глубокому расколу на лагерь ревностных его почитателей и не менее
воинствующих приверженцев иных языков и стилей программирова-
ния. Вот несколько наиболее характерных высказываний о бейсике.
«Можно смело сказать, что именно с бейсика часто начинается
влюбленность в ЭВМ и «туземец» (т. е. — непрофессионал) превра-
щается в маститого «аборигена», бесстрашно решающего сложнейшие
задачи с помощью ЭВМ» (Л. А. Растригин. Вычислительные маши-
ны, системы, сети...— М.: Наука, 1982).
«Бейсик — язык более известный своей популярностью, чем воз-
можностью использования во встроенных системах для инженерных
приложений. Иногда, достаточно резко, его называют языком для
простаков... При желании использовать язык высокого уровня бей-
сик может удовлетворить первоначальный аппетит, но при более
серьезном подходе выбор этот скорее всего будет не последним»
(Р. Фаулджер. Программирование встроенных микропроцессоров. М.:
Мир, 1985).
«Практически невозможно научить хорошему программирование
студентов, ориентированных первоначально на бейсик; как потенци-
альные программисты они умственно оболванены без надежды на исце-
ление» (Э. В. Дейкстра. ASM SIGPL AN Notice, 1982, №7, p. 13—15).
Споры о преимуществах или недостатках того или иного алго-
ритмического языка ведутся с момента возникновения первых средств
автоматизации программирования. Естественный консерватизм, при-
сущий любому языку, дает обильную пищу таким спорам. Иногда они
носят довольно схоластический характер, больше напоминая войну
«тупоконечников» и «остроконечников». В большинстве своем алго-
ритмические языки высокого уровня располагают довольно сходными
возможностями, а процедуры, не реализуемые языковыми средствами,
могут быть выполнены с помощью подпрограмм, составленных на
9
других алгоритмических языках. В конечном итоге можно прибегнуть
к языку ассемблер и выжать из ЭВМ все, на что она способна. Мно-
гие функции общего назначения, реализуемые внешними процедурами,
с развитием алгоритмического языка постепенно переходят в состав
его штатных средств. Однако этот процесс усложнения входного
языка зачастую вступает в противоречие с возможностями и потреб-
ностями того или иного контингента пользователей.
Существует предположение (Л. А. Растригин), что своим наиме-
нованием бейсик обязан довольно популярному среди эмигрантов
упрощенному английскому языку «Basic English», насчитывающему
порядка 300—800 слов. По этому параметру сюда скорее бы подош-
ли более солидные алгоритмические языки типа ПЛ/1 или кобол.
Первоначальная версия бейсика обходилась всего 14-ю служебными
словами, почти вдвое уступая словарному запасу знаменитой Эллочки-
людоедки. При желании в термине «basic» можно усмотреть и неко-
торую претенциозность (basic—основа, база), однако авторы языка
уверяют, что его название образовано от сокращения английских
слов—Beginner’s All Purpose Symbolic Instruction Code. В дословном
переводе это —многоцелевой код (язык) символических команд для
начинающих. Язык бейсик и соответствующий транслятор для ЭВМ
GE-235 были разработаны сотрудниками Дартмутского колледжа
(США) в 1964 г. Если исключить рабочие инструкции, доступные
только узкому кругу пользователей, то первая официальная публи-
кация по бейсику датируется 1967 годом [1J. Однако широкое при-
знание пришло к этому языку несколько позже, после того, как он
попал в знаменитый реестр, опубликованный руководителем отделе-
ния алгоритмических языков фирмы IBM Джейн Сэммет (J. Е. Sam-
met: Programming Languages: History and Fundamentals. Prentice-
Hall, N. Y., 1969).
В конце 60-х — начале 70-х годов бейсик получил мощную под-
держку фирм' General Electric, Hewlett-Packard и Digital Equipment
Corp. (DEC). Для двух последних этот период совпал с крупными
успехами на рынке миниЭВМ. Благодаря этим обстоятельствам на-
чавшееся десятилетие можно считать периодом расцвета диалоговых
систем программирования на базе Дартмутской версии бейсика и ее
последующих модификаций.
В нашей стране интерес к бейсику проявили независимо друг от
друга несколько организаций, в которых были предприняты попытки
создать системы коллективного пользования на базе отечественных
ЭВМ. Первая Бейсик-система для ЭВМ типа М-20 была разработана
сотрудниками Горьковского университета в 1969—1970 гг. Сначала
эта система эксплуатировалась в пакетном режиме, а в . 1973 г. на ее
базе был введен в строй первый учебный терминал-класс. Другой
достаточно известной реализацией была диалоговая система BASIC-6,
разработанная в 1972 г. сотрудниками ВЦ СО АН СССР на базе
10
ЭВМ БЭСМ-6. Еще две системы тех лет были созданы в Институте
кибернетики АН УССР (система АЗ на базе БЭСМ-6) и в Институте
математики АН БССР (система Бейсик-гамма на базе ЭВМ Минск-32).
Второй этап увлечения бейсиком в нашей стране совпал с вы-
пуском семейства малых ЭВМ, совместимых по архитектуре и про-
граммному обеспечению с зарубежными моделями фирм Hewlett-Pac-
kard (М-6000, М-7000, СМ-1, СМ-2) и DEC (СМ-3, СМ-4).
Современная массовая вычислительная техника — микроЭВМ и
персональные компьютеры сделали бейсик своеобразным эсперанто,
одинаково доступным школьнику и студенту, бухгалтеру и экономи-
сту, инженеру и исследователю. Вместе с другим алгоритмическим
языком рапира он положен в основу школьного курса по' информа-
тике и вычислительной технике.
Небольшой штрих, подчеркивающий необычайную популярность
бейсика в студенческой среде. В 1975 г. одному из студенческих
строительных отрядов Горьковского университета было присвоено на-
звание «BASIC». Вскоре после этого термин «BASIC» можно было
встретить на заборах, ограждающих строительные площадки города
и области. Автор не располагает информацией о каком-либо другом
алгоритмическом языке, удостоенном таких почестей.
Наконец, еще один факт, свидетельствующий о том, что бейсик
создан не только для развлечений и игр. Фирму IBM довольно труд-
но заподозрить в симпатиях к языку, разработанному конкурентами.
Тем не менее именно IBM заключила контракт стоимостью 1.7 млрд,
долларов на создание программного обеспечения боевой системы
SABACS управления подводными лодками ВМС США. А в качестве
языка программирования этой системы утвержден бейсик (Электро-
ника.— 1985.—№ 11.—С. 8 — 9).
Из сказанного выше не следует, что автор считает бейсик иде-
альным языком программирования. К нему можно предъявить целый
ряд претензий по существу. И по мере изложения материала мы бу-
дем фиксировать внимание читателя на слабых сторонах бейсика.
В качестве средства массового обучения была бы более понятна
отечественная версия алгоритмического языка. Не так уж и трудно
предусмотреть в современных компиляторах и интерпретаторах дву-
язычные таблицы служебных слов и текстовых сообщений. Однако
среди доступных нам сегодня систем программирования бейсик наи-
более удобен для начального освоения средств вычислительной тех-
ники непрофессиональным пользователем.
Автор вполне разделяет мнение Р. Фаулджера о том, что по мере
овладения элементами компьютерной грамотности и усложнения стоя-
щих перед пользователем задач выбор бейсика может оказаться не
последним. Возможным преемником может стать выдержавший про-
верку временем, хотя и несколько старомодный фортран, к которому
бейсик очень близок.
11
1.2. Как набирается программа на бейсике
Бейсик относится к процедурно-ориентированным алгоритмиче-
ским языкам. Программа на этом языке состоит из упорядоченного
набора операторов (процедур), предписывающих, какие действия и в
какой последовательности ЭВМ должна выполнить, чтобы решить за-
дачу. На самом деле бейсик-программа адресована непосредственно
не вычислительной машине, а находящейся в ее памяти программе-
переводчику (транслятору) или программе-исполнителю* (интерпре-
татору).
Текст бейсик-программы набирается с помощью клавиатуры тер-
минала подобно тому, как любой документ печатается на пишущей
машинке. Информация, набираемая пользователем и поступающая в
ЭВМ, состоит из нумерованных (программных) и ненумерованных
(директивных, командных) строк. В процессе ввода программные
строки машиной обычно не обрабатываются, а лишь накапливаются
в памяти ЭВМ и упорядочиваются по возрастанию номеров строк.
Командные строки подлежат немедленному исполнению.
Наиболее естественными представляются системы, для которых
программная или командная строка отображается в виде одной стро-
ки на экране дисплея. Однако существует довольно много типов тер-
миналов с очень короткими строками — 20, 32 или 40 символов.-Боль-
шая формула в такой строке не уберется. Поэтому в большинстве
современных бейсик-систем программные и командные строки могут
занимать несколько подряд идущих строк на экране дисплея. В од-
них системах такой перенос осуществляется автоматически по дости-
жении последней позиции в текущей строке, в других — для продол-
жения набора в следующей строке пользователь должен сам нажать
специальную клавишу ПС (Перевод Строки) или LF (Line Feed).
Признаком конца набора очередной программной или командной
строки является нажатие управляющей клавиши ВК (Возврат Ка-
ретки) или CR (Carriage Return).
С помощью программных строк формулируется алгоритм реше-
ния задачи. Каждая программная строка начинается с числовой
метки — целого числа из диапазона [1,9999]. В некоторых системах
максимальное значение метки может ограничиваться и другим числом,
например, 32767 или 99999. Такие ограничения, как правило, носят
технический характер и зависят от программной реализации. Вслед
за числовой меткой располагается один или несколько операторов
бейсика. Каждый оператор начинается со служебного слова, опреде-
ляющего характер действия, предписываемого ЭВМ. Вслед за ним
располагается так называемое тело оператора, содержащее всю ин-
формацию, необходимую для указанного действия. Например:
150 LET Р = 3.141593
160 PRINT Р
12
Программная строка с номером 150 предписывает машине осуществить
процедуру присваивания, заключающуюся в том, что переменной с
именем Р присваивается значение константы л. Следующая строка
заставляет машину напечатать значение переменной Р. Оба эти опе-
ратора можно было бы разместить и в одной программной строке:
150 LET P = 3.141593\PRINT Р
Символ, отделяющий один оператор от другого в пределах программ-
ной строки, может быть и другим. Во многих бейсик-системах для
этой цели используется двоеточие. Объединение нескольких операто-
ров в одной программной строке имеет следующий смысл. Как пра-
вило, любая система программирования накладывает ограничение на
количество строк в исходной программе. Например, в системе Бейсик-
ЕС максимальное число строк в программе равно 250. Применение
составных программных строк, содержащих по нескольку операторов,
позволяет разрабатывать программы, в которых число операторов
может доходить до 1000.
Программные строки, набираемые пользователем, в памяти ЭВМ
упорядочиваются по возрастанию номеров строк. Это позволяет по
ходу составления программы вносить в нее изменения—добавлять
новые строки между ^веденными ранее, исправлять ошибки путем на-
бора новой строки с таким же номером, удалять ненужные строки из
программы, вводя пустые строки, т. е. строки, в которых кроме но-
мера ничего нет. Как правило, строки программы нумеруются не
подряд, а с каким-нибудь шагом, чаще через 10. Это обеспечивает
возможность вставить что-то новое в уже набранный текст.
Номер строки в бейсике несет и еще одну нагрузку. Обычно
программа выполняется машиной в порядке возрастания номеров
строк (в пределах одной строки операторы обрабатываются слева на-
право). Но иногда, в зависимости от результатов проверки тех или
иных условий задачи, ход вычислительного процесса следует изме-
нить. Тогда в программах появляются операторы перехода, застав-
ляющие ЭВМ продолжить вычисления, начиная со строки с указан-
ным номером. Таким образом, номер играет как бы роль адреса
строки в памяти вычислительной машины. На номер строки машина
ссылается и при обнаружении каких-либо ошибок во время ввода
или выполнения исходной программы.
Командные строки предназначены для немедленного исполнения
очередного заказа пользователя. Обычно в командных строках наби-
раются директивы, адресованные бейсик-системе. Например,
NEW—освободить память и установить режим рвода новой
программы с терминала;
OLD «имя» —вызвать из архива текст программы с указанным
именем;
13
LIST 100, 180—выдать на терминал фрагмент текущей программы,
начиная с программной строки с номером 100 и до строки с номером
180 включительно;
RUN*-выполнить текущую программу.
От системы к системе набор таких указаний может варьироваться
в довольно широких пределах — от четырех-шести директив до не-
скольких десятков. Однако приведенные выше команды фигурируют
практически в каждой бейсик-системе.
Директивы подобно операторам начинаются со служебных слов,
вслед за которыми могут быть набраны один или несколько пара-
метров. Завершается набор директивы нажатием клавиши В К (CR),
после чего Бейсик-система начинает немедленную реализацию посту-
пившей заявки.
В примере 1.1 приведен протокол взаимодействия человека и
ЭВМ, отражающий процесс ввода, исправления и исполнения про-
граммы, вычисляющей и печатающей значение sin(0.5).
Пример 1.1. Протокол взаимодействия человека и ЭВМ.
Человек: NEW 10 LET Y = SIH(X) 20 PRINT X, Y 5 LET X==0.5 30 END RUN
ЭВМ: ПРОВЕРЬТЕ ИМЯ ФУНКЦИИ 10 LET Y = SIH
Человек: 10 LET Y = SIN(X) LIST
ЭВМ: 5 LET X = 0.5 10 LET Y==SIN(X) 20 PRINT X, Y 30 END
Человек: ЭВМ: RUN 0.5 0.479425 КОНЕЦ ЗАДАЧИ
Человек: ЭВМ: RUN 0.5 0.479425 КОНЕЦ ЗАДАЧИ
Созданная в процессе ввода программа хранится в оперативной
памяти ЭВМ до тех пор, пока мы ее сами не удалим с помощью со-
ответствующей директивы. Это позволяет выполнять многократные
вычисления по одной и той же программе. Естественно, что такая
процедура имеет смысл только в том случае, когда от варианта к
варианту исходные данные изменяются тем или иным способом.
14
Большинство Бейсик-систем предоставляют пользователю возмож-
ность сохранить набранную программу в архиве и извлекать ее от-
туда в последующих сеансах.
1.3. Режим непосредственных вычислений
Бейсик-системы интерпретирующего типа обычно допускают ре-
жим непосредственных (прямых) вычислений. Для этого операторы
бейсика набираются без номеров строк, и их выполнение происходит
сразу же после нажатия клавиши В К. Например:
Человек: LET Х = 0.5
PRINT X, SIN(X)
ЭВМ: 0.5 0.479425
После выполнения оператора в режиме непосредственных вычис-
лений его текст в памяти ЭВМ не сохраняется. Поэтому для повто-
рения расчета все придется набирать заново, как на непрограмми-
руемом калькуляторе.
Режимом непосредственных вычислений можно воспользоваться,
если нам действительно нужно подсчитать значение несложной ариф-
метической формулы, а величины входящих в нее переменных маши-
не стали известны на предыдущих шагах. Но чаще всего к прямому
выполнению операторов прибегают в процессе отладки программы.
С помощью тех или иных средств можно остановить выполнение про-
граммы, отпечатать промежуточные значения переменных, присвоить
некоторым из них новые значения и продолжить работу.
1.4. Алфавит бейсика
Изучение любого алгоритмического языка начинается со знаком-
ства с набором его изобразительных средств — алфавитом языка.
Символика бейсика в значительной мере определяется его ориента-
цией на работу в диалоговом режиме. Выносной пульт — терминал,
с помощью которого пользователь общается с ЭВМ, — обычно кон-
струируется на базе телетайпов, электрифицированных пишущих маши-
нок, дисплеев. Поэтому вполне естественно, что алфавит бейсика
определяется возможностями клавиатуры соответствующих устройств,
точнее—общим для разных клавиатур набором символов. Среди них:
— 26 заглавных латинских букв от А до Z;
— 10 цифр от 0 до 9;
— знаки арифметических операций (+, —, *, /, f);
— знаки операций отношения (=, >, ^, <, #);
— знаки препинания (точка, запятая, точка с запятой, двоеточие,
кавычки);
— круглые скобки;
— несколько специальных символов (#, Q, &, ...) и пробел.
15
От версии к версии алфавит бейсика может немного варьиро-
ваться. Так, например, на отечественных ЭВМ входной язык допус-
кает ограниченное использование больших русских букв. На некото-
рых ЭВМ знак операции возведения в степень «f» заменяется сим-
волом «~1» или Иногда в качестве этой операции употребляется
сочетание двух подряд идущих знаков умножения — ***». Так как
клавиатура ряда терминалов не содержит некоторых знаков опера-
ций отношения, то их тоже принято обозначать двухсимвольными
сочетаниями:
знак заменяют на комбинацию >= или =>;
знак заменяют на комбинацию <= или =<;
знак # заменяют на комбинацию <> или ><.
В качестве кавычек могут выступать открывающая или закрыва-
ющая одинарная кавычка (‘, *), двойная кавычка (") или апостроф (').
Современные дисплеи имеют возможность отображать не только
большие, но и малые буквы. Однако их употребление в бейсик-про-
граммах ограничивается комментариями и текстами, сопровождающи-
ми выдаваемые из ЭВМ результаты. В обозначениях переменных,
функций и служебных слов большие и малые буквы считаются экви-
валентными.
1.5. Объекты алгоритмического языка
Программа, написанная на любом из процедурных алгоритмиче-
ских языков, по сути дела, представляет собой последовательность
некоторых операций, выполняемых над указанными объектами.
И принципиально один алгоритмический язык отличается от другого
множеством допустимых объектов и наборов операций над этими
объектами.
Основными объектами бейсика являются текстовые и числовые
константы вещественного типа, переменные вещественного типа, стан-
дартные и нестандартные функции, арифметические выражения. Каж-
дому из этих объектов в ЭВМ соответствует определенное значение,
представленное той или иной комбинацией двоичных разрядов. Эти
кодовые комбинации могут оставаться неизменными в процессе вы-
полнения программы или менять свои значения в соответствии
с предписаниями алгоритма. Значения объектов можно сравнивать
между собой и использовать результаты такого сравнения для изме-
нения хода вычислительного процесса.
По мере развития бейсика состав его объектов пополнялся но-
выми числовыми данными (целые, вещественные с удвоенной точно-
стью), текстовыми или символьными переменными, графическими об-
разами, файлами. Однако в первых разделах мы ограничимся зна-
комством только с основными объектами бейсика, входящими в состав
так называемой базовой версии языка.
16
1.5.1. Константы. Ни одна из программ не обходится без упо-
требления числовых констант—чисел, задающих значения исходных
данных или входящих в качестве операндов в арифметические выра-
жения. На форму записи чисел бейсик накладывает два синтаксиче-
ских ограничения:
— целая часть числа отделяется от дробной точкой, а не запятой
(например, вместо—99,8 следует писать —99.8);
— для удобства в представлении слишком больших или слишком
малых чисел допускается употребление степенного множителя (на-
пример, число 0,622хЮ”23 в бейсике записывается как 0.622Е — 23).
Оба эти правила приняты в большинстве алгоритмических язы-
ков и вполне естественны для англоязычной математической литера-
туры, где точка уже давно получила права гражданства при записи
числовых данных. Дело в том, что запятая обычно используется
в качестве разделителя при перечислении объектов. Поэтому запись
вида «1, 3» может трактоваться и как два целых числа, и как веще-
ственное число «одна целая и три десятых». Указатель десятичного
порядка — буква Е обязан своим названием английскому слову expo-
nent (степень).
Все остальные ограничения — количество значащих цифр в чис-
ле, максимально и минимально допустимые числа — носят технический
характер и зависят от особенностей ЭВМ. Так, например, на СМ ЭВМ
и большинстве персональных ЭВМ количество значащих цифр долж-
но быть не больше 7, а по модулю число должно удовлетворять сле-
дующим ограничениям:
0.29* 10“ 38 < | х К 1.7*10+38.
На ЕС ЭВМ этот диапазон существенно шире—от 10“?9 до 10+?6.
Существуют интерпретаторы, в которых диапазон допустимых поряд-
ков измеряется сотнями (10±99, 1О±308) и даже тысячами (10±98°).
В бейсике разрешается использовать и обычный нуль, но при
этом не следует забывать, что «машинный» нуль соответствует не
только абсолютному нулю, но и любому числу, по модулю меньше-
му, чем минимально допустимое.
Текстовые константы представляют собой последовательность
любых символов алфавита, заключенную в кавычки. В базовой вер-
сии бейсика употребление текстовых констант ограничено оператором
печати, который воспроизводит значение константы на терминале без
окаймляющих кавычек. Например:
150 PRINT SIN(0.5), "SIN(0.5)"
В результате выполнения этого оператора на экране дисплея по-
явится следующая строка:
lj 0.479425 SIN(0.5)
17
Первый элемент строки соответствует значению арифметического вы-
ражения, а второй — повторяет текстовую константу.
Как правило, текстовые константы используются для вывода
пояснительных надписей или каких-либо заголовков.
1.5.2. Переменные. В математической литературе с понятием
переменной связывают некоторый именованный объект, который может
принимать одно из допустимых значений. Для программиста термин
«переменная» ассоциируется с участком оперативной памяти, в кото-
ром хранится текущее значение объекта. Поэтому имя переменной
можно рассматривать как синоним адреса такого участка. Знание
этого «адреса» дает пользователю возможность изменять значение
переменной в процессе выполнения программы.
Константам, так же как и переменным, выделяются необходимые
участки памяти, однако их адреса пользователю не известны. Поэто-
му значения констант в процессе работы программы изменить
нельзя.
По способу хранения данных в оперативной памяти бейсик раз-
личает два класса переменных—одиночные и групповые. Каждая
одиночная переменная имеет индивидуальное имя. Имя такой пере-
менной может состоять либо из одной латинской буквы, либо из
латинской буквы с последующей цифрой: А, А6, В8, СО, Z9. Для
того чтобы не перепутать букву О с цифрой 0, программисты часто
перечеркивают нуль косой чертой (О). На клавиатуре термина-
лов, как правило, для буквы О и цифры 0 используются разные
клавиши.
При составлении программы следует стремится к наиболее есте-
ственным обозначениям переменных. Так, если в формулировке задачи
некоторая переменная, например, скорость, обозначена буквой о, то
и в бейсик-программе за этой величиной разумно сохранить наимено-
вание V. Также естественно для обозначения аргументов функции
f (xi, х2, х3) воспользоваться именами XI, Х2, ХЗ. В тех случаях,
когда названия переменных в задаче состоят из нескольких символов,
их надо попытаться сократить (SUMMA—>S) и только в крайних
случаях вводить в программе новые имена, ничего общего не имеющие
с обозначениями задачи.
Во многих алгоритмических языках одиночные переменные при-
нято называть простыми, скалярными. Кроме них бейсик допускает
использование групповых переменных — массивов. С каждым массивом
связывается его наименование—одна латинская буква. Объединение
переменных в массив преследует две цели. Во-первых, это позволяет
упорядочить элементы массива в оперативной памяти и тем самым
облегчить их массовую обработку. Во-вторых, упрощается идентифи-
кация элементов массива, так как теперь для ссылки на нуж-
ную компоненту нам достаточно указать ее порядковый номер
в массиве.
18
По способу организации различают одномерные массивы — векторы
и двумерные—матрицы. Элементы одномерных массивов снабжаются
одним индексом, определяющим порядковый номер элемента в массиве:
А(1) — первый элемент массива А, В(3) — третий элемент массива В,
С (К) — К-й элемент массива С.
Элементы двумерных массивов снабжаются двумя индексами,
первый из которых определяет номер строки, а второй—номер
столбца, на пересечении которых расположен в матрице соответствую-
щий элемент:
F (1,1) — элемент, расположенный на пересечении первой строки
и первого столбца массива F;
М (5,J) — элемент, расположенный на пересечении пятой строки
и J-ro столбца матрицы М.
Если в оперативной памяти ЭВМ компоненты двумерного массива
располагаются по строкам, то порядковый номер элемента с индек-
сами 1 и j определяется по формуле:
= (* 1) * /max 4"/,
где /тах — число столбцов в массиве.
В случаях расположения массива по столбцам порядковый номер
элемента вычисляется следующим образом:
= (/ 1) * Чпах 4~ h
где imax — число строк в массиве.
Вместо термина «индекс» чаще пользуются термином «индексное
выражение». Это объясняется тем, что численное значение индекса
может задаваться формулой. Никаких ограничений на сложность этих
формул бейсик не накладывает:
В(А1+А2 + А3) , A(I,J — 1) , C(20*SIN(X)+30)
Если в качестве индексного выражения употребляется замысловатая
формула, то после вычисления ее значения либо отбрасывается дроб-
ная часть, либо производится округление до ближайшего целого.
На какой из этих вариантов усечения индекса настроена конкретная
Бейсик-система, можно легко выяснить, выполнив следующую про-
грамму:
10 LET А(1) = 1
20 LET А(2) = 2
30 PRINT А(1.1),А(1.5),А(1.9)
В первых версиях бейсика была принята естественная нумерация
элементов массива —с единицы. Однако спустя некоторое время
появились версии, в которых за начало отсчета был принят нуль:
А(0), А(1), А(2), ... Сейчас эксплуатируется довольно много систем,
в которых программист сам может устанавливать минимальное зна-
чение индекса —нуль или единицу.
19
Используя в программе массивы, мы обязаны их описывать или
объявлять. Описание одномерного массива сводится к указанию ко-
личества его элементов, а точнее—максимального значения индексного
выражения. Для двумерного массива задаются максимальные значе-
ния каждого из его индексов. Например:
10 DIM А(50), В(15,12)
Наименование оператора DIM происходит от английского слова
dimension — размерность. В некоторых версиях бейсика требуется,
чтобы описание массивов предшествовало испдльзованию их элементов
в других операторах.
Для чего нужно описывать массивы? Во-первых из нашего опи-
сания становится ясным, сколько места в оперативной памяти ЭВМ
следует отвести под тот или иной массив. Во-вторых, без указания
границ двумерных массивов невозможно определить расположение его
элементов. В третьих, знание размерности массива и его границ
позволяет исключить ошибки, связанные с неправильным применением
индексов.
Бейсик допускает употребление элементов массивов без их описания
вообще. Это —так называемое правило умолчания, при котором мак-
симальное значение индексного выражения устанавливается равным 10.
В оперативной памяти для неописанного вектора резервируется 10
или 11 слов, а для неописанной матрицы— Юх 10 или 11X11 слов.
1.5.3. Математические функции. В математике под вещественной
функцией понимают отображение множества значений ее аргументов
на множество вещественных чисел. В ЭВМ роль такого отображения
выполняют машинные программы, точнее —подпрограммы, ла вход
которых поступает набор значений аргументов, а результатом работы
является одно-единственное число—значение функции.
Для наиболее употребительных функций такие подпрограммы
имеются на каждой ЭВМ. Ими пользуется и любая система програм-
мирования на базе языка бейсик. Такие функции носят название
стандартных. Для обозначения стандартных функций в бейсике
используют трехбуквенные английские наименования. Аргумент функ-
ции заключается в круглые скобки, и им может быть произвольное
арифметическое выражение. Список стандартных функций приведен
в табл. 1.1.
Аргументы тригонометрических функций SIN, COS и TAN должны
задаваться в радианах, результат работы функции ATN тоже приу-
чается в радианах. Существуют Бейсик-системы, в которых в качестве
единицы измерения угловых величин могут использоваться и градусы.
Большинство из функций, приведенных в табл. 1.1, зндцрмо
каждому из нас со школьной скамьи. Поэтому мы прокомментируем
только две из них.
20
Таблица 1.1
Обозначение функции Пояснение
ABS(X) ATN(X) COS(X) ЕХР(Х) INT(X) LOG(X) SGN(X) Модуль аргумента, |x| Арктангенс, arctgx Косинус, cos X Экспонента, ех Ближайшее целое, не превосходящее х Натуральный логарифм, 1пх Знак (signum) аргумента: ( —1, если х < 0, SGN(X) = < 0, если х = 0, ( 4-1, если х > 0
SIN(X) SQR(X) RND(X) RND TAN(X) Синус, sin х Квадратный корень, У х Датчик случайных чисел из диапазона (0, 1) с рав- номерным законом распределения. Тангенс, tgx
Функция INT выделяет целую часть своего аргумента только
в том случае, когда аргумент положителен. Например:
INT(2.1) = INT(2.9) = 2, INT(—2.1) = INT(—2.9) = —3
Функцией INT(X4-0.5) можно воспользоваться для округления произ-
вольного вещественного значения до ближайшего целого:
INT(2.14-0.5) = 2, INT(2.9 4-0.5) =3
INT(—2.1 4- 0.5) = —2, INT(—2.9 4-0.5) = —3
Аналогичная конструкция может быть использована и для округления
до заданного десятичного знака. Предварительно потребуется только
умножить или разделить аргумент на подходящую степень десяти:
100 * INT( 1986/1004-0.5) =2000
INT(0.123 * 104-0.5)/10 = 0.100
Функция RND при каждом очередном обращении к ней выдает
очередное случайное число из интервала (0, 1). Случайные числа
с тем или иным законом распределения широко используются в игро-
вых программах, в задачах имитационного моделирования и др.
В одном из последующих разделов мы возвратимся к этому вопросу.
А пока лишь ограничимся чисто формальными сведениями. В неко-
торых Бейсик-системах функция RND может употребляться без
аргумента, в других— аргумент задается, но является фиктивным.
Существуют версии языка, в которых аргумент управляет перенаст-
ройкой датчика случайных чисел.
21
Кроме стандартных функций, пользователь может вводить в своей
задаче и нестандартные функции. Однако в этом случае он обязан
описать формулу вычисления новой функции. Имена нестандартных
функций должны содержать три латинские буквы и начинаться с ком-
бинации FN. Например:
100 DEF FNT(X) = (ЕХР(Х) —ЕХР(—Х))/(ЕХР(Х) +
ЕХР(—X))
НО DEF FNR(A,B£) = SQR(Af2 + Bt2+Cf2)
В строке с номером 100 описывается формула вычисления гипер-
/ гех. g-X \
болического тангенса th х=-—--------- )« Следующая строка содер-
\ ел~\-в~л j
жит описание функции FNR от трех аргументов, выдающей значение
радиус-вектора точки с координатами (А, В, С).
В^ некоторых версиях бейсика действует ограничение на ко-
личество аргументов нестандартной функции—один, два, пять
и т. п.
1.5.4. Арифметические выражения. Арифметические выражения
составляются из числовых операндов-констант, переменных и функций,
объединенных знаками арифметических операций. На запись формул
накладывается единственное ограничение—выражение должно быть
расположено в одной программной строке и не содержать каких-либо
надстрочных (типа х2) или подстрочных (типа А/) знаков. Это огра-
ничение связано с техническими возможностями терминалов.
Выбор знаков арифметических операций (умножение, деление,
возведение в степень) в бейсике скорее объясняется программистскими
традициями. Символ возведения в степень "f" заимствован из алгола.
Из фортрана пришли знаки операции умножения (*), деления (/)
и возведения в степень (**). Более привычные для нас обозначения
умножения (a>bt axb) и деления ^a:bt в алгоритмических язы-
Таблица 1.2
Типичные ошибки в записи формул Пояснение
2А + В 2* —В ((SIN(X) + B)/(C + D|2) SINX + B Пропущен знак умножения, должно быть 2*A-f-B Два знака операции подряд, должно быть 2*(—В) Не хватает закрывающей скобки Отсутствуют скобки, окаймляющие аргу- мент. Возможны варианты: SIN(X)4-B или SIN(X+B)
22
ках не привились по ряду причин. Точки в средней части строки
на терминалах нет, а точка в нижней части задействована в числах,
знак «X» легко перепутать с буквой «икс», горизонтальная черта
противоречит правилу записи формулы в строку и т. п.
При записи арифметических выражений можно использовать
круглые скобки для указания порядка выполнения операций. Как
правило, полезнее поставить лишние скобки, чем задумывать-
ся, например, о значении выражения — Х|2. Внутри скобок сохра-
няется общепринятый порядок выполнения арифметических дей-
ствий.
В табл. 1.2 приведены некоторые наиболее характерные ошибки в
записи формул.
1.6. Анализ простой программы
Для удержания подоходного налога в зависимости от размера
заработной платы используется следующий алгоритм. Если сумма
заработной платы не превышает 70 р., то подоходный налог не взи-
мается. Для небольших сумм от 71 до 100 р. налог удерживается
в соответствии с табл. 1.3. При заработке свыше 100 р. подоходный
налог взимается в размере 8 р. 20 к. с первых ста рублей плюс 13 %
от оставшейся суммы.
Таблица 1.3
Зарплата Налог Зарплата Налог Зарплата Налог
71 0.25 81 3.75 91 7.12
72 0.59 82 4.09 92 7.24
73 0.93 83 4.43 93 7.36
74 1.30 84 4.77 94 7.48
75 1.65 85 5.11 95 7.60
76 2.00 86 5.45 96 7.72
• 77 2.39 87 5.79 97 7.84
78 2.73 88 6.13 98 7.96
79 3.07 89 6.47 99 8.08
80 3.41 90 6.81 100 8.20
На рис. 1.1 приведена блок-схема описанного алгоритма. В ней
приняты следующие соглашения. Облагаемая сумма обозначена
через С, величина удерживаемого налога запоминается в переменной Н.
Массив Y, содержащий 30 элементов, предназначен для хранения
в ЭВМ таблицы удержаний. При этом элемент Y (1) соответствует
величине удержания с суммы 71 р., Y (2)— с суммы 72 р., ... Y (30) —
с суммы 100 р. Для суммы С, расположенной в диапазоне от 71
23
до 100 р., величина подоходного налога определяется значением
элемента Y (С—70).
Числовые метки, проставленные около элементов блок-схемы,
соответствуют номерам строк бейсик-программы, реализующих ука-
занные действия. Несмотря на то, что де1альное описание возмож-
ностей каждого оператора бейсика будет приведено несколько позже,
мы попробуем прокомментировать текст программы расчета подоход-
ного налога (см. пример 1.2 на с 25). Единственное отступление,
которое мы позволим себе при разборе первой программы, состоит в
70-70
Рис. 1.1. Блок-схема начисления зарплаты с удержанием подоходного
налога
замене английских наименований операторов русскими. Для желаю-
щих проверить работу этой программы на ЭВМ приведен ее текст и
на настоящем бейсике (см. пример 1.3 на с. 26).
В первых трех строках с номерами 10—30 записаны числовые
значения удержаний, порядок которых соответствует возрастанию
облагаемых сумм от 71 до 100 р. В ЭВМ данные из указанных строк
образуют единую таблицу удержаний.
Строка с номером 40 представляет собой описание массива Y,
содержащего 30 элементов. Значения элементов этого массива форми-
руются в программных строках с номерами 50—70. Происходит это
следующим образом. Строка 50 подготавливает ЭВМ к многократному
24
25
26
повторению последующих операций. При каждом таком повторе зна-
чение переменной К будет монотонно возрастать от начального значе
ния (К = 1) до конечного значения (К = 30) с шагом ДК = 1.
Строка с номером 60 извлекает (читает) очередное числовое зна-
чение из таблицы удержаний и присваивает его элементу массива Y (К).
В первый раз (К=1) считывается значение 0.25, которое присваи-
вается переменной Y (1), в следующий раз переменной Y (2) при-
сваивается значение 0.59 и т. д.
Оператор с номером 70 заставляет ЭВМ повторить те действия,
которые записаны между операторами ДЛЯ (строка 50) и СЛЕДУЮ-
ЩЕЕ (строка 70). При этом к переменной К прибавляется шаг ДК,
затем полученная величина сравнивается с конечным значением
(К = 30). До тех пор, пока текущее значение переменной К не пре-
высило установленного максимума, ЭВМ. будет возвращаться к повто-
рению строки 60.
В результате выполнения операторов 80 и 90 на экране терми-
нала появляется приглашение:
ВВЕДИТЕ НАЧИСЛЕННУЮ СУММУ
?
После этого ЭВМ переходит в режим ожидания, из которого ее можно
вывести только путем набора какого-либо числа с последующим
нажатием клавиши В К.
Если введенное нами число окажется нулевым или отрицатель-
ным, то оператор с номером 100 передает управление на 180-ю строку,
и работа программы прекращается.
В противном случае (С > 0) программа продолжает выполняться
со строки ПО. Здесь, на всякий случай, величине налога присваивается
нулевое значение, которое оказывается истинным, если введенная
сумма не превышает 70 р.
Если введенная сумма превосходит минимальную границу, то
ЭВМ попадает на строку с номером 130. Здесь величина налога
вычисляется по формуле, которая справедлива для сумм свыше 100 р.
Однако проверка на принадлежность С диапазону [71, 100] делается
только в следующей строке.
Если логическое условие С > 100 оказывается выполненным, то
мы попадаем на строку 160 с величиной налога, вычисленной в опе-
раторе 130. В противном случае величина налога определяется как
значение элемента Y (С — 70) из массива удержаний.
Оператор 160 выводит на экран дисплея три числовые величины
с предшествующими им текстовыми пояснениями. Например, если
введенная сумма С была равна 95 р., то на экране появится сооб-
щение:
НАЧИСЛЕНО—95 УДЕРЖАНО-7.6 .
ПОДЛЕЖИТ ВЫДАЧЕ —87.4
27
ВВЕДИТЕ НАЧИСЛЕННУЮ СУММУ
Две последние строки являются следствием перехода • к повторному
выполнению программы (см. оператор 170). Таким образом обеспечи-
вается возможность многократных вычислений. И это будет продол-
жаться до тех пор, пока мы в ответ на очередной запрос ЭВМ не
введем нулевое или отрицательное число.
При массовых начислениях зарплаты многократно повторяемая
фраза ВВЕДИТЕ НАЧИСЛЕННУЮ СУММУ может вызвать раздра-
жение пользователя. Тогда можно удалить строку 80 или заменить
адрес перехода в 170-й строке (ПЕРЕЙТИ К 90).
Если в приведенной программе что-то оказалось непонятным, то
мы рекомендуем возвратиться к ней еще раз после изучения следую-
щего раздела.
Глава 2. ОСНОВЫ ПРОГРАММИРОВАНИЯ ЗАДАЧ
ВЫЧИСЛИТЕЛЬНОГО ХАРАКТЕРА
2.1. Как задать или изменить значение переменной
С этим вопросом мы сталкиваемся при решении любой задачи.
Во-первых, необходимо задать начальные значения тех переменных,
которые мы использовали для обозначения исходных данных задачи.
Затем в процессе решения приходится запоминать во вспомогательных
переменных результаты промежуточных вычислений по тем или иным
формулам. Наконец, искомый результат тоже должен попасть на свое
место в оперативной памяти ЭВМ.
Бейсик предлагает пользователю три возможности для изменения
значения переменных. Мы рассмотрим их на конкретном примере —
фрагменте программы для решения квадратного уравнения +
+ с = 0. Пусть, для определенности, коэффициенты интересующего
нас уравнения имеют соответственно значения 2.8, —12, 0.0009.
Первая возможность заключается в использовании оператора
присваивания:
10 LET А = 2.8
20 LET В = —12
30 LET С = 9Е—4
В левой части оператора присваивания после служебного слова LET
(пусть) записывается имя переменной, значение которой мы хотим
задать или изменить. Справа от знака «равно» может быть указано
любое число или арифметическое выражение, определяющее новое
значение переменной. В этой формуле, в частности, может фигури-
ровать имя изменяемой переменной. Например:
100 LET Х = Х + 1
Это означает, что ЭВМ должна выбрать содержимое ячейки с
«адресом» X, т. е. взять предыдущее значение переменной, затем
прибавить к нему единицу и записать новый результат на прежнее
место в оперативной памяти. Старое значение переменной X при этом
будет потеряно.
Знак равенства в операторе присваивания имеет несколько иной
смысл, чем в проверках на равенство двух величин. Поэтому в не-
29
которых алгоритмических языках вместо него используют специаль-
ный символ присваивания, например, х:=х-{-1 (алгол-60) или
хч—х + 1 (APL).
Второй прием для изменения значения переменных базируется
на использовании блока данных. Блок данных — это упорядоченная
последовательность чисел, формируемых в памяти ЭВМ с помощью
операторов DATA (данные). В нашем примере достаточно одного опе-
ратора, чтобы задать блок данных, содержащий три числовых зна-
чения:
10 DATA 2.8, —12, 9Е—4 .
Извлечение числовых значений из блока данных и присвоение их
соответствующим переменным ЭВМ выполняет по оператору READ
(читай):
20 READ А, В, С
Происходит это следующим образом. С блоком данных в ЭВМ свя-
зан указатель, который «смотрит» на очередное доступное число.
Указатель—это служебная ячейка Бейсик-системы, в которой хра-
нится текущий адрес очередного значения из блока данных. В на-
чальный момент при запуске задачи указатель смотрит на самое
первое число в блоке данных (в нашем примере—число 2.8). Выпол-
няя оператор READ, машина «достает» из блока данных значение,
определяемое указателем, присваивает это значение первой перемен-
ной из списка (в нашем примере—переменной А) и «продвигает»
указатель на следующее по порядку числовое значение блока данных.
Если список переменных в операторе READ не исчерпан и блок дан-
ных еще не пуст, то описанная выше процедура повторяется.
Оператор DATA принадлежит к так называемым невыполняемым
операторам, которые ЭВМ обходит во время исполнения программы.
Он может быть расположен как до оператора READ, так и после
него:
10 READ А, В, С
200 DATA 2.8, —12, 9Е—4
Наконец, третья возможность изменения значения переменных
связана с заданием этих значений человеком в ответ на запрос ЭВМ.
Для того чтобы организовать такой запрос, необходимо в соответ-
ствующее место программы включить оператор INPUT (ввод). Например:
10 INPUT А, В, С
Выполняя такой оператор, ЭВМ выдает на экран дисплея специаль-
ное предупреждение и переходит в режим ожидания. В большинстве
систем такое предупреждение предсгавлено вопросительным знаком.
В других системах на экран выдается текст самого оператора INPUT.
30
Получив приглашение в той или иной форме, пользователь дол-
жен набрать столько чисел, сколько переменных было указано в
операторе INPUT, и нажать клавишу ВК. Число от числа отделяется
при этом запятыми. Первое из набранных им значений машина
присвоит первой переменной списка, второе значение — второй пере-
менной и т. д. После этого выполнение программы будет продолжено.
Теперь представим себе, что по составленной нами программе
придется решать не одно квадратное уравнение. Тогда в первом
случае для перехода к новому уравнению нам придется заменить в
программе все три оператора LET. Во втором случае изменению
подвергнется только один оператор DATA. Наконец, в третьем случае
никаких изменений в исходной программе делать не надо, так как
при каждом повторном попадании на оператор INPUT машина будет
требовать от пользователя очередную тройку числовых значений.
Из этого примера ни в коем случае нельзя делать вывод, что
самым рациональным способом изменения значения переменных явля-
ется использование процедуры ввода данных человеком по запросу ЭВМ.
На самом деле каждый из перечисленных выше способов имеет свою
сферу применения, и пользоваться ими нужно следующим образом.
Для начального присвоения переменным числовых значений, ко-
торые мы заранее знаем, целесообразно прибегать к блоку данных
(операторы DATA и READ). С помощью этого приема можно пере-
присваивать начальные значения исходных данных при переходе от
расчета одного варианта к другому. Для присвоения переменным
значений, вычисляемых по формулам и изменяющихся в процессе
счета, годится только оператор присваивания (LET).
К оператору INPUT целесообразно прибегать только в тех слу-
чаях, когда без него трудно или невозможно обойтись. Например,
в игровых программах—для ввода хода партнера ЭВМ, в сложных
задачах вычислительного характера—для ввода значений параметров,
определяемых по интуиции, расчет которых трудно запрограммировать,
и т. п. Не надо забывать о том, что включение оператора INPUT в
программу замедляет ход вычислений, а ввод больших числовых
массивов во время счета может сопровождаться большим количеством
ошибок.
Несколько позже будут приведены более подробные сведения об
операторах, с которыми мы только что познакомились.
2.2. Как напечатать результаты вычислений
Для вывода результатов вычислений, а также различных поясни-
тельных текстов используется оператор PRINT (печать). Мы проде-
монстрируем его действие сначала на конкретном примере расчета
среднего геометрического а*b (см. пример 2.1).
31
Пример 2.1. Расчет среднего геометрического.
Человек: NEW
10 PRINT 'РАСЧЕТ СРЕДНЕГО
ГЕОМЕТРИЧЕСКОГО'
20 PRINT 'НАБЕРИТЕ ЗНАЧЕНИЯ А, В'
30 INPUT А, В
40 PRINT 'А, В, СРЕДНЕЕ = '; SQR (А*В)
50 END
RUN
ЭВМ: РАСЧЕТ СРЕДНЕГО ГЕОМЕТРИЧЕСКОГО
НАБЕРИТЕ ЗНАЧЕНИЯ А, В
?
Человек: 0.8,5
ЭВМ: 0.8 5 СРЕДНЕЕ = 2
Механизм работц оператора PRINT можно представить себе следу-
ющим образом. Перед запуском на счет задаче выделяется участок
оперативной памяти, который принято называть буфером вывода или
выводной строкой. Длина такой строки измеряется в байтах *), каж-
дый из которых предназначен для хранения одного выводимого
символа. На разных ЭВМ эти длины могут оказаться разными—72,
80, 128, 132, ?53 байтов. При отображении на экран дисплея содер-
жимое буфера вывода может занять несколько строк.
В начальный момент буфер пуст, т. е. все его позиции (байты)
заполнены кодом£пробела. В процессе выполнения программы вывод-
ная строка заполняется числовой и/или текстовой информацией и
время от времени выдается на терминал.
Заполнение буфера и его вывод регулируются с помощью опера-
тора PRINT, допускающего один из трех форматов:
PRINT
PRINT а^оСзРг-•-«k
PRINT ai0ia202’ • -akpk
Здесь a/ —элементы выводного списка, а Р/—знаки препинания (раз-
делители), отделяющие один элемент от другого.
С буфером вывода в ЭВМ связан специальный указатель, опре-
деляющий начало свободного места в выводной строке. Перед за-
пуском задачи на счет указатель «смотрит* на первую позицию бу-
фера. Во время выполнения оператора PRINT очередной элемент из
списка вывода заносится в буфер на свободное место, а указатель
буфера перемещается вправо. На дополнительные перемещения ука-
зателя влияют разделители списка.
*) Байт—единица измерения емкости оперативных и внешних
запоминающих устройств ЭВМ. Один байт состоит из восьми двоичных
разрядов»
32
Употребление оператора PRINT без выводного списка означает,
что буфер надо вывести на терминал и после выдачи привести в пер-
воначальное состояние — заполнить пробелами и вернуть указатель в
первую позицию. Обычно пустым оператором PRINT пользуются для
того, чтобы пропустить на экране строку или выдать накопленный,
но еще не отображенный материал.
В качестве элементов выводного списка оператора PRINT можно
использовать арифметические формулы (в частности, числа и имена
переменных), текстовые константы и функцию TAB, управляющую
перемещениями указателя. Для отделения элементов друг от друга
обычно применяют запятые и точки с запятыми. Простейший меха-
низм вывода связан с так называемой зонной или табличной печатью.
При этом экран дисплея условно разбивается на вертикальные полосы —
зоны шириной по 14—16 позиций. На выбор размера зоны влияют
два основных соображения. Во-первых, строка терминала должна
быть кратна целому числу зон. Во-вторых, в зоне должно разместиться
любое число, удовлетворяющее ограничениям конкретной Бейсик-си-
стемы. Для наиболее распространенных ЭВМ (мантисса 6 — 7 знаков,
порядок — 2 знака) любое число можно разместить на 12—13 пози-
циях (знак числа, точка, мантисса и четыре позиции под порядок).
Очередной элемент списка оператора PRINT располагается с
первой позиции текущей зоны. Если вслед за этим элементом распо-
При выводе числовых данных первая позиция зоны отводится под
знак числа. Форма печати числа зависит от его величины. Если чис-
ловой результат целый и сравнительно небольшой (например, меньше,
чем 106), то он выдается в естественном виде. Для числовых данных
с ненулевой дробной частью, принадлежащих интервалу [0.1, ЛГгаах],
вывод осуществляется в форме с фиксированной точкой. В разных
Бейсик-системах величина Afmax может быть разной: 1, 10, 9999 и др.
Ее значение обычно оговаривается в руководстве или легко может
быть установлено с помощью следующего теста:
PRINT 0.5, 9.5, 99.5, 999.5, 9999.5, 99999.5, ...
Вещественные числа, не принадлежащие интервалу [0.1, ЛГтах],
выдаются в форме с плавающей точкой.
2 Ю. Л. Кеткоз 33
Например:
р р 1 N Т 0 . 0 5 f - 1 . 5 Е 7
. 5 0 0 0 0 0 Е - 0 1 - • 1 5 0 0 0 0 Е + 0 8
Если количество числовых данных, разделенных запятыми, в вы-
водном списке оператора PRINT превышает максимальное количество
зон, то результаты на экране дисплея займут несколько строк.
Например:
PRINT 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, И, 12
1 2 3 4 5
6 7 8 9 10
11 12
Запятая в конце выводного списка является признаком незавер-
шенного оператора PRINT. В этом случае происходит только запол-
нение выводной строки, без ее вывода на экран. Очередной оператор
PRINT продолжает заполнение выводной строки вслед за ранее на-
копленным материалом. Например, действие операторов
105 PRINT А, В
ПО PRINT SQR(A*B)
эквивалентно выполнению одного оператора вывода
120 PRINT A, B,SQR(A*B)
К такому приему—-разбиению выводного списка на несколько
частей —приходится прибегать в тех случаях, когда выводной список
не помещается на поле одного оператора. Иногда знак препинания в
конце выводного списка ставят с целью более рационального исполь-
зования площади экрана.
Итак, наличие запятой после очередного элемента списка явля-
ется сигналом подготовки к выводу с начала следующей зоны или к
переходу в начало следующей строки, если последняя зона уже за-
полнена.
Большее уплотнение информации в выводной строке достигается
за счет употребления точки с запятой в качестве разделителя эле-
ментов выводного списка. В этом случае после заполнения выводной
строки очередным числовым значением указатель смещается не в на-
чало следующей зоны, а всего на одну позицию вправо. Таким обра-
зом, каждое новое значение располагается через один пробел после
предшественника. Например:
?// V7 1 ' ; 2. : 4, \5 ; 6; ; 7: ; 8j ; 1 i г *; 1;
1 ! 2 4 1 6 7 8 1 0 11 г г<
34
Если в текущей строке не хватает места для очередного элемента
списка, то он выводится с начала следующей строки.
Отсутствие запятой или точки с запятой в конце выводного
списка всегда вызывает отображение накопленного материала и пе-
реход к началу новой строки. Поэтому один или несколько пустых
операторов PRINT обычно используются гдля организации пропуска
нужного числа строк на экране:
150 PRINT : PRINT : PRINT
Текстовые константы, использованные в качестве элементов вы-
водного списка, переносятся в выводную строку без окаймляющих
кавычек. Знаки препинания действуют при этом обычным образом, а
сама константа может занимать любое число позиций в строке, пе-
реходя из зоны в зону. Например:
1аЕОЕВ1ВЕЕ2Еиваа1Ёг!Е2вв8а@!а0ааэзаввиваваавиав111
lEssaaaaaQsiiiiasQaaaaQQiiiiiisaaaaEiEiBiiimii
йЕашзввЕЗЕааэа51аазЕвввав1!ааваэ2вввввиавЕиави1
1Еапабаа221ва1аваааав1вааавааа1111111111111и
Как правило, текстовые константы используются для вывода
заголовков табличных документов или комментариев, сопровождающих
числовые результаты. Например:
ISQElDBIDBQBBilHQDIQI
rffl-'llnllllllllll-----------
Для размещения соответствующего заголовка в нужной части
документа используется управляющая функция ТАВ(е), которая воз-
действует на перемещение указателя выводной строки. Своим назва-
нием эта функция обязана табуляторному пропуску, который ис-
пользуется при печати таблиц на пишущих машинках. С помощью
специальной клавиши на пишущей машинке можно установить упоры,
соответствующие номерам начальных позиций каждой колонки таблицы.
Затем, нажимая клавишу табуляторного пропуска, мы перемещаем
пишущий механизм в начало очередной колонки.
В первых версиях Бейсика функция TAB (е) трактовалась как
перемещение пишущего узла вправо на е позиций от текущего поло-
жения. Сейчас более распространена другая интерпретация—функ-
ция ТАВ(е) вызывает перемещение пишущего механизма в позицию с
номером е, если указанная позиция находится правее текущей. Пос-
леднее ограничение—явный анахронизм, сохранившийся от времен
использования телетайпов и электрифицированных пишущих машинок
в качестве терминалов. Перемещения маркера (курсора) на экране
дисплея как вправо, так и влево не вызывают каких-либо техниче-
2* 35
ских трудностей. Точно так же нет никаких проблем в любом пере-
мещении указателя выводной строки в оперативной памяти ЭВМ.
Знак препинания, заданный после функции TAB, в большинстве
Бейсик-систем не вызывает дополнительного сдвига указателя вывод-
ной строки. Однако существуют и такие системы, в которых знак
препинания после TAB действует обычным образом. На наш взгляд,
последнее—более естественно, так как приучает пользователя к еди-
ной дисциплине, а не к многочисленным исключениям из правил.
Функция TAB может использоваться и для перемещения число-
вого поля в нужную позицию. При этом может получиться и так,
что часть числового данного разместится в конце одной зоны, а про-
должение— в начале следующей зоны. Например:
ISSQQQIQEEQQS9BQIBSSI
нгтпггт-ж№1 т 11
Экран алфавитно-цифрового дисплея обладает гораздо большими
возможностями по отображению материала по сравнению с первыми
электромеханическими терминалами. В ранних системах дисплеи
имитировали работу пишущей машинки. При этом очередное сообще-
ние ЭВМ появлялось в самой нижней строке, а прежнее содержимое
экрана поднималось вверх подобно титрам в кино. Такой режим
отображения информации связан с большими накладными расходами.
В современных системах заполнение экрана обычно производится
сверху вниз. Поэтому для управления выводом приходится прибегать
к таким средствам, как очистка экрана, перемещение курсора в за-
данную позицию, опрос положения курсора, установка нужного кода
цветности, режима отображения и т. п. Более подробно эти средства
рассматриваются в следующих разделах.
2.3. Как изменить ход вычислений
Нумерация строк определяет естественный порядок выполнения
операторов программы. Однако большинство задач редко укладывается
в такую линейную схему. Очень часто приходится проверять те и%и
иные условия, от выполнения которых зависит выбор соответствующей
ветви программы. В таких ситуациях мы должны нарушить нормаль-
ный ход вычислений и заставить ЭВМ «перескочить вперед» или
«вернуться назад» в нужную точку программы. Операторы, с помо-
щью которых производятся такие манипуляции, принято называть
операторами управления. К их числу относятся операторы, реализу-
ющие многократно повторяющиеся вычисления (циклы), обращения
к подпрограммам, условные и безусловные переходы.
36
2.3.1. Организация циклов. Циклами называют такие участки
программы, которые во время счета должны повториться заданное
число раз. Как правило, с каждым новым повторением цикла проис-
ходит изменение некоторой переменной по закону арифметической
прогрессии. Такую переменную принято называть управляющей или
счетчиком цикла. В последний раз цикл повторяется тогда, когда
управляющая переменная достигает своего конечного значения.
Для организации цикла перед повторяющимся участком программы
размещают подготовительный оператор FOR (для), имеющий следую-
щий формат:
FOR v = ei ТО е2 STEP е3
Арифметическое выражение ех задает начальное значение управляющей
переменной v, выражение е2 определяет конечное значение, а выра-
жение е3 —величину приращения Av.
Величина приращения может быть как положительной, так и
отрицательной. Однако она не должна равняться нулю, так как это
может привести к бесконечному повторению цикла. При Av > 0 конеч-
ное значение е2 должно быть не меньше начального — ei, при Av < О
должно выполняться обратное соотношение.
Конец циклического участка задается с помощью оператора NEXT
(следующий):
NEXT v
Имя переменной, которое указывается в этом операторе, должно сов-
падать с именем управляющей переменной, использованной в опера-
торе заголовка цикла — FOR.
В момент выполнения оператора NEXT к управляющей перемен-
ной прибавляется приращение е3 и результат сравнивается с конеч-
ным значением. Если конечное значение еще не достигнуто, то цикл
повторяется с оператора, следующего за FOR. В противном случае
ЭВМ переходит к выполнению оператора, следующего за NEXT.
Блок-схема описанной процедуры изображена на рис. 2.1.
Из этой схемы нетрудно понять, почему запрещено входить в
цикл, минуя оператор FOR. Если это произойдет, то параметры
цикла не будут вычислены, имя управляющей переменной останется
неизвестным системе, и действия, выполняемые при попадании на
оператор NEXT, будут лишены смысла.
Эта же схема-позволяет понять и смысл следующего правила,
запрещающего производить изменение конечного значения vK0H и
шага Av в теле цикла. Ведь эти величины были подсчитаны и запом-
нены в момент обработки оператора FOR. При повторениях цикла
программа сюда уже не возвращается, иначе бы управляющая пере-
менная каждый раз принимала свое начальное значение.
37
может фигурировать
В качестве управляющей переменной цикла
любая простая переменная. Например:
100 FOR Х = 0.5 ТО 1.4 STEP 0.1
ПО PRINT X, SIN(X)*COS(X)
120 NEXT X
При выполнении этого фрагмента на экране появятся 10 строк,
в каждой из которых будет отображено по два числа: в первой ко-
лонке— значение счетчика цикла (0.5, 0.6, . 1.4), во второй—соот-
ветствующее значение функции sin (x)«cos (х).
Рис. 2.1. Блок-схема выполнения операторов цикла
В большинстве практических задач организация цикла связана
с последовательной обработкой элементов массива. Как правило, в этих
случаях индексы элементов выполняют роль управляющих перемен-
ных, и при очередном повторении цикла их значение увеличивается
на единицу. Поэтому оператор FOR допускает еще одну конструкцию,
в которой величина приращения устанавливается автоматически
(е3^1):
FOR v = ei ТО е2
38
В качестве примера приведем фрагмент программы, осуществляющий
80
вычисление суммы отрезка ряда 2 аЛ:
k = 10
120 LET S = 0
130 FOR К=ЮТО80
140 LET S = S + A(K)
150 NEXT К
Значение управляющей переменной в теле цикла может быть
изменено помимо стандартной добавки постоянного приращения. Это
дает возможность конструировать циклы с переменным шагом по
управляющей переменной? Например*
120 LET S = 0
130 FOR К=1 ТО 20
140 IF К< Ю THEN 160
150 LET К = К+1
160 LET S = S + A(K)
170 NEXT К
В этом примере цикл повторяется не 20, а 15 раз, так как начиная
с К=11» помимо прибавления стандартного шага (оператор 170),
происходит дополнительное увеличение К в теле цикла (оператор 150).
Таким образом, в приведенном фрагменте с помощью одной пары
операторов цикла реализуется вычисление суммы:
5 = Л(1) + Л(2)+,.. + Л(10) + Л(12) + А(14)4-...+Л(20)
Внутри циклического участка программы может встретиться еще
один или несколько циклов. Такие конструкции принято называть
вложенными циклами. Примером может служить фрагмент программы,
реализующий сложение двух матриц:
----50 FOR J = 1 ТО N
—60 FOR К=1 ТО М
70 LET C(J, K) = A(J, K) + B(J, К)
—80 NEXT К
----90 NEXT J
Здесь цикл по индексу К называют внутренним, а по индексу J —
внешним. Перестановка в этом примере операторов 80 и 90 местами
(80 NEXT J, 90 NEXT К) привела бы к недопустимой конструкции
циклов с пересечениями.
Циклы в программах могут быть либо последовательными, неза-
висимыми друг от друга, либо строго вложенными. В последнем слу-
чае при очередном выполнении внешнего цикла повторяется заданное
число раз внутренний цикл. Внутренний цикл может содержать в себе
другие циклы, подобно вложенным друг в друга деревянным матреш-
39
кам. Глубина такого вложения в реальных системах ограничена чис-
лом 8—10, однако конкретные задачи с более чем четырьмя вложен-
ными циклами встречаются довольно редко.
Во введении мы уже упоминали, что объединение данных в массивы
может дать определенный выигрыш при составлении программы. Сейчас
мы продемонстрируем еще один пример, в котором использование
массивов приводит еще и к существенному сокращению общего времени
решения задачи за счет уменьшения глубины вложения циклов.
В предлагаемой задаче речь пойдет о вероятности покупки
«счастливого» билета на одном из видов городского транспорта. Будем
считать, что каждый проездной билет снабжен уникальным шести-
значным номером а6аьа4а3а2а1 и что он принадлежит множеству «счаст-
ливых» билетов при условии равенства суммы старших и младших
цифр его номера (ав + а5 + а4 = 03 + ^2+ ^1)-
Для подсчета вероятности счастливого события придется опреде-
лить количество N счастливых билетов в рулоне и разделить его на
общее количество билетов. В транспортные кассы заправляются ру-
лоны емкостью по 1000 билетов, так как катушка с миллионом биле-
тов весила бы порядка 100 кг и имела бы внушительные размеры.
Однако мы примем, что общее количество анализируемых билетов
равно миллиону.
Самая простая идея, которая вытекает из определения счастли-
вого билета, приводит к программе, содержащей шесть вложенных
циклов. Каждый из них организует перебор комбинаций по своей
цифре а/, а в самом внутреннем цикле в зависимости от результатов
сравнения сумм старших и младших разрядов накапливается коли-
чество счастливых билетов.
Пример 2.2. Вариант с шестью вложенными циклами
10 LET N = 0
20 FOR Al =0 TO 9
30 FOR A2 = 0 TO 9
40 FOR A3 = 0 TO 9
50 FOR A4 = 0 TO 9
60 FOR A5 = 0 TO 9
70 FOR A6 = 0 TO 9
80 IF Al+A2 + A3^ A4+A5-4-A6 THEN 100
90 LET N = N+1
100 NEXT A6
110 NEXT A5
120 NEXT A4
130 NEXT A3
140 NEXT A2
150 NEXT Al
160 PRINT 'ВЕРОЯТНОСТЬ = '; N/1E6
170 END
40
Несмотря на логическую простоту, эта программа обладает сущест-
венным недостатком —она очень долго считает, так как ее внутрен-
ний цикл (операторы 80—100) «крутится» 10е раз. При производи-
тельности ЭВМ порядка 20 000 оп/с время работы такой программы
достигает нескольких десятков минут.
Для усовершенствования этого алгоритма придется провести
небольшой анализ. Очевидно, что комбинация трех цифр может дать
любую сумму от 0 до 27. Обозначим через Sk+i количество комбина-
ций, дающих в сумме число k. Если мы определим все значения s^+1
(k = 0, 1, 2, ..., 27), то нетрудно сообразить, что количество счастли-
вых билетов можно подсчитать по формуле
27
N= 2
*=0
Каждый элемент этой суммы равен произведению количества
комбинаций старших цифр, дающих в сумме kt на такое же количество
комбинаций в трех младших разрядах.
Но для нахождения значений нам потребуется программа,
состоящая всего из трех вложенных циклов (см. пример 2.3).
Пример 2.3. Вариант с тремя вложенными циклами
10 DIM S(28)
20 FOR К = 1 ТО 28
30 LET S(K) = O
40 NEXT К
50 FOR Al=0 TO 9
60 FOR A2 = 0 TO 9
70 FOR A3 = 0 TO 9
80 LET S(A1 + A2 + A3+ 1) = S(A1 + A2-f-A3+1) +1
90 NEXT A3
100 NEXT A2
110 NEXT Al
120 LET N = 0
130 FOR K=1 TO 28
140 LET N = N+S(K)*S(K)
150 NEXT К
160 PRINT 'ВЕРОЯТНОСТЬ = '; N/1E6
170 END
Объем программы из-за усложнения логики не возрос, а время счета
сократилось приблизительно на три порядка. Этому содействовало
введение в программу массива S, хотя в постановке исходной задачи
ни о каких массивах и не было речи.
Из приведенного примера не следует делать поспешные выводы
о каких-то магических преимуществах массивов перед простыми пере-
менными. Но то, что выбор рационального алгоритма может ускорить
41
процедуру решения задачи во много раз,— это факт. И с этим надо
особенно считаться в ситуации, когда программа ориентируется на
многократное применение.
2.3.2. Использование подпрограмм. Подпрограммы в некотором
смысле напоминают циклы. Это—тоже повторяющиеся участки про-
граммы. Однако, в отличие от циклов, подпрограммы не повторяются
несколько раз подряд. К ним обращаются за однократным выполне-
нием из нескольких разных мест программы.
Пример 2.4 иллюстрирует подпрограмму нормирования вектора В,
содержащего М элементов. Результатом ее работы являются вектор В
с модифицированными значениями компонент 11/ j и
переменная N, в которой формируется значение нормы исходного
вектора. Единственная особенность в оформлении подпрограммы заклю-
чается в том, что ее работа заканчивается специальным оператором
возврата — R Е TUR N.
Пример 2.4. Подпрограмма нормирования вектора.
2000 LET N = 0
2010 FOR J = 1 TO M
2020 LET N = B(J)f 2 + N
2030 NEXT J
2040 LET N = SQR(N)
2050 FOR J = 1 TO N
2060 LET B(J) = B(J)/N
2070 NEXT J
2080 RETURN
Предположим, что с помощью этой подпрограммы необходимо
пронормировать векторы X и F, содержащие соответственно 18 и 30
компонент. Эту задачу решает фрагмент программы, приведенный
в примере 2.5.
Пример 2.5. Нормирование векторов с помощью подпрограммы.
120 LET М=18
130 FOR К=1 ТО М
140 LET В(К) = Х(К)
150 NEXT К
160 GOSUB 2000
170 FOR К=1 ТО М
180 LET Х(К) = В(К)
190 NEXT К
200 LET М = 30
210 FOR К=1 ТО М
220 LET B(K) = Y(K)
230 NEXT К
42
240 GOSUB 2000
250 FOR K=1 TO M
260 LET Y(K) = B(K)
270 NEXT К
Операторы 120—150 подготавливают информацию для нормирования
вектора X. Затем с помощью оператора GOSUB (GO—идти, SUB rou-
tine—подпрограмма) производится обращение к подпрограмме. Спе-
цифика в выполнении этого оператора заключается в том, что ЭВМ
предварительно запоминает номер текущей строки (в данном слу-
чае—160) для организации последующего возврата в нужную точку.
По оператору RETURN управление будет передано основной программе
в точку, расположенную непосредственно вслед за сработавшим опе-
ратором GOSUB.
После работы подпрограммы ортонор мированные компоненты век-
тора X находятся в массиве В. Следовательно, перед очередным
обращением к подпрограмме эти результаты надо запомнить, что и
выполняет группа операторов 170—190. Последующие операторы
осуществляют аналогичную обработку вектора F.
В приведенном примере затраты на подготовку исходной инфор-
мации для работы подпрограммы и на запоминание результатов
сопоставимы с длиной самой подпрограммы. Поэтому эффект от исполь-
зования подпрограммы в данном случае не велик. Подпрограммы
позволяют существенно сократить общее время на разработку про-
граммы, если затраты на обращение существенно меньше, чем длина
подпрограммы. И чем больше точек в исходной программе, из которых
производится обращение к подпрограмме, тем больше суммарный
выигрыш.
Механизм подпрограмм, реализованный в Бейсике, представляет
собой наиболее уязвимое место этого языка. В нем не предусмотрен
аппарат формальных параметров, и все заботы по подготовке исход-
ных данных и запоминанию результатов счета переложены на плечи
пользователя.
Глобальный характер переменных в Бейсик-программе существенно
затрудняет компоновку программных комплексов из отдельных под-
программ, так как приходится учитывать имена и типы использован-
ных там переменных, длины подпрограмм, их взаимосвязи и т. п.
Как правило, все это приводит к многочисленным коррекциям, пере-
настройкам номеров строк, заменам имен переменных и массивов.
А любые исправления программы всегда влекут за собой дополни-
тельные ошибки.
2.3.3. Условные и безусловные переходы. Изменение естественного
порядка обработки программы в зависимости от выполнения или
невыполнения каких-либо условий обычно производится с помощью
оператора IF-THEN (если —то). Канонический формат этого опера-
43
тора включает сравнение двух арифметических значений и указание
номера строки, на которую следует перейти в случае выполнения
условия:
100 IF Bf2-4*A*C>0 THEN 200
Во многих системах наряду с формой IF-THEN используется экви-
валентная ей комбинация IF-GOTO (если — переход к):
ПО IF А = 0 GOTO 180
В том случае, когда проверяемое условие не соблюдается, сохра-
няется естественный порядок выполнения операторов, т. е. следующим
будет обрабатываться оператор, расположенный вслед за IF.
Пример 2.6 демонстрирует фрагмент работы программы, которая
запрашивает у пользователя два числовых значения и печатает наи-
большее из них.
Пример 2.6. Выбор максимального значения.
NEW
10 PRINT 'ВВЕДИТЕ ДВА ЧИСЛА’
20 INPUT А, В
30 LET М = А
40 IF А^В THEN 60
50 LET М = В
60 PRINT 'НАИБОЛЬШЕЕ ИЗ НИХ = '; М
70 END
RUN
ВВЕДИТЕ ДВА ЧИСЛА
? 25, 92
НАИБОЛЬШЕЕ ИЗ НИХ =92.
В этом примере использованы три переменные — А, В и М. Пер-
вые две предназначены для запоминания введенных числовых значе-
ний. В переменную М засылается наибольшее из них.
В операторе 30 переменной М присваивается значение перемен-
ной А на тот случай, если оно окажется наибольшим. Однако срав-
нение величин А-и В производится только в следующей строке. Если
условие А В выполнено, то после 40-й строки ЭВМ попадает на
60-ю и выводит на экран дисплея значение М. В случае А < В вслед
за 40-й строкой выполняется 50-я, в которой происходит перепри-
своение нового значения (М=7В). Использование оператора IF в
составных строках, содержащих по нескольку операторов, может при-
вести к неправильной работе алгоритма. Дело в том, что существуют
Бейсик-системы, в которых при невыполнении условия управление
передается не на следующий за IF оператор в этой же строке, а
в начало следующей строки. В таких системах конструкция вида
30 LET М = А : IF А^В THEN 60 : LET М = В
60 PRINT 'НАИБОЛЬШЕЕ ИЗ НИХ = '; М
44
может сработать неправильно в случае А < В, так как второй опера-
тор присваивания (М = В) никогда выполняться не будет.
На наш взгляд, такое решение противоречит элементарной логике
и традициям других алгоритмических языков. И чтобы не пострадать
из-за этого недоразумения, мы рекомендуем не использовать остаток
составной строки, расположенной правее оператора IF.
И еще два предостережения, связанных с учетом вычислительной
погрешности и с количеством значащих цифр в машинном представле-
нии числовых данных. Дело в том, что при переводе дробной части
числа из десятичной системы в двоичную может произойти потеря
значащих разрядов (0.210 = 0.0011001100110011.. .2). Такого же сорта
погрешности могут накапливаться и из-за вычислений с ограниченным
числом разрядов (1/3 = 0.3333...). Поэтому, если у вас в программе
оказалось, что равенство 10*0.1 = 1 не выполнено, то удивляться
этому событию не стоит.
С целыми числами таких недоразумений обычно не происходит.
Но если мы попытаемся сравнить число типа 1Е12 с выражением
1Е12+ 1, которые, на наш взгляд, не равны, ЭВМ с нами не согла-
сится. Все объясняется тем, что мы видим разницу в 12-м знаке,
а в оперативной памяти ЭВМ хранится всего 7—8 значащих цифр.
И ЭВМ такой разницы «не видит».
По указанным соображениям следует избегать проверок на точное
равенство или точное неравенство в тех случаях, когда анализируемые
выражения не помещаются в разрядной сетке ЭВМ или не являются
целыми.
Оператор IF обеспечивает возможность условного перехода по
одной из двух альтернативных ветвей алгоритма. Однако им можно
воспользоваться и для организации безусловного перехода в нужную
точку программы:
100 IF 2*2 = 4 THEN 200
Только зачем загружать машину проверкой условия, в котором никто
не сомневается? В таком случае более эффективным является специ-
альный оператор безусловного перехода — GOTO. Он допускает как
слитное, так и раздельное написание:
100 GOTO 200
180 GO ТО 55
В некоторых книгах можно встретить утверждение о том, что
передача управления «на себя» является ошибкой, так как приводит
к бесконечному циклу ЭВМ на одном операторе:
160 GOTO 160
И в ряде Бейсик-систем такая ситуация рассматривается как ошибоч-
ная. Однако на современных персональных ЭВМ переход на себя часто
45
используется для организации цикла ожидания сигнала вмешательства
извне. Это особенно характерно для игровых программ.
Для организации алгоритмических развилок, в которых число
ответвлений превышает два, используется специальный оператор ON.
Такого рода операторы существуют во многих алгоритмических язы-
ках, и их принято называть переключателями. Схема работы опера-
тора ON очень напоминает действие различного рода переключателей
галетного или ползункового типа, применяемых в радиоприемниках,
телевизорах, измерительных приборах и т. п. (см. рис. 2.2).
Рис. 2.2. Схема действия переключателя
Выход переключателя определяется по номеру ветви, который
задается с помощью значения специальным образом подобранного
выражения е:
ON е GOTO Nlt N2, ..., Nk
Выражение e, которое принято называть переключающим, обычно
стараются подобрать таким образом, чтобы оно принимало целые
значения из диапазона [1, к].
При выполнении оператора ON значение выражения е вычис-
ляется и, при необходимости, из него выделяется целая часть или
берется ближайшее целое. Если полученное таким образом значение i
равно 1, то управление передается на обработку первой ветви. Вход
в нее задается номером Nj, указанным на первом месте в списке
оператора ON. Если окажется, что 1 = 2, то управление будет пере-
дано на строку с 'номером N2 для обработки второй ветви и т. д.
В тех случаях, когда значение переключающего выражения не
принадлежит запланированному диапазону [1, к], возможны варианты.
Большинство систем (и мы [считаем такую идеологию правильной)
рассматривают эту ситуацию как программную ошибку. В других
системах никаких сообщений не выдается. Вместо переключения при
ig[l,k] происходит переход на оператор, следующий за ON. В третьих
системах адрес перехода определяется еще более замысловато:
( если е = 0,
N = -j если i = INT (ABS (е) + 0,5) s^k,
V Мс> если ABS(e) > k.
46
В качестве примера рассмотрим переход на одну из трех ветвей
в программе решения квадратного уравнения ах2 -\-Ьх-\-с = Ъ. Здесь,
в зависимости от знака дискриминанта d = d2—4ас, приходится вести
вычисления по разным формулам:
. п — b+V"d
а > 0, корни вещественные, различные xi =----; х2 =
_ —b—Vd .
2а
d = 0, корни вещественные, кратные х1=х2 = — ;
d < 0, корни комплексные сопряженные ^вещественная часть =
& J
= — тг , мнимая часть = ± i —н— / •
2а 2а /
Выбор переключающего выражения в этом примере напрашивается
сам собой. Раз все определяется знаком d, то целесообразно прибег-
нуть к функции SGN(d). Эта функция принимает значения — 1, 0 и
1, а нам нужно — 1, 2 и 3. Нетрудно догадаться, что искомое пере-
ключающее выражение имеет вид SGN(d)4-2:
60 LET D = B*B— 4*А*С
70 ON SGN(D) + 2 GOTO 180, 160, 120
В данном примере один переключатель заменил действие трех
следующих операторов:
70 IF D < 0 THEN 180
71 IF D = 0 THEN 160
72 GOTO 120
2.4. Повторное использование блока данных
Блок данных обеспечивает последовательную поставку числовой
информации, которую мы сформировали в памяти ЭВМ с помощью
операторов DATA. Так как эта числовая последовательность конечна,
то рано или поздно может наступить момент, когда из блока данных
будет извлечено последнее значение. Попытка прочитать что-то еще
из «опустевшего» блока расценивается как программная ошибка.
Иногда это обстоятельство используют для того, чтобы прервать
работу программы, не утруждая себя подсчетом числа вариантов.
Например:
NEW
10 DATA 1,2, 3,4
20 READ X
30 PRINT X;
40 GOTO 20
47
50 END
RUN
12 3 4
БЛОК ДАННЫХ ИСЧЕРПАН
10 DATA 1,2,3, 4,5,6
RUN
1 2 3 4 5 6
БЛОК ДАННЫХ ИСЧЕРПАН
Однако чтение информации из оперативной памяти ЭВМ не при-
водит к ее физическому разрушению. Поэтому «опустевшийэ блок
данных из памяти не исчез. Просто его указатель переместился
в такую позицию, после которой чтение запрещено. Что будет, если
вернуть указатель в его первоначальное состояние? В этом случае
появится возможность повторного доступа к данным.
Описанная процедура восстановления блока данных реализуется
с помощью оператора RESTORE (в дословном переводе —«переза-
помнить»). После выполнения этого оператора очередным доступным
значением становится первое число из блока данных. Например;
10 DATA 1, 2, 3, 4, 5
20 READ XI, Х2, ХЗ
30 RESTORE
40 READ А,В
50 PRINT XI; Х2; ХЗ; А; В
60 END
RUN
12 3 12
Оператором RESTORE можно воспользоваться в любой момент,
вовсе не обязательно дожидаться полного исчерпания данных. Даже
перед первой выборкой из блока данных процедура восстановления
ничему не повредит.
В каких ситуациях прибегают к повторному использованию блока
данных? Чаще всего в программах, ориентированных на автомати-
ческий расчет нескольких вариантов (т. е. для перехода от варианта
к варианту без использования директивы RUN). Приведем в качестве
примера программу, определяющую сдачу с рубля минимальным
количеством монет.
Алгоритм ее решения достаточно очевиден: сначала надо вклю-
чить в сдачу максимально возможную по достоинству монету, затем
проделать аналогичную процедуру с остатком и т. д. Единственная
монета, которая может фигурировать в оптимальной сдаче дважды,
это — 20 к. (например, 43 = 20 + 20+3).
Программа (см. пример 2.7) построена следующим образом.
Она запрашивает у партнера стоимость товара, которая должна быть
целым числом, принадлежащим диапазону [1,99]. Если введенная
48
стоимость равна нулю, предусмотрено нормальное завершение работы
программы — выход на оператор END. Если стоимость товара не
удовлетворяет перечисленным ограничениям, работа программы при-
останавливается, а на дисплей выдается сообщение с указанием при-
чины останова. После этого работу программы можно продолжать
путем набора директивы CONT илй CONTINUE (продолжить).
Прокомментируем наиболее интересные фрагменты этой программы.
Начинается она с группы операторов REM (от remark — коммента-
рий), используемых для внесения пояснений в текст программы.
Операторы эти принадлежат к группе невыполняемых, т. е. таких,
которые обходятся при выполнении программы. Располагать их можно
в любом месте программы. Обычно комментарием снабжаются входы
в логические блоки и наиболее сложные для понимания фрагменты
алгоритма. Наличие четких комментариев является одним из требо-
ваний при оформлении программной документации, это не простой
формализм. Программы обладают очень интересной особенностью —
они быстро забываются. По истечении 2 — 3 месяцев автор программы
с трудом воспринимает некомментированный текст. Расшифровка
чужой программы, лишенной подробного описания, по затратам вре-
мени сопоставима с созданием новой программы.
Первая интересная деталь — наличие точки с запятой в операторе
вывода приглашения (строка 70). Она приводит к тому, что вопроси-
тельный знак от выполнения последующего оператора INPUT выво-
дится в этой же строке. Здесь же происходит и набор числа, соот-
ветствующего стоимости товара:
ЧЕМУ РАВНА СТОИМОСТЬ ТОВАРА ? 58
Для проверки, является ли введенное значение 'целым, исполь-
зована финкция INT. При целом аргументе значение этой функции
совпадает с аргументом. Если введенная цена оказалась не целой,
то условие в строке 100 будет ложным. В этом случае после выдачи
соответствующего сообщения (строка НО) ЭВМ попадает на оператор
STOP, вызывающий временное прекращение работы программы. На
этот же оператор машина «приходит» и в случае нарушения двух
других условий (С < 1, С > 99).
Если введенное значение стоимости удовлетворяет ограничениям
программы, то вычисляется величина сдачи (оператор 200) и произ-
водится восстановление блока данных (строка 210). В первый раз эта
процедура лишена смысла, так как в момент выполнения директивы
RUN все указатели задачи приводятся в начальное состояние. После
того как программа один раз сработает, указатель блока данных уже
перемещен, поэтому для расчета сдачи со вторым и всеми последую-
щими значениями переменной С блок данных необходимо каждый раз
восстанавливать.
49
Еще одна интересная деталь связана с использованием раздели-
теля (точка с запятой) в конце выводного списка в операторе 250.
Этот оператор выполняется столько раз, сколько монет включается
в состав сдачи, но каждый раз действие оператора вывода оказы-
вается незавершенным. Поэтому после выхода на нулевой остаток S
производится отображение информации, накопившейся в выводной
строке. Это реализуется с помощью «пустого» оператора PRINT
(строка 270). Содержимое выводной строки могло появиться на экране
и без применения пустого PRINT. Вслед за сообщением о сдаче туда
бы занеслось приглашение к очередному вводу (строка 70) и вопро-
сительный знак (строка 80). В этом случае информацйя, выводимая
на экран, начала бы сползать вправо и каждый раз на нерегуляр-
ную величину. Красота выводимого документа от этого бы сущест-
венно пострадала.
Пример 2.7. Сдача с рубля.
10 REM ЭТА ПРОГРАММА ОПРЕДЕЛЯЕТ СОСТАВ
СДАЧИ С РУБЛЯ
20 REM НАИМЕНЬШИМ ЧИСЛОМ МОНЕТ.
30 REM В ПРОГРАММЕ ИСПОЛЬЗОВАНЫ СЛЕДУЮЩИЕ
ПЕРЕМЕННЫЕ:
40 REM С —СТОИМОСТЬ ТОВАРА
(К С<99)
50 REM S —ВЕЛИЧИНА СДАЧИ, ОСТАТОК
60 REM М—ДОСТОИНСТВО ТЕКУЩЕЙ
МОНЕТЫ (50, 20, ..., 1)
70 PRINT 'ЧЕМУ РАВНА СТОИМОСТЬ ТОВАРА';
80 INPUT С
90 IF С = 0 THEN 300
100 IF C=INT(C) THEN 140
110 PRINT 'ТАК НЕЛЬЗЯ, ЧИСЛО ДОЛЖНО БЫТЬ
ЦЕЛЫМ'
120 STOP
130 GOTO 70
140 IF С> 1 THEN 170
150 PRINT 'ЧИСЛО МЕНЬШЕ ДОПУСТИМОГО (С < 1/
160 GOTO 120
170 IF С <99 THEN 200
180 PRINT 'ЧИСЛО БОЛЬШЕ ДОПУСТИМОГО (С > 99)’
190 GOTO 120
200 LET S=100—С
210 RESTORE
220 READ M
230 IF M > S THEN 220
240 LET S = S —M
50
250 PRINT M;
260 IF S ф 0 THEN 220
270 PRINT
280 GOTO 70
290 DATA 50, 20, 20, 15, 10, 5, 3, 2, 1
300 END
2.5. Случайные числа в вычислительной математике
Стандартная функция Y = RND(X) используется в качестве дат-
чика случайных чисел из интервала (0,1) с равномерным законом
распределения. Реализуется такой датчик обычно программным путем
на базе сравнительно простого итерационного алгоритма:
Хп + ± = (а*Хп-\-Ь) mod т
Yn+i== Хп + 1/т
здесь
т = 2Л+1 (/?= 15 или 31), а, Ь, Хо —целые
числа из диапазона [0, т—1].
Выбор параметров а, b и Хо влияет на длину отрезка аперио-
дичности генерируемых псевдослучайных значений. Хороший обзор
Ук
по этим вопросам можно найти в книге
«Искусство программирования. Т. 2. Полу-
численные алгоритмы» [4].
Существует масса приложений, в ко-
торых случайные числа играют важную
роль. Среди них методы поиска экстрему-
мов, алгоритмы исследования систем массо-
вого обслуживания, имитационное модели-
рование, игровые задачи и т. п. В вычи-
слительной математике появился самостоя-
тельный раздел, изучающий методы, осно-
ванные на использовании случайных чисел
(см., например, [6]).
Мы продемонстрируем один из алгоритмов подобного рода на
примере вычисления определенного интеграла. Пусть
Рис. 2.3. Нормирова-
ние криволинейной
трапеции
ь
J = f (z)
а
Путем несложных преобразований вычисление исходного интеграла J
можно свести к нахождению площади криволинейной трапеции, рас-
положенной в единичном квадрате (рис. 2.3):
z—а , dz
х = ---; dx=T---
b—а b—а
51
<S>(x) = kr(f (z)-f-*2). 0<<р(х)<1;
1
J = C<p(x)dx+*; = Z:1'.S + ^.
J'
0
Идея использования случайных чисел при вычислении площади
криволинейной трапеции заключается в следующем. Выберем два слу-
чайных числа Xi и yi и будем рассматривать их как координаты
случайной точки в единичном квадрате. Затем выберем следующую
пару (х2, t/г) и т. д. Когда число выбранных таким образом точек
станет достаточно большим, они более или менее равномерно покроют
единичный квадрат. При этом количество точек, попавших под кри-
вую 1/ = ф(х), будет пропорционально площади криволинейной тра-
пеции. А количество всех точек, участвовавших в эксперименте, будет
пропорционально площади единичного квадрата. Поэтому в качестве
приближенного значения искомой площади S можно взять отношение
N/M, где W— число точек, оказавшихся под кривой у = у(х), а М—
общее количество случайных точек. Пример 2.8 иллюстрирует описан-
1
ный алгоритм вычисления интеграла sin (х) cos (х) dx.
о
Пример 2.8. Вычисление определенного интеграла.
10 REM МЕТОД МОНТЕ-КАРЛО ДЛЯ ОДНОМЕРНОГО
ИНТЕГРАЛА
20 DATA 0,10000
25 DEF FNF(X) = SIN(X) * COS(X)
30 READ N, M
40 FOR K=1 TO M
50 LET X = RND
60 LET Y = RND
70 IF Y > FNF(X) THEN 90
80 LET N = N+1
90 NEXT К
100 PRINT 'ИНТЕГРАЛ=' ; N/M
110 END
Вместо трех операторов (50 — 70) можно было.бы воспользоваться
одним:
50 IF RND > FNF(RND) THEN 90
Но мы хотели максимально приблизить текст программы к описан-
ному алгоритму.
Для одномерных интегралов метод Монте-Карло никакого вы-
игрыша не дает. Его точность пропорциональна V”Л4, поэтому для
достижения приемлемых результатов приходится выполнить работу
гораздо большего объема, чем при использовании регулярных сеточ-
ных схем (методы прямоугольников, трапеций, Симпсона, Ньютона
52
и т. п.). Однако с ростом размерности п пространства регулярные
методы начинают уступать методу Монте-Карло, так как их трудо-
емкость возрастает пропорционально тп (т —число интервалов по
каждой координате). Сложность вычислительной схемы метода Монте —
Карло с повышением размерности подынтегральной функции практи-
чески не меняется.
Пусть,
интеграл:
например, потребовалось вычислить четырехкратный
х2, *з, Х4) dxt dx2 dx3 dx^.
0000
приведенной программе достаточно заменить всего два
Для этого в
оператора:
25 DEF FNF(X1,X2,X3,X4)=
и
50 IF RND > FNF(RND,RND,RND,RND) THEN 90
Возможно, что для повышения точности вычислений потребуется
увеличить количество испытаний (значение М).
Существует несколько вариантов датчиков случайных чисел.
В одних системах функция RND употребляется без аргумента или
с фиктивным аргументом, и, как правило, при повторных запусках
программы генерируемая последовательность псевдослучайных чисел
повторяется. В этом есть определенное преимущество, которое можно
использовать при разработке программы. Отлаживать программу на
непредсказуемой последовательности данных гораздо сложнее. Однако,
если программа уже переведена в режим интенсивной эксплуатации,
то ее «случайные» ходы могут быть заранее предсказаны. В игровых
ситуациях это неприемлемо. Поэтому в ряде систем были преду-
смотрены средства по управлению работой датчика случайных чисел.
Одно из них основано на смене начальных значений параметров,
используемых в программе RND. Их можно сформировать с помощью
некоторой комбинации данных, которую трудно повторить от пуска
к пуску (календарная дата, астрономическое время, длительность
сеанса, содержимое случайно выбранной ячейки памяти и т. п.). Обычно
такая перенастройка «датчика» осуществляется с помощью оператора
RANDOMIZE, алгоритм исполнения которого держится в секрете от
пользователей.
В некоторых системах имеется возможность повторить цепочку
сгенерированных псевдослучайных чисел с самого начала или на
некоторое время заморозить выдачу нового «случайного» числа. Как
правило, здесь используется модификация RND(X) с аргументом,
принимающим три значения:
/ х < 0, повторная выдача предыдущего «случайного» числа;
RND(X) = < х = 0, возврат датчика в начальное состояние;
I х > 0, генерация очередного случайного числа.
Глава 3. ОСНОВНЫЕ ФОРМАТЫ БАЗОВЫХ ОПЕРАТОРОВ
В предыдущем разделе читатели познакомились практически со
всеми операторами так называемой базовой версии языка. Однако
в различных БЕЙСИК-системах те или иные базовые операторы могут
иметь несколько иной формат. Поэтому необходимо уточнить состав
операторов базовой версии и привести наиболее распространенные
форматы каждого базового оператора, отметив характерные особен-
ности, связанные с использованием того или иного оператора. По-
скольку это описание будет носить более формальный характер,
сведения о базовых операторах рассматриваются в алфавитном по-
рядке.
Полный список операторов базовой версии и их основные функ-
ции приведены в табл. 3.1.
Таблица 3.1
Наименование Основная функция
DATA Формирование блока данных
DEF Описание нестандартных функций
DIM Описание (объявление) массивов
END Конец программы
FOR Заголовок цикла
GOSUB Переход на подпрограмму
GOTO Безусловный переход
IF Условный переход
INPUT Ввод по запросу программы
LET Оператор присваивания
NEXT Оператор проверки конца цикла
ON Переключатель
OPTION BASE Указание минимального индекса для
элементов массива
PRINT Вывод числовых и текстовых данных
RANDOMIZE Перенастройка генератора случайных
чисел
READ Выборка из блока данных
REM Комментарий в программе
RESTORE Восстановление блока данных
RETURN Возврат из подпрограммы
STOP Останов работы программы
54
3.1. Оператор DATA
Назначение. Формирование блока данных — упорядоченный по-
следовательности числовых и/или текстовых констант
Базовый формат:
DATA сх, с2, ..., Cft
Здесь с/ — числовые или текстовые константы. Текстовые константы,
не похожие по внешнему виду на числа, могут не] заключаться в ка-
вычки. В тех случаях, когда текстовая константа содержит запятые,
пробелы или символ разделения операторов, наличие окаймляющих
кавычек обязательно.
Замечания по применению. Операторы DATA относятся к невы-
полняемым и могут находиться в любых точках программы. Все кон-
станты, записанные в теле операторов DATA, собираются в общий
блок данных с последовательным доступом. Информация об исполь-
зовании текстовых констант из блока данных приведена в гл. 4.
В составных строках, как правило, оператор DATA должен быть
либо единственным, либо последним.
Основные модификации.
3.1.1. При наличии в блоке данных нескольких подряд идущих
одинаковых констант система Бейсик-EC допускает возможность ука-
зания коэффициента кратности. Например:
105 DATA (5) 0.8, (3) —1.5
эквивалентно
105 DATA 0.8, 0.8, 0.8, 0.8, 0.8, —1.5, —1.5, -1.5
3.1.2. В некоторых системах не считается синтаксической ошиб-
кой наличие запятой в конце списка. Например:
10 DATA 1, 2, 3, 4, 5,
3.2. Оператор DEF
Назначение. Описание алгоритма (формулы) вычисления нестан-
дартной функции. В более поздних версиях языка используется до-
полнительно для установления связи между именами и типами пере-
менных, для задания точки входа в подпрограмму, написанную на
языке ассемблер, для распределения оперативной памяти между про-
граммными сегментами.
Базовый формат.
DEF FNa(x) = e
55
Здесь а—любая буква латинского алфавита, X — аргумент функции,
е — арифметическое выражение, определяющее значение нестандартной
функции с именем FNa.
Замечания по применению. Оператор DEF относится к невыпол-
няемым операторам. В некоторых Бейсик-системах требуется, чтобы
описание нестандартной функции появилось в программе раньше,
чем оператор с первым ее использованием.
Основные модификации.
3.2.1. В ряде систем разрешается использование нестандартных
функций от нескольких аргументов. Иногда число аргументов огра-
ничивают конкретным значением — 2, 5 и др.
3.2.2. Для описания функций, алгоритм вычисления которых
зависит от различных логических условий, используются много-
строчные (многооператорные) фрагменты, заканчивающиеся специаль-
ным оператором —FNEND, RETURN или END DEF. В ряде систем
в таких описаниях допускает рекурсивное обращение подпрограммы-
функции к самой себе. Результат вычисления многострочной функ-
ции либо присваивается служебной переменной, имя которой обычно
совпадает с именем нестандартной функции, либо возвращается вы-
зывающему оператору с помощью модификации оператора RETURN.
3.2.3. Входной язык системы Искра-226 (Wang 2200) допускает
использование оператора DEF для описания подпрограмм, у которых
имя задается целым числом к из диапазона от 0 до 512:
DEF FN'k(xb х2, ..., хп)
RETURN
Обращение к такой подпрограмме производится с помощью оператора
GOSUB 'к(У1, у2, ..., уп).
3.2.4. Во входном языке системы Искра-226 (WANG 2200) имеется
возможность связать с функциональной клавишей № к (0<;кс^31)
фиксированный текст или подпрограмму-функцию без параметров.
Для этой цели используются соответственно форматы:
DEF FN'k «текст»
DEF FN'k
RETURN
56
3.2.5. Для описания типов переменных по первой букве имени
используются операторы следующих форматов:
DEF DBL диапазон букв
DEF INT диапазон букв
DEF SNG диапазон букв
DEF STR диапазон букв
Диапазон букв задается либо одной буквой (например, DEF DBL
A, S, J), либо граничными символами алфавита (например,
DEF SNG A—D, X —Z).
Служебное слово, расположенное после DEF, описывает тип
переменных, имена которых начинаются с буквы, попадающей в за-
данный диапазон:
DBL (от double—двойной) —арифметические переменные вещест-
венного типа с удвоенной точностью (обычно порядка 14—16 знача-
щих цифр),
INT (от integer — целый) — арифметические переменные целого
типа (обычно из диапазона от —32768 до +32767),
SNG (от single — обычный) — арифметические переменнные вещест-
венного типа с обычной точностью (как правило, порядка 6—8 зна-
чащих цифр),
STR (от string—строка) —текстовые переменные, значениями ко-
торых являются цепочки символов.
3.2.6. Адрес входа в подпрограмму пользователя с именем
USRn (п— целое число из диапазона 0<:п<:9) задается с помощью
оператора
DEF USRn = адрес
3.2.7. Адрес начала текущей программной секции во входном
языке IBM PC задается с помощью оператора:
DEF SEG = адрес
3.3. Оператор DIM
Назначение. Описание (объявление) массивов, содержащее мак-
симальное значение каждого индекса. В большинстве систем коли-
чество индексов — один или два. Существуют версии бейсика, в ко-
торых можно использовать массивы большей размерности. В системах,
допускающих употребление текстовых переменных, оператор DIM
57
может включать дополнительную информацию о максимальной длине
простых переменных или элементов текстового массива.
Базовый формат.
DIM Vf(ni), v2 (n2, m2) ...
Здесь V/—имя массива;
п/, т/—целые числа, задающие максимальные значения индек-
сов в одномерных (ni) или двумерных (ri2, т2) массивах.
Замечания по применению. Оператор DIM относится к невыпол-
няемым операторам. В большинстве систем требуется, чтобы описа-
ние массива предшествовало употреблению его элементов. Индексы
элементов массива отсчитываются от 0 или 1. Существуют системы,
в которых пользователю предоставляется право выбора начала от-
счета (см. оператор OPTION BASE).
Во многих системах размерность массива, описанного по опера-
тору DIM, может изменяться во время работы программы. Однако
устанавливаемые таким образом новые размеры массива не должны
превосходить размеры участка памяти, выделенного .массиву в момент
его объявления по оператору DIM.
Основные модификации.
3.3.1. Небольшие отклонения в формате оператора DIM связаны
со способом задания длин простых текстовых переменных или эле-
ментов текстовых массивов.
Например:
DIM AQ20, BQ(30)80, CQ(6, 8) 40 (Искра-226)
DIM А$(2, 3)*20 (РВ-700)
3.4. Оператор END
Назначение. Последний оператор в программе. При его выпол-
нении ЭВМ завершает обработку программы и производит все дейст-
вия, связанные с окончанием счета (чистка полей памяти, закрытие
файлов и т. п.)
Базовый формат.
END
Замечание по применению. Обычно оператор END должен нахо-
диться в программной строке с максимальным номером. В некоторых
версиях допускается отсутствие оператора END. В этом случае
система сама осуществляет все мероприятия, связанные с завершением
счета, после выполнения оператора с максимальным номером. Ряд
модификаций бейсика допускает употребление оператора END в се-
58
редине программы (IF EOF 4£2 THEN END). Иногда после опера
тора END разрешают размещать тексты подпрограмм и нестандартных
функций.
Основные модификации.
3.4.1. Большинство модификаций оператора END в новейших
версиях бейсика связано с его употреблением в качестве последнего
оператора таких структурных единиц, как нестандартная подпро-
грамма-функция, подпрограмма, блоки типа IF—THEN — ELSE,
DO—WHILE, DO—UNTIL, описания графических процедур и т. п.
В таких, случаях формат оператора END обычно сопровождается
дополнительным пояснительным словом:
END DEF—конец описания нестандартной функции;
END SUB — конец подпрограммы;
END IF — конец блока IF;
3.4.2. Иногда оператор END используется в сочетании с провер-
кой условия исчерпания данных:
IF END THEN 4..
3.5. Оператор FOR
Назначение. Оператор установки параметров цикла —имени
управляющей переменной, ее начального и конечного значений,
а также величины шага (приращения), которая прибавляется к теку-
щему значению управляющей переменной при каждом повторении
цикла.
Базовый формат.
FOR v = ei ТО e2[STEP е3]
Здесь V—имя управляющей переменной;
ех — арифметическое выражение, значение которого задает началь-
ную величину v0;
е2 — арифметическое выражение, значение которого задает конеч-
ную величину vK0H;
е3 — арифметическое выражение, значение которого задает вели-
чину приращения Ду. При опущенном значении параметра STEP
принимает стандартный шаг, равный -}-1.
Замечания по применению. В качестве управляющей переменной
может выступать любая простая переменная арифметического типа.
Параметры укон и Ду в процессе выполнения цикла сохраняют свои
первоначальные значения, вычисленные в момент обработки опера-
тора FOR.
59
Существуют два способа реализации повторов тела цикла.
В ранних Бейсик-системах был принят заимствованный из фортрана
подход к проверке достижения управляющей переменной своего ко-
нечного значения после очередного выполнения тела цикла. Иными
словами, проверка окончания цикла производилась в момент выпол-
нения оператора NEXT. При таком подходе тело цикла выполнялось
хотя бы один раз даже при задании несовместимых значений пара-
метров цикла (v0 > vK0H и Av^O, v0 < vK0H и Av<0). В более
поздних системах чаще используется проверка на конец перед вы-
полнением первого оператора тела цикла, т. е. она включается
в схему обработки оператора FOR. В таком случае возможны ситуа-
ции, когда тело цикла не выполняется ни разу. Вместо этого ЭВМ
переходит на оператор, следующий за соответствующим NEXT.
Автор не считает, что новый подход обладает какими-либо преиму-
ществами перед старым. Ведь обход тела цикла может произойти
и в результате программной ошибки, но никакой информации от
системы по этому поводу пользователь не получит.
Основные модификации.
3.5.1. В некоторых версиях наряду с базовым используется
формат, заимствованный из фортрана и допускающий отсутствие
служебных слов ТО и STEP:
FOR v = ex, е2 [, е3]
3.5.2. В случаях, когда заголовки вложенных циклов распола-
гаются друг за другом, некоторые системы допускают их объедине-
ние. Например:
FOR 1 = 1 ТО N, J = 1 ТОМ
3.6. Оператор GOSUB
Назначение. Передача управления на выполнение подпрограммы
Базовый формат.
GOSUB N
Здесь N—-номер программной строки, с которой начинается описа-
ние текста подпрограммы.
Замечания по применению. Оператор GOSUB, в отличие от опе-
ратора GOTO, не только осуществляет безусловный переход на вы-
полнение программной строки с номером N, но и организует предва-
рительное запоминание точки возврата в специально выделенном
участке памяти—стеке возвратов. Перед записью в стек его содер-
жимое «утапливается» подобно тому, как это происходит при зарядке
60
магазина огнестрельного оружия. Верхушка стека хранит текущий
адрес возврата, определяемый номером строки последнего сработав-
шего оператора GOSUB.
Механизм стековой памяти позволяет очень просто организовать
управление вложенными обращениями, т. е. цепочку «хождения» из
одной подпрограммы в другую. В момент завершения работы текущей
подпрограммы адрес возврата выбирается из стека, а его содержимое
«поднимается» на одну позицию вверх. При работе со стеком воз-
вратов никаких физических перемещений информации в оперативной
памяти ЭВМ не происходит.
Процедура записи или чтения сопровождаются аппаратным или
программным перемещением указателя, определяющего адрес текущей
позиции в стеке.
Мы остановились на деталях реализации оператора GOSUB для
того, чтобы пользователь понимал смысл терминов «стек возвратов»
и «очистка стека возвратов». Дело в том, что в момент прерывания
программы стек возвратов может оказаться не пустым. В этом слу-
чае продолжение счета с точки, заданной пользователем, приведет
к неправильной логике выполнения программы. В ряде систем для
нормализации обстановки предусмотрена директива очистки стека
возвратов.
Аналогичный механизм стековой памяти используется и для
управления вложенными циклами.
Основные модификации
3.6.1. В системе Бейсик-EC адрес перехода на подпрограмму
может быть задан не только номером строки, но и значением ариф-
метической переменной.
Например:
100 LET А =180
140 GOSUB А
3.6.2. В версиях, реализованных на ЭВМ формы Hewlett-Packard,
допускается переход на подпрограмму, определяемую по аналогии
с переключателем:
GOSUB е OF Nb N2, ..t, Nk
Здесь Ni, N2, ...» Nk — номера строк, задающие входы в соответст-
вующие подпрограммы;
е— переключающее выражение арифметического типа. При е = 1
происходит переход на подпрограмму со входом Nx, при е = 2 —на
подпрограмму со входом N2, и т. д.
61
3.6.3. Для подпрограмм, описываемых на языке Бейсик-искра
с помощью оператора DEF FN'k (O^k ^512), используется одна
из модификаций:
GOSUB 'к
GOSUB 'к(Хь Х2, .... Хп)
3.6.4. В персональном компьютере РВ-700 фирмы Casio (Япония)
оператор GOSUB используется для передачи управления из одной
программной секции в другую:
GOSUB PROG n
Здесь, п —номер программной секции, целое число из диапазона
от 0 до 9.
После завершения работы программы, расположенной в указанной
секции, происходит возврат в вызывающую программу,
3.7. Оператор GOTO
Назначение. Организация безусловного перехода на программную
строку с указанным номером.
Базовый формат.
GOTO N
Здесь N — номер программной строки, на выполнение которой ЭВМ
должна перейти.
Замечания по применению. Оператор безусловного перехода до-
пускает как слитное (GOTO), так и раздельное (GO ТО) написания.
Передача управления на невыполняемый оператор типа DATA
DEF, DIM или REM ошибкой не считается. Программа продолжает
работу с ближайшего выполняемого оператора с большим номером.
В ряде систем также не считается ошибкой переход на строку с не-
существующим номером. При этом работа продолжается с ближайшего
выполняемого оператора с большим номером. Такое решение является
спорным, более желательный вариант — фиксация программной ошибки.
Основные модификации.
3.7.1. В системе Бейсик-EC адрес перехода может быть задан
значением арифметической переменной. Например:
100 LET А =180
140 GOTO А
62
3.7.2. В версиях, реализованных на ЭВМ фирмы Hewlett-Packard,
допускается формат, эквивалентный переключателю ON:
GOTO е OF Nb N2, ..., Nk
Здесь e — переключающее выражение;
N/ — номер строки, на обработку которой управление передается
при e = i.
3.7.3. В персональном компьютере РВ-700 допускается передача
управления из одной программной секции в другую без возврата:
GOTO PROG n
3.8. Оператор IF
Назначение. Организация условного перехода или выполнение
указанного действия в зависимости от результата проверки логического
условия.
Базовые форматы.
IF условие THEN действие
Здесь N — номер программной строки, на обработку которой ЭВМ
должна перейти, в случае истинности проверяемого условия.
Замечания по применению. Логические условия, включаемые
в текст оператора IF, обычно сводятся к проверке взаимоотношения
двух арифметических или текстовых значений (равно, не равно,
больше, меньше и т. д.). В некоторых системах разрешается объеди-
нять результаты простых отношений в более сложные логические
формулы с помощью операций AND («И»), OR («ИЛИ), NOT («НЕ»).
Иногда к этим действиям добавляются и другие логические операции
(XOR — исключающее «ИЛИ», IMP — импликация, EQV—эквивалент-
ность). В ряде систем результирующим значением логического выра-
жения является целое число, которое трактуется как «ИСТИНА»
(не равно нулю) или «ЛОЖЬ» (равно нулю).
Существуют системы, в которых невыполнение условия приводит
к переходу на следующую программную строку, а не на оператор,
записанный вслед за IF. Для того чтобы не нарушить естественную
логику алгоритма, в таких системах лучше не употреблять IF в се-
редине составных строк,
63
Основные модификации.
3.8.1. Почти все современные версии бейсика предлагают наряду
с форматом IF-THEN конструкцию вида IF-THEN-ELSE
(если-то-иначе):
(номер \ (номер
IF выражение THEN строки }• ELSE строки }-
V действие ) V действие )
Выражение, расположенное справа от IF, может быть либо ло-
гическим (А^= В, X AND Х^В), либо арифметическим («ЛОЖЬ»—
нуль, «ИСТИНА» — не нуль).
3.8.2. Входной язык Бейсик-EC предусматривает условное окон-
чание цикла:
IF условие NEXT v
3.8.3. В ряде версий оператор IF используется для проверки
некоторых характеристик* системы обмена с внешними устройствами
(исчерпание данных, признак конца ленты, отсутствие свободного
места и т. п.)
IF END THEN ...
IF EOF(2) THEN ...
3.9. Оператор INPUT
Назначение. Организация запроса из ЭВМ для ввода значений
арифметических или текстовых переменных с терминала во время
выполнения программы.
Базовый формат:
INPUT V1, va, ...» vn
Здесь v; — имена переменных, значения которых пользователь должен
задать в ответ на запрос ЭВМ.
Замечания по применению. Большинство Бейсик-систем, выпол-
няя оператор INPUT, выдают на терминал приглашение в виде во-
просительного знака в начале текущей строки. Для того чтобы
облегчить пользователю процедуру ввода данных, рекомендуется
перед оператором INPUT выдавать сообщение о количестве и типах
запрашиваемых данных. В новых системах такая подсказка совме-
щается с оператором INPUT (см. ниже). В одной из систем было
сочтено целесообразным вместо подсказки выдавать на терминах пол-
64
ный текст обрабатываемого оператора INPUT и начинать ввод дан-
ных со следующей строки.
Порядок вводимых данных и их типы должны соответствовать
списку переменных в теле оператора INPUT. В случае нарушения
синтаксиса при наборе очередного числового значения система обычно
предлагает повторить ввод, начиная с ошибочного числа. В некото-
рых системах для упрощения процедуры ввода в каждой строке
набирается единственное значение с последующим нажатием кла-
виши ВК. За количеством вводимых значений система следит сама,
выдавая на терминал нужное число приглашений.
Основные модификации.
3.9.1. Включение текста подсказки (одной или нескольких)
в тело оператора INPUT:
INPUT "текст"; Vi, v2.......vn
INPUT "текст/'; Vf, "текста"; Va, ...
INPUT PROMPT "текст": Vi, v2, ...» vn
Текст, заключенный в кавычки, выдается на терминал, символи-
зируя приглашение ко вводу. Слово PROMPT в переводе — подсказка.
3.9.2. Включение в текст оператора временных указаний, таких
как ограничение времени набора данных (TIMEOUT Дт), указание
об измерении времени набора (ELAPSED Т) и т. д. Эти возможности
характерны для версий языка, реализованных на ЭВМ фирмы
Hewlett-Packard:
INPUT TIMEOUT 30, ELAPSED Al: vx, v2, ...
3.10. Оператор LET
Назначение. Присвоение нового значения указанной переменной.
Базовый формат.
LET v = e
Здесь у —имя переменной, которой присваивается значение вы-
ражения е.
Замечания по применению. Значения переменных, входящих
в выражение в качестве операндов, должны быть определены.
Однако большинство систем не контролирует фдкт присвоения значе-
ния той или иной переменной. Во многих системах перед запуском
задачи на счет производится чистка поля переменных, при которой
всем арифметическим переменным присваиваются нулевые значения,
а текстовым переменным — значения «пусто».
3 Ю. Л. Кетков 65
Основные модификации.
3.10.1. Большинство систем допускает отсутствие служебного
слова LET:
v = e
3.10.2. В некоторых системах допускается присвоение одного
и того же значения нескольким переменным в пределах одного опе-
ратора:
[LET] vi = v2= . ;i = vn=e
[LET] vf, v2, ... , vn = e
При использовании такой конструкции необходимо воздержи-
ваться от употребления в одном списке индекса и элемента массива,
определяемого этим индексом. Например:
100 LET Г=2
ПО LET 1 = А(1) = 3
Дело в том, что технология присвоения значений в разных систе-
мах базируется на двух разных способах прочтения списка —слева
направо (1 = 3, А(3) = 3) или справа налево (А(2) = 3,1 = 3). Поэтому
результаты выполнения двух операторов вида I = А(1)=3 и A(I) = I =3
могут не совпадать. Перекладывать на пользователя контроль за такими
ситуациями не очень справедливо.
3.11. Оператор NEXT
Назначение. Изменение текущего значения управляющей перемен-
ной, проверка условия достижения конечного значения управляющей
переменной и организация повторного выполнения тела цикла в слу-
чае необходимости.
Базовый формат.
NEXT v
Здесь v—имя переменной, управляющей повторением цикла.
Замечания по применению. Имя управляющей переменной, ука-
занное в операторе NEXT, обязательно должно совпадать с именем
переменной, которая была использована в предшествовавшем опера-
торе FOR. Проверка эта реализуется по содержимому стека циклов,
в вершине которого хранятся все параметры текущего цикла (имя
управляющей переменной v, ее конечное значение vKQh. приращение Av
и адрес начала тела цикла). Запись всех этих данных в стек произ-
водится в момент выполнения оператора FOR. Если имя переменной,
66
указанное в операторе NEXT, не соответствует сведениям из верхушки
стека, то причин может быть две. Либо мы попали на оператор NEXT,
минуя оператор FOR, либо в двух смежных парах FOR-NEXT ука-
заны две разные переменные. В любом из этих случаев нас ждет сооб.
щение об ошибке типа «NEXT без FOR» или «NEXT не соответст-
вует FOR». Наличие стека циклов позволяет проконтролировать
ситуацию, когда в двух вложенных циклах использована одна и та
же управляющая переменная. Такой контроль происходит в момент
выполнения очередного оператора FOR путем просмотра всех строк,
находящихся в стеке.
После достижения управляющей переменной своего конечного зна-
чения из стека удаляется верхушка, и ЭВМ переходит к выполнению
оператора, следующего за NEXT.
Основные модификации.
8.11.1. В различных версиях, построенных на базе языка бей-
сик-80, допускается использование оператора NEXT без указания
имени управляющей переменной. При этом считается,, что опущенное
имя совпадает с именем управляющей переменной, указанной в ранее
выполненном операторе FOR.
3.11.2. В тех случаях, когда вложенные циклы завершаются двумя
или более подряд идущими операторами NEXT, некоторые модифика-
ции языка бейсик-80 разрешают совмещение. Например:
FOR К=1 ТО 20 \ FOR К = 1 ТО 20
FOR J = 1 ТО 15 > FOR J = 1 ТО 15
NEXT J NEXT J, К
NEXT К )
3.12. Оператор ON
Назначение. Организация перехода на одну из нескольких про-
граммных строк или подпрограмм, указанных в списке, в зависимо-
сти от значения переключающего выражения. В более поздних вер-
сиях помимо функции переключателя оператор ON используется для
назначения точек входа в подпрограммы обработки программных
и внешних прерываний.
Базовые форматы.
ON е GOTO Ni, N2, ... , Nk
переключатель строк
ON e GOSUB Nb N2, Nk
переключатель подпрограмм
3*
67
Здесь е — арифметическое выражение, значение которого определяет
номер адреса перехода в списке;
N,— номер строки или точка входа в подпрограмму, на которую
передается управление в случае, если значение переключающего выра-
жения е равно i.
Замечания по применению. Конструкция ON-GOTO выполняет
безусловную передачу управления подобно оператору GOTO. Сочета-
ние ON-GOSUB используется для перехода на одну из подпрограмм,
указанных в списке. После выполнения подпрограммы управление
возвращается оператору, следующему за ON-GOSUB.
В разных системах по-разному преобразовывают значение пере-
ключающего выражения: в одних случаях дробная часть результата
вычисления е отбрасывается (1.1—> 1, 1.7—> 1), в других случаях
производится естественное округление (1.1 —► 1, 1.7 —>2). По-разиому
могут реагировать системы и на выход значения е из диапазона [1, к].
Одни системы рассматривают такую ситуацию как программную ошибку,
другие производят замену переключающего выражения ближайшей
границей (1 или к), третьи системы игнорируют оператор ON и пере-
дают управление следующему за ним оператору.
Основные модификации.
3.12.1. Входной язык Бейсик-EC допускает задание адреса пере-
хода не только номером программной строки, но и значением пере-
менной арифметического типа.
Например:
ON SGN (Bf2—4*А*С)+2 GOTO 150, Nl, М5
3.12.2. В расширенных версиях языка Бейсик-80 оператор
используется для назначения точки (-ек) входа в подпрограмму обра-
ботки сигнала прерывания, возникающего в момент появления того
или иного события. Общий формат этих операторов таков:
ON тип события < gqsub f N2, . • • » Nr
Достаточно подробно такие операторы описываются в главе 10.
8.13. Оператор OPTION BASE
Назначение. Фиксация начала отсчета индексов (базы) в мас-
сивах от нуля или единицы.
Базовый формат.
OPTION BASE | j }
68
Замечания по применению. Фиксация базы массивов должна бы гь
произведена до объявления массивов или употребления элементов не-
описанных массивов. В большинстве Бейсик-систем по умолчанию
индексы отсчитываются от нуля.
3.14. Оператор PRINT
Назначение. Вывод числовой и текстовой информации йа терми-
нал или на какое-нибудь другое внешнее устройство.
Базовые форматы.
PRINT
PRINT aiPiO^Pa • * - ak
PRINT aiMaPa •»• «kPk
Здесь az —элементы выводного списка — арифметические или текстовые
выражения;
Р/ — знаки препинания —разделители элементов выводного списка
(запятая или точка с запятой).
Замечания по применению. Механизм работы базового оператора
PRINT подробно рассматривался в предыдущей главе.
Основные модификации.
3.14.1. Основное направление развития оператора PRINT связано
с управлением форматом выводной строки. Этим средствам посвящена
целая глава (см. гл. 5).
3.14.2. Другая достаточно важная модификация оператора PRINT
связана с выводом информации ив оперативной памяти в файл, рас-
положенный на внешнем устройстве. Для этой цели используются две
основные модификации:
PRINT # п» список вывода;
PRINT n USING формат, список вывода.
Здесь 4£п — программный номер файла (п—целое число). Более под-
робные сведения об использовании указанных операторов можно найти
в гл. 6.
Одной из разновидностей операторов вывода на внешние устрой-
ства следует считать оператор LPRINT (иногда используется LINE
PRINT), предназначенный для печати данных на АЦПУ. Действует
такой оператор подобно оператору PRINT с той лишь разни-
цей, что длина строки АЦПУ может отличаться от длины строки
дисплея.
3.14.3. В некоторых системах служебное слово PRINT может
заменяться вопросительным знаком.
69
3.14.4. Системы Бейсик-222 и Бейсик-ЕС характеризуются рас-
ширенным набором редактирующих указателей:
TAB (п) — сдвиг на п позиций вправо;
ТАБ (п) — установка в позицию с номером п;
PGR (е, S) — запись символа S в позицию, номер которой опре-
деляется значением выражения е;
RPT (е, *SiS2 ... SK’)~многократное (е раз) повторение тексто-
вой константы;
PAGE — пропуск строк для перехода к печати с начала новой
страницы;
* Iw*, FMT(Iw) \
* Fw.d*, FMT(Fw.d) > и—установка формата вывода числовой ин-
* Ew.d*, FMT(Ew.d) J формации;
GOTO N — употребляется в конце выводного списка для перехода
после печати в указанную точку.
3.14.5. В ряде современных версий Бейсика оператор PRINT
допускает в качестве элемента списка употребление функции SPC(n),
с помощью которой в выводную строку заносится п пробелов, начиная
с текущей позиции.
3.15. Оператор RANDOMIZE
Назначение. Перенастройка датчика случайных чисел.
Базовый формат.
RANDOMIZE.
Замечания по применению. Оператор RANDOMIZE обычно исполь-
зуется в программах с многократным применением. Для того чтобы
избежать повтора последовательности случайных чисел, перед запуском
очередного варианта производят перенастройку датчика. Такой прием
не позволяет партнеру разгадать «ходы» программы.
Основные модификации.
3.15.1. В некоторых версиях, построенных на базе языка бейсик-80,
в теле оператора RANDOMIZE указывается целое число из диапазона
от —32 768 до +32 767. Это число используется для изменения кон-
станты в программе выработки случайного числа. Если указанный
параметр не задан, то система обращается к пользователю с просьбой
ввести это число подобно тому, как если бы в программе встретился
оператор INPUT.
70
3.16. Оператор READ
Назначение. Выборка очередного значения из блока данных и при-
своение его очередной переменной из списка оператора READ.
Базовый формат.
READ vi, v2, ...» Vk
(k^l)
Здесь v/ — имя переменной арифметического или текстового типа.
Замечания по применению. При формировании списка переменных
необходимо следить за соответствием типов переменных и предназна-
ченных им значений в блоке данных. В ряде систем допускается про-
читать в текстовую переменную числовую константу. Попытка про-
читать еще одно значение после исчерпания блока данных обычно
классифицируется как программная ошибка. В некоторых системах
можно запрограммировать обработку такой ситуации.
Основные модификации.
3.16.1. Наиболее важной новой функцией оператора READ яв-
ляется выборка данных из файла, расположенного на внешнем уст-
ройстве:
READ zftn, Vi, v2, ...» Vk
Здесь 4£п—программный номер файла. Более подробные сведения об
этой модификации можно найти в гл. 6.
3.17. Оператор REM
Назначение. Включение комментариев в программу.
Базовый формат.
REM произвольный текст
Замечания по применению. Оператор REM относится к невыпол-
няемым операторам и не оказывает никакого влияния на порядок
работы программы. Его единственная задача — появиться в листинге
и помочь своим текстом расшифровать тот или иной фрагмент про-
граммы.
Основные модификации.
3.17.1. В некоторых системах служебное слово REM можно заме-
нить кавычкой. Например:
100 REM ВХОД В ПОДПРОГРАММУ ГАУССА
100 ' ВХОД В ПОДПРОГРАММУ ГАУССА
или
71
3.18. Оператор RESTORE
Назначение. Приведение указателя блока данных в первоначаль-
ное состояние с целью обеспечения повторного доступа к хранящейся
там информации.
Базовый формат.
RESTORE
Замечания по применению. Оператор RESTORE можно выполнить
в любой момент программы, даже если из блока данных не было про-
читано ни одного значения.
Основные модификации.
3.18.1. Ряд систем обеспечивают возможность возврата указателя
блока данных не в самое начало, а на значение, соответствующее
первому элементу оператора DATA с указанным номером. Например:
10 DATA 1, 2, 3, 4
20 DATA 5, 6, 7, 8
120 RESTORE 20
После выполнения оператора 120 текущим доступным значением
становится число 5.
3.18.2. В некоторых системах перемещение указателя регулируется
заданием порядкового номера нужного значения в блоке данных или
величины смещения относительно текущей позиции.
Например:
RESTORE 7 установить указатель на седьмое значение в блоке;
RESTORE +5 продвинуть указатель блока данных вперед на
5 позиций от текущего положения;
RESTORE —2 вернуть указатель на 2 значения назад.
3.18.3. В одной из авторских версий допускалось раздельное
управление указателями в блоках данных с числовой и текстовой ин-
формацией:
RESTORE вернуть указатель числового блока данных в началь-
ное положение;
RESTORE $ вернуть указатель текстового блока данных в на-
чальное положение;
RESTORE вернуть в начальное положение оба указателя.
3.19. Оператор RETURN
Назначение. Возврат из подпрограммы на оператор, следующий
за оператором вызова подпрограммы (GOSUB).
Базовый формат.
RETURN
72
Замечания по применению. Выполнение оператора RETURN сво-
дится к переходу по адресу, хранящемуся в стеке возвратов, и очистке
верхушки стека. Поэтому, если переход на подпрограмму был выпол-
нен не по оператору GOSUB, фиксируется программная ошибка.
В подпрограмме может быть несколько операторов RETURN, но
сработать должен только один из них.
Основные модификации.
3.19.1. Входной язык бейсик-искра допускает использование кон-
струкции RETURN CLEAR, которая возвращает управление по адресу
из верхушки стека и одновременно чистит весь стек. Это позволяет
удалить следы незавершенных подпрограмм в программе обработки
ошибки.
3.19.2. Некоторые версии, построенные на базе языка бейсик-80,
разрешают применение оператора RETURN с указанием номера про-
граммной строки. Такой оператор срабатывает как GOTO, но предва-
рительно производит очистку стека возвратов.
3.19.3. В версиях бейсика, реализованных на ЭВМ типа НР-9830А,
в теле оператора RETURN может находиться арифметическое выра-
жение. Таким образом, здесь осуществляют возврат значения
нестандартной функции, заданной с помощью многострочного описания
(DEF FNa—FNEND).
3.20. Оператор STOP
Назначение. Приостанов выполнения программы. После выхода
на такой останов работу программы можно продолжить.
Базовый формат.
STOP
Замечания по применению. Основная разница между операторами
STOP и END заключается в том, что после останова по оператору
STOP выполнение программы можно продолжить либо со следующего
оператора, либо с указанной точки. Ресурсы программы (файлы, уст-
ройства, оперативная память) при таком останове у задачи не отби-
раются и сохраняются в том состоянии, которое предшествовало опе-
ратору STOP.
Основные модификации.
3.20.1. Входной язык бейсик-искра допускает употребление ком-
ментария в теле оператора STOP:
STOP произвольный текст
Глава 4. ЭЛЕМЕНТЫ ОБРАБОТКИ СИМВОЛЬНОЙ
ИНФОРМАЦИИ
Задачи вычислительного характера, в которых основными объек-
тами являются числовые данные, далеко не исчерпывают сферу при-
менения ЭВМ. Очень широкий спектр задач информатики связан
Таблица 4.1
ДКОИ-8 (EBCDIC)
с обработкой текстовых документов. Это —различные информационно-
справочные системы, обучающие комплексы, трансляторы и интерпре-
таторы алгоритмических языков, системы автоматизации редакционно-
издательской деятельности,' процессов управления технологическими
процессами и т. п.
Работы по кодированию текстовых данных и унификации процедур
их обработки были начаты еще на ЭВМ первого поколения. А в вы-
числительных машинах третьего поколения многие из решений алго-
ритмического характера нашли техническое воплощение. В первую
очередь это относится к байтовой структуре запоминающих устройств,
хорошо приспособленной для хранения символьных данных. Система
74
машинных команд ЕС ЭВМ включает такие операции, как формиро-
вание и замена одиночного символа, пересылка и сравнение текстовых
цепочек, содержащих до 256 символов, перекодировка символьных
данных по заданному словарю соответствия кодов и др.
Таблица 4«2
КОИ-7 (ASCII)
К X, У 2 3 4 5 6 7
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 пробел п а % & ( ) * + > / 0 1 2 3 4 5 6 7 8 9 » > ? © А В С D Е F G Н I J К L М N О Р 0 R S Т и V W X Y Z [ 1 t ю А Б Ц Д Е Ф Г X и й к л м Н О п я р с т У ж в ь ы 3 ш э Щ ч
В ЭВМ с байтовой организацией памяти наиболее широко рас-
пространены две международные системы кодирования символьной
информации— EBCDIC (Extended Binary Coded Decimal Interchange
Code) и ASCII (American Standard Code Information Interchange). Код
EBCDIC, дополненный большими и малыми русскими буквами, отлич-
ными по написанию от латинских, известен в отечественной литературе
под названием ДКОИ-8 (двоичный код обмена информацией). Стандарт
ASCII чаще всего используется на мини- и микроЭВМ. Дополненный
русским алфавитом, этот код известен под названием КОИ-7. В табл. 4.1
и 4.2 соответственно приведены кодировочные таблицы ДКОИ-8
и КОИ-7. Для того чтобы определить код нужного символа, необхо-
димо воспользоваться формулой 16*х+{/.
4.1. Основные символьные объекты
Текстовые (символьные) константы. Они знакомы нам по опера-
тору PRINT и представляют собой цепочку произвольных символов
алфавита, заключенных в кавычки. В некоторых версиях бейсика роль
кавычек выполняют двойные кавычки или апострофы:
'КОНСТАНТА’ "КОНСТАНТА* 'КОНСТАНТА*
75
Пробел, используемый в текстовой константе, рассматривается
как обычный символ и не игнорируется в отличие от пробелов в теле
операторов бейсика:
'шПРИМЕР КОНСТАНТЫ С ПРОБ ЕЛ АМИши'
В этом примере текстовая константа включает один начальный пробел,
два конечных и три внутренних, выполняющих роль разделителя слов.
Общая длина приведенной константы — 31 символ.
Иногда текст, который мы хотим использовать в качестве кон-
станты, может содержать кавычку. Например, из-за отсутствия твер-
дого знака на клавиатуре большинства терминалов приходится заменять
его кавычкой —ПОД’ЕЗД. Как же в таких случаях отличить кавычки,
ограничивающие текстовую константу, от внутренних кавычек? В раз-
ных системах эту проблему решают по-разному. Одни версии, следуя
фортрану, требуют употребления двойного символа «кавычка» внутри
текстовой константы:
<ПОД"ЕЗД' "ПОДЪЕЗД" 'ПОДЪЕЗД'
В памяти ЭВМ такая сдвоенная кавычка рассматривается как один
символ. Поэтому приведенная выше константа содержит семь символов,
а не восемь. Другие версии бейсика, допускающие окаймление тексто-
вой константы двумя разными «кавычками», разрешают внутри кавы-
чек одного вида применять эквивалентный символ:
>ПОД"ЕЗД’ "ПОД’ЕЗД"
Текстовые константы могут использоваться для формирования
блока данных, для составления символьных выражений, для печати
комментариев в теле оператора PRINT.
Текстовые (символьные) переменные. Впервые текстовые перемен-
ные были введены в бейсик в 1968 г. Для того чтобы отличать их
от переменных арифметрического типа, к именам текстовых переменных
добавлялся символ денежной единицы — А$, В4$ (на отечественных
ЭВМ соответственно—AQ, B4Q). Эта же редакция бейсика наряду
с одиночными символьными переменными разрешала использовать одно-
мерные текстовые массивы.
Количество элементов в текстовом массиве задается с помощью
оператора DIM. Те версии бейсика, в которых длина простой символь-
ной переменной зафиксирована, распространяют это ограничение и на
элементы текстовых массивов. В этом случае оператор DIM ничем не
отличается от уже известного нам формата:
10 DIM А(50), AQ(20), BQ(10, 12)
Двумерные массивы символьного типа встречаются в реализациях
не так уж и часто, однако, на наш взгляд, это скорее следует отнести
к недостаткам соответствующих версий. Ведь двумерный массив можно
76
рассматривать как аналог страницы текстового документа, т. е. объекта,
с которым приходится работать довольно часто.
В тех случаях, когда версия языка позволяет установить макси-
мальную длину символьной переменной, описание простых и групповых
переменных может выглядеть следующим образом:
15 DIM AQ18, BQ(20)40, CQ(4, 5)60
Оператор DIM в этом примере используется не только для описания
характеристик текстовых массивов BQ и CQ, но и для указания
максимальной длины простой переменной AQ.
4.2. Как задать или изменить значение
текстовой переменной
Значение текстовой переменной представляется в виде строки сим-
волов. Поэтому текстовые переменные иногда называют строковыми.
До тех пор, пока символьной переменной не присваивалось никакого
значения, считается, что она представлена пустой строкой, т. е. стро-
кой, не содержащей ни одного символа. Говорят, что в этом случае
длина текстовой переменной равна нулю. Во время выполнения про-
граммы эта характеристика может изменяться в зависимости от теку-
щего значения переменной. Максимальное число символов, которое
может быть присвоено текстовой переменной, зависит от конкретной
системы. Иногда это фиксированное число—16, 18, 128, 132, 255 сим-
волов. В других системах максимальная длина текстовой переменной
объявляется пользователем.
Присвоение значения символьной переменной мало чем отличается
от уже известных нам приемов. Во-первых, это —извлечение текстовой
константы из блока данных:
10 DATA 'САША', 'СЕРЕЖА4
20 READ AQ, С0
Во-вторых, мы можем присвоить значение текстовой переменной с по-
мощью обычного оператора присваивания:
10 LET А0='САША'
20 LET CQ ='СЕРЕЖА4
30 LET SlQ = CQ+'uKETKOB4
В правой части последнего оператора использовано текстовое выра-
жение, полученное путем сцепления двух текстовых значений. В ре-
зультате переменная S1Q примет значение 'СЕРЕЖА КЕТКОВ'.
Операция подобного рода над текстовыми величинами носит название
конкатенация, хотя термин сцепка, сцепление гораздо точнее пере-
дает смысл процедуры. В некоторых версиях бейсика для ее обозна-
чения прибегают к другой символике:
77
30 LET S2Q = AQ 1Г шКЕТКОВ'
40 LET S1Q = CQ, 'шКЕТКОВ*
50 LET S Q = AQ&CQ
В результате переприсвоения значения текстовая переменная
может изменять свою длину. Однако новая длина не должна пре-
восходить максимальную длину, устанавливаемую по первоначаль-
ному объявлению или по умолчанию. Попытка нарушить это правило
приведет к потере «лишних» символов справа.
Большинство развитых версий бейсика позволяют оперировать
не только с полным значением символьной переменной, но и с лю-
бым ее фрагментом, В примере 4.1 демонстрируется один из таких
подходов.
Пример 4.1. Печать подстроки*
10 LET АО='ОБРАЗЕЦ ПЕЧАТИ ПОДСТРОКИ'
20 PRINT AQ
30 PRINT AQ(1,7)
40 PRINT AQ(9,14)
50 PRINT AQ(16,24)
60 LET AQ(16,24) = "
70 PRINT AQ
80 END
RUN
ОБРАЗЕЦ ПЕЧАТИ ПОДСТРОКИ
ОБРАЗЕЦ
ПЕЧАТИ
ПОДСТРОКИ
ОБРАЗЕЦ ПЕЧАТИ
Граничные номера позиций, определяющие подстроку, могут
задаваться и с помощью арифметических выражений:
50 LET SQ(J, J 4-3) ='САША'
В некоторых версиях второй индекс задает длину подстроки. Приве-
денные примеры плохо согласуются с обозначениями элементов дву-
мерных текстовых массивов. Отчасти этим объясняется отсутствие
таких массивов в отдельных версиях бейсика. Что же касается дей-
ствительно развитых современных Бейсик-систем, то в них для выде-
ления подстрок используются стандартные функции.
Третий способ изменения значений текстовых переменных ис-
пользует оператор INPUT или его модификацию LINPUT (LINE
INPUT) для ввода новых данных по запросу из ЭВМ:
10 INPUT AQ.BQ
20 PRINT AQ + BQ
RUN
78
? '2X2 = ', '4*
2X2 = 4
Если наша версия бейсика допускает работу с подстроками, то с
помощью оператора INPUT можно обновить любой фрагмент в значе-
нии текстовой переменной.
§ 4.3. Стандартные процедуры обработки символьных
строк
Практика обработки текстовых данных породила набор типовых
процедур, оформленных в виде стандартных подпрограмм-функций.
Список наиболее употребительных функций, включенных в большин-
ство версий бейсика, приведен в табл. 4.3. В этой таблице через eQ
обозначено обрабатываемое текстовое выражение, в качестве которого
чаще всего выступает простая или индексированная переменная
текстового типа.
В процессе решения задачи мы можем присваивать текстовой
переменной значения разной длины, т. е. содержащие разное коли-
чество символов. Особенно важно уметь контролировать длину сим-
вольной строки, которая вводится по оператору INPUT.
Пример 4.2.
10 PRINT 'НАБЕРИТЕ ИМЯ ПЕРЕМЕННОЙ,
ЗАКЛЮЧЕННОЕ В КАВЫЧКИ'7
20 INPUT AQ
30 IF LEN(AQ)<6 THEN 60
40 PRINT 'ИМЯ ДОЛЖНО СОДЕРЖАТЬ
HE БОЛЕЕ 6-ТИ СИМВОЛОВ*
50 PRINT 'ПОВТОРИТЕ ВВОД*
55 GOTO 20
60 л , . . .
В примере 4.2, который может быть использован в качестве фраг»
мента обучающей программы, приводится схема анализа длины имена
переменной с помощью функции LEN.
Функции LEFTQ, MIDQ, RIGHTQ или их эквиваленты, при»
веденные в табл. 4.3, позволяют выделить в заданной строке под*
строку символов, заключенных между указанными позициями.
Пример 4.3.
10 LET AQ='KETKOB АЛЕКСАНДР
ЮЛЬЕВИЧ'
20 PRINT LEFTQ (AQ, 6)
30 PRINT MIDQ(AQ, 7, 16)
40 PRINT 'LJ' + RIGHTQ(AQ, 17)
50 END
7d
Таблица 4.3
Содержание процедуры Наименование функции
Определение длины текстового выражения Выделение левой подстроки LEN (eQ) LEFT (eQ, J) LEFTQ(eQ, J)
Выделение правой подстроки RIGHT (eQ, J) RIGHT Q(eQ, J)
Выделение центральной под- строки (в середине текста) MID (eQ, I, J) “rWiV" SEGQ(eQ, I, J)
Размножение символа SPACE Q(N) STRING Q(N, код) STRING Q(N, eQ)
Поиск вхождения одного текс- тового выражения (eiQ) в др у- гое (e2Q) INSTR ([J.J eiQ, e2Q) POS(eiQ, e2Q, J)
RUN
КЕТКОВ
АЛЕКСАНДР
ЮЛЬЕВИЧ
Граничные номера позиций, с помощью которых выделяется та или
иная подстрока, могут задаваться и в виде арифметических выраже-
ний. Например, MIDQ (AQ, J, J +4). Однако, если величина пра-
вой (конечной) границы будет меньше номера начальной позиции,
то в качестве подстроки выдается пустое значение.
Следует обратить внимание на то, чго среди приведенных функ-
ций выделения подстроки наиболее мощной является функция MIDQ.
Действительно, для символьной переменной AQ из примера 4.3 имеют
место равенства:
LEFTQ(AQ, 6)=MIDQ(AQ, 1, 6)
RIGHTQ(AQ, 17) = MIDQ (AQ, 17, 24)
Единственное неудобство функции MIDQ состоит в том, что она тре-
бует большего числа аргументов. В одной из модификаций бейсика
допускается задавать функцию MIDQ с двумя аргументами —
MIDQ (AQ, 17). Это означает, что внутренняя подстрока начинается
с 17-го символа переменной AQ, а заканчивается последним симво-
лом этой переменной. Таким образом, на ИЗОТ—1031 С, где имеет
80
место указанное правило, функции MIDQ (AQ, I) и RIGHTQ
(AQ, I) абсолютно идентичны.
Функция STR, используемая для выделения подстроки на ЭВМ
типа Искра-226, своим третьим аргументом задает длину подстроки,
а не номер самой правой позиции. Этот аргумент не является
обязательным, и если он опущен, то действие функции STR экви-
валентно процедуре RIGHTQ.
Функция размножения символа предназначена для формирования
строк заданной длины, состоящих из повторяющегося символа. Функ-
ция SPACEQ является частным случаем функции STRINGQ. С ее
помощью можно заменить любой фрагмент текстовой переменной про-
белами (см. пример 4.4).
Пример 4.4,
10 LET AQ ='УВАЖАЕМАЯ ЕКАТЕРИНА
ИВАНОВНА!'
20 PRINT AQ
30 LET AQ (1,9)= SPACEQ (9)
40 PRINT AQ
50 END
RUN
УВАЖАЕМАЯ ЕКАТЕРИНА ИВАНОВНА!
ЕКАТЕРИНА ИВАНОВНА!
С помощью функции STRINGQ можно построить строку любой
длины, состоящую из одинаковых символов. Этим приемом очень
удобно пользоваться для вывода разделительных линий в таблицах
или подчеркивания выделяемых в тексте слов (см, пример 4.5),
Пример 4.5.
10 PRINT 'ПРИМЕР ФОРМИРОВАНИЯ
ГОРИЗОНТАЛЬНЫХ ЛИНИЙ'
20 PRINT STRINGQ(6, '--')
ЙО PRINT STRINGQ(40, ' = ')
40 END
RUN
ПРИМЕР ФОРМИРОВАНИЯ ГОРИЗОНТАЛЬНЫХ ЛИНИЙ
В приведенном фрагменте для подчеркивания слова ПРИМЕР исполь-
зована строка из символов «надчерк». Модификация функции STRINGQ
позволяет задавать размножаемый символ либо путем его указания
в текстовом выражении, либо с помощью цифрового кода символа
в системе ASCII или EBCDIC. Например:
STRINGQ (10, 42) ==='**********'
В системе ASCII (KON-7) символ «звездочка» кодируется десятичным
числом 42.
81
Процедура поиска вхождения позволяет дать ответ на вопрос —
содержится ли заданная комбинация символов в исследуемой строке
и с какой позиции она там располагается? Такой анализ приходится
делать при распознавании ответов пользователя, при обработке текс-
тов исходных программ в компиляторах и интерпретаторах, при
поиске ключевых слов в текстовых документах и т. п. Пример 4.6
демонстрирует поиск первого и второго вхождения слова FORMAT
в текст фортрайовского оператора.
Пример 4.6.
10 LET FQ='1I111ljFORMAT(6HFORMAT)'
20 LET KQ ='FORMAT'
30 LET N = INSTR(KQ, FQ)
40 PRINT N, INSTR(N + 1, KQ, FQ)
50 END
RUN
I_J7 16
Первый необязательный аргумент функции INSTR определяет пози-
цию в исследуемой строке, начиная с которой производится поиск
вхождения подстроки. Если он опущен, то анализ начинается с пер-
вой позиции. В некоторых версиях бейсика функция INSTR требует
обязательного задания всех трех аргументов. Нулевое значение функ-
ции 1NSTR означает отрицательный ответ на вопрос о вхождении.
4.4. Ввод символьных данных с помощью
оператора LINPUT
При вводе значений текстовых переменных с помощью оператора
INPUT следует выделить две особенности. Во-первых, список опера-
тора INPUT может содержать несколько имен текстовых переменных,
которые допускается перемежать переменными арифметического типа.
Во-вторых, текстовые значения, набираемые пользователем на терми-
нале, заключаются в кавычки и отделяются друг от друга запятыми.
Операторы LINPUT или его разновидность LINE INPUT в отли-
чие от оператора INPUT предназначены для ввода значений только
текстовых переменных. Одни версии бейсика разрешают указать
в водном списке имена нескольких текстовых переменных, другие —
имя единственной переменной. В любом случае значение очередной
переменной, набираемое пользователем, занимает всю строку цели-
ком и в кавычки не заключается. Это позволяет включить В состав
данного любые символы алфавита, начальные и конечные пробелы.
От последних можно избавиться с помощью стандартной функции
TRMQ
TRMQ ('ljuljAljBljljlj') = 'AuB'
82
4.5. Лексикографическое упорядочение текстовых
данных
Каждому из нас приходилось иметь дело с тем или иным язы-
ковым словарем. Трудно даже представить себе, насколько усложни-
лась бы задача переводчика, если бы слова в словаре были распо-
ложены случайным образом. Сколько неразберихи и хаоса вызвали бы
ведомости избирателей или телефонные справочники, если бы в них
фамилии не располагались в алфавитном порядке. Можно привести
еще много примеров, в которых упорядочение текстовых данных
существенно ускоряет процедуру их обработки.
Лексикографический порядок слов соответствует их расположе-
нию по алфавиту. Кодировка символьных данных в ЭВМ построена
таким образом, чтобы облегчить решение задачи упорядочения текс-
товой информации. Так, в общепринятых системах EBCDIC или
ASCII цифровые коды букв построены по возрастанию в соответствии
с их расположением в алфавите. Поскольку в памяти вычислительной
машины тексты представлены последовательностью восьмиразрядных
двоичных кодов, то мы имеем возможность сравнивать слова, точ-
нее— их кодовые эквиваленты, и в зависимости от результатов этого
сравнения принимать решение, какое из анализируемых слов должно
быть расположено первым по алфавиту. Так, например, кодовый
эквивалент слова СТОЛ меньше, чем соответствующий код слова
СТУЛ. Действительно, в системе КОИ-7 этим двум словам соответ-
ствуют следующие четырехбайтовые сочетания:
стол ' СТУЛ
115 116 111 108
115 116 117 108
Так как код буквы «О» меньше кода буквы «У», то текстовая кон-
станта 'СТОЛ' меньше, чем константа 'СТУЛ'. Менее очевидно, что
справедливо соотношение 'СТО' < 'СТОЛ'. Дело в том, что при
сравнении констант, содержащих разное число символов, более ко-
роткий текст дополняется справа пробелами. А код пробела в любой
системе кодирования имеет наименьшее числовое значение среди
отображаемых символов (32 в КОИ-7 и 64 в ДКОИ-8).
Пример 4.7 демонстрирует программу, которая запрашивает
у пользователя 10 фамилий и упорядочивает их в алфавитном по-
рядке.
Пример 4.7. Сортировка текстовых данных.
10 REM УПОРЯДОЧЕНИЕ СПИСКА ФАМИЛИЙ
20 DIM AQ( 10)20
30 PRINT 'ВВЕДИТЕ 10 ФАМИЛИЙ ПО ОДНОЙ В СТРОКЕ,';
40 PRINT 'ЗАКЛЮЧАЯ КАЖДУЮ В КАВЫЧКИ'
83
60 FOR к = 1 TO 10
60 INPUT AQ(K)
70 NEXT К
80 LET M = 0
90 FOR К = 1 TO 9
100 IF AQ(K)<AQ(K+D THEN 150
110 LET BQ = AQ(K)
120 LET AQ(K) = AQ(K + 1)
130 LET AQ(K + 1) = BQ
140 LET M=1
150 NEXT К
160 IF M=1 THEN 80
170 FOR K=1 TO 10
180 PRINT AQ(K),
190 NEXT К
200 END
В этой программе использован так называемый «пузырьковый»
алгоритм сортировки. Его идея заключается в попарном сравнении
соседних элементов массива. Если они расположены не в порядке
возрастания, то более «легкий» как бы всплывает. Так как эта пере-
становка носит локальный характер, то всплывший пузырек может
продолжить свой путь наверх. Поэтому после перестановки соседей
устанавливается признак (М=1), по которому цикл анализа будет
повторен заново. Перед началом цикла просмотра признак М сбра-
сывается (М = 0).
Сравнение текстовых данных на большинстве отечественных ЭВМ
представляет собой не такую уж тривиальную задачу. Дело в том,
что принцип упорядоченности кодовых эквивалентов и в системе
ASCII, и в системе EBCDIC выдержан только для букв латинского
алфавита. Коды же русских букв либо разбросаны в кодировочной
таблице по совсем непонятному принципу (EBCDIC), либо одинако-
вым по написанию буквам русского и латинского алфавита соответ-
ствуют различные числовые значения (ASCII). Поэтому фамилия
'КЕТКОВ', набранная на латинском регистре, имеет меньший кодо-
вый эквивалент, чем фамилия 'ИВАНОВ'. Код имени 'ПЕТЯ' может
оказаться меньше, чем кодовое значение 'ВАСЯ' и т. п.
Для устранения указанных неприятностей перед сравнением
строк приходится перешифровывать исходный текст, заменяя кодо-
вые эквиваленты букв на другие числа. Система команд некоторых
ЭВМ включает подобного рода операции (например, команды TR и
TRT в ЕС ЭВМ). Идея перекодировки исходного текста заключается
в следующем. Пусть переменная TQ представляет текстовую вели-
чину, подлежащую перешифровке. Например, Т0 = 'ПЕТЯ'. В ко-
дировке КОИ-7 этому значению соответствуют четыре байта с кодами
84
112, 101, 116, 113. Введем текстовую переменную SQ, которую бу
дем называть словарем перекодировки. Устроим этот словарь таким
образом, чтобы 112-й символ переменной SQ заменял букву П, 101-й
символ — букву Е, и т. д. Поскольку латинская буква А имеет
код 65, а русской букве А соответствует код 97, то для устранения
двусмысленности мы расположим в 65-й и 97-й позициях словаря
одинаковый эквивалент. Выбор символов словаря полностью в наших
руках, поэтому мы постараемся так подобрать эквиваленты переко-
дируемых букв, чтобы они были упорядочены нужным образом.
Таблица 4.4
Символ словаря Цифро- вой КОД Символ- эквива- лент Символ слова- ря Цифро- вой код Символ- эквива- лент Символ слова- ря Цифро- вой код Символ- эквива- лент
$1—S47 32 пробел $81 32 пробел $103 68 D
$48 48 0 $82 32 «—» $104 86 V
$49 49 1 $83 32 «—» $105 73 I
- . - $84 83 S $106 74 J
$57 57 9 $85 32 пробел $107 75 к
$58—$64 32 пробел $86 32 «—» $108 76 L
$65 65 А $87 32 «—» $109 77 М
$66 67 С $88 86 V $110 78 N
$67 82 R $89 32 пробел $111 79 О
$68 32 пробел $90 32 «—» $112 80 Р
$69 70 F $91 32 «—» $113 95 подчерк
$70 32 пробел $92 32 «—» $114 81 Q
$71 32 «—» $93 32 «—» $115 82 R
$72 78 Н $94 32 «—» $116 83 S
$73 32 пробел $95 32 «—» $117 84 Т
$74 32 &—» $96 94 t $118 71 G
$75 75 К $97 65 А $119 67 С
$76 32 пробел $98 66 В $120 91 [
$77 77 М $99 87 W $121 92
$78 32 пробел $100 69 Е $122 72 н
$79 79 О $101 70 F $123 89 Y
$80 81 Q $102 85 и $124 $125 $126 93 89 88 ] Z X
Предположим, что в нашем тексте встречаются только цифры,
буквы русского алфавита и совпадающие с ними по начертанию
буквы латинского алфавита. Тогда в качестве словаря можно при-
вести цепочку символов Si — S127, приведенную в табл. 4.4. Для по-
строения этой таблицы был использован следующий алгоритм. Во-пер-
вых, было решено заменить все недопустимые символы пробелами.
Во-вторых, все буквы русского алфавита было решено разместить
с 66-й позиции словаря, т. е, с начальной позиции латинского алфа-
85
вита (код латинской буквы А, равный 65, занимает в ASCII 66-е
место, так как кодировка символов начинается с нуля). После этого
мы выписываем заменяющую строку символов—буквы латинского
алфавита плюс пять недостающих знаков, а под ними упорядоченную
последовательность букв русского алфавита (рис. 4.1).
Код 6 7 56789 0- 1 23456789
Символ ABC DEFGHI J KLMNO
Символ АВ ВГДЕЖЗИЙ К Л МН О
Код 1111111111111 99100012000001 1 789301826678901
Код 8 9 0123456789012345
Символ PQRSTUVWXYZ[\] t_
Символ ПР С Т. УФХ ЦЧШЩЬЫЭЮЯ
Код 1111111 111111 1 1 1 1 1 100922222291 245672496350 1 4 6 Й
Рис. 4.1. Схема перекодировки
Теперь остается только выписать соответствие заменяемых и за-
меняющих символов. Например, букве Ф в исходном тексте соответ-
ствует код 102, а в заменяющем тексте на ее месте будет находиться
буква U с кодом 85. Таким образом, в 103-й позиции словаря должен
быть помещен символ U. Или еще: латинская буква X с кодом 88
отождествляется с русской буквой X (код 104), а последняя подле-
жит замене на символ V (код 86). Поэтому S88 = S104 ='V'.
В версии Бейсик-плюс подобного рода перекодировка выпол-
няется с помощью функции XLATE:
XLATE (/nETH,,SQ)=PES~ .
XLATE ('BACH',SQ)=CAR —
86
Результаты замены можно спокойно сравнивать, не задумываясь над
тем, на каком из регистров набирались символы Е, Т, В, А, С.
Работая на ЭВМ с разными системами кодировки символьной
информации, не следует забывать, что программа упорядочения дан-
ных может привести к разным результатам. Так, в коде EBCDIC
цифры расположены «ниже», чем буквы. Поэтому в таких системах
справедливо неравенство '1А' > 'АГ, А в системе ASCII цифры
имеют меньшие коды по сравнению с буквами. И там будет иметь
место обратное неравенство ЧА' < 'АГ. Много неприятностей может
вызвать и тот факт, что кодировка букв латинского алфавита в си-
стеме EBCDIC представлена тремя числовыми диапазонами, соответ-
ствующими группам букв А—I, J —R и S—Z. А в промежутках
хаотически разбросаны некоторые русские буквы и . символ \. Для
преодоления всех этих неурядиц и приходится изобретать перекоди-
ровочные словари и функции типа XLATE.
4.6. Типовые средства преобразования данных
В предыдущем разделе мы познакомились с одним из вариантов
преобразования символьных данных, в котором каждый символ ис-
ходного текста заменялся другим с помощью таблицы соответствий
(словаря). Существует много прямых и обратных преобразований,
в которых в качестве функций и аргументов выступают данные сме-
шаных типов — числовые и символьные.
Довольно широкий класс задач информатики связан с обработ-
кой документов, в которых содержимое отдельных символьных полей
представлено числовыми данными различного типа. Если эта инфор
мация является входной, то ее надо уметь извлекать из документа
и преобразовывать в соответствующий машинный формат. Если эти
данные формируются по результатам вычислений, то возникает по-
требность в обратном преобразовании.
Процедуры подобного рода выполняются в бейсике как бы «скры-
той камерой» при вводе и выводе числовой информации, при выборке
значений арифметического типа из блока данных, при обмене с фай-
лами. Однако возможность использовать такие преобразования в ре-
жиме программирования позволяет существенно расширить круг задач,
связанных с обработкой текстовых документов. Наиболее распростра-
ненные операции преобразования оформлены в виде стандартных
функций, приведенных в табл. 4.5
Для того чтобы лучше понять смысл отдельных преобразований,
стоит разобраться с машинными форматами некоторых констант ариф-
метического и текстового типов (см. рис. 4.2). Здесь для представле-
ния символьных данных использован код ASCII, для целых чисел —
двухбайтовый формат с записью отрицательных значений в дополни-
тельном коде, для вещественных чисел с обычной точностью—четы-
87
Таблица 4.5
№ п/п Формат обращения Результат
1 ASC(AQ) . Машинный формат числа, представленного в символьном виде текстовым выражением AQ
2 ASCII(AQ) Число, соответствующее коду первого сим- вола в текстовом выражении AQ
3 CHRQ(I) Символ ASCII, кодовым эквивалентом кото- рого является значение I
4 CVI(SXS2) Машинный эквивалент целого числа, пред- ставленного двухсимвольным текстовым зна- чением
5 CVS(S1S2S3S4) Машинный эквивалент вещественного числа с обычной точностью, представленного четы- рехсимвольным текстовым значением
6 CVD(S1S2...S8) Машинный эквивалент вещественного числа с двойной точностью, представленного вось- мисимвольным текстовым значением
7 HEXQ(Z) Текстовый эквивалент целого десятичного числа Z, переведенного в шестнадцатеричную систему
8 MKIQ(I) Двухсимвольный текстовый эквивалент це- лого числа 1
9 MKSQ(R) Четырехсимвольный текстовый эквивалент вещественного числа R (обычная точность)
10 MKDQ(D) Восьмисимвольный текстовый эквивалент ве- щественного числа D (двойная точность)
11 OCTQ(Z) Текстовый эквивалент целого десятичного числа Z, переведенного в восьмеричную си- стему
12 STRQ(Z) Перевод числового значения Z в символьный формат подобно оператору PRINT
13 VAL(AQ) Перевод числа из символьного представления в соответствующий машинный формат по- добно операторам READ или INPUT
рехбайтовый формат с мантиссой в прямом коде и двоичным поряд-
ком, увеличенным на 64. Для вещественных чисел с двойной точ-
ностью единственное отличие состоит в том, что мантисса занимает
не три байта, а семь.
Приведенные ниже примеры иллюстрируют действие стандартных
функций из табл. 4.5. Для анализа результатов следует обратиться
к рис. 4.2.
88
+13 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1
знак числа (целые числа — 2 байта)
—13 . 1 1111111 11110 0 11
+13 0 1 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 (вещественныё числа с обычной точ-
ностью—4 байта, с двойной точно-
знак числа стью—8 байтов)
—13 1 1 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0
порядок числа мантисса числа
'+13' 00101011 00110001 00110011 (текстовые константы)
'—13' 00101101 00110001 00110011
'1985' 00110001 00111001 00111000 00110101
Рис. 4.2. Машинные форматы числовых и символьных данных
ASC(' + 13') = ASC(' 13') = 13;
ASCIIf + 13') = 43; ASC11(' 13') = 49;
ASCI I(' 13') = 45; CHR0(49) = ' 1';
HEX0(13) = 'D'; OCT0(13) = '15';
CVI('13') = 49*28-f-51;
C VS(' 1985') = 249 - 64* (57*2 -8 + 56*2 -18 + 53*2 - 24);
C VD(' 1 985i_iljljlj') = 249 - 64*(57*2 - 8 + 56*2 - *8 +
+ 53*2 -24 + 32*2 - 82+32*2 - 40 + 32*2 - 48+32*2 -Bo);
MKI(49*2564-51)='13'
Таблица 4.6
№ Наименование функции Эквивалент в Бейсик-плюс
1 2 3*) 4 5 6*) 7 CVI(SiS2) CVS^SaSsS^) CVDfSA.. .S8) MKIQ(I) MKSQ(R) MKDQ(D) STRQ(Z) CVT$%(A$) CVT$F(A$) CVT$F(A$) CVT%$(I) CVTF$(R) CVTF$(D) NUM$(Z)
*) В зависимости от настройки системы Бейсик-плюс на вычисления с обычной или двойной точностью.
Преобразования типа CVS или CVD могут дать на конкретной
ЭВМ результаты, отличающиеся от приведенных выше. Это связано
с особенностями представления вещественных чисел. Например, на
СМ-4 порядок числа занимает не семь двоичных разрядов, как по-
казано на рис. 4.2, а восемь. По сравнению с истинным порядком
его искусственно увеличивают на 128, а старшую цифру мантиссы,
которая у любого нормализованного числа равна единице, в памяти
не хранят. Это позволяет вдвое расширить диапазон представления
чисел в ЭВМ без какой-либо потери точности в числовых данных.
Мы надеемся, что приведенные примеры помогут читателю разобраться
с этими преобразованиями в конкретной ситуации.
Однако не менее важно понять, зачем нужны такие процедуры.
Ведь при прямых и обратных преобразованиях типа CV-—MK двоич-
ная структура аргумента никаким изменениям не подвергается. Про-
исходит фактически лишь переобозначение величины. К такому приему
программисты прибегают довольно часто. Например, восемь двоичных
разрядов 01000001 можно рассматривать и как код символа «А»,
и как шестнадцатеричное число 41, и как восьмеричное число 101,
и как десятичное число 65. В одних операциях это значение может
выступать как число, а в других — как буква. Но синтаксис языка
не позволяет в арифметических выражениях использовать символьные
данные или присваивать текстовым переменным числовые значения.
90
Л потребность в таком смешении типов иногда возникает. Примером
может служить обмен с использованием буферной области. Буфер
предназначен для уменьшения числа физических обращений к внеш-
нему устройству. Обычно буфер описывается в терминах символьных
полей, на которых мы размещаем свою информацию в процессе
ввода или вывода. Но не все данные задачи имеют текстовую при-
роду. Вот и приходится маскировать числовые значения под текст,
чтобы поместить их на символьные поля или извлечь оттуда. Анало-
гичные приемы хорошо известны программирующим на фортране,
когда с помощью оператора EQUIVALENCE мы рассматриваем
некоторый массив то как числовое поле, то как цепочку однобайто-
вых логических переменных.
В некоторых версиях бейсика используются аналогичные функ-
ции преобразования, но с другой мнемоникой. В табл. 4.6 приво-
дится соответствие между описанными ранее функциями и эквива-
лентными им процедурами в системе Бейсик—плюс.
Глава 5. СРЕДСТВА РЕДАКТИРОВАНИЯ
ДАННЫХ ПРИ ВЫВОДЕ
Стандартные возможности оператора PRINT удовлетворяют поль-
зователей только на первых этапах освоения бейсика. Позднее поль-
зователи начинают замечать, что зонная печать таблиц далека от
совершенства. Одноименные разряды целых чисел располагаются в раз-
ных позициях колонки, количество значащих цифр управлению не
поддается, изменить размеры и расположение зон нельзя. Употребле-
ние уплотненной печати или размещение данных, начиная с фикси-
рованной позиции, также не позволяют получить «красивый» документ
из-за разброса данных, которые печатаются то в виде целых чисел,
то в форме с фиксированной или плавающей запятой.
Идея построчного вывода со смещением пишущего узла только
вправо и подъемом документа вверх после печати очередной строки
была оправдана на терминальных устройствах типа электрифициро-
ванных пишущих машинок или телетайпов. При выводе на экран
дисплея с помощью обычных средств оператора PRINT довольно
трудно организовать хорошее расположение документа на экране,
подобрать нужную скорость- перемещения строк и т. п. Ав игровых
задачах часто требуется расположить на экране дисплея неподвижную
картинку и организовать повторный вывод по уже «напечатанному»
месту.
Поэтому разработчики Бейсик-систем не прекращают поиски более
удобных и эффективных средств вывода. В одних случаях они при-
бегают к использованию подпрограмм, написанных на языке ассемблер,
в других —включают в состав бейсика новые функции и операторы.
В этой главе рассматриваются оригинальные средства редактирования
числовой и 'символьной информации, включенные в состав тех или
иных версий бейсика.
5.1. Управление форматом вывода числовых данных
К настоящему разделу отнесены средства, используемые в опе-
раторе PRINT как дополнение к традиционным редактирующим ука-
зателям (запятая, точка с запятой, TAB). С их помощью может быть
установлен единый формат печати числовых данных, действующий до
тех пор, пока не встретится новое указание об изменении формата.
92
Это может произойти как в пределах одного оператора PRINT, так и
в одном из последующих операторов PRINT. Установленный формат
печати не отменяет действие стандартных редактирующих указателей.
5.1.1. Печать числовой информации в системе Бейсик-EC. Вид
числовой информации на печати определяется текущим состоянием
формата вывода. Этот формат задает количество позиций, на которых
должно быть размещено выводимое число, и характер представления
числа. Число может быть представлено либо как целое (1-формат),
либо в форме с фиксированной точкой (F-формат), либо в форме
с плавающей точкой (Е-формат).
Перед запуском задачи на счет формат печати устанавливается
в состояние Е15.7. Это соответствует выводу числовой информации
с плавающей точкой по следующему шаблону:
LJLJ[—]. а1а2аза4абаба7Е ± р2р2
Мантисса числа печатается с семью значащими цифрами, знаковая
позиция положительного числа замещается пробелом. В выводной
строке число занимает 15 позиций, включая два пробела, предшест-
вующие числу.
Формат печати чисел может быть изменен в любой момент вы-
полнения программы с помощью редактирующего указателя FMT,
размещаемого в списке оператора PRINT. Например:
150 PRINT FMT(F8.2),X,Y
Во время выполнения оператора 150 указатель FMT установит режим
печати числовой информации в форме с фиксированной точкой. При
этом на каждое число будет отводиться по восемь позиций, две из
которых (самые правые) предназначаются для дробной части.
Указатель FMT в качестве своего аргумента может иметь один
из параметров типа Iw, Fw.d или Ew.d. Параметр Iw устанавливает
режим печати целых чисел, при котором после округления у числа
отбрасывается дробная часть, а целая часть переносится на буфер
вывода с прижимом вправо:
W позиций
LJ — Цк Нк-1
значащие цифры
_гПОЗИЦИЯ
(знака
✓ j
(положение указателя
< буфера до начала пе-
(реписи числа
положение
указателя
буфера
после пере-
писи числа
Для отрицательных чисел знак «минус» размещается вплотную к са-
мой старшей значащей цифре. У положительных чисел знаковая по-
93
зиция замещается пробелом. Если w отведенных позиций не хватает
для размещения слишком большого числа, то все выделенные под
числовое поле позиции заполняются звездочками.
Параметр Fw.d устанавливает режим печати чисел в форме
с фиксированной точкой. При этом у числа после соответствующего
округления сохраняется d цифр в дробной части, а результат пере-
писывается на буфер вывода следующим образом:
W позиций
|Ц-а |
---указатель
«до»
I---указатель
«после»
Если размер поля w недостаточен для размещения числа, то отве-
денные позиции буфера заполняются звездочками.
Указатель FMT с параметром Ew.d устанавливает режим печати
чисел с плавающей точкой. При этом число округляется в (d-1- 1)-й
значащей цифре и переписывается на буфер вывода следующим
образом:
W позиций
----указатель «до»
... ]u-d
указатель
«после»
При выводе по формату Е можно напечатать любое число, помещаю
щееся в разрядной сетке ЭВМ.
В любом - случае под числовую информацию должно отводиться
не более 15 позиций (w^15), а количество дробных или значащих
цифр не должно превышать семи (d^T).
Пример 5.1. Образец форматной печати в системе Бейсик-ЕС.
10 FOR Х = 1 ТО 1.2 STEP 0.2
20 PRINT FMT(F5.2), X; FMT(F8.4), SIN(X);
COS(X) : FMT(E12.3), EXP(X)
30 NEXT X
RUN
L_J1 . 00 1 . 20 4— F5.2 —> LJ > . LJLJLJ . 8415 . 9320 <— F8.4 —> > LJLJLJ . 5403 . 3624 4— F8.4 —> LJLJLJLJ . 272E-J-01 . 332E+01 4 E12.3 >
94
5.1.2. Управление форматом печати на микроЭВМ. Электроника
ДЗ-28. Способ управления печатью числовых данных на микроЭВМ
Электроника ДЗ-28 очень напоминает действие форматного указателя
FMT, описанного в предыдущем разделе. По существу, разница
только в записи форматного указателя, который здесь окаймляется
восклицательными знаками:
150 PRINT ! 4.2 ! X,Y
Существует два основных типа задания формата печати:
! n.m Г и ! Fn.ni f
Первый из них соответствует печати числа с фиксированной точкой.
При этом для записи числа отводится n-J-m+2 позиции, из которых
одна резервируется под знак, следующие и предназначены для раз-
мещения целой части, (п-|-2)-я позиция занята точкой, вслед за ко-
торой располагается m дробных разрядов. Этот формат может быть
использован и для печати целых чисел в случае ш = 0. Второй тип
формата устанавливает режим печати чисел с плавающей точкой. При
этом числовое поле занимает п + ш-)-6 позиций, из которых первые
n + m + 2 формируются так же, как и в предыдущем случае, а в
четырех последних записывается порядок.
Пусть, например, значение переменной А равно 3.1416, Тогда
в результате выполнения следующего оператора:
105 PRINT ! 4.2 I А, ! F4.2 1 А
мы увидим следующую строку на терминале:
Iljljljlj 3 . 14 ljljljljljljIlj3141 . 60Е — 03ljlj|
------ 1-я эона ------------------2-я зона------>|
Частный случай формата ! F0.12 I записывается более компакт-
но — ! Е !. В этом отношении авторы версии заслуживают упрека
за непоследовательность в использовании букв F и Е. Экспоненциаль-
ной форме числа больше соответствует буква Е, да и нарушать тра-
диции фортрана вряд ли бы следовало.
Интересной особенностью описанных форматок является то, что
их можно задавать в выводном списке вместо разделителей — запятой
или точки с запятой. Это позволяет не делать дополнительные пере-
мещения пишущего узла, которые были бы вызваны стандартными
разделителями, окаймляющими форматный указатель. Например, два
следующих оператора:
105 PRINT ! 4^ I, А 1 F4.2 ! А
НО PRINT 1 4.2 ! А ! F4.2 1 А
приведут к одинаковой по форме печати, но в первой строке оба зна-
чения будут расположены, начиная со второй зоны, а в следующей
95
строке —с первой зоны. И между обоими числами в каждой строке
никакого дополнительного пробела не будет.
При запуске Бейсик-системы на Электронике ДЗ-28 стандартно,
устанавливается формат ! F1.9 !.
5.2. Печать с использованием формата выводной строки
Идея задания структуры выводной строки и ссылки на нее из
оператора печати пришла в бейсик из фортрана. Однако в разных
версиях бейсика имеются отдельные нюансы как в средствах описания
формата выводной строки, так и в способах ссылки на это описание.
Наиболее распространенным вариантом оператора форматной
печати является PRINT USING..* (напечатать используя...). Иногда
эту пару служебных слов пишут слитно — PRINTUSING (Wang 2200,
Искра-226), в большинстве других систем преобладает раздельное
написание. Иногда между этими словами может задаваться параметр,
определяющий номер выводного файла (Рафос, бейсик-плюс, ДВК).
Например:
100 PRINT 5 USING формат, список
Файл с программным номером #5 обозначает здесь участок дисковой
или ленточной памяти, в который переносятся выдаваемые данные.
При отсутствии такого указания (^ 5) вывод происходит на терминал.
Параметр, следующий за служебным словом USING, содержит
явное или косвенное описание структуры выводной строки. Под явным
описанием формата мы понимаем текстовую константу, заключенную
в кавычки и содержащую характеристики числовых и символьных
полей. Косвенное описание формата —это либо имя текстовой пере-
менной, либо номер строки, в которых задается шаблон вывода. Наи-
более развитые системы допускают все три способа описания формата,
в других (Диеп, Искра-226) применяется только ссылка на строку
с соответствующим описанием. Большинство реализаций бейсика на
ДВК и СМ-4 в качестве формата разрешают использование только
текстовых констант или текстовых переменных. В этом случае отдель-
ный оператор, предназначенный для описания формата выводной
строки, в составе входного языка отсутствует.
5.2.1. Способы описания числовых полей. Числовое поле пред-
ставляет собой группу смежных позиций выводной строки, на кото-
рых с прижимом вправо должно быть расположено значение арифме-
тического типа. Последнее может быть представлено в одном из трех
основных форматов — в форме целого числа, числа с фиксированной
или плавающей точкой.
Описание формата числового поля длиной в w позиций состоит
из w символов, каждый из которых определяет позиции целой и дроб-
ной части числа, местоположение точки и позиции, выделяемые под
96
порядок. Для описания формата резервируется небольшое количество
символов из алфавита языка, порядка четырех-пяти. Символы 44
обычно соответствуют цифровым позициям поля. Местоположение де-
сятичной точки, отделяющей целую часть числа от дробной, почти во
всех версиях бейсика задается символом «точка». Для указания по-
зиций порядка в формате с плавающей точкой используется четверка
символов, соответствующих операции возведения в степень:
]~1 —на ЭВМ СМ-4 (Рафос)
АЛЛА —на ЭВМ ДВК, Искра-226
! ! ! ! —на ЕС ЭВМ (Диеп)
f t t t *—на ЭВМ СМ-4 (бейсик-плюс), Wang 2200
В приведенном ниже примере демонстрируются образцы описания
основных форматов числовых полей:
"44###"—числовое поле целого типа, содержащее четыре
позиции. На нем можно разместить любое число из диапазона от —
999 до 9999.
"#44 ## • # #*—числовое поле из семи позиций, в которых
располагаются числа в форме с фиксированной точкой и двумя циф-
рами в дробной части. Результат может содержать до четырех цифр
в целой части.
"#44 • 44 44## tttt" — числовое поле из И позиций для пред-
ставления результата в форме с плавающей точкой, содержащего не
более двух цифр в целой части и четыре цифры в дробной части
мантиссы.
Управление позицией знака на числовом поле, Если никаких допол-
нительных указаний по поводу знака в описании формата нет, то
в большинстве систем приняты наиболее естественные соглашения.
Сводятся они к двум следующим пунктам:
— знаковым разрядом считается один из разрядов целой части
числа, непосредственно предшествующий самой старшей значащей
цифре результата;
— знаковый разряд для положительных величин замещается про-
белом, но при необходимости он может быть занят и старшей знача-
щей цифрой.
В табл. 5.1 приведены результаты редактирования числовых дан-
ных с использованием стандартных соглашений о знаке применительно
к версии языка Бейсик-плюс. Подобного рода результаты будут по-
лучены и в других версиях Бейсик-систем, эксплуатируемых на оте-
чественных ЭВМ. Правда, в некоторых реализациях знак «+» перед
положительным порядком не заменяется пробелом.
Существуют и другие соглашения по поводу знака числа,
если его позиция в описании формата поля явно не указана.
Так, на миниЭВМ фирмы Data General в этом случае знак числа
вообще не печатается, и машинные числа 4-30 и —30 при выводе по
4 Ю. Л. Кетков
97
Таблица 5.1
Формат числового поля Значение данного в ЭВМ Вид результата на выводе
• 4# - . #zj tttt • # = ¥tttt ## • # tttt ## . ## tttt tttt zzfzztzlzft tttt :::z:zz::=# tttt *#### + 1234 — 1234 + 123 + 1.278 —12.783 + 127.8 +2.57 —2.57- —999.12 +0.001234 —0.1234 + 123456789 — 123456789 —852.96 +0.13579 LJ LJ 1234 LJ — 1234 123 LJ LJ 1.28 —12.78 127.80 25.70Е —01 —2.57ELJ00 —9.99ELJ02 12.34Е —04 —123Е —03 1235Е LJ 05 — 123Е LJ 06 —853. . 1358
формату "4£ # выглядят абсолютно одинаковыми. Мы не считаем
такой подход разумным.
В отдельных случаях бывает полезно зафиксировать позицию
знака результата на числовом поле. Чаще всего это делают в самой
левой позиции поля. Но в некоторых документах, используемых
в бухгалтерских или плановых расчетах, позицию знака располагают
справа от числа. Для таких манипуляций в некоторых версиях бей-
сика при описании формата прибегают к символу «+» или «—».
Например:
Символ «+» означает, что занимаемая им позиция должна быть обя-
зательно замещена знаком результата, каким бы последний ни был.
Употребление символа «—» означает, что в данной позиции может
быть помещен только знак минус. Для положительного результата
эта позиция замещается пробелом.
Следует отметить, что нет какого-то стандарта в использовании
знаков «+» и «—» при описании форматов числовых полей. Так,
например, употребление указанных символов в первой позиции фор-
мата на ЭВМ Искра-226 приводит к печати знака, прижатого к стар-
шей значащей цифре целой части числа. На миниЭВМ фирмы Data
General плавающий знак числа, прижатый к старшей цифре, описы-
вается с помощью пары символов «+ +» или «---------». Реализация
бейсика на ЭВМ типа Электроника-60 и СМ-4 допускает использова-
98
ние только знака «—» в самой правой или в самой левой позиции
числового поля. В системе Дисп-ЕС знак «—» может быть указан
только в первой позиции поля. Поэтому, работая на конкретной
установке, вы должны тщательно ознакомиться с соответствующими
руководствами или попробовать заинтересовавшие вас варианты на
ЭВМ. Последнее предпочтительнее, так как далеко не всегда доку-
ментация по бейсику содержит исчерпывающую информацию.
Дополнительные средства редактирования числовых данных. Среди
дополнительных средств, предлагаемых некоторыми версиями бейсика,
отметим возможность разделения групп цифр (обычно — троек) запя-
тыми, замещение старших нулей звездочками и размещение непосред-
ственно перед числом символа денежной единицы. Примеры исполь-
зования указанных средств приведены в табл. 5.2.
Таблица 5.2
Формат числового поля Значение данного в ЭВМ Вид результата на выводе
**##•# **##.#- 00#*-# 00#*-# 00##-*- 00#* 00. *##.#**•## 4-4832684.15 127.8 12.78 —1.5 127.8 12.78 —1.5 125 1250 4-4832684.15 LJ4,832,684.15 *127.8 **12.8 ***1.5— Q127.8 LJ012.8 ULJQ1.5— 0125 1250 04,'832,684.15
Расстановка запятых между 'группами цифр делает более нагляд-
ной запись многозначных чисел. Такая возможность имеется в версиях
бейсика на ЭВМ типа ДВК, Искра-226, СМ-4 (Рафос, Бейсик-
плюс). Подавление лидирующих нулей символом «звездочка» допу-
скается на ДВК и СМ-4. Использование знака денежной единицы
(в зарубежных версиях вместо символа Q употребляется знак дол.
лара—$ или фунта стерлингов L) на отечественных ЭВМ не целе-
сообразно, хотя такая возможность предоставляется на ДВК, СМ-4
и Искре-226.
Реакция системы на переполнение числового поля. Описания чис-
ловых полей целого типа или в форме с фиксированной точкой могут
оказаться неприемлемыми для размещения определенных значений.
Так, например, длина поля типа явно недостаточна для
вывода чисел 1985 или —159, а на поле формата нельзя
расположить число 198.5. В таких случаях принято говорить о пере-
полнении числового поля. На поле с плавающей точкой такой ситуа-
ции не возникает.
4*
99
Реакция на переполнение в разных системах может быть различ-
ной. Одни системы рассматривают эту ситуацию как программную
ошибку, появление которой приводит к аварийному завершению про-
граммы. В других системах по аналогии с фортраном переполнив-
шееся поле забивают звездочками и продолжают счет. В третьих — на
поле печатают описание его формата. Надо отметить, что два послед-
них подхода характеризуются малой информативностью. Поэтому сле-
дует приветствовать поиски более разумных решений, которые были
предприняты в ряде систем. Так, например, на вычислительных маши-
нах типа System-4 в операционной системе Multijob в случае перепол-
нения поля с фиксированной точкой делается попытка сдвинуть по-
зицию точки вправо, насколько это возможно в пределах длины поля.
Если и эта попытка оканчивается неудачей, то результат печатается в
форме с плавающей точкой;
На ЭВМ типа ДВК и СМ-4 использован другой прием. Здесь
производится расширение поля вправо до нужной длины без измене-
ния типа формата. Но для того чтобы пользователь обратил внимание
на имевшее место переполнение, перед результатом печатается сим-
вол %.
Демонстрация некоторых из описанных выше вариантов реакции
на переполнение приведена в табл. 5.3.
Таблица 5.3
Формат числового поля Значение данного в ЭВМ Результат редактирования Тип ЭВМ
##### 958.2 598745 789012.34 —789 —0.999 ***** ******** %—789 %—. 999 Wang 2200 Data General » » Бейсик-плюс (см-4) » »
5.2.2. Способы описания текстовых полей. Текстовые поля выде-
ляются в выводной строке для размещения значений символьных
констант, переменных и выражений. В одних версиях бейсика суще-
ствуют специальные средства для описания размеров текстовых полей
и способов размещения символьных данных на этих полях. К ним
относятся системы, эксплуатируемые на ЭВМ типа ДВК и СМ-4
(ОС РВ, Рафос). В других реализациях принято задавать только ко-
личество позиций, отводимых под текстовое поле (Бейсик-плюс, BASIC-
ICL). Наконец, существуют системы, позволяющие располагать тек-
стовые данные на месте числовых полей (Искра-226, Дисп-ЕС).
Первую группу средств описания текстовых полей составляют
форматы, начинающиеся с апострофа, вслед за которым расположено
100
несколько одинаковых букв L, R, С или Е. Общее количество сим-
волов, включая апостроф, определяет длину текстового поля. Распо-
ложение символьного данного на таком поле определяется буквой»
использованной в описании формата. Для буквы L характерен при-
жим текста к левой границе поля, для буквы R— к правой. Буква С
является указанием о симметричном (центральном) расположении
выдаваемого текста. Действие буквы Е связано с прижимом выдачи
влево и одновременным расширением поля, если его длина меньше
длины выводимого текста. Примеры действия указанных форматов
приведены в табл. 5.4.
Таблица 5.4
Формат текстового поля Значение данного в ЭВМ Результат редактирования
'LLL 'RRR 'ССС 'LL 'RR 'С 'ЕЕ 'ЕЕЕЕ ДА ДА ДА ДА СТОЛ стол стол стол стол д ДАии LJLJ ДА иДАи СТО тол то стол СТОЛ |_1
Попытка напечатать числовое значение на текстовом поле или
вывести символьное значение на числовом поле в ОС РВ, Рафос и
ОС-ДВК расценивается как синтаксическая ошибка. Она может быть
обнаружена на стадии предварительной обработки исходной програм-
мы, если формат выводной строки задан явно, или во время счета,
если шаблон печати определяется значением текстовой переменной.
В системах Бейсик-плюс и BASIC-ICL использована довольно
сходная идея для указания границ текстового поля. Так, символьное
поле длиной в одну позицию в ДОС РВР описывается символом «!»,
а в операционной системе Multijob — апострофом. Для описания поля
длиной в две позиции на СМ-4 используют пару символов «\\», а
на ЭВМ System-4—две смежные кавычки. Для описания более длин-
ных полей, состоящих из п (п > 2) позиций, между указанными сим-
волами располагают п — 2 пробела. Например:
\LJ l—l LJ LJ\ — текстовое поле длиной в 6 позиций (СМ-4,
Бейсик-плюс),
"LJ LJ L—Г — текстовое поле длиной в 5 позиций (ICL).
На полях, описанных таким образом, текстовые данные располагаются,
прижимаясь влево. Если значение выводимого текста длиннее, чем
101
отведенное поле, то излишние символы справа отсекаются. Для ко-
роткого текста оставшиеся позиции заполняются пробелами. Наруше-
ние соответствия между описанием поля и типом выводимого данного
в обеих системах считается ошибкой.
В системах, реализованных на ЭВМ типа Искра-226 п ЕС (Дисп-ЕС),
специальных средств для описания текстовых полей нет. Здесь до-
пускается размещение текстовых значений на полях числового типа.
При этом символы, использованные для описания числового формата,
никакого влияния на вывод текста не оказывают. Все они только
обозначают позиции поля и его расположение в выводной строке.
5.2.3. Описание структуры выводной строки в целом. Описание
структуры выводной строки, определяющее шаблон печати, пред-
ставляет собой список описаний полей числового или символьного
типа. Типы полей могут чередоваться в произвольном порядке. Ка-
ких-то специальных разделителей, отделяющих описание одного поля
от другого, не существует. Любой символ, не используемый в фор-
матных указателях, выполняет роль такого разделителя. Все эти
символы воспроизводятся в соответствующих позициях выводной строки
наряду с изменяемым содержимым числовых и текстовых полей. На-
пример:
В приведенной цепочке содержится описание трех последовательных
числовых полей и одного текстового. В позициях 1—4 выводной строки
располагается поле целого типа. Далее в позициях 5 и 6 будет вос-
производиться двухсимвольная константа "А = ", правее которой рас-
положено числовое поле вещественного типа с фиксированной точкой
(позиции 7—12). От следующего числового поля его отделяет пробел,
который будет выдаваться на печать в 13-й позиции. Непосредственно
вслед за вещественным полем с плавающей точкой (позиции 14—22)
располагается текстовое поле, содержащее три позиции.
Заметим, что пример форматного описания вида # # # # —
* ф . ф * однозначно истолкован быть не может. Знак минус здесь
можно отнести как к описателю первого поля, так и к описателю
второго поля. Поэтому такой формат будет воспринят системой как
ошибочный, и для устранения неоднозначности необходимо справа
или слева от знака «минус» поместить какой-нибудь разделяющий
символ, например, пробел.
Мы уже упоминали, что полное описание структуры выводной
строки может быть задано либо явным образом в виде текстовой кон-
станты в теле оператора PRINT USING, либо в виде ссылки на зна-
чение текстовой переменной или на номер специального оператора,
описывающего шаблон печати.
Явное задание формата печати используется в реализациях бей-
сика на ЭВМ СМ-4 (Рафос, ОС РВ, ДОС-РВР) и эквивалентных им
102
моделях фирмы DEC, на ДВК, ЭВМ фирмы DG. Оператор форматной
печати для этих систем может выглядеть, например, следующим
образом:
100 PRINT USING "А = —####uuB = ## . #LJ
Cl A, В, Cl
Задание аналогичного формата выводной строки через значение
текстовой переменной может быть реализовано так:
90 LET = =
Cl=###"
100 PRINT USING FQ, A, В, Cl
Такой способ описания шаблона печати допускается в версиях опера-
ционных систем на СМ-4 и ДВК. Сравнивая оба приведенных при-
мера, можно сделать следующие выводы. Использование текстовой
константы устраняет какую-либо неоднозначность в описании шаблона
печати. Этот способ обладает большей наглядностью, так как действие
оператора печати полностью определено в нем самом. И не надо произ-
водить анализ программы и логики выполнения ее операторов, чтобы
установить форму печати. На самом деле попасть на оператор с мет-
кой 100 в приведенном выше примере можно и минуя оператор 90.
А возможность переприсвоения переменной FQ нового значения исклю-
чать нельзя. Главный недостаток текстовой константы при задании
формата заключается в длине описания. Ведь в теле оператора PRINT
USING размещается еще и выводной список. Поэтому с помощью
текстовой константы нельзя описать структуру достаточно длинной
выводной строки, не содержащей повторяющихся групп однотипных
полей. Можно указать и на еще одно неудобство использования тек-
стовой константы. Если нам в двух или более точках программы
приходится печатать значения разных выражений по одному и тому
же формату, то описание структуры выводной строки приходится
повторять в теле каждого оператора PRINT USING. В такой ситуа-
ции использование текстовой переменной гораздо предпочтительнее.
Специальный оператор описания формата выводной строки исполь-
зуется на ЭВМ типа Искра-226 (Wang 2200), ЕС ЭВМ (Диеп-ЕС) и
совместимых с ними вычислительных машинах типа System-4. Вместо
служебного слова, с которого начинается текст любого оператора,
здесь используется единственный символ—знак «%» на Искре-226
(Wang 2200) и двоеточие на машинах типа ЕС ЭВМ. Указанный сим-
вол располагается сразу вслед за номером строки, на которую ссы-
лается оператор PRINT USING. Например:
100 PRINT USING 200, А, В, Cl
200 % = .#UUUC1=##*
103
Первый же символ, расположенный вслед за спецзнаком (% или:),
соответствует первой позиции описания выводной строки. Этим, кстати,
и объясняется выбор односимвольного «имени» оператора. Короткое
имя позволяет отвести максимум позиций строки под описание длин-
ного шаблона печати.
5.2.4. Взаимодействие элементов выводного списка с шаблоном
печати. Фиксация границ и типов полей в выводной строке, естест-
венно, не согласуется с традиционными соглашениями бейсика по по-
воду влияния разделителей выводного списка на формат печати. По-
этому в операторе PRINT USING обычно игнорируются стандартные
перемещения пишущего узла в зависимости от запятой, Точки с за-
пятой или указателя ТАВ(е).
Наиболее естественной является ситуация, при которой количе-
ство элементов выводного списка и их типы в точности соответствуют
числу и форматам описания полей выводной строки. Однако иногда
нам приходится отступать от этого правила. Например, если с по-
мощью оператора PRINT USING мы печатаем заголовок, -состоящий
из символов, вкрапленных в описание полей. В этом случае вывод-
ной список пуст. Другой пример — одно описание шаблона печати
используется в двух или более операторах PRINT USING, тела ко-
торых включают разное количество элементов выводного списка. Од-
ним словом, несоответствие между количеством выводимых данных и
числом описаний полей — не такая уж и большая редкость. Как же
реагируют различные Бейсик-системы на подобного рода ситуации?
Если количество полей в описании шаблона печати меньше, чем
число элементов выводного списка, то существуют две разумные воз-
можности. В первом случае можно считать, что шаблон печати пов-
торяется столько раз, насколько позволяет длина выводной строки.
Например:
80 PRINT USINGS#список
Такой подход предполагает, что выводная строка общей длиной в
80 позиций содержит 16 числовых полей с чередующимися форма-
тами— поле целого типа (позиции 2 — 4), поле вещественного типа с
фиксированной точкой (позиции 6—10), поле целого типа (позиции
12—14), поле вещественного типа (позиции 16—20) и т. д. Второй
подход состоит в том, что когда список полей исчерпан, вывод про-
должается по такому же формату, но уже в следующей строке. Эта
идея принадлежит фортрану.
Первый вариант с продолжением вывода в той же строке реали-
зован на ЭВМ фирм ICL, Data General. Второй вариант с переходом
на вывод в следующей строке характерен для версии Бейсик-плюс.
На ЭВМ типа Искра-226 и Wang 2200 пользователь имеет возмож-
ность управлять выбором того или иного варианта. Иллюстрацией
к этому служит пример 5.2,
104
Пример 5.2. Форматная печать на Искре-226.
10 LET AQ = "ABODE FGH"
20 PRINTUSING 30, AQ, AQ, AQ
30
40 PRINTUSING 30, AQ; AQ; AQ
RUN
ljABCD
ljabcd
ljABCD
ljABCDljABCDljABCD
5.3. Другие способы управления форматом вывода
5.3.1. Форматная печать в системе разделения времени TSS 1640.
Для форматной печати в системе TSS 1640 (фирма Honeywell) ис-
пользована модификация оператора PRINT, которая отличается от
стандартного формата наличием запятой сразу же после служебного
слова:
150 PRINT, 200, Al, Bl, Cl
Первый элемент в списке задает номер строки, в которой с помощью
оператора FMT описана структура выводной строки:
200 FMT 16, F8.2, Е12.4
Оператор FMT практически повторяет идеологию оператора FORMAT
из фортрана. Для описания числовых полей целого и вещественного
типа здесь используются уже известные форматы Iw, Fw.d и Ew.d.
Пропуск между числовыми полями организуется с помощью формата
Xw. При этом очередные w позиций выводной строки заполняются
пробелами. Текстовые вставки в выводной строке задаются операто-
ром FMT в виде обычных символьных констант, заключенных в ка-
вычки. И еще один редактирующий указатель, состоящий из символа
«/», используется как сигнал к продолжению печати в следующей
строке.
Пример 5.3. Форматная печать в TSS 1640.
10 FOR Х = 0 ТО 1.2 STEP 0.2
20 PRINT, 40, X, SIN(X), COS(X)
30 NEXT X
40 FMT 'X = ‘, F4.1, /l_jSIN(X) = /, F7.4, 'ljCOS(X) = ', F7.4
50 END
RUN
X = ljO.OljSIN (X) = ljO.OOOOljCOS( X) = i_i 1.0000
X = ljO.2l_jSIN (X) = i_10.1 987l_jCOS(X) = ljO .9801
X = lj1.2ljSIN(X) = i_i0.9320ljCOS(X) =i_i0.3624
105
5.3.2. Управление форматом вывода на ЭВМ НР-2100. В Иашей
стране эксплуатируется несколько вычислительных установок фирмы
Hewlett-Packard. Система с разделением времени BASIC 2000F реа-
лизована не на такой уж современной модели НР-2100А. Но она
интересна тем, что предлагает пользователю широкие возможности
по управлению выводом и редактированию числовой и символьной
информации.
Оператор форматной печати в системе TSB 2000F может быть
использован в одной из трех следующих модификаций:
100 RRINT USING 200; список
105 PRINT USING А$; список
ПО PRINT USING 'DDD.D, 5А, 4D'; список
В первом случае тело оператора печати начинается со ссылки на
метку оператора IMAGE, в котором описывается последовательность
форматов вывода. Во втором случае шаблон печати задается значе-
нием текстовой переменной А$, а в третьем используется явное опи-
сание формата печати в виде текстовой константы. Явное или неяв-
ное указание о формате отделяется от выводного списка точкой с
запятой.
Среди элементов списка вывода в операторе PRINT USING раз-
решается употреблять числовые константы, арифметические перемен-
ные и выражения, а также текстовые переменные. Употребление
текстовых констант в списке вывода запрещено, так как необходимые
символьные вкрапления в нужных позициях выводной строки зада-
ются между описаниями форматов соответствующих полей. Здесь уже
в который раз проявилось влияние фортрана на бейсик. В списке
оператора PRINT USING наряду с указанными выше элементами
могут встретиться следующие редактирующие функции:
^ТАВ (п) — перевод пишущего узла в п-ую позицию выводной
строки,
SPA (п) — пропуск п позиций перед печатью следующего элемента,
LIN (п) — пропуск п строк перед печатью следующего элемента
(если п < 0, то пишущий узел возвращается в начало
текущей строки).
Все элементы выводного списка в операторе PRINT USING раз-
деляются запятыми.
Из того факта, что список вывода допускает указания по допол-
нительному перемещению пишущего узла, вытекает интересная осо-
бенность форматных описаний. Описания числовых и текстовых по-
лей, задаваемые явным или неявным образом, не привязаны к
конкретным позициям выводной строки. Очередной форматный ука-
затель начинает действовать с текущей позиции выводной строки.
Пример 5.4 демонстрирует возможность получить разные распечатки
при использовании одного и того же описания форматов полей.
106
Пример 5.4. Влияние редактирующих указателей в теле опе-
ратора PRINT USING.
10 LET N$ = 'ABCD'
20 PRINT USING 40; N$, N$
30 PRINT USING 40; N$, TAB(8), N$
40 IMAGE 5A, 5A
50 END
RUN
ABCDljABCDlj
ABCDljljljABCDlj
В этом примере мы имеем дело с двумя текстовыми полями, зани-
мающими по пять позиций. Но в первом случае они занимают пози-
ции 1—5 и 6^-10 выводной строки, а во втором случае произошел
сдвиг очередного поля в позиции 8—12.
Описание текстовых полей. Формат текстового поля описывается
с помощью цепочки символов А, которые могут перемежаться симво-
лами X. Например, АААА, АХАА, АХХАХА и т. д. Несколько
подряд идущих одинаковых символов в формате можно записывать
более компактно, указывая перед символом число его повторений.
Например, вместо АААА писать 4А, вместо АААХХАААА — ЗА2Х4А.
Таким же образом можно избежать дублирования повторяющихся
групп символов.
Каждая позиция текстового поля, соответствующая букве А в
описании формата, замещается очередным символом данного, выда-
ваемого на печать, или пробелом (в случае, когда формат больше
значения). Позиции текстового поля, помеченные буквами X в опи-
сании формата, замещаются на выводе пробелами. При этом очеред-
ной символ выводимого данного не пропадает, он просто «приторма-
живается», дожидаясь позиции, отмеченной в формате буквой А.
Эта интересная особенность позволяет печатать любые фрагменты
Таблица 5.5
Формат текстового поля Значение данного в ЭВМ Результат редактировани
АААААА 6А 5А 8А 2Х6А АХАХАХАХАХА 5(АХ)А 6(АХ)5А ABCDEF ABCDEF ABCDEF ABCDEF ABCDEF ABCDEF ABCDEF КЕТКОВшЮ. Л. ABCDEF ABCDEF ABCDE ABCDEFljlj ljljABCDEF AljBljCljDljEljF AljBljCljDljEljF КиЕиТиКиОиВшЮ.Л.
107
текстовых данных вразрядку, чтобы выделить более важную часть
сообщения.
Примеры редактирования текстовых значений приведены
в табл. 5.5.
Описание числовых полей целого типа. Для описания числовых
полей целого типа можно использовать любые комбинации символов
D (позиция цифры) и X (позиция пробела), а также символ S, опре-
деляющий расположение и способ печати знака числа. Задание S
означает печать знака числа в любом случае («+» или «—»), тогда
как без этого указания знак печатается только у отрицательного
числа.
В табл. 5.6 приведены примеры редактирования числовых дан-
ных на полях целого типа.
Таблица 5.6
Формат числового поля Значение данного в ЭВМ Результат редактиро- вания Формат числового поля Значение данного в ЭВМ Результат редакти- рования
4D 1985 1985 5D —1985 — 1985
4D 1985.1 1985 4(DX) 1985 1lj9lj8lj5lj
4D 1985.9 1986 S6D 1985 ulj+1985
S4D 4DS 5D 1985 1985 1985 + 1985 1985+ U1985 DS3D 1985 1+985
Описание числовых полей с плавающей точкой. Формат число-
вого поля с плавающей точкой может задаваться с помощью симво-
лов D, X, Е, S и "Л Обязательными при описании формата явля-
ются только символы D и Е. Один символ Е резервирует четыре
Таблица 5.7
Формат числового поля Значение данного в ЭВМ Результат редактирования
DD.DDDE 3.14159 U3.142E + 00
SD.3DE 3.14159 ИЗ. 142Е4-00
SD.3DEX 3.14159 -3.142EU4-00
S.3DE 3.14159 -. 314Е + 01
SD.3DXE 3.14159 -3.142UE4-00
позиции для записи порядка числа. Употребление одного или не-
скольких символов X справа от Е приводит к отделению указателя
экспоненты (буквы Е) от величины порядка соответствующим коли-
чеством пробелов.
108
Примеры редактирования данных о плавающей точкой приведены
в табл. 5.7.
Если выдаваемый результат не помещается на отведенном поле,
то его значение печатается в отдельной строке по формату с плава-
ющей точкой (SD.5DE).
Описание числовых полей с фиксированной точкой. Числовое поле
с фиксированной точкой описывается с помощью символов D, X, S и
Указание о позиции десятичной точки должно присутствовать в
формате обязательно, указание о знаке можно и не задавать. При-
меры редактирования числовых данных на полях вещественного типа
с фиксированной точкой приведены в табл. 5.8.
Таблица 5.8
Формат Значение Результат
числового поля данного в ЭВМ редактирования
, DDD.DDD 123.456 123.456
3D.3D 123.4567 123.457
4D.3D 123.456 UJ123.456
S3D.3D 123.456 +123.456
2D.3D —0.123 —0.123
S2D.3D —0.123 LJ—0.123
S2D.3D 0.123 ш+0.123
S.3D 0.123 + .123
D.3D 0.123 0.123
D.3D —0.123 — .123
Формат оператора IMAGE. Тело оператора IMAGE представляет
собой список описаний числовых и текстовых полей, разделяемых
запятыми. При этом группы повторяющихся описаний могут быть
заключены в круглые скобки, перед которыми задается коэффициент
повторения. Например:
150 IMAGE А5, 4(10А, 2Х, 4D2X)
Среди описания полей может находиться указание о продолжении
печати с начала следующей строки. Функцию такого указателя вы-
полняет символ «/», широко используемый для данной цели и в дру-
гих системах. Например:
200 IMAGE 3D.3D//(2AX, 6D, 4(2Х2АХ)/)
Еще одна особенность оператора IMAGE, заимствованная из
фортрана, связана с управлением печатью по первому символу фор-
мата. В качестве управляющего символа в BASIC 2000F используется
«+», «—» или «#». Помещается такой символ сразу после сло-
ва IMAGE и отделяется от последующего списка форматов
запятой.
109
Срабатывает управляющий символ после редактирования всех выво-
димых данных из списка оператора PRINT USING. Символ «+»
запрещает перевод строки. Это означает, что при выполнении очеред-
ного оператора печати произойдет наложение нового текста на ста-
рый. Символ «—» запрещает возврат каретки. Таким образом, после-
дующая печать будет продолжена с прерванной позиции, но уже в
следующей строке (печать «лесенкой»). Символ «#» запрещает оба
перемещения, что приведет к продолжению печати в той же строке
с прерванного места.
Если управляющий символ в операторе IMAGE отсутствует, то
после выполнения очередного оператора PRINT USING новая печать
будет произведена с начала следующей строки.
Глава 6. РАБОТА С ФАЙЛАМИ
Термин файл (file), перекочевавший в информатику из сферы де-
лопроизводства, дословно означает картотеку — ящик с однородными
документами. В качестве таких документов могут выступать библио-
графические карточки, листки по учету кадров, трудовые книжки,
входящие и исходящие письма, и т. п. Основной характеристикой
документа является его «неделимость», а именно: из ящика-файла
нельзя вынуть пол-письма, обложку от трудовой книжки, часть све-
дений, касающихся образования сотрудника, и т. п. Документ можно
извлечь только целиком.
Работа с файлом осуществляется с помощью весьма ограничен-
ного числа процедур. Сначала необходимо найти нужный ящик и
выдвинуть его. Эту операцию обычно связывают со словом «открыть».
Затем мы производим поиск и достаем интересующий нас документ,
т. е. «читаем» затребованную неделимую порцию данных. Следующий
шаг связан с содержательным изучением информации, расположенной
в соответствующих разделах документа. Последняя процедура из-за
разнобоя в структуре документов не относится к числу стандартных,
и ее реализация возлагается на пользователя.
Включение нового документа в файл соответствует процедуре
«записи» поступившей порции данных.
По окончанию работы с очередным файлом мы ставим ящик
на свое место или, как говорят, «закрываем» доступ к его ин-
формации.
В вычислительной технике функции файлов выполняют различ-
ные устройства, которые могут быть использованы в качестве носи-
теля информации. Это — внешние запоминающие устройства (магнит-
ные ленты, диски), дисплеи, алфавитно-цифровые печатающие
устройства, графопостроители, каналы связи и т. п. Некоторые из
них обеспечивают только односторонний обмен информацией. На
АЦПУ, например, можно только выводить информацию, с клавиатуры
дисплея — только прочитать ее. На одних физических устройствах
можно расположить несколько разных файлов, на других — только
один. Например, АЦПУ в данный момент времени может представ-
лять единственный файл. На магнитной ленте может находиться не-
сколько разных файлов, но в текущий момент времени из них может
111
быть открыт только один. В отличие от этого дисковые накопи-
тели обеспечивают доступ к нескольким одновременно открытым
файлам.
Для того чтобы различать файлы, каждому из них присваивается
индивидуальное обозначение—спецификация. Большинство современ-
ных компьютерных систем используют в качестве спецификации со-
ставное имя вида:
«имя устройства: имя файла»
Для тех устройств, на которых может быть расположен единствен-
ный файл, роль спецификации выполняет только имя устройства.
Например, на IBM PC при выводе на АЦПУ можно воспользоваться
одним из имен "LPT1:", "LPT2:" или "LPT3:". Спецификация файлов,
расположенных на магнитной ленте, может иметь вид: "CAS1:PROGA",
"CAS1 :FILE2", ...
Чтобы упростить процедуры обмена с файлами и не заставлять
пользователя каждый раз указывать достаточно длинную специфика-
цию, последнюю заменяют цифровым номером—z^l, #2, ... Соот-
ветствие между постоянной спецификацией и временно действующим
программным номером файла устанавливается пользователем в мо-
мент открытия файла. Закрыв файл "CAS1:FILE2", выступавший под
номером 4£3, мы можем в последующем открыть другой файл и свя-
зать его с тем же самым номером 4£3.
Порции данных, эквивалентные выше упомянутым документам и
составляющие содержимое файла, в вычислительной технике носят
название «записей» (RECORD). Для их хранения на внешнем носи-
теле бейсик предусматривает различные способы. Первый из них на-
поминает способ представления данных в теле оператора DATA.
При этом каждое числовое значение переводится в подходящий сим-
вольный формат подобно тому, как это делает оператор PRINT, а
два соседних числовых значения разделяются запятой. Каждое тек-
стовое значение, включаемое в запись, обрамляется кавычками и
также отделяется друг от друга запятой. В конце записи может быть
помещен специальный управляющий символ.
Второй способ связан с жестким распределением записи на фик-
сированные поля. Например, первые шесть байтов предназначены для
хранения целого числа, следующие восемь — для символьной инфор-
мации, в байтах с 15-го по 23-й хранится вещественное число с дву-
мя дробными 'разрядами и т. п. Все это напоминает форматное опи-
сание строки при использовании оператора PRINT USING.
Третий способ позволяет хранить числовые и символьные данные
на внешнем запоминающем устройстве в том же самом формате, как
они представлены в оперативной памяти. Этот способ наиболее эко-
номичен с точки зрения объема используемой памяти и затрат ма-
шинного времени на выполнение процедур обмена.
112
Возможны и другие варианты формирования записей, но пере-
численные выше являются наиболее распространенными.
По характеру доступа к записям, обеспечиваемым возможностями
внешнего устройства, различают файлы с последовательной и прямой
организацией. В последовательном файле документы —записи можно
перебирать («читать» или «писать») только в одном направлении —
от начала картотеки к ее концу. Так, например, работают магнит-
ные ленты, алфавитно-цифровые печатающие устройства, каналы
связи. В файлах с прямым доступом (иногда в литературе встреча-
ется эквивалентный термин «случайный» доступ) пользователь имеет
возможность обратиться к нужному документу, указав его номер.
Такие файлы могут быть организованы на магнитных дисках.
Существует еще одна важная характеристика файла, связанная
с направлением обмена. Из одних файлов информацию можно только
читать. Это —так называемые вводные файлы. В другие файлы можно
только писать, и поэтому их называют выводными. Выводные файлы
на некоторых устройствах могут быть использованы впоследствии
как источники данных для новых расчетов. В некоторых системах
допускается использование одного и того же файла одновременно и
для чтения, и для записи. Однако во избежание порчи уже сущест-
вующих данных в таких файлах предусматриваются средства за-
щиты— вводятся специальные операторы перезаписи, ведется конт-
роль за наложением информации и т. п.
6.1. Основные приемы работы с последовательными
файлами
Наиболее естественный набор процедур для работы с файлами
последовательного доступа предлагают системы программирования
на современных ПЭВМ. Мы продемонстрируем их возможности на
примере IBM PC, С аналогичными операторами пользователь может
встретиться и на ряде других персональных компьютеров, эксплуа-
тирующих программное обеспечение фирмы Microsoft или его моди-
фикации.
Список служебных имен, используемых для обозначения внешних
устройств IBM PC, приведен в табл. 6.1.
Готовность к работе для некоторых файлов (KYBD, SCRN, LPT1)
обеспечивается системой, другие должны быть открыты по указанию
программиста. Файл на IBM PC открывается с помощью следующего
оператора:
OPEN "СФ" FOR
(INPUT )
4 OUTPUT 1
(.append;
AS # n
Здесь СФ —спецификация файла, 4фп—его программный номер, ко-
113
торый в дальнейшем будет использоваться в операторах обмена. Па-
раметр FOR INPUT означает, что открываемый файл будет исполь-
зоваться только для ввода, а параметр FOR OUTPUT является при-
знаком выводного .файла. Если мы собираемся открыть файл, пред-
назначенный для дозаписи новых данных в хвост к уже существую-
щим, то используется параметр FOR APPEND.. Процедура открытия
вводного или выводного файла производит начальные установки, обес-
печивающие пользователю доступ к самой первой записи.
Таблица 6.1
Обозначение Назначение устройства
А В CAS1 СОМ1 COM2 KYBD LPT1 LPT2 LPT3 SCRN Первый накопитель на гибком диске (ввод-вывод) Второй накопитель на гибком диске Накопитель на магнитной ленте (ввод-вывод) Первый асинхронный адаптер (канал связи, ввод- вывод) Второй асинхронный адаптер Клавиатура терминала (только для ввода) Алфавитно-цифровое печатающее устройство (только для вывода) Дополнительное АЦПУ № 2 Дополнительное АЦПУ № 3 Экран терминала (только для вывода)
Выборка данных из очередной записи вводного файла осуществ-
ляется с помощью операторов INPUT или LINE INPUT
100 INPUT #5, А, В$, С
105 LINE INPUT #2, V$
Считываемая запись рассматривается как длинная строка, в ко-
торой могут находиться либо только текстовые данные (LINE
INPUT 4f:), либо перемежающиеся числовые и текстовые значения
(INPUT 4t)- В качестве разделителей числовых данных воспринима-
ются запятые, пробелы и управляющие символы LF (Line Feed — пе-
ревод строки) или CR (Carriage Return—возврат каретки). При чтении
текстового данного по оператору INPUT # первым значащим счита-
ется символ, отличный от разделителя. Если таковым окажется ка-
вычка, то извлекаются все символы до следующей кавычки.
Если количество данных в считываемой записи превышает число
переменных в списке оператора INPUT то неиспользованная ин-
формация пропадает. Противоположная ситуация — число данных мень-
ше количества переменных—рассматривается как программная ошибка.
114
Передача очередной порции данных в выводной файл произво-
дится с помощью одного из следующих операторов:
PRINT #п, список выражений
PRINT 4фп USING формат, список выражений
WRITE zftzn, список выражений
Запись, которая формируется в процессе выполнения указанных
сператоров, представляет собой строку символов, содержащую значе-
ния выводимых выражений. Правила формирования этой строки мало
чем отличаются от выводных строк, которые мы наблюдаем на экране
дисплея в результате выполнения операторов PRINT или PRINT
USING.
Оператор WRITE # формирует выводную запись по тем же
правилам, что и оператор PRINT Но он не делает лишних про-
белов между соседними значениями, которые бы возникали под влия-
нием разделителей выводного списка (запятые, точки с запятыми,
TAB). Вместо этого после каждого числового значения в выводимую
запись автоматически включается запятая, а каждое символьное зна-
чение окаймляется кавычками.
Закрывается файл с помощью оператора CLOSE. Один такой
оператор может прекратить доступ к нескольким файлам:
180 CLOSE #5, #3, #7
Работа с наиболее употребительными файлами последовательного
доступа не требует открытия или закрытия соответствующего файла.
Такие процедуры выполняются системой автоматически в момент пер-
вого обращения к файлу или в момент завершения задачи. Не тре-
буется для таких файлов и указывать их программный номер. Так,
например, для вывода на экран дисплея IBM PC в текстовом режиме
(файл "SCRN") используются следующие-операторы:
PRINT список выражений
PRINT USING формат, список выражений
WRITE список выражений
А выдача на АЦПУ (файл "LPT1:") обеспечивается с помощью опе-
раторов LPRINT или LPRINT USING.
В распоряжении пользователя, работающего с файлами последо-
вательного доступа, имеются две стандартные функции — LOC (в)
и EOF (в). С помощью первой он может установить порядковый номер
текущей записи. Вторая функция позволяет обойти ситуацию исчер-
пания данных в файле. Она принимает значение—1 (логическая
«истина»), если вместо очередной порции данных считан признак
конца файла (end-of-file). Этот признак заносится в выводной файл
автоматически в момент его закрытия.
115
6.2. Организация обмена с файлами прямого доступа
Файлы прямого доступа на IBM PC могут быть расположены
только на магнитных дисках. Открывают их с помощью модификации
оператора OPEN:
f"O"A
OPEN -I "I" [ , [#] и, "СФ" [, 1]
l"R"J
Первый символ в теле оператора OPEN определяет направление
обмена с файлом: I—-для ввода, О—для вывода, R—для файла,
допускающего одновременно операции чтения и записи. Символ #
перед номером файла может опускаться, так как основные операторы
обмена с файлами прямого доступа отличаются от соответствующих
операторов, описанных в предыдущем разделе.
Параметр "СФ" по-прежнему обозначаег спецификацию файла.
Последний необязательный параметр 1 позволяет задать длину запи-
си, отличную от установленной в системе (128 байт). Выбор нестандарт-
ной длины записи может сократить общий объем внешней памяти,
резервируемой под конкретный файл, или сделать возможной работу
с очень длинными документами.
С каждым открытым файлом прямого доступа связывается буфер,
расположенный в оперативной памяти и предназначенный для вре-
менного хранения обрабатываемой записи. Описывается этот буфер с
помощью оператора FIELD (поле):
FIELD [#] n, к AS V1$ [, la AS v2$ ...]
Через vi$, v2$, ... обозначены последовательные поля буфера, рас-
сматриваемые как символьные переменные с фиксированными дли-
нами И, 12, ... Суммарная длина полей должна соответствовать раз-
меру документа-записи, установленному при выполнении оператора
OPEN.
Обмен с файлом прямого доступа выполняется в два этапа. При
считывании указанная или очередная запись передается из дисковой
памяти в область буфера:
GET (4У п [, номер записи]
Затем содержимое описанных полей vj$, v2$, ... может использо-
ваться в программе как значения обычных текстовых переменных.
Перед выводом записи в файл содержимое полей буфера форми-
руется с помощью операторов LSET и RSET:
LSET Vi$ = х$
RSET v2$ = у$
Первый из этих операторов перемещает символьные данные на соот-
116
ветствующее поле буфера с прижимом влево (LSET), а второй — с
прижимом данных вправо (RSET).
Сформированная таким образом запись выводится на диск с по-
мощью оператора PUT (положить):
PUT [4ф] п [, номер записи]
Естественно возникает вопрос о средствах содержательной обра.
ботки полей документа, в которых может быть расположена числовая
информация. Ведь мы не имеем права присваивать значения арифме-
тических выражений текстовым переменным, имитирующим соответст-
вующее поле документа. Вариантов здесь может быть два. Во-первых
мы можем преобразовать числовое значение в символьное или наобо-
рот с помощью стандартных функций STR$ и VAL:
STR$ (3.14) = "3.14"
VAL ("3.14") = 3.14
Операцию по преобразованию можно совместить с записью или
чтением соответствующего числового данного:
100 LSET AS = STR$ (PI * R Л 2)
200 S = VAL (A$)
Другой способ, более экономичный как по времени, так и по
объему внешней памяти, связан с переобозначением данных, пред-
ставленных в машинном формате. На использовании стандартных
функций типа CVI, CVS, CVD, MKI$, MKS$ и MKD$ для этих це-
лей мы уже достаточно подробно останавливались в разделе 4.6.
6.3. Работа с виртуальными массивами на ЭВМ
типа ДВК, СМ-3, СМ-4
Виртуальный массив представляет собой разновидность файла
прямого доступа. Размещается он в дисковой памяти, где для него
выделяется необходимый участок в соответствии с объявленными в
операторе DIM параметрами. Например:
10 DIM #2, AQ (20) = 80
В одном операторе DIM^t может быть объявлен только один вирту-
альный массив любого типа.
Файлу с объявленным программным номером затем следует при-
своить инвентарное имя, которое понадобится операционной системе.
Эта процедура совмещается с открытием файла:
20 OPEN "DX1 : МАС1" FOR OUTPUT AS FILE #2
Специальных операторов обращения к элементам виртуальных
массивов не существует. Их имена используются в программе так
же, как и имена элементов внутренних массивов.
Глава 7. МАТРИЧНЫЕ ОПЕРАЦИИ
Матричное исчисление играет большую роль в решении ряда
прикладных задач. На нем базируется, например, такой крупный
раздел, как теория колебаний в электрических, акустических и меха-
нических системах, где фундаментельное значение имеют характери-
стические уравнения, собственные значения й собственные векторы.
К задачам линейной алгебры сводятся многочисленные алгоритмы
обработки экспериментальных данных, минимизации линейных форм,
различные задачи теории прочности, упругости и пластичности. Мат-
ричное исчисление положено в основу, математического аппарата
квантовой и статической механики, квантовой физики, химии, радио-
электроники. Одно из первых направлений в квантовой механике,
заложенное Гейзенбергом, даже носило название матричной механики.
Численные методы линейной алгебры представляют сегодня один
из наиболее развитых разделов вычислительной математики. Прове-
дены серьезные исследования точности и устойчивости различных
алгоритмов, разработаны хорошие пакеты программ для решения
задач линейной алгебры (LINPAC, EISPAC, BLISS и др.). Неодно-
кратно предпринимались попытки включения процедур обработки
векторов и матриц в состав алгоритмических языков высокого уров-
ня, ориентированных на расчеты научно-технического характера.
Одной из первых работ в этом направлении является создание вход-
ного языка системы автоматизации программирования альфа, разра-
ботанной в период с 1959 по 1964 гг. под руководством академика
А. П. Ершова. В значительной мере матричным операциям обязан
своей популярностью язык АПЛ. Элементы матричного исчисления
присущи и таким универсальным алгоритмическим языкам, как ПЛ/L
и алгол-68.
Первые четыре матричные операции в составе Дартмутской вер-
сии бейсика появились в октябре 1964 г. (вторая редакция). Третья
редакция (1966 г.) уже включала 11 матричных функций. Наконец,
в четвертой редакции были добавлены еще два оператора, завершив-
шие базовый набор матричных процедур (см. талб. 7.1).
Из табл. 7.1 видно, что все матричные операторы начинаются со
служебного слова МАТ (от matrix—матрица). Необходимость в такой
добавке вызвана тем, что бейсик разрешает в пределах одной про-
граммы работать и с массивом А, и с простой переменной А. Так
118
Таблица 7.1
Формат оператора Выполняемая функция
MAT READ А, В, С, ... MAT INPUT А, В, С, ... MAT A = CON MAT A = ZER MAT A = IDN МАТ А = В МАТ А = В + С МАТ А = В —С МАТ А = В * С МАТ А = (е) * В MAT A = TRN(B) MAT A = INV (В) MAT PRINT А, В; С Присвоение элементам массива зна- чений из блока данных Ввод значений элементов массива с терминала Роспись массива единицами Очистка массива (роспись нулями) Формирование единичной матрицы Матричное присваивание Сложение матриц (векторов) Вычитание матриц (векторов) Умножение матриц Умножение матрицы (вектора) на скаляр Транспонирование матрицы Обращение матрицы Печать элементов массива
что новое служебное слово позволяет отличить имя массива, употреб-
ленное без индексного выражения, от простой переменной с идентич-
ным именем.
Что дает введение специального матричного оператора? Во-пер-
вых, сокращение объема программы. Ведь несмотря на сравнительную
простоту алгебраических и специальных операций над векторами и
матрицами, реализация большинства из них требует порядка пяти
обычных операторов. А для обращения матрицы потребуется доста-
точно серьезная программа, содержащая несколько десятков опера-
торов. Во-вторых, матричные операторы обеспечивают более высокое
быстродействие за счет сокращения накладных расходов, возникающих
при переходе с оператора на оператор и особенно больших при орга-
низации циклов.
7.1. Специфика базовых операторов
Все массивы, участвующие в матричных операторах, должны быть
объявлены по оператору DIM. Это связано с тем, что только по имени
массива невозможно отличить одномерный массив от двумерного. И,
стало быть, нельзя применить стандартные соглашения бейсика по
отношению к неописанным (необъявленным) массивам.
7.1.1. Формирование стандартных значений. Для формирования
стандартных значений элементов массива существует три возможно-
сти— «очистить» массив, т. е. присвоить всем его элементам нулевые
значения, «расписать» массив единицами или сформировать единич-
119
ную матрицу, в которой на главной диагонали расположены единицы,
а всем остальным элементам присвоены нулевые значения.
Рассмотрим особенности использования этих операторов на конк-
ретном примере:
10 DIM А (30), В (9, 4)
20 MAT A = ZER
30 MAT B-ZER
150 MAT A = CON (20)
160 MAT B = CON (5,5)
220 MAT B=IDN
360 MAT B = IDN(6,6)
Предположим, что последовательность выполнения матричных опера-
торов в приведенном примере не нарушается операторами перехода.
Тогда после выполнения 20-го оператора все тридцать элементов мас-
сива А примут нулевые значения. Эквивалентное действие могло быть
выполнено и с помощью обычных операторов:
20 FOR К=1 ТО 30
21 LET А(К) = 0
22 NEXT К
Оператор с меткой 30 заносит нулевые значения во все 30 элементов
двумерного массива В.
Аналогичное действие можно было бы выполнить уже пятью обыч-
ными операторами:
30 FOR J=1 ТО 9
31 FOR К=1 ТО 4
32 LET В (J, К) = 0
33 NEXT К
34 NEXT J
Матричные операторы ZER, CON и IDN позволяют динамически
переопределять границы индексных выражений. При этом требуется
соблюдение двух условий. Во-первых, объем памяти после переопре-
деления массива не должен превысить объем, выделенный данному
массиву изначально в соответствии с его описанием по оператору
DIM. Во-вторых, не должно измениться количество индексов после
переопределения границ. Это означает, что вектор не может превра-
титься в матрицу, а матрица—в вектор.
Техника переопределения размера массива демонстрируется в
операторах 150, 160 и 360. После выполнения 150-го оператора мас-
сив А будет рассматриваться как вектор с 20-ю компонентами, каж-
120
дая из которых принимает единичное значение. Неиспользованный
участок памяти, выделенный массиву А при изначальном определе-
нии, от массива А не отторгается и может быть использован при по-
следующих переопределениях длины массива. Матрица В после вы-
полнения оператора 160 будет выступать как квадратная матрица,
содержащая 5 строк и 5 столбцов с единичными компонентами. По-
этому после действия оператора с меткой 220 на месте массива В
окажется единичная матрица размером 5x5. Это не помешает распо-
ложить на месте массива В единичную матрицу размером 6x6. Однако
попытка выполнить оператор МАТ В = IDN (7,7) была бы расценена
как ошибочная ситуация из-за превышения первоначально выделен-
ного объема памяти.
В каких ситуациях переопределение размерности массива может
оказаться необходимым? Для ответа на этот вопрос надо вспомнить,
как размещаются в памяти ЭВМ элементы двумерных массивов. В
большинстве реализаций бейсика принято располагать массивы по
строкам.
Предположим, например, что мы имеем дело с матрицей С (3x4)
и что под каждый элемент отводится одно слово оперативной памяти.
Тогда элемент С (2,2) располагается в шестом слове относительно
начала массива С, если индексация ведется от единицы. Если бы
массив С имел другую размерность, например, 5x8, то тот же эле-
мент С (2,2) находился бы уже в десятом слове от начала массива.
Таким образом, в двумерном массиве расположение элемента С (I, J)
зависит от максимальной границы второго индекса, и адрес с/у вы-
числяется в ЭВМ по формуле:
адрес (Cij) = адрес (cn) + (i — 1) * jmax + (j — 0
Предположим далее, что мы написали подпрограмму, связанную
с обработкой матрицы С, и хотим использовать ее, засылая на место
С массивы разных размерностей. Без переопределения границ С из
этого ничего хорошего может не получиться. Например, на месте
матрицы С (5x8) нельзя разместить элементы массива А(ЗХ10), ис-
пользуя для пересылки естественный оператор присваивания (С (I, J)=
= A (I, J)). И если даже мы сумеем перенести значения элементов
ац на место массива С, то бейсик выдает сообщение об ошибке при
попытке извлечь, например, элемент С (1, 9). Для одномерных масси-
вов проблем подобного рода не возникает, так как i-й элемент лю-
бого вектора всегда расположен в i-м слове относительно начала
массива.
7.1.2. Формирование произвольных значений. Оператор МАТ
предлагает два способа для формирования массива с произвольными
значениями его элементов. Первый способ использует блок данных,
из которого наперед заданные числовые величины извлекаются с по-
мощью оператора MAT READ,
121
Пусть, например, нам требуется сформировать матрицу D сле-
дующего вида:
—1
—2,5
49
О 0,85 4,5
8 1,2 0,4
3 54 0,05
Один из возможных вариантов программы приведен ниже:
10 DIM D (3, 4)
20 DATA — 1, 0, 0.85, 4.5
30 DATA —2.5, 8, 1.2, 0.4
40 DATA 49, 3, 54, 0.05
50 MAT READ D
Числовые данные поместились бы и в одном операторе DATA, но
предлагаемый вариант отличается большей наглядностью.
В теле оператора MAT READ могут располагаться несколько
массивов. При этом сначала «обслуживаются» все элементы массива,
указанного в списке первым, затем числовые значения присваиваются
элементам второго массива из списка и т. д.
Пусть, например, массивы А, В и С имеют соответственно раз-
мерности 24, 4x15 и 3x20. Тогда действие одного матричного опе-
ратора MAT READ А, В, С эквивалентно выполнению следующей
группы обычных операторов:
10 FOR К=1 ТО 24
20 READ А (К)
30 NEXT К
40 FOR J = 1 ТО 4
50 FOR К=1 ТО 15
60 READ В (J, К)
70 NEXT К
80 NEXT J
90 FOR К=1 ТО 3
100 FOR J = 1 ТО 20
ПО READ C(K,J)
120 NEXT J
130 NEXT К
Второй способ формирования массива использует ввод значений
его элементов с терминала по оператору MAT INPUT. Например:
10 DIM D(3, 4)
20 MAT INPUT D
RUN
? —1, 0, .85, 4.5, —2,5, 8, 1.2, .4, 49, 3, 54, .05
122
Набор данных для двумерных массивов после поступления за-
проса из ЭВМ должен производиться по строкам. Одной наборной
строки для ввода значений элементов большого массива может не
хватить. Поэтому машина будет требовать от пользователя продол-
жения ввода до тех пор, пока он не наберет необходимое количество
данных. Например:
10 DIM D(3, 4)
20 MAT INPUT D
RUN
? —1, 0, .85, 4.5 jCRj
? —2.5, 8, 1.2, 0.4 jCRj
? 49, 3, 54, .05 jCR|
В некоторых реализациях фирмы Honeywell предусмотрена воз-
можность досрочного прекращения ввода массива по инициативе поль-
зователя. Сигналом к этому является нажатие клавиши & вместо
набора очередного значения. В результате предшествующие данные
заполняют начало массива, а оставшиеся элементы заменяются нулями.
Список ввода в операторе MAT INPUT может содержать не-
сколько массивов. Однако пользоваться этим оператором для ввода
большого количества данных не следует. Дело в том, что процедура
набора числовой информации в таком режиме достаточно утомительна,
а исправить ошибку в данных после завершения набора не всегда
возможно.
В большинстве' версий бейсика, включающих матричные операции,
пользователю предоставляется возможность переопределять размеры
массивов в операторах MAT READ и MAT INPUT. Например:
10 DIM А (12, 6), В (40)
80 MAT READ А (8, 8)
120 MAT INPUT А, В (15)
При этом действуют те же ограничения, о которых шла речь в пре-
дыдущем разделе.
7.1.3. Арифметические операции над массивами. В составе этой
группы базовый набор насчитывает пять матричных процедур —
матричное присваивание, покомпонентное сложение или вычитание
массивов, умножение элементов массива на скаляр и умножение
матриц.
Первые четыре из них могут выполняться как над векторами,
так и над матрицами при условии, что размерности результирующего
массива и массивов-операндов полностью совпадают.
123
Умножение матриц выполняется в соответствии с общепринятыми
правилами линейной алгебры. Однако матричные операторы вида
МАТ А —А*В или МАТ А = В*А считаются в большинстве реализа-
ций запрещенными. Смысл этого ограничения нетрудно понять. Как
только будет подсчитан первый же элемент произведения 2
k
то он заменит прежнее значение ап, и все последующие вычисления
окажутся неверными. Для сохранения старых значений операнда А
в такой ситуации пришлось бы отвести дополнительный массив для
временного хранения получаемых результатов. После завершения про-
цедуры умножения все значения из этого массива надо было бы пе-
реслать на место матрицы А. Однако перемножать приходится матри-
цы разных размерностей, поэтому выделение дополнительного массива
с переменными границами организовать довольно сложно. Гораздо
проще переложить эти проблемы на пользователя, которому ничего
не стоит обойти указанный запрет с помощью двух матричных опе-
раторов:
МАТ С = А*В
МАТ А = С .
В некоторых реализациях бейсика оператор умножения на скаляр
имеет формат, несколько отличающийся от общепринятого. Так, на-
пример, в системах BASIC-222 и Бейсик-EC скалярный множитель
записывается на месте второго операнда:
100 MAT F = A*(1.5 —X)
Система BASIC-6 позволяет опускать круглые скобки, если мно-
жителем является не выражение, а число:
100 MAT F=1.5hA
Следует отметить и еще одну особенность, связанную с выполне-
нием матричного умножения в системе ДОС-РВ для ЭВМ М-7000.
Здесь одномерные массивы могут выступать в качестве двумерных
с единичным индексом на первом или втором месте. Это очень удобно,
так как в линейной алгебре широко используются такие понятия, как
вектор-строка (X(l, N)) или вектор-столбец (B(N,1)).
7.1.4. Транспонирование и обращение матриц. Транспонирование
матрицы равносильно ее повороту на 180° вокруг главной диагонали.
При этом строки и столбцы матрицы меняются местами. Операция
транспонирования может выполняться и над прямоугольной матри-
цей В размерности NxM при условии, что результирующий массив
имеет размерность MxN. Действие оператора MAT A = TRN(B) экви-
валентно выполнению следующего фрагмента:
100 FOR J = 1 ТО N
ПО FOR К=1 ТО М
120 LET- A(K,J) = B(J,K)
124
130 NEXT К
140 NEXT J
Оператор MAT A=INV(B) имеет смысл только для квадратной
неособенной матрицы В. Он вычисляет элементы обратной матрицы В”1
и засылает их в соответствующие позиции массива А. Обращение
матрицы —одна из важнейших процедур линейной алгебры. Напри-
мер, для нахождения решения системы уравнений Ах = Ь достаточно
умножить обратную матрицу А”1 на вектор-столбец правых частей.
Вычисление обратных матриц используется при нахождении собствен-
ных векторов, при различных матричных преобразованиях.
В некоторых системах (BASIC-222, Бейсик-ЕС) принято помещать
обратную матрицу на место исходной. При этом соответствующий
матричный оператор записывается без аргумента—MAT A = INV.
В других версиях операция MAT A=INV(A) считается запрещенной.
Ограничения эти носят чисто технический характер, так как опреде-
ляются выбранным алгоритмом обращения и его реализацией в ЭВМ.
Вычисление обратной матрицы возможно при условии, что опре-
делитель исходной матрицы отличен от нуля. Поэтому в некоторых
модификациях бейсика в процессе обращения матрицы вычисляется
и ее определитель, значение которого тем или иным способом стано-
вится доступно пользователю. Так, в системах BASIC-6 и Бейсик-
плюс величина определителя присваивается системной переменной
с именем DET. Версия Бейсика для ЭВМ Wang 2200 предусматри-
вает следующую модификацию оператора INV:
100 MAT A = INV(B), D
После выполнения оператора переменной D присваивается значение
определителя det (В).
7.1.5. Матричная печать. Список оператора MAT PRINT вклю-
чает имена массивов, значения элементов которых должны быть вы-
даны на терминал. Разделитель, использованный в списке после имени
массива, определяет характер печати элементов данного массива. Зон-
ной печати соответствует употребление в выводном списке запятой
после имени массива или отсутствие знака препинания в конце спи-
ска. Для организации плотной печати после имени массива необхо-
димо набрать точку с запятой. Это можно сделать даже в том случае,
когда массив указан в выводном списке последним.
Значения элементов очередного массиву начинают печататься
с новой строки. Как правило, вывод с новой строки на терминале
начинается и при переходе к печати следующей строки двумерного
массива. Подобно оператору MAT READ оператор матричной печати
заменяет работу довольно громоздкой программы. Если, например,
массивы А, В и С имеют соответственно размерности'20, 3x15 и 12,
то действие оператора
100 MAT PRINT В; А, С
125
эквивалентно работе следующего фрагмента:
100 PRINT
НО FOR J = 1 ТО 3
120 PRINT
130 FOR К=1 ТО 15
140 PRINT B(J, К);
150 NEXT К
160 NEXT J
170 PRINT
180 FOR K=1 TO 20
190 PRINT A(K),
200 NEXT К
210 PRINT
220 FOR K=1 TO 12
230 PRINT C(K),
240 NEXT К
Пустые операторы PRINT (100, 120, 170, 210) включены в эквива-
лентную программу для того, чтобы каждый новый массив или строка
двумерного массива начинали печататься с новой строки. Если бы их
не было, то и без того малопривлекательная печать массивов потеряла
бы всякую наглядность, так как было бы трудно отделить элементы
одной матрицы от другой.
Развитие функций оператора MAT PRINT в основном связано
с использованием средств форматной печати. Так, уже в системе
BASIC-6 появилась возможность регулировать длину поля, отводи-
мую под каждый элемент массива:
100 MAT PRINT А[4], С[8]
Число, указанное в квадратных скобках после имени массива, задает
количество позиций, выделяемых под значение каждого элемента дан-
ного массива.
Гораздо более гибкие средства предоставляются пользователям
систем BASIC-222 и Бейсик-EC, в которых имеется дополнительное
управление форматом печати. Например:
НО PRINT FMT (16)
120 MAT PRINT А, В; C:D
При этом все элементы массивов А, В, С и D будут печататься как
целые числа, занимающие по 6 позиций. Однако каждый элемент
массивов А и D будет располагаться с начала очередной зоны.
Печать очередного элемента массива В будет заканчиваться одним
дополнительным пробелом, его вызывает точка с запятой. Соседние
шести разрядные поля, выделяемые для элементов массива С, смы-
каются вплотную, так как двоеточие в системе бейсик-ЕС дополни-
тельного пробела не вызывает.
126
Система бейсик-ЕС позволяет выдать не только весь массив цели-
ком, но и любой его фрагмент, указанный начальным и конечным
значением индексного выражения. Например:
150 MAT PRINT А(5:12), С(1:8, 3:6)
Это дает, во-первых, возможность в более естественном виде просмот-
реть на экране дисплея нужный фрагмент матрицы, вырезанной с по-
мощью соответствующего «окна». Во-вторых, при выводе на печатаю-
щее устройство можно организовать выдачу фрагментов больших матриц
с их последующей склейкой.
В других системах (Дисп-ЕС, HP2000F) оператор матричной пе-
чати используется в модификации MAT PRINT USING. Первый эле-
мент в списке такого оператора обычно содержит ссылку на строку
с описанием форматов печати. Например:
100 MAT PRINT USING 205, А, В, С
205 : +#####
При этом все элементы массивов А, В и С печатаются как целые числа
по формату 16. После вывода очередного массива пропускается две
строки. Описание формата может содержать и несколько разных ука-
зателей. Тогда смежные элементы в строке будут напечатаны по-
разному. Для иллюстрации мы слегка модернизируем пример, заимст-
вованный из [15.3.3]:
10 DIM А(3,3), В(3,3)
20:####и##.##Ш##. ##!!!!
30 MAT A = IDN
40 МАТ В = (—0.01)*А
50 MAT PRINT USING 20, А, В
RUN
LJLJLJ 1 LJl—jO. OOljljO . 00E + 00
ljljljOljlj 1. OOljljO. 00E+00
ljljljOljljO.OOljlj 1.00E + 00
LJ
LJ
ljljljOljljO. OOljljO. 00E + 00
ljljljOlj—0.01 ljljO.OOE + 00
ljljljOljljO. OOlj — 1.00E—02
§ 7.2. Приложение матричных операторов
к расчету электрических цепей
7.2.1. Анализ электрических сетей переменного тока. Обозначим
через /1, /2, •••» hi комплексные значения контурных токов, а через
V2, ...» Vn — комплексные значения напряжений в соответствую-
127
щях контурах сети. В установившемся состоянии токи и напряжения
связаны системой линейных алгебраических уравнений:
Zn/i + Zi2/2 4" • • • —
Z21Z1 + Z22Z2+• ♦.+Z2nZn = V2, (7 1)
^п1Л+^п2/2+ ... -\-ZnnIп — Vп.
Коэффициентами этой системы являются комплексные числа Z/y
икпедансов контуров. Значения Zu определяются собственным импе-
дансом /-го контура, значения Z/y (i j) — взаимными импедансами
i-то и /-го контуров.
Если через Z обозначить матрицу импедансов размерности пХп,
через / — вектор-строку контурных токов размерности 1Хи, а через
V—вектор-столбец контурных напряжений размерности иХ1, то си-
стему (7.1) можно записать в матричной форме:
Zx/ = V. (7.2)
Основная задача анализа электрической сети состоит в вычисле-
нии контурных токов по заданным напряжениям. Формально решение
этой задачи можно получить, умножив обе части равенства (7.2) на
обратную матрицу Z~x:
(7.3)
В связи с тем, что элементы всех наших массивов являются комп-
лексными числами, формулой (7.3) для составления программы не-
посредственно воспользоваться нельзя. Поэтому мы выделим в каждом
массиве действительную и мнимую части:
I
v =u+iwt
z =/? + /*,
Z-i = G+/B.
В принятых обозначениях массив R носит название матрицы
сопротивлений, массив X— матрицы реактивных сопротивлений, мас-
сив G — матрицы проводимостей, массив В — матрицы реактивных про-
водимостей. Для нахождения элементов матрицы адмитанса (Z-1)
воспользуемся тем, что произведение прямой и обратной матриц дает
единичную матрицу Е:
E = ZxZ-i=(RxG — XxB)+j (RXB + XXG).
Приравнивая действительные и мнимые части этого равенства, мы
получим систему матричных уравнений относительно неизвестных
G и Б:
RxG-XxB = E,
RxB + XxG = O.
128
Через О обозначена нулевая матрица размерности лХл. Решение
системы (7.4) можно записать в виде:
О = (/?+Хх/?-1ХХ)-Ч В = — R-'xXxG v '
или В = -(Х + /?хХ-1Х/?)-\ ,7fi. G=—X~1XRXB. у,0)
Выбор формул (7.5) или (7.6) в конкретной задаче решается в за-
висимости от специфики сети. Например, для LC-цепей матрица со-
противлений R содержит только нулевые элементы. Поэтому для нее
не существует обратной матрицы R~*t и формулами (7.5) нельзя будет
воспользоваться.
Фрагмент программы, реализующий вычисление матрицы адми-
танса по формулам (7.6), выглядит следующим образом:
100 МАТ А = Х
ПО MAT A=INV
120 MAT S = A*R
130 MAT B = R*S
140 МАТ В = Х4-В
150 MAT B = INV
160 MAT G=S*B
170 МАТ В = В*(—1)
Введение дополнительных матриц А и S, используемых для хра-
нения промежуточных результатов, объясняется отчасти и спецификой
матричных операций. Например, обращая матрицу с помощью опера-
тора INV, мы одновременно теряем *) исходную матрицу, так как
результат помещается на то же самое место в памяти ЭВМ. Точно
так же мы не можем воспользоваться оператором вида MAT S = S*B,
потому что память, отведенная под сомножитель S, начнет забиваться
элементами произведения, и общий результат окажется неверным.
Подставляя найденные матрицы проводимостей в уравнение (7.3),
мы получим окончательные выражения для вещественного и мнимого
компонентов вектора контурных токов:
Re (1) = J = G*U—B*W,
Im (I) == K = B*U+G*W.
Реализация этих вычислений особого труда не составляет:
180 MAT J = G*U
190 MAT T = B*W
*) Это соображение справедливо для систем BASIC-222 и
Вейсик-ЕС. В других системах обращение не портит исходную матрицу.
5 Ю. Л. Кетков 129
200 MAT Jx=J—T
210 MAT K = B*U
220 MAT T = G*W
230 MAT K = K+T
Обратим особое внимание на то, что массивы J, К, U, W и ра-
бочий массив Т должны быть объявлены как двумерные, хотя один
из индексов у них принимает одно-
единственное значение. Причина за-
— ключается в том, что они встречаются
-------------------------- в качестве операндов в матричном
умножении, а проверка размерности
Рис, 7.1. Четырехполюсник сомножителей всегда осуществляется
по обоим индексам.
7.2.2. Анализ LC-фильтров. Методы расчета различных фильтров
базируются на матричной теории пассивных четырехполюсников, основ-
ные положения которой нам вкратце придется изложить для более
четкого понимания смысла задачи.
Четырехполюсник—одно из наиболее распространенных электри-
ческих устройств, в котором выделяют две входные и две выходные
клеммы (рис. 7.1).
Комплексные входные и выходные напряжения и токи связаны
между собой соотношениями:
4 = 011^1 +1/12^2»
7 2 = У 22^1 +1/22^2»
которые можно записать в матричной форме:
7 = У*У, (7.7)
Матрицу Y называют матрицей полной проводимости четырех-
полюсника. Систему (7.7) можно разрешить’ относительно напряже-
ний Vi и V2:
Матрицу У-1, обычно обозначаемую через Z, принято называть
матрицей полного импеданса четырехполюсника. Можно разрешить
систему (7.7) и относительно других пар переменных. Наибольший
интерес представляет выражение тока и напряжения на выходе через
входные параметры:
^2 = 11^1 + ^12^1»
/2 = ^21^1 + ^2271*
Матрицу Т называют характеристической или передаточной матри-
цей четырехполюсника. Для основных четырехполюсников такие
матрицы приводятся в любом справочнике по электротехнике. Однако
для анализа пассивных четырехполюсников любой сложности доста-
130
точно знать передаточные матрицы лишь для двух элементарных
схем (рис. 7.2 и 7.3).
Более сложные цепи могут быть представлены в виде соединений
этих элементарных четырехполюсников (рис. 7.4, 7.5, 7.6).
Рис. 7.2. Последовательно вклю-
ченное сопротивление
Рис. 7.3. Шунтирующая
проводимость
Для каждого из таких соединений известны правила формирова-
ния передаточных матриц, матриц импедансов и проводимостей.
Рис. 7.4. Цепное (каскадное) соединение четырехполюсников
Например, при каскадном соединении двух четырехполюсников
общ = ^*2 ХЛ’.
При параллельном соединении суммируются проводимости:
ГобЩ=г2+гь
при последовательном соединении — импедансы:
Z061H = Z2+Zf.
Знание этих правил позволяет сравнительно легко рассчитать
Г-образные, Т-образные и П-образные схемы (рис. 7.7).
Рис. 7.6. Последовательное со-
единение четырехполюсников
Рис. 7.5. Параллельное соеди-
нение четырехполюсников
С ростом числа каскадов сложность выражений катастрофически
возрастает. В реальных фильтрах низких или высоких частот (см.
рис. 7.9 и 7.10) количество каскадов доходит до 15—20. На слож-
ность вычислений влияет то, что элементами матриц являются ком-
плексные числа, а сам расчет должен выполняться многократно, так
как параметры каскадов зависят от частоты со входного напряжения.
5* 131
Не затрагивая пока всех деталей программы, связанной с расче-
том параметров каскада, займемся реализацией вычислений переда-
точной матрицы Т для л-каскадной цепи:
= (7.8)
Для определенности будем считать, что блок вычисления пара-
метров t-го каскада на каждой расчетной частоте со выдает тройку
Рис. 7.7. Характеристические матрицы Г-образных, Т-образных и
П-образных схем
чисел (6, а, Ь), определяющую характер подключения (k) и комплекс-
ную величину а+/Ь импеданса или проводимости. Условимся, что
k = 0 соответствует последовательному включению импеданса Z/, а
6=1 имеет место при шунтирующем включении проводимости
Рис. 7.8. Блок-схема вычисления передаточной матрицы: п—число
каскадов, Е—единичная матрица
Так как вычисление характеристической матрицы Т сводится
к повторению стереотипных действий (формирование передаточной
матрицы Т/ очередного каскада, домножение на матрицу Г/), то вполне
естественно организовать цикл, логика которого представлена на
блок-схеме (рис. 7.8).
132
Учитывая, что параметрами матриц Т и Tt являются комплексные
числа, нам придется выделить у них соответствующие составляющие:
T = C+/D,
TZ=F+/G.
Каждая из этих матриц имеет размерность 2x2, Начальное фор-
мирование матриц Т сводится к засылке единичной матрицы в веще-
ственную часть (С) и очистке мнимой части (D):
200 MAT C=IDN
210 MAT D = ZER
Для последовательного подключения f-го каскада (6=0) матри-
цы F и G должны быть сформированы следующим образом:
В случае шунтирующего включения (6 = 1) эти матрицы приобре-
тают вид:
-=[_:?]•
Таким образом, формирование передаточной матрицы i-го каскада
по поступившей тройке чисел может быть выполнено следующей груп-
пой операторов:
300 MAT F = IDN
310 MAT G = ZER
320 LET F(1 + К, 2—К) = —А
330 LET G(l + K, 2—К)=— В
Процедура домножения матрицы Т на сформированную матрицу
Г/ ничем не отличается от аналогичного фрагмента в предыдущей
вадаче:
370 MAT P = C*F
380 MAT Q = D*G
390 MAT R = P—Q
400 MAT P = C*G
410 MAT Q = D*F
420 MAT D = P+Q
430 MAT C=R
Вспомогательные матрицы Р, Q, R пришлось ввести здесь для хра-
нения промежуточных результатов. Поэтому необходимо их объявить.
Возвращаясь к расчету LC-фильтров, попытаемся подметить спе-
цифику конкретной задачи. Во-первых, было бы естественно построить
единую программу и для расчета фильтров низких частот — ФНЧ
133
(рис. 7.9) и для расчета фильтров высоких частот—ФВЧ (рис. 7.10).
В обеих ситуациях при переборе элементов фильтра мы имеем оди-
наковый закон чередования способов подключения — последовательное,
Рис. 7.9. Фильтр низких частот (ФНЧ)
Рис. 7.10. Фильтр высоких частот (ФВЧ)
шунтирующее и т. д. Таким образом, управляющий параметр К по-
очередно принимает значения 0 и 1, и для его изменения при пере-
ходе к следующему ^каскаду можно было бы воспользоваться опера-
тором:
LET К=1-К
Поскольку перебор каскадов для вычисления передаточной матри-
цы Т ведется с конца, то исходные данные о фильтре мы скомпдруем
в блоке данных в этой же последовательности. Для ФНЧ блок дан-
ных составят значения
Cjv-i, C2, Li,
для ФВЧ —
W, Cjv, L/v_b Cjy-2, *.i, L2, Ci.
Первое число в блоке данных задает количество элементов
в фильтре.
Осуществляя в цикле последовательную выборку очередного эле-
мента из блока данных, мы сталкиваемся с закономерным чередова-
нием емкостей и индуктивностей. Разница между ФНЧ и ФВЧ зак-
лючается в начальном элементе этого чередования. Поэтому мы введем
еще один управляющий параметр L, который будет принимать значе-
ние 1, если из блока данных выбрана индуктивность, и 0—при вы-
боре емкости. Его начальное значение должно быть равно 1 для ФНЧ
и 0 — для ФВЧ. Для упрощения смены вариантов начальное значе-
ние L удобно ввести также в блок данных, который теперь будет
выглядеть абсолютно одинаково и для ФНЧ, и для ФВЧ:
L, N, Rm Rn-i, Я1
134
Здесь мы ввели новое обозначение R{ для i-ro элемента фильтра.
Теперь займемся процедурой формирования передаточной матри-
цы i-ro каскада. Во время перебора элементов фильтра нам при-
дется столкнуться с одной из четырех ситуаций, представленных на
рис. 7.11.
В силу специфики задачи действительным компонентом матрицы
Т{ всегда является единичная матрица, а в мнимом компоненте дол-
жен быть сформирован единственный элемент G (1+&, 2 — k). Пред-
Рис. 7.11. Передаточные матрицы звеньев LC-фильтров
лагаем читателю убедиться, что, несмотря на наличие четырех комби-
наций, формирование этого элемента выполняется одним оператором:
50 LET G(1 + К, 2 — К) = (—l)fABS(K — L)*(R*W)f
(2*ABS(K —L) —1)
Здесь через R обозначена величина емкости С/ или индуктив-
ность L/, значение которой выбрано из блока данных, а через W —
круговая частота сигнала на входе фильтра.
Таким образом, блок формирования передаточной матрицы в на-
шей задаче состоит всего из трех операторов:
40 READ R
45 MAT G = ZER
50 LET G(l + K, 2—К) = (—1) t ABS(K —L)*(R*W) f
(2*ABS(K — L)~ 1)
135
Тот факт, что матрица F является единичной, позволяет ее вообще
не хранить и несколько упрощает процедуру умножения' комплексных
матриц (Т=Т*Т/):
60 MAT P=D*G
65 MAT Q = C*G
70 МАТ С=С—Р
75 MAT D = D+Q
Рис. 7.12. Пример конкретного ФНЧ
Окончательный вариант программы расчета передаточной матрицы
с набором данных для конкретного ФНЧ (рис. 7.12) имеет следую-
щий вид:
5 DIM С(2,2), D(2,2), G(2,2), Р(2,2), Q(2,2)
10 FOR W = 0.1 TO 2 STEP 0.1
20 READ L,N
30 LET K = 0
40 MAT C=IDN
50 MAT D = ZER
60 FOR 1=1 TO N
70 READ R
80 MAT G = ZER
90 LET G(l + K,2—K) = (— 1) f ABS(K — L)*(R*W) f
(2*ABS(K—L) —1)
100 MAT P = D*G
110 MAT Q = C*G
120 MAT C = C—P
130 MAT D = D+Q
140 LET K=l —К
150 LET L = l —L
160 NEXT I
170 MAT PRINT C,D
180 RESTORE
190 NEXT W
500 DATA 1, 5, 0.8253, 1.551, 1.892, 1.715, 0.835
9999 END
136
В результате ее работы на печать будет выдана таблица элемен-
тов характеристической матрицы фильтра в некотором диапазоне
частот W.
Составленная программа может послужить основой для создания
практической программы расчета LC-фильтров. Для этого во избежа-
ние возможных переполнений в ней, во-первых, нужно было бы пре-
дусмотреть нормировку исходных данных:
W7 ______ ® Т * ^<D . V . IS
w норм > ^норм —к# > '-’Норм — Ь * Л(|) *
В приведенном примере значения частот, индуктивностей и емко-
стей были пронормированы вручную.
Во-вторых, вместо печати элементов характеристической мат-
рицы Т целесообразнее было бы организовать вычисление и выдачу
таких общепринятых в электротехнике характеристик, как входной
и выходной импедансы, коэффициенты усиления по току и напряже-
нию и т. п. Все они по очень несложным арифметическим формулам
выражаются через элементы передаточной матрицы:
__ *22*н— *12 v ______ *ПГГ— *12
ВХ~ /п —/21гн ’ Zbmx~ /аа-/21гг ’
*22^н — *12 * *11— *21ГН '
S *11ГГ—*12 + ^ (*22— *21^г)
2 Кгггн
a = 201g|S|.
Здесь использованы следующие обозначения:
ZBX— входной импеданс;
ZBbIX—выходной импеданс;
Яу—коэффициент усиления по напряжению;
К[—коэффициент усиления по току;
гг—внутреннее сопротивление генератора — источника входного
напряжения;
гн — сопротивление нагрузки, подсоединенной к выходу фильтра;
S—рабочий коэффициент передачи;
а—рабочее затухание (в децибелах).
Предоставляя заинтересованному читателю возможность самому
довести описанную программу до коммерческого уровня, мы ограни-
чимся лишь двумя замечаниями. Во-первых, элементы /// передаточ-
ной матрицы являются комплексными числами, и об этом не надо
забывать при программировании формул (7.9). Во-вторых, можно
придать большее изящество программе, если вместо печати характе-
ристик (или наряду с печатью) предусмотреть вывод их графиков.
137
7.3. Новые функциональные возможности
матричных процедур
Анализ различных версий бейсика позволяет выделить три основ-
ные тенденции в развитии матричных процедур.
Первое направление связано с попытками перенести некоторые
матричные операции на текстовые массивы. Главным образом это —
очистка массивов (занесение пробелов), формирование текстовых зна-
чений в массивах с использованием блока данных (MAT READ),
ввод (MAT INPUT) и вывод (MAT PRINT) элементов символьных
массивов.
Второе направление составляют различные процедуры обмена
между содержимым массивов и файлами данных на внешнем носителе
(MAT GET, MAT PUT, MAT PRINT MAT INPUT #, МАТ
READ MAT WRITE :$:). Единственная особенность по сравнению
с обычными операциями обмена с файлами прямого или последова-
тельного доступа состоит в том, что в качестве элементов вводного
или выводного списка здесь выступают имена массивов.
Характерной особенностью третьего направления является под-
ключение новых матричных операций. Так, например, в состав функ-
ций оператора МАТ были введены процедуры умножения матрицы
на вектор (DOT), вычисления произведения (PRD) и суммы (SUM)
компонент вектора, сортировки элементов арифметического массива
по возрастанию (ASORT) или убыванию (DSORT) величин. Програм-
мное обеспечение ЭВМ Искра-226 включает пакет матричных про-
цедур, связанных с сортировкой, копированием и слиянием массивов.
Основной особенностью этого пакета является существенное
повышение быстродействия по сравнению с реализацией аналогичных
процедур посредством обычных операторов бейсика. В значительной
мере это обусловлено двумя вспомогательными процедурами, вклю-
ченными в состав пакета.
Одна из них связана со сравнением числовых данных. Дело
в том, что принятый в машине формат представления чисел не дает
возможности сопоставить два значения путем быстрой процедуры
побайтного сравнения. Производить сравнение так, как это делается
в обычном операторе IF, значит резко снизить быстродействие за счет
интерпретации команд десятичной арифметики. Поэтому в пакете
матричной сортировки предусмотрено преобразование значений эле-
ментов исходного массива в специально подобранную форму с пла-
вающей запятой, допускающую побайтовое сравнение. Выполняется
такое преобразование с помощью оператора MAT CONVERT:
MAT CONVERT А( ) ТО В 0 ( )
При этом каждый элемент числового массива А преобразуется
в восьмибайтовую конструкцию, записываемую на место соответствую-
138
щего элемента в текстовом массиве BQ. Последующие процедуры
сортировки выполняются уже над элементами символьного мас-
сива BQ.
Вторая подготовительная процедура заключается в построении
вспомогательного массива указателей (в документации по програм-
мному обеспечению Искры-226 для этого массива использован термин
«локатор»). Массив-локатор состоит из двухбайтовых элементов, коли-
чество которых обычно совпадает с количеством элементов в исходном
числовом массиве А или в его символьном эквиваленте BQ. Первый
Рис. 7.13. Структура локатора для одно- и двумерных массивов
элемент массива-локатора «показывает» на минимальный по вели-
чине элемент массива A (BQ), второй элемент локатора «смотрит»
на следующий по величине элемент массива А (В Q) и т. д. Термины
«смотрит», «показывает» следует понимать так: в элементе массива-
локатора хранятся индексы соответствующего элемента исходного или
преобразованного массива (см. рис. 7.13).
Двухбайтовый размер элементов массива-локатора хорошо согла-
суется с ограничением входного языка бейсик-искра на величину
индексов—хтах^ 255. В программах матричной сортировки действует
дополнительное ограничение imax^254, так как код HEX(FF) = 255
используется для служебных целей.
Обозначим для определенности массив-локатор ч^рез L Q. Для
его создания существует несколько возможностей. Первая состоит
в использовании оператора MAT SORT:
MAT SORT BQ( ) ТО R2Q( ), LQ( )
Здесь BQ—эквивалент исходного числового массива А, полученный
в результате преобразования MAT CONVERT, R2Q—рабочий массив
с двухбайтовыми элементами (общее количество элементов в R2Q
должно быть не менее, чем в массиве В Q).
Термин «сортировка», который напрашивается по названию опе-
ратора MAT SORT, может навести на ложный след. Никакой пере-
139
отановки элементов ни в массиве BQ, ни в его числовом эквива-
ленте А процедура MAT SORT не производит. Формируются только
элементы массива-локатора LQ, который можно использовать для
упорядоченной выборки элементов из массива BQ или А. Выпол-
няется такая перепись с помощью оператора MAT MOVE:
MAT MOVE А( ), L Q ( ) ТО С( )
или
MAT MOVE BQ( ), LQ( ) ТО DQ( )
В результате выполнения оператора MAT MOVE массивы-прием-
ники (С или DQ) будут состоять из элементов, упорядоченных по
возрастанию значений. Оператор переписи позволяет начать работу
с любого элемента LQ и тем самым выбрать только часть упорядо-
ченных элементов. Результат выборки можно поместить с любой
точки массива-приемника, а не только с самого его начала.
Второй способ создания массива-локатора использует оператор
MAT MERGE:
MAT MERGE В0( ) ТО RfQ( ), R,Q( ), LQ( )
Здесь В Q—Двумерный символьный массив, полученный в результате
преобразования исходного числового массива А (с помощью опера-
тора MAT CONVERT), N—общее количество элементов массива В Q;
RiQ —рабочий массив с однобайтовыми элементами, количество
которых не менее N -f-1; R2Q—рабочий массив с двухбайтовыми эле-
ментами, количество которых не менее N; LQ—создаваемый массив-
локатор.
Перед выполнением оператора MAT MERGE необходимо сформи-
ровать значения указателей в элементах рабочего массива RiQ. Эту
процедуру можно выполнить следующим образом:
INIT (01) RiQ( )
Смысл указателей-элементов массива RiQ таков. Первый элемент
R1Q(1) «смотрит» на элемент массива BQ, начиная с которого
ведется просмотр элементов первой строки. Второй элемент Ri Q (2)
указывает на начало просмотра во второй строке и т. д. Если значе-
ние какого-то указателя Ri Q (к) равно нулю, то к-я строка мас-
сива В Q в процедуре MAT MERGE не участвует.
Массив-локатор L Q создается путем параллельного просмотра
строк массива В Q, начиная с выделенного элемента в каждой строке.
Указатели в элементах LQ формируются таким образом, как будто
значения элементов строк массива В 0 или его эквивалента А участ-
вовали бы в процедуре слияния.
140
Например:
8
9
Ш 412'
3 6 2 .
—1 |~25~| 13_
L-J
В исходной матрице А рамками обведены элементы, начиная с ко-
торых выполняется процедура «слияния». Поэтому количество запол-
ненных указателей в массиве L Q может оказаться меньшим, чем
общее количество элементов в исходном массиве.
Для того чтобы выполнить физическое слияние строк или их
фрагментов, необходимо прибегнуть к оператору MAT MOVE.
Существует еще одна возможность построения массива-локатора,
которая состоит в следующем. Исследуемый символьный массив рас-
сматривается как строка байтов, среди которых выделяются номера
байтов, удовлетворяющие заданному условию. Например, в мас-
сиве S0() необходимо отметить позиции, в которых расположен
код запятой. Для этой цели используется оператор MAT SEARCH:
100 MAT SEARCH S Q ( ), = Y ТО L 0 ( )
Просмотр анализируемой строки может вестись байт за байтом или
с каким-то шагом подобно операторам цикла. Например:
105 MAT SEARCH S0 ( ), = Т* ТО L 0 ( ) STEP 6
Здесь мы просматриваем 1-й, 7-й, 13-й, ... байты исследуемой строки
на предмет обнаружения в них символа F. Массив-локатор, получен-
ный в процедуре MAT SEARCH, не может быть использован в опе-
раторе MAT MOVE.
В состав матричного пакета включена еще одна процедура копи-
рования символьных массивов, которая представляет собой аналог
матричного присваивания с более широкими возможностями:
MAT COPY [-]А 0 [(I)] ТО [—]В О [(J)J
Оператор MAT COPY осуществляет побайтовую перепись из мас-
сива А 0 в массив В 0. При этом имеется возможность переписывать
байты, начиная с А 0(1), и выбирать их, просматривая массив А0
либо вперед (т. е. А0(1), А0(1 + 1), А0(1+2), ..,), либо назад
(т. е. A0(I), А0(1 —1), А0(1~2), ...), если перед именем мас-
сива А0 указан знак минут. Аналогичная возможность имеет место
и для массива-получателя В0.
Глава 8. МАШИННАЯ ГРАФИКА
Термин «машинная графика, включает аппаратные и программные
средства, обеспечивающие ввод и формирование в ЭВМ моделей
описания графических объектов, выполнение геометрических процедур,
связанных с анализом и синтезом плоских и пространственных фигур,
отображение различных графических документов—графиков, гисто-
грамм, эскизов чертежей и т. п. Машинная графика широко исполь-
зуется в задачах автоматизации научного эксперимента, в системах
автоматизированного проектирования, при подготовке данных для
станков с числовым программным управлением.
Элементы Машинной графики появились в бейсике сравнительно
недавно. Первый стандарт ANSI, принятый в 1978 г., их вообще не
предусматривал. Однако бурный рост выпуска персональных ЭВМ
и развитие индустрии «машинных игр» в значительной мере содейст-
вовали появлению новых версий языка, снабженных средствами
обработки и отображения графической информации.
Прежде чем заняться более детальным изучением этих новшеств,
нам потребуется некоторое отступление для элементарного знакомства
с аппаратурой и терминологией.
8.1. Основные сведения об аппаратных средствах
На современных ЭВМ используется широкая гамма средств ото-
бражения информации, в которых для фиксации изображения приме-
няются различные физические принципы. Среди них—устройства,
обеспечивающие возможность получения графического документа
(твердой копии) на том или ином носителе—на обычной или электро-
химической бумаге, на фоточувствительной пленке или специальном
пластике с защитным слоем и т. п. Техника нанесения изображения
на носитель достаточно разнообразна. Это—и обычные шариковые
стержни или ампулы с чернилами, входящие в непосредственный
контакт с носителем, и специальные самописцы, распыляющие кра-
сящую пасту или жидкость без контакта с носителем, и игольчатые
матрицы, выжигающие узор с помощью искрового разряда, и резцы,
гравирующие защитный слой на пластике, и фотоголовки с управ-
ляемыми конфигурацией и размерами луча и т. п. Все эти элементы
142
объединяются термином «пишущий узел». Устройства отображения,
использующие тот или иной пишущий узел, носят название графо-
построителей (реже графодовторителей) или координатографов.
Последний термин чаще применяют до отношению к прецизионным
графопостроителям, снабжаемым пишущей головкой с набором сменных
инструментов—фрез, сверл. Как правило, координатографы исполь-
зуются для подготовки фотошаблонов и печатных плат, расслоенных
по цветам оригиналов топографических и тематических карт, других
графических документов, предъявляющих высокие требования к точ-
ности их производства.
Другой тип регистрирующих устройств—графические дисплеи,
на экране которых можно .воспроизвести сравнительно несложное
изображение. Графические дисплеи обладают богатыми возможно-
стями— управление цветом и яркостью .изображения, быстрая смена
отображаемых кадров, комбинирование графических элементов с ал-
фавитно-цифровой информацией и т. л. Все это позволяет строить на
экране динамические кцртинки, моделирующие поведение отображае-
мого объекта, создавать изображения объемных тел, менять их поло-
жение л пространстве. .Роль пишущего узла в графическом дисплее
выполняет электронный .луч, направляемый в.заданные точки люмино-
фора ла экране.
Несмотря на различие .в -конструктивном оформлении и исполь-
зуемых физических принципах, средства отображения графической
информации могут быть описаны с единой точки зрения. В каждом
таком устройстве присутствует лишущий механизм—«перо», переме-
щающееся тем или иным способом в прямоугольной области. .Эта
область носит название рабочего лоля графопостроителя. Его размеры
могут сильно варьироваться для разных конструкций регистрирующих
устройств. Для графических дисплеев длина (ширина) рабочего поля
редко превышает 25—40 см. Настольные графопостроители обеспечи-
вают вывод на листы форматов АН (210x297 мм) или А4 (297x520 мм).
Рабочие поля координатографов имеют размеры от 800 мм до 1200 мм.
Специальные графопостроители, предназначенные для вывода плазовой
документации в судостроении и авиастроении, имеют рабочие столы
длиной до 8—10 м и шириной до 2 м.
Минимально допустимые перемещения пера по каждой из коор-
динат в плоскости чертежа определяют на рабочем поле прямоуголь-
ную сетку. Концы любой траектории пера должны обязательно
совпадать с узлами этой сетки. Узлам координатной сетки на рабочем
поле графического дисплея соответствуют точки телевизионного
растра. Их можно легко обнаружить на экране цветного телевизора,
где в каждой строке просматриваются компактные тройки, образо-
ванные красным, зеленым и синим пятнышками (см. рис. 8.1). В вы-
числительной технике за таким образованием закрепился .термин
«пиксель» (от англ, pixel —элемент изображения).
143
6 соответствующие вершины пикселя направляются лучи от трех
электронных пушек, каждая из которых управляет интенсивностью
своего цвета. Смешение красного, зеленого и синего цветов в разной
пропорции позволяет получить достаточно богатую палитру, насчиты-
вающую от нескольких десятков до нескольких сотен оттенков.
Рис. 8.1. Схема расположения
цветных элементов в телевизи-
онном растре (R — красный,
G—зеленый, В — синий)
В качестве графических дисплеев недорогих персональных ЭВМ
могут использоваться бытовые черно-белые или цветные телевизоры.
Однако для профессиональных вычислительных систем выпускают
специализированные дисплеи с повышенной разрешающей способ-
ностью. Количество строк на их рабочем поле может в 2—3 раза
превышать обычный телевизионный стандарт (625 строк).
Координатная сетка на рабочем поле графопостроителя исполь-
зуется для адресации местоположения пера. Начало декартовой
системы координат обычно совмещают с нижним левым углом рабочего
поля, а координаты точек задают с помощью неотрицательных целых
чисел. Статическое изображение на рабочем поле может быть опи-
сано с помощью матрицы состояний, элементы которой соответствуют
узлам координатной сетки. Значение каждого элемента определяет
характеристики соответствующего пикселя—код цвета, уровень яр-
кости, признак мерцания и т. п. Для одноцветных регистрирующих
устройств каждый элемент матрицы состояний представляется двоич-
ным разрядом, который равен 1, если через данную точку проходит
^онтурная линия, или 0, если через эту точку ничего не проходит.
С подобного рода бинарными табло многие из нас встречались в залах
ожидания на железнодорожных вокзалах и в аэропортах.
Вывод графической информации, по сути дела, сводится к фор-
мированию значений элементов матрицы состояний' с последующей
отработкой выданных указаний пишущим узлом. Запись в матрицу
состояний эквивалентна выводу в файл на внешнем устройстве. По
аналогии с файлами прямого и последовательного доступа различают
векторные и растровые способы управления пишущим механизмом.
В векторных графопостроителях перо совершает обход контура
воспроизводимой фигуры, перемещаясь на каждом шаге из одной
тучки координатной сетки в другую. В этом случае последователь-
йбсть элементов матрицы состояния отображающей поверхности гене-
рируется программно в порядке обхода точек контура, а положение
очередной точки может задаваться как в абсолютных координатах,
так и в приращениях. Последний режим иногда называют шаговым
или инкрементальным. В шаговом режиме пишущий механизм уста-
144
навливается в начальную точку траектории, а затем перемещается
в соседний узел сетки по одному из восьми возможных направлений
(см. рис. 8.2)
Для перевода пера в конечную точку траектории может понадо-
биться довольно много таких элементарных перемещений. На рис. 8.3
показана одна из возможных траекторий движения по «прямой» из
точки (0,0) в точку с координатами (5,3).
В электромеханическом графопостроителе такие перемещения
осуществляются с помощью двух шаговых двигателей, работающих
либо поочередно (вертикальные или горизонтальные сдвиги), либо
Рис. 8.2. Схема перемещений
пера в инкрементальном режиме
одновременно. В векторных дисплеях смещением луча заведуют гори-
зонтальная и вертикальная отклоняющие системы. Графическая про-
грамма для инкрементального режима выглядит следующим образом:
установить перо в начало координат
опустить перо
переместить перо в направлении /\
переместить перо в направлении /а
поднять перо
переместить перо в направлении и
переместить перо в направлении i2
опустить перо
Изначальное движение пера в первую точку контура совершается
точно таким же образом в поднятом положении. Для кодирования
каждой графической команды хватило бы и одного байта, но в реаль-
ных графопостроителях чаще используют двухбайтовые команды.
Объем графической программы существенно сокращается, если
графопостроитель снабжен линейным и круговым интерполяторами,
обеспечивающими аппаратное вычисление координат промежуточных
145
точек траектории. Графическая программа в интерполяционном режиме
состоит из команд следующего вида:
переместить перо в точку (х, у) в поднятом состоянии,
переместить перо в точку (х, у) в опущенном состоянии,
построить дугу окружности с центром в точке (х0, у0) по часовой
стрелке до точки (хь yt),
построить дугу окружности с центром в точке (х0, у^) против
часовой стрелки до точки (хх, #1).
Иногда параметры отрезков и дуг окружностей могут быть заданы
другими способами. Например, угол наклона и длина вектора, две
точки дуги окружности и величина центрального угла и т. п.
Среди инкрементальных или интерполяционных графических
команд может встретиться процедура смены пишущего узла, которая
управляет выбором нужной цветности в многоперьевых графопо-
строителях.
Из-за низкой 'скорости работы механических графопостроителей
векторного типа графическая программа обычно записывается на про-
межуточный носитель (перфолента, магнитная лента, магнитный диск)
для последующего автономного воспроизведения. Графические дисплеи
с векторным управлением снабжаются буферным запоминающим уст-
ройством, в котором хранится программа воспроизведения очередного
кадра. Аппаратура дисплея многократно повторяет эту программу,
создавая на экране устойчивое изображение.
Растровый способ управления заключается в том, что матрица
состояний узлов координатной сетки формируется последовательно —
по строкам или столбцам. Затем в таком же порядке пишущий узел
воспроизводит состояние каждого пикселя. Подобного рода технология
применяется при передаче телеграмм и газетных матриц с помощью
фототелеграфных аппаратов. Рабочее поле здесь представлено фото-
бумагой, наклеиваемой на вращающийся барабан. По образующей
барабана медленно перемещается «перо»—точечный источник света.
Пока барабан совершает полный оборот, источник включается или
выключается, чтобы зафиксировать все черные и белые точки на дан-
ной вертикали. Затем источник света перемещается на соседнюю
вертикаль фотодокумента, и все повторяется заново. Точно так же
действует и электронный луч, сканирующий точки координатной сетки
в растровом дисплее.
Растровые графопостроители используют запоминающие устройства
достаточно большого объема для хранения матрицы состояний или
ее фрагмента. Подготовка значений соответствующих элементов до-
вольно трудоемка. Однако время воспроизведения графического доку-
мента здесь практически не зависит от его сложности. В графических
регистрирующих устройствах электромеханического типа с векторным
управлением время построения сложного чертежа исчисляется десят-
ками минут и даже часами.
146
8.2. Некоторые математические аспекты
машинной графики
Предположим, что мы выделили на рабочем поле графопострои-
теля прямоугольную область и собираемся" в ней разместить график
функции v = sin (и) на интервале 0^и^2л. Конечный результат
представляется нам в виде,, изображенном на рис. 8.4.
Рис. 8.4. График функции
sin (и) на рабочем поле
графопостроителя
Нетрудно видеть, что для этой цели придется преобразовать ко-
ординаты точек (и/, Цу) исходной кривой по следующему алгоритму:
— перенести начало координат системы (и, v) в точку с коорди-
натами (х0, Уо + О,5хЬу);
— изменить масштаб по оси и так, чтобы значению и = 2л соот-
ветствовала точка с ординатой x = xQ-\-Lx\
— изменить масштаб по оси v так, чтобы значениям v= \ и v=—1
соответствовали величины и у0. Соответствующие формулы
пересчета координат точек (и/, Ц/) произвольной функции v (и) в физи-
ческие координаты рабочего поля графопостроителя имеют вид:
Xi = XQ+LxX
Ц/—Цщ1п
ит1п
У1 = Уо+^уХ
vi ^min
утах ymin
(8.1)
Приведенные выше процедуры переноса координат и изменения мас-
штабов относятся к так называемым аффинным преобразованиям. Еще
одна довольно распространенная процедура подобного рода связана
с поворотом графического изображения вокруг заданной точки на
угол <р. Если центр вращения совпадает с началом координат, то
пересчет координат выполняется по формулам:
*нов = XctXcos <p+t/CTXsin <р, 2
Умов *стХ sin ф + 1/стХ cos ф. * *
Если центр вращения находится в другой точке, то в нее можно пере-
нести начало координат, а затем воспользоваться формулами (8.2).
147
В самом общем случае пересчет координат в результате произвольного
аффинного преобразования осуществляется следующим образом:
х' = anx+ai2y+&i,
/=а21*+а22*/+*2-
(8.6)
В процессе формирования сложных графических изображений при-
ходится довольно часто прибегать к пересчету координат составных
компонент фигуры. С целью унификации этих операций в большинстве
систем машинной графики используются так называемые однородные
координаты. В этом представлении каждой точке плоскости (х, у)
ставится в соответствие вектор-столбец (х, у, 1). Использование тройки
чисел вместо пары координат не увеличивает объема памяти, необхо-
димой для хранения информации. Дело в том, что дополнительная
единица хранится как бы «в уме», она вступает в действие только
при пересчете координат. Преобразования типа сдвиг, масштабирование
и поворот над однородными координатами сводятся к умножению
соответствующей матрицы третьего порядка на указанный вектор.
Например:
" 1 0 Ах" 0 1 Ду XCT Уст —- *НОВ Унов — "хСт+ Ах" */ст+Д*/ 9
10 1. ~kx 0 0 1 ХСт .1 Лнов 1 Г^Х'хст-
0^0 X Уст = Унов -1 ^j/Х Уст 1
.0 0 1 COS ф — sin ф sin cos _1 Ф 0“ 1 ф 0 X 1 *ст Уст : L 1 *нов Унов ~ ' XctXCOS ф + 1/стХ Sin ф — хст х sin ф + уст X cos ф
0 0 1. L1 1 J 1
Применяя несколько последовательных преобразований с матри-
цами Тъ Т2, ..., Tk над компонентами графического объекта, не
нужно производить пересчет координат на каждом шаге. Вместо этого
вычисляют матрицу результирующего преобразования, которая полу-
чается как произведение указанных матриц:
Т'общ = T’fe—iX ... X 7*2X7*1.
Окончательный пересчет координат выполняется уже с помощью мат-
рицы Тобщ. Это существенно сокращает объем вычислений при вы-
воде графической информации и обеспечивает возможность распарал-
леливания вычислений при пересчете координат.
Техника однородных координат широко используется и в системах
трехмерной машинной графики. Для обозначения таких систем при-
меняют термин 3D, а для двумерных графических систем—2D. В си-
стеме 3D точка заменяется четырехмерным вектором (х, у, z, 1). Ниже
148
приведены матрицы некоторых аффинных преобразований для трех-
мерного пространства:
‘10 0 Дх“ 0 1 0 Ьу 0 0 1 Дг Lo 0 0 1 _ — перенос начала координат,
“6х 0 0 0“
0 ky 0 0 —сжатие по координатным осям (kx, kyt kz) и учет
О 0 kz 0 общего масштабного коэффициента k.
_0 О О A-J
С вращениями в ЗВ-системах дело обстоит несколько сложнее из-за
большего числа вариантов:
— cos a sin а 0 0“
- sin а cos а 0 0
0 0 1 0
- 0 0 0 1-
'cos р 0 — sin Р 0“
0 1 0 0
sin р 0 cos Р 0
0 0 0 L
*1 0 0 0“
0 cosy sin у 0
0 — sin у cos у 0
-0 0 0 1-
поворот на угол а вокруг оси z,
с
•поворот на угол Р вокруг оси у.
— поворот на угол у вокруг оси х.
Перемножая указанные матрицы, можно получить результирующую
матрицу для произвольного поворота вокруг начала координат.
Некоторые системы машинной графики, обеспечивающие работу
с плоскими изображениями (2В-системы), строятся с перспективой
развития на базе матриц преобразования размерности 4x4. Третья
координата (z) в этом случае полагается равной нулю. Таким обра-
зом, встретив в описаниях систем машинной графики упоминание
о служебных (рабочих) матрицах третьего или четвертого порядка,
пользователь должен представлять, о чем идет речь.
8.3. Средства машинной графики на ЭВМ Искра-226
В качестве технических средств отображения графической инфор-
мации на ЭВМ Искра-226 могут использоваться совмещенный алфа-
витно-цифровой и графический дисплей и малогабаритный графопо-
строитель Н-306. В текстовом режиме дисплей воспроизводит содержи-
мое собственного буферного запоминающего устройства емкостью
1920 байт (24 строки по 80 символов). В графическом режиме дис-
плейный кадр представлен растром 560x 256 (в более поздних моде-
149
лях 612x256) точек, на котором отображается специальным образом
подготовленная информация в буфере, выделяемом программой поль-
вователя. Разрешающая возможность дисплея в графическом режиме —
порядка 0.4 мм. Графопостроитель Н-306 имеет рабочее поле размером
300x 200 мм, соответствующее растру 4000x2666 точек. Разрешающая
возможность графопостроителя — порядка 0.075 мм.
Средства входного языка предусматривают три уровня общения
с устройствами отображения графической информации. Самый низкий
уровень использует элементарные графические команды, обеспечиваю-
щие заданные относительные перемещения пишущего узла. Графиче-
ская команда состоит из однобайтового кода операции, задающего
характер движения, и одного-двух операндов, определяющих величины
смещений по осям х и у. Например:
100 PRINT /14, НЕХ(05), 100, 200
Номер устройства 14 соответствует графопостроителю. Код опера-
ции 05, заданный в виде однобайтовой шестнадцатеричной константы,
определяет движение пишущего узла вправо (+Дх) и вверх (+Ду).
Если обозначить через (хг, уг) координаты текущего положения пера,
то после выполнения 100-го оператора пишущий узел переместится
в точку (хг+100, уг4-100) и, если перо не было поднято, на чер-
теже появится отрезок прямой. Элементарные графические команды
позволяют воспроизводить на графопостроителе и отдельные символы.
Например:
105 PRINT /14, HEX(EBE5F4EFF720E02EEC2E)
Каждая пара шестнадцатеричных цифр представляет здесь графиче-
скую команду по воспроизведению отдельного символа размером 12x16
дискретов и межсимвольным расстоянием в 7 дискретов *). В приве-
денном примере закодирована фамилия автора. Список кодов гра-
фических команд дисплея и их форматы приведены в табл. 17.13
(см. п. 17.4.10). Команды графопостроителя отличаются в основном
терминологией. Вместо засветки луча—опускание пера, вместо отклю-
чения засветки — подъем пера, вместо возврата курсора в начало коор-
динат— возврат пера. Переключение вывода на дисплей производится
либо путем указания номера устройства (PRINT /10 ...), либо путем
назначения графического дисплея логическому устройству PRINT
(SELECT-PRINT 10). После такого назначения номер устройства вы-
вода в теле оператора PRINT уже не указывается.
Второй уровень отображения графической информации связан
с использованием оператора PLOT, который избавляет пользователя
от запоминания кодов графических команд. Работе с оператором PLOT
предшествует назначение графопостроителя или графического дисплея
логическому устройству с именем PLOT и выделение ему буфера
♦) Дискрет—расстояние между двумя соседними точками растра.
150
s оперативной памяти:
200 SELECT PLOT 14 (4000)
Операндами в теле оператора PLOT являются графические макро-
команды следующего вида:
< , , R>—быстрая установка пишущего узла в начало координат
(левый нижний угол),
<Дх, Ду, U>—перемещение пишущего узла из текущей точки
(хг, Ут) в точку (ху'+Дх, уг+Ду) без оставления следа пера (перо
поднято, засветка отключена),
<Дх, Ду, D> — аналогичное перемещение с вычерчиванием отрезка
прямой (перо опущено, засветка включена),
<п, , С> — установка масштаба вычерчивания символов (стандарт-
ный размер символов 5x7 дискретов),
<Дх, Ду, S>—установка горизонтального (Дх) и вертикального
(Ду) смещения между соседними символами. По умолчанию Дх = 2,
Ду = 0,
<Дх, Ду, "aitz2-• — воспроизведение текстовой константы, за-
данной в кавычках. Значения Дх и Ду определяют соответствующие
смещения нижнего левого угла знакоместа первого символа от теку-
щей точки.
Приведенный ниже фрагмент программы строит равнобедренный тре-
угольник с вершинами в точках (40, 40), (70, 100) и (100, 40) и раз-
мещает под ним подпись ТРЕУГОЛЬНИК:
200 PLOT <40, 40, U>, <30, 60, D>, <30, —60, D>, <—60, 0, D>
210 PLOT < , , R>, <20, 20, «ТРЕУГОЛЬНИКА
В качестве смещений (Дх, Ду) во всех приведенных примерах могут
быть заданы арифметические выражения. После их вычисления исполь-
зуется целая часть результирующего значения.
Наибольшие возможности по отображению геометрической инфор-
мации и конструированию описаний графических объектов представ-
ляют операторы третьего уровня. Графический объект (ГО), который
можно программным путем создавать, преобразовывать и выводить,
представляет собой совокупность точек, векторов и надписей. Форми-
руется ГО обычно в декартовой системе координат (0^x^32 767,
032 767), единицей длины в которой служит дискрет растра
экрана или графопостроителя. Для хранения информации, описываю-
щей структуру ГО и установочные данные, необходимые для его раз-
мещения на рабочем поле, применяются одномерные или двумерные
текстовые массивы. Имя такого массива отождествляется с именем ГО.
По сути дела, текстовый массив используегся в данном случае лишь
как средство резервирования памяти (буфера) под описание ГО. Раз-
мер области памяти, запрашиваемый с помощью оператора DIM, дол-
жен быть не менее 64 байт. По умолчанию для хранения ГО выде-
ляется 1600 байт.
151
Для того чтобы начать работу с любым ГО, его надо предвари-
тельно активизировать (открыть), т. е. употребить имя ГО в теле
оператора QOPEN. Например:
100 QOPEN AQ( ), GQ( )
Имя первого ГО, указанное в списке оператора QOPEN, выделяет
графический объект, именуемый экранным. Отображение этого объекта,
если в его описании уже есть информация, немедленно выдается на
экран дисплея. Если с экранным объектом производятся какие-либо
операции (дополнение новых элементов, уничтожение старых, перенос
начала координат, повороты и т. п.), то их результат можно сразу же
увидеть на экране.
Если мы хотим открыть дополнительные графические объекты BQ
и FQ, но собираемся сохранить объект AQ в качестве экранного,
то следует воспользоваться модификацией оператора QOPEN:
110 QOPEN ,В0( ), FQ( )
Процедура активизации графического Объекта с помощью оператора
QOPEN заключается не только в том, что мы получим возможность
доступа к этому ГО. Для пустого, т. е. еще не сформированного ГО,
открытие сопровождается начальным формированием установочных
данных. К таковым относятся координаты точки привязки объекта,
определяющие его расположение на рабочем поле, масштабные коэф-
фициенты по осям х и у, угол поворота объекта относительно физи-
ческой системы координат, минимальное и максимальное значения
горизонтальной и вертикальной координат, используемые при проекти-
ровании ГО на экран дисплея, координаты текущей точки.
Стандартные установочные данные могут быть изменены пользо-
вателем для того, чтобы переместить ГО или повернуть его на задан-
ный угол, произвести масштабирование по одной или обеим коорди-
натам и т. п.
В описании графического объекта важную роль играет понятие
текущей точки, как бы соответствующей положению пишущего меха-
низма в момент воспроизведения контура ГО. Пока объект пуст, теку-
щая точка совпадает с началом локальной системы координат. Затем
мы начинаем пополнять объект точками, векторами, надписями.
И каждый раз последняя точка очередной компоненты считается теку-
щей. Если спустя какое-то время мы продолжим формирование ГО,
то новые фрагменты начнут пристраиваться с запомненной текущей
точки.
Новая точка в описание ГО включается для того, чтобы перевести
в нее перо в поднятом состоянии и тем самым иметь возможность
формировать многосвязные геометрические объекты или располагать
надписи на некотором расстоянии от фрагмента ГО. Для пополнения
152
фигуры G0 новой точкой используется одна из модификаций опера-
тора DOT:
180 DOT G0( ), 60, 100
или
180 DDOT G0( ), 10, 20
В первом случае точка задается координатами (х, у) в локальной
системе координат объекта, а во втором—перемещениями Дх и Ду
относительно текущей точки.
Точка может иметь и самостоятельное значение в составе графи-
ческого объекта. Например, с помощью точек можно построить штри-
ховую линию, предварительно рассчитав местоположение каждого
штриха. Координаты точки в операторах DOT и DDOT могут быть
заданы не только числами, но и значениями арифметических выражений.
Вектор из текущей точки в точку, заданную локальными коорди-
натами (х, у) или относительными перемещениями (Дх, Ду), добав-
ляется к описанию ГО с помощью операторов DRAW или DDRAW.
Приводимый ниже фрагмент демонстрирует включение в состав объ-
екта А0 равнобедренного треугольника с вершинами (40, 40), (70, 100)
и (100, 40):
100 DOT А0( ) , 40, 40
ПО DDRAW AQ( ), 30, 60
120 DRAW A0( ), 100, 40
130 DDRAW AQ( ), —60, 0
Для включения в состав описания ГО пояснительной подписи,
заданной значением текстовой константы или текстовой переменной,
используется оператор LABEL. Мы можем управлять размерами сим-
волов и расположением надписи, меняя смещения Дх и Ду между
соседними символами. Например:
180 LET Т0=“ТРЕУГОЛЬНИК”
190 LABEL А0( ), 1,2, 0, Т0
200 LABEL А0( ), , 2, 0, Т0
210 LABEL А0( ), , , , Т0
Три последних оператора (190, 200, 210) эквивалентны по своему дей-
ствию. Каждый из них устанавливает единичный масштабный коэф-
фициент (второй аргумент списка), что соответствует размеру символов
примерно 2x2.8 мм. Надпись ТРЕУГОЛЬНИК будет расположена
горизонтально (Дх = 2, Ду=0) так, что нижний левый угол знакоместа
буквы Т совпадает с координатами текущей точки. Для вертикального
расположения надписи можно, например, воспользоваться следующим
оператором:
220 LABEL А0( ), 2, 0, —3, “ТРЕУГОЛЬНИК”
153
Размер символов здесь в два раза крупнее стандартного, и сама
надпись расположена сверху вниз.
С помощью операторов NPLOT и DNPLOT можно изменить по-
ложение текущей (последней) точки в описании объекта. Причем такая
точка в отличие от DOT (DDOT) на экране не воспроизводится.
Элементарные графические фигуры (точки, вектор, надписи), вхо-
дящие в описание ГО, нумеруются в порядке их подключения. Это
обеспечивает возможность доступа к любой компоненте графического
объекта с~ целью ее использования при компоновке других описаний
или исключения из какого-либо ГО. Объединение графических объ-
ектов или их компонент выполняется с помощью специального опера-
тора QLET. Например:
10 QOPEN AQ( ), BQ( )
20 DOT AQ( ), 40, 40
30 NPLOT BQ( ), 20, 20
40 LABEL BQ( ) , , , , “ТРЕУГОЛЬНИК”
50 DRAW AQ( ), 70, 100 : DRAW AQ( ), 100, 40
60 DRAW AQ( ), 40, 40
70 QLET AQ( ) = AQ( )+BQ(2)
В правой части оператора QLET может находиться любое количество
«слагаемых», каждое из которых представлено графическим объектом
или любой компонентой ГО. Порядок слагаемых определяет последо-
вательность их воспроизведения и соответственно нумерацию вновь
присоединяемых компонент. Оператором* QLET можно воспользоваться
и для удаления любой компоненты из ГО. Например:
80 QLET AQ(5) = 0
Удаление точек и векторов из описания ГО можно выполнить
и другим способом—с помощью операторов NDOT и NDRAW. Если
удаляемая компонента была построена с помощью абсолютной адре-
сации (DOT, DRAW), то в теле соответствующего оператора надо
будет задать те же координаты точки или конца вектора:
100 DOT AQ( ), 30, 40
380 NDOT AQ( ), 30, 40
Если же объект был включен в ГО с использованием относительных
перемещений, то для его удаления придется вычислить абсолютные
координаты. Например:
10 QOPEN AQ( )
20 DOT AQ( ), 40, 40
30 DDRAW AQ( ), 30, 60
40 DDRAW AQ( ), 30, —60
Ж
50 DDRAW AQ( ), —60, 0
180 NDRAW AQ( ), 40, 40
Последний оператор исключит из описания треугольника его основа-
ние. Конечно, было бы проще выполнить аналогичное мероприятие
с помощью оператора QLET AQ(4) = 0.
Описание графического объекта может быть подвергнуто одному
преобразованию или любой последовательности аффинных преобразо-
ваний—сдвигу (QMOVE), повороту (TURN) вокруг заданной-точки
и процедурам сжатия-раетяжения (STRETCH) относительно указан-
ной точки. Следует обратить внимание на тот факт, что все эти опе-
раторы не сопровождаются пересчетом координат каждой точки
в описании соответствующего ГО: они приводят только к изменению
результирующей матрицы преобразований. Для экранного объекта
действие результирующей матрицы распространяется на каждую точку
описания.
Сформированное описание графического объекта может бить
сохранено в архиве на магнитной ленте (DATA SAVE). В дальней-
шем его можно оттуда извлечь (DATA LOAD) и использовать
получения графической копии или формирования более сложных FQ.
Выводу графического объекта на экран дисплея или на графо-
построитель могут предшествовать процедуры, согласующие размеры
области вывода (WINDOW) и предельные границы изменения коор-
динат объекта (FRAME). С помощью оператора WINDOW задаются
габариты прямоугольной области (xmin, xmax, ymin, ymax)» Которая
должна целиком помещаться на рабочем поле дисплея или графо-
построителя. Отрезки прямых (векторы), выходящие за пределы
области вывода, отсекаются по границе области. Если на эту границу
попадает текст, то он не выводится. Оператор FRAME, имеющий
аналогичные параметры, задает размеры области, в которой целиком
помещается ГО. Если координатная сетка не совпадает с растром
экрана или графопостроителя, то указанные пределы используются
для преобразования программных координат в физические координаты
области вывода. Среди дополнительных возможностей по согласова-
нию программных и физических областей отметим операторы ORIGIN
и SCALE, обеспечивающие соответственно перенос начала координат
ГО и изменение цен делений по осям х и у. Если описание ГО со-
ставлено в физических координатах, то нет необходимости в исполь-
зовании указанных операторов.
Графический объект, объявленный экранным, выдается на дис-
плей автоматически. Для вывода этого объекта или любого другого
открытого ГО на графопостроитель предназначается оператор QCOPY.
Например:
120 QCOPY /14, AQ( )
155
В качестве дополнительных параметров в этом операторе могут быть
указаны координаты нижнего левого угла окна вывода. Графический
объект, не объявленный экранным, но открытый по оператору QOPEN,
может быть выведен с помощью оператора QCOPY и на дисплей:
130 QCOPY /10, BQ( ), 200, 100
Дополнительные средства по редактированию графического объ-
екта предоставляет световое перо. Используются эти возможности
следующим образом. По оператору QPEN AQ( ) программа перево-
дится в режим ожидания, а на рабочем поле дисплея отображается
ГО с указанным именем. Дальнейшая работа сочетает целеуказание
с помощью светового пера и нажатие функциональных клавиш, т. е.
использование заранее запрограммированных процедур. Программное
обеспечение Искры-226 предоставляет в распоряжение пользователей
пять таких процедур, каждая из которых инициируется по нажатию
своей функциональной клавиши.
Первая процедура обеспечивает слежение за местоположением
светового пера. ,С этой целью на экран дисплея выдается перекре-
стье графический курсор. Затем световое перо подводится к центру
перекрестья и «захватывает» графический курсор. Последний как бы
притягивается к кончику пера и начинает следовать по траектории,
повторяющей перемещения пера. Фактически процедура слежения
опрашивает координаты светового пера и строит в этом месте образ
графического курсора.
Вторая процедура отмечает точками на экране траекторию дви-
жения пера. Если при этом перо перемещается сравнительно мед-
ленно, то точки следуют достаточно густо—через 1—3 экранных
дискрета. При более быстрых движениях точки на траектории, от-
слеживающей положение пера, располагаются реже—через 5—7 ди-
скретов. Формируемая таким образом произвольная кривая состоит
из точек, которые присоединяются к описанию графического объекта,
указанного в операторе QPEN.
Третья процедура обеспечивает присоединение к описанию ГО
новых векторов. Производится это следующим образом. Графический
маркер устанавливается в текущую точку ГО и включается режим
слежения. Затем кончик пера фиксируется в нужной точке и нажи-
мается соответствующая функциональная клавиша. В результате на
экране и в описании ГО появляется новый отрезок прямой. Конец
построенного вектора становится новой текущей точкой ГО. Затем
эту процедуру можно повторить нужное число раз.
Четвертая процедура позволяет идентифицировать (опознать)
компоненту в графическом описании объекта. Мы уже упоминали,
что все компоненты ГО нумеруются в порядке поступления: AQ(1),
AQ(2), .... Если теперь подвести световое перо к нужной точке,
156
концу вектора или началу надписи и нажать соответствующую функ-
циональную клавишу, то на экране появится одно из сообщений вида:
POINTED AQ(1) DOT Х = 40 Y=40
POINTED AQ(3) DRAW X = 100 Y«40
POINTED AQ(5) LABEL X = 20 Y = 20
Последняя, пятая процедура предусматривает выход из режима
работы со световым пером. По нажатию соответствующей функцио-
нальной клавиши программа пользователя выводится из состояния
ожидания и управление передается оператору, следующему за QPEN.
8.4. Цветная дисплейная графика
Для демонстрации возможностей цветной графики мы выбрали
один из наиболее распространенных персональных компьютеров —
IBM PC. Его терминал может работать в алфавитно-цифровом и гра-
фическом режимах. Переключение с одного режима на другой осу-
ществляется программным путем. Средства управления терминалом
при работе в текстовом режиме описаны в разд. 18.3.
В графическом режиме дисплей допускает две степени разреше-
ния— среднюю с растром 200 x 320 и высокую с растром 200x640 то-
чек. Точки графического растра нумеруются, начиная с верхнего
левого угла. По вертикали эти номера идут от 0 до 319 (639), по
горизонтали — от 0 до 199. При среднем разрешении каждая точка
растра может быть окрашена в один из четырех цветов, представ-
ленных в выбранной х пользователем палитре. Для точек высокого
разрешения цветовая гамма состоит всего из двух красок. Буферное
запоминающее устройство, в котором хранится отображаемая графи-
ческая информация, имеет емкость 16 Кбайт. Оно позволяет раз-
местить сведения о 64 000 пикселей при среднем разрешении или
о 128000 пикселей при высоком разрешении.
8.4.1. Установочные процедуры. К этой группе отнесены два
оператора—SCREEN и COLOR, обеспечивающие выбор того или
иного режима отображения и установку признаков цветности. Опера-
тор SCREEN имеет следующий формат:
100 SCREEN п [, ш]
Первый, обязательный параметр может принимать значение п=1 —
для установки графического режима со средним разрешением—и
п = 2—для графического режима с высоким разрешением. При п = 0
дисплей переходит в алфавитно-цифровой режим работы. Второй,
необязательный параметр ш может принимать два значения, обеспе-
чивающих включение (ш = 0) или отключение (ш 0) цветности. Для
графического режима с высоким разрешением, где используется всего
два оттенка, параметр ш не задается.
167
Ивет фона и выбор палитры в режиме со средним разрешением
задаются с помощью оператора COLOR;
105 COLOR 3,1
Первый параметр, который может принимать значения 1, 2 или 3,
устанавливает цвет экрана, на фоне которого будут воспроизводиться
графические объекты. Второй параметр принимает всего два значе-
ния—0 (или любое четное число) и 1 (или любое нечетное число).
Он управляет выбором палитры, определяющей набор цветов (табл. 8.1).
Таблица 8.1
Код цвета Палитра 0 Палитра 1
0 Черный Синий
1 Зеленый Зеленоватый
2 Красный Пурпурный
3 Коричневый Белый
8.4.2. Построение графических примитивов. К графическим при-
митивам, которые с помощью операторов бейсика немедленно ото-
бражаются на экране, относятся точка, отрезок прямой, прямоуголь-
ник и дуга окружности (эллипса).
Координаты точки (х, у) могут быть заданы либо целыми числами
из диапазонов 0 ^х^199 и 0^ у «С 319 (639), либо арифметиче-
скими выражениями, значения которых принадлежат указанным ин-
тервалам. Для занесения точки в буферную память дисплея исполь-
зуются два сходных по своему формату оператора:
105 PSET (х, у), N
110 PRESET (х, у), N
Здесь N — номер цвета, приписываемый точке (х, у). Он может при-
нимать значения от 0 до 3 и даже отсутствовать. По умолчанию
оператор PSET изображает точку основным центром, a PRESET —
фоновым.
Существует возможность наносить точки на экране, пользуясь
не абсолютными координатами, а относительными. В этом случае сме-
щению Дх должен обязательно предшествовать знак -f- или —.
Величины смещений (Дх, Ду), задаваемые в операторах PSET и
PRESET, определяют расположение новой точки относительно теку-
щей точки, записанной в буфер на предыдущем шаге. Если абсолют-
ные координаты новой точки выходят за пределы экрана, то в буфер
Ничего не записывается.
158
Отрезок прямой или прямоугольник на экране дисплея форми-
руются с помощью оператора LINE:
120 LINE [(Х1, У1)]-.(х2, у2) [Дп][, B[F]J]
Точка (хь ух), если она задана, определяет начало отрезка или на-
чальный угол прямоугольника. Если она опущена, то в качестве
начальной выступает текущая точка. Точка (х2, у2) задает конец
отрезка или противоположный угол прямоугольника. Необязательный
параметр п определяет цвет линии или цвет заливки площади пря-
моугольника. Параметр В или BF задается в том случае, если вместо
отрезка прямой необходимо построить контур прямоугольника i(B)
или нанести прямоугольник заданного цвета (BF—фигура с заливкой
внутренней области).
Координаты начальной или конечной точек могут быть заданы
как в абсолютных координатах’ экрана, так и в приращениях. Если
одна из точек —(хх, ух) или (х2, у2) — выходит за пределы допусти-
мого диапазона, то она заменяется соответствующим граничным зна-
чением. Если не задан номер цвета, то окраска линии, контура или
области прямоугольника выполняется основным цветом (п = 3 для
среднего разрешения и п=1 для высокого).
Дуга окружности или эллипса воспроизводится с помощью опе-
ратора CIRCLE, использующего до шести параметров:
130 CIRCLE (х0, у0), R[, n[, а0, ak[, кху]]]
Точка (х0, у0) задает абсолютные или относительные координаты
центра фигуры—окружности или эллипса. Окружность легко транс-
формируется в эллипс, если цены делений по осям х и у не совпа-
дают. Такая ситуация физически имеет место из-за прямоугольности
рабочего поля экрана. Кроме того, соотношение шагоа координатной
сетки может быть изменено программным путем за счет задания
коэффициента кху (кху = Дх/Ду). Если кху < 1, то величина R соот-
ветствует заданию радиуса по оси х. В противном случае (кху > 1)
параметр R задает радиус по оси у. Если величина кху в операторе
CIRCLE не задана, то система принимает меры к воспроизведению
достаточно «хорошей» окружности. Это означает, что в режиме сред-
него разрешения автоматически устанавливается кху = 5/6, а в режиме
высокого разрешения — кху = 5/12.
Код цвета п определяет окраску воспроизводимой дуги. По умол-
чанию выбирается основной цвет, т. е. п = 3 для среднего разрешения
или п=1 для высокого разрешения.
Начальная и конечная точки дуги определяются углами а0 и а^,
измеряемыми между осью х и соответствующими радиус-векторами,
проведенными из центра (х0, у0). Величины этих углов задаются
в радианах и должны принадлежать диапазону от —2л до 2л.
8.4.3. Формирование описания и построение полигональных фигур.
Полигональная фигура образуется на экране путем перемещения све-
159
Рис. 8.5, Кодировка
направлений движе-
ния луча
тового луча по вершинам ломаной линии — полигона. Отдельные участки
луч может проходить без засветки. Таким образом, имеется возмож-
ность формировать контуры многосвязных фигур. Полигональная
траектория описывается с помощью условных графических команд
(псевдокоманд), в которых используются одна или две буквы, сим-
волизирующие код графической операции,
-----------т------и некоторая числовая характеристика. На-
правления перемещений луча в одну из
восьми соседних точек координатной сетки
обозначаются буквами, приведенными на
рис. 8.5.
Команда R5, или R = 5, означает пере-
мещение луча по горизонтали вправо на
пять дискретов экрана. Длина перемеще-
ния может быть задана либо целым числом
п в виде Rn, либо целым положительным
значением арифметического выражения. В
последнем случае графическая команда на-
поминает оператор присваивания R = X*5—А, а для разделения двух
соседних команд такого вида используется точка с запятой:
Е = 20; F = 20; L = 40
Приведенный фрагмент соответствует треугольнику с вершинами
в точках (хг, уг), (хг+20, уг+20) и (хг+40, уг). Здесь через
(ху, Ут) обозначены координаты текущей точки, из которой должно
быть начато построение. На самом деле размеры указанного треуголь-
ника могут быть и другими, поскольку величины смещений в соот-
ветствующих графических командах дополнительно умножаются на
некоторый масштабный множитель X. Поэтому на экране дисплея
вершинами треугольника окажутся следующие точки:
(хг, у у), (ху-|-20*Х, уу-[-20*Х), (ху+40*Х, у у)
Масштабный множитель' X устанавливается с помощью графиче-
ской псевдокоманды Sn(S = n), например S16 или S=16. Операнд
этой команды должен принадлежать диапазону от 1 до 255. Целая
часть выражения п/4 и является масштабным коэффициентом X, дей-
ствующим на все последующие перемещения луча до очередной
команды S.
Кроме указанных команд перемещения из текущей точки по од-
ному из восьми направлений, мы имеем возможность установить луч
в точку с заданными абсолютными (х, у) или относительными (±х,
±у) координатами. Выполняется эта процедура с помощью графиче-
ской псевдокоманды М:
М = 20, 20; ЕЮ; М = + 10, —10
160
Любое из указанных девяти движений может быть выполнено с пога-
шенным лучом, т. е. без фиксации следа на экране. Для этого сим-
волу-коду операции графической псевдокоманды должна предшест-
вовать буква В:
Е = 20; F = 20; BL = 40
В этом примере основание треугольника не будет прорисовано, но
луч вернется в исходную точку (хг, уг)/
К числу установочных процедур относятся псевдокоманды уста-
новки цвета (Сп или С = п) и угла поворота последующего фрагмента
изображения (Ап или А = п). Номер цвета может принимать значения
от 0 до 3 для среднего или 0—1 для высокого разрешения. Угол
поворота на 0, 90, 180 или 270° устанавливается соответственно зна-
чениями аргумента псевдокоманды: 0, 1, 2 или 3.
Описание фигуры, составленное из перечисленных графических
команд, образует текстовую константу. Эту константу можно непо-
средственно указать в теле оператора DRAW или присвоить некото-
рой текстовой переменной, а затем в операторе графического вывода
указать имя этой переменной. Например:
10 LET AQ = *E = 20; F = 20; BL = 40"
100 DRAW AQ
или
200 DRAW *E = 20; F = 20; BL = 40*
Особое внимание хотелось бы обратить на графическую псевдо-
команду X, аргументом которой может быть либо строка, либо тек-
стовая переменная. Действие псевдокоманды X эквивалентно опера-
тору DRAW: она исполняет графическую программу, указанную в ее
операнде. Можно рассматривать выполнение псевдокоманды X как
обращение к графической подпрограмме. Это дает нам возможность
формировать фрагменты геометрических объектов, присваивать им
имена и в дальнейшем использовать их при компоновке или прори-
совке более сложных изображений.
8.4.4. Окраска многоугольников. Внутреннюю область много-
угольника, построенного с помощью описанных выше команд, можно
окрасить в один из допустимых цветов или изменить его окраску
впоследствии. Такого рода цветовые эффекты нам иногда предлагают
в музыкальных телевизионных программах.
Для заливки (окраски) ограниченной области используется опе-
ратор PAINT, имеющий следующий формат:
200 PAINT (х, у)[, п0[, пг]]
Здесь (х, у) — абсолютные или относительные координаты любой внут-
ренней точки окрашиваемой области. Номер цвета По определяет
6 Ю. Л. Кетков 161
оттенок, приписываемый веем внутренним точкам этой же области.
Номер цвета пг присваивается граничным точкам многоугольника.
Если один из этих цветов не указан, то у соответствующей компо-
ненты окраска сохраняется.
8.4.5. Обмен с экраном на «физическом» уровне. Графические
объекты, которые мы видим на экране, представляют собой отобра-
жение буферной памяти дисплея. Каждому пикселю экрана соответ-
ствуют два двоичных разряда в буферной памяти при среднем разре-
шении или один разряд при высоком. В этих разрядах хранится код
цвета соответствующей точки экрана. Если вырезать на экране неко-
торую прямоугольную область, то соответствующая информация о всех
ее точках может быть развернута в двоичный вектор.
Под физическим уровнем обмена понимают возможность прочи-
тать содержимое этого вектора в некоторый участок оперативной
памяти ЭВМ. или обратную операцию. Для выполнения таких дейст-
вий используются функция POINT, процедуры GET и PUT.
С помощью функции POINT можно «прочитать» состояния от-
дельной точки дисплея, расположенной на пересечении i-й строки
и j-ro столбца экранного растра. Например:
100 LET N=POINT(i, j)
Значение функции, равное —1, свидетельствует о том, что точка рас-
положена за пределами экрана (POINT(300, 300) = —1). В режиме
высокого разрешения функция POINT принимает только два значения
(0 или 1), в режиме среднего разрешения—четыре значения (0, 1,
2 или 3). Используя в цикле функцию POINT и оператор окраски
точки, можно произвести инвертирование цвета всего экрана или
отдельной его области. Например:
100 SCREEN 2
110 FOR 1 = 0 ТО 199
120 FOR J = 0 ТО 639
130 PSET (I, J), 1—PO1NT(I, J)
140 NEXT J
150 NEXT I
В результате работы этого фрагмента позитивное изображение на
экране сменится негативным.
С помощью функции POINT можно в цикле прочитать и запом-
нить состояние всех точек некоторой прямоугольной области экрана.
Однако эта программа будет выполняться достаточно долго и для
хранения информации о цветности каждой точки нам потребуется
в лучшем случае по два байта *) на точку вместо одного или двух
*) Длина самой короткой переменной арифметического типа
в IBM PC составляет два байта.
162
двоичных разрядов. Поэтому процедура чтения состояния точек эк-
рана гораздо более эффективно выполняется с помощью оператора
GET:
НО GET (10, 20) —(60, 80), А
Первый параметр с помощью координат (хх, yi) и (х2, у2) двух про-
тивоположных вершин прямоугольника задает границы считываемого
растра. Второй параметр определяет имя массива достаточной длины,
на место которого считывается содержимое выделенного фрагмента
буферной памяти дисплея. При этом в одном элементе массива А
будет расположена информация о нескольких точках экрана (в режиме
высокого разрешения вещественная переменная с обычной точностью
вмещает сведения о 32 пикселях).
Считанное таким образом содержимое буферной памяти дисплея
может быть подвергнуто программной обработке и вновь выдано на
экран с помощью оператора PUT:
180 PUT (xi, ух), А(, режим]
Здесь (xi, yi)—координаты верхнего левого угла прямоугольной
области на экране, в которую производится запись. Числовой
массив А хранит записываемую информацию в виде двоичного
вектора.
Несоответствие между способами задания области в операторах
GET (координаты двух точек) и PUT {одной точки) не должно вы-
зывать удивления. Дело в том, что при чтении (GET) в первых че-
тырех байтах массива А запоминаются линейные размеры выделенной
области — число битов по координатам X и Y соответственно. Третий
необязательный параметр управляет режимом наложения цветов вновь
записываемой информации на предыдущие цвета одноименных точек.
Этот параметр задается с помощью одного из ключевых слов OR,
AND, XOR, PSET или PRESET. Первые три из них формируют
результирующий цвет по правилам алгебры логики, причем соответ-
ствующая операция выполняется с двоичными эквивалентами кодов
цвета (2 AND 3 — 2, 2 OR 1 = 3, 3 XOR 2=1).
Режимы PSET и PRESET игнорируют предыдущий цвет точки
и устанавливают либо передаваемый новый цвет (PSET), либо его
негатив (PRESET).
С помощью указанных процедур можно реализовать перемещение
объекта на экране следующим образом. Сначала выдать объект на
экран в режиме XOR, затем перевычислить ловые координаты и сте-
реть прежнее отображение, повторив выдачу предыдущего образа
тоже в режиме XOR. После этих шагов повторяется выдача нового
кадра в режиме XOR я т.д.
6*
163
8.5. Метод блуждающей маски
Термин «блуждающая маска» широко используется в кинемато-
графии и телевидении. За ним скрывается серия приемов, исполь-
зуемых при комбинированных киносъемках. Один из них заключается
в раздельной съемке актера и фона. Для этой цели используются
специальные кинокамеры, в которых перед объективом протягиваются
одновременно две пленки. На ближней к объективу пленке] сни-
мают кадры с актером, а затем эту пленку проявляют. При повтор-
ном экспонировании проявленная пленка, вновь расположенная ближе
к объективу, играет роль непрозрачного экрана в тех участках кадра,
где расположена фигура актера. Так снимается «настоящий» фон,
заслоняемый фрагментами первоначальной съемки.
Еще одно приложение, связанное с идеей блуждающей маски,
хорошо знакомо лекторам, использующим кодоскопы различных кон-
струкций. На рабочем столе кодоскопа, подсвеченном снизу, распо-
лагают прозрачную пленку, на которой фломастерами наносят тек-
стовый и графический иллюстративный материал. Очень часто
лектор накладывает несколько слайдов один на другой, чтобы про-
демонстрировать динамическое развитие того или иного процесса.
Рис. 8.6. Схема располо-
жения экранных масок
1—полупрозрачные маски,
2—главный экран, 3—фо-
новый экран, 4—рамка
Описанные выше примеры привлечены для того, чтобы лучше
понять идею экранных масок, реализованную в персональном ком-
пьютере фирмы Sanyo (MSX). Эта ЭВМ снабжена цветным дисплеем,
который может использоваться как в цифровом (24 строки по 40 или
по 32 символа в каждой), так и в графическом режимах (256x192
точек с отображением каждой точки при высоком разрешении и
256x192 точек с отображением блоками размером 4X4 точки при
низком разрешении). Управление цветовыми возможностями в гра-
фическом режиме здесь несколько иное, чем на IBM PC. Однако
самая существенная особенность данного дисплея заключается в воз-
можности размещения перед основным изображением (текстом) до 32
полупрозрачных электронно управляемых масок (рис. 8.6). Основное
графическое изображение формируется на главном экране. Оно может
164
состоять из разноцветных отрезков прямых, дуг окружностей, зали-
тых и незалитых прямоугольников. На этом же экране располагается
и текстовая информация. Сквозь незанятые позиции главного экрана
«просвечивают» фоновый экран и окаймляющая его цветная рамка.
Для адресации точек на главном экране используется декартовая
система координат, начало которой расположено в левом верхнем
углу; ось х направлена вправо (0х^ 255), а ось у—вниз (0^1/^191).
Рис. 8.7. Примеры дискретных пиктограмм
Смысл экранных масок состоит в том, что нанесенные на них
разноцветные фигурки или узоры накладываются на основное изобра-
жение, затеняя и дополняя его. Более того, за счет перемещения
отдельных фигурок (узоров) по площади маски можно оживить общее
изображение подобно тому, как это происходит в мультипликационном
кино. При этом детали, изображенные на масках с меньшими номе-
рами, заслоняют все то, что находится дальше от пользователя.
На одной маске пользователь может расположить единственное
одноцветное изображение, напоминающее мозаику на поле в 8x8 или
16x16 квадратиков. Размеры этих квадратиков либо совпадают с раз-
мерами точек на главном экране (масштаб 1:1), либо превышают их
по площади в четыре раза (масштаб 2:1). На рис. 8.7 приведены
образцы некоторых фигурок.
Описание изображения (шаблона), предназначенного для воспроиз-
ведения на поле 8x8, выполняется с помощью шестнадцатеричных
констант. Формируются эти константы следующим образом. Каждая
165
строка матрицы (шаблона) описывается двумя шестнадцатеричными
цифрами, двоичное представление которых однозначно определяется
расположением светлых (нули) и темных (единицы) пятен в клеточках
строки:
OOO1\1OQO} -^/8
00 11\110 0\
0111\1110\ + 7E
+\00 01\10То\ + 18
^0T0l\l0 08\+18
В итоге символьные константы для каждой из строк объединя-
ются (операция конкатенации) в общую текстовую константу, значе-
ние которой присваивается одной из переменных служебного массива
SPRITE^
SPRHE$(K>=CHR$(&H18) + CHR$(&H3C) +
CHR$(&H7E) + CHR$(&HFF)4-CHR$(&H18) +
CHR$(&Hl8) + CHR$(&H18) + CHR$(&H18)
части
Для кодировки изображения, располо-
женного на поле размером 16x16, шаб-
лон разбивают на четыре части (рис. 8.8).
Для каждой из указанных частей в
порядке их нумерации строятся сим-
вольные константы, например А1$, А2$,
А3$ и А4$. Затем их общая «сумма» зано-*
сится на место выбранного элемента слу-
жебного массива SPRITE$:
А1 $ = CHR$(&H...) + CHR$(&H...)+...
A2$ = CHR$(&H.. .) + CHR$(&H..,.)+ ...
A3$ = CHR$(&H.. .) + CHR$(&H...)+...
A4$ = CHR$(&H.. .) + CHR$(&H. ..)+.-
SPRITE$(J) = A1$+A2$+A3$ + A4$
Служебный массив SPRITE$ позволяет запомнить до 256 различных
описаний шаблонов размером 8x8 или до 64 описаний шаблонов
размером 16x16.
Установка характеристик шаблонов, предназначенных для ото-
бражения на масках, определяется вторым параметром оператора
SCREEN:
SCREEN 2[ ,j]
166
По умолчанию принимается значение j = 0. В табл. 8.2 приведено
соответствие между величиной j и параметрами шаблона.
Таблица 8.2
I Размер шаблона Масштаб
0 8X8 1:1
1 8x8 2:1
2 16X16 1:1
3 16X16 2:1
Для переноса закодированного изображения из k-го элемента
массива SPRITE$ на маску с номером i используется оператор
PUT SPRITE:
PUT SPRITE i, (x, y), c, k
Здесь (x, у) — координата точки привязки шаблона на поле маски
(рис. 8.9), а с—код цвета темных пятен в шаблоне (О «С с «^15). Вы-
Рис. 8.9. Расположение k-го шаблона на i-й маске
полняя процедуру PUT SPRITE в цикле и меняя каждый раз коор-
динаты (х, у) точки привязки шаблона, мы можем имитировать дви-
жение объекта по экрану. Если на двух или более масках расположены
перемещающиеся объекты, то аппаратные средства позволяют опре-
делить момент, когда разные изображения начинают накладываться
друг на друга. Эта ситуация вызывает прерывание, которое можно
обработать программным путем. Для этой цели используются следую-
щие операторы:
ON SPRITE GOSUB N (указание точки вхдда для обработки
прерывания),
SPRITE ON (разрешение сигнала прерывания),
SPRITE OFF (блокировка сигнала прерывания),
SPRITE STOP (замораживание сигнала прерывания).
Техника работы с операторами подобного рода описана в гл. 10.
Глава 9. СЕГМЕНТАЦИЯ ПРОГРАММ
Под сегментацией обычно понимают возможность разбиения про-
граммы на отдельные части, независимую их отладку и компоновку
из таких частей достаточно больших программных комплексов. К сег-
ментации приходится прибегать в тех случаях, когда программа не
может целиком разместиться в оперативной памяти ЭВМ либо когда
за счет использования уже готовых блоков можно сократить затраты
на составление программы.
Отлаженные сегменты могут храниться как в виде текстов бейсик-
программ, так и в некотором промежуточном коде—результате полной
или частичной трансляции соответствующего фрагмента.
Библиотечные сегменты могут присоединяться к программе поль-
зователя, образуя таким образом новый текст исходной программы.
В таких случаях принято говорить о слиянии программ. Альтерна-
тивная возможность состоит в том, что затребованный сегмент вызы-
вается в оперативную память ЭВМ, исполняется и освобождает зани-
маемые им ресурсы. Возможны и некоторые модификации указанных
схем.
Отдельные фрагменты программы могут быть составлены на дру-
гих алгоритмических языках или непосредственно в кодах ЭВМ,
т. е. на языке ассемблер. Последнее бывает полезно при реализа-
ции каких-либо возможностей ЭВМ, не достигаемых операторами
бейсика.
В данной главе будут рассмотрены основные языковые средства,
имеющие отношение к проблеме сегментации и реализованные в раз-
личных версиях бейсика.
9.1. Включение машинных команд
в бейсик-программу
Возможность комбинирования операторов бейсика с группами
машинных команд представляет собой развитие идеи процедур-кодов,
предложенных С. С. Камыниным и Э. 3. Любимским в трансляторе
с алгола-60. Для бейсика попытка такого рода впервые была пред-
принята при создании системы пакетной обработки на базе ЭВМ
типа М-20.
168
Для включения машинных команд в исходную программу входной
язык был дополнен оператором БЭСМ*). Группа вставляемых команд
(вставка) предназначалась, как правило, для обращения к стандарт-
ным подпрограммам библиотеки ИС-2 (ИС-22). Помимо этого вставка
могла применяться и для реализаций функций, достижимых только
за счет использования машинных команд.
Каждая команда вставки оформлялась в виде отдельного опера-
тора БЭСМ. При написании вставки учитывались следующие ограни-
чения:
— вход во вставку разрешался только через первую команду
группы, которая условно считалась выполняемым оператором;
— внутренние передачи управления во вставке допускались (для
их организации можно было использовать метки строк или относи-
тельные адреса);
— вставка должна была заканчиваться пустым оператором БЭСМ.
В общем виде оператор БЭСМ имел следующий формат:
БЭСМ КОП,А1,А2,АЗ
Здесь КОП—две или три восьмеричные цифры, соответствующие
признакам модификации адресов и коду операции; А1,А2,АЗ — выра-
жения, соответствующие первому, второму и третьему адресам машин-
ной команды. В пустом операторе БЭСМ код операции и адресная
часть отсутствовали.
В качестве операнда машинной команды могли выступать:
абсолютный восьмеричный адрес—восьмеричное число, содержа-
щее от одной до четырех цифр, заключенных в кавычки;
относительный адрес—выражение вида * ± п (п—целое десятич-
ное число). Символ * обозначал адрес команды, в которой этот символ
использовался. Относительный адрес не должен был выходить за пре-
делы вставки;
метка—целое десятичное число, обозначающее номер программной
строки и соответствующее адресу входа в указанный оператор;
число — любое число, допускаемое входным языком, с предше-
ствующим символом «=» (аналог литеральной константы в автокодной
команде);
имя простой переменной — латинская буква или буква с цифрой;
имя массива—буква, заключенная в круглые скобки.
Употребление переменных с индексами в качестве операндов ма-
шинной команды было запрещено. Однако для работы с элементами
массива можно было использовать операнд-массив, модифицируя его
с помощью регистра адреса.
*) Своим происхождением оператор БЭСМ обязан названию ЭВМ
БЭСМ-ЗМ, на которой была реализована первая отечественная бейсик-
система.
169
Нулевые операнды в машинных командах можно было опускать,
сохраняя при этом нужное число запятых между оставшимися опе-
рандами.
Другая возможность подобного рода реализована в составе бейсик-
интерпретатора на ЭВМ Агат. Здесь команды ассемблера могут чере-
доваться с операторами бейсика. Признаком машинной команды (аналог
оператора БЭСМ) является восклицательный знак, который поме-
щается перед каждым оператором ассемблера:
! машинная команда
: ! машинная команда
После группы команд помещается признак выхода из ассемблера —
аналог пустой машинной команды (! :).
В состав входного языка интерпретатора на ЭВМ «Электроника
ДЗ-28» введен оператор CMD:
CMD XXXX,YYYYYYYY,ZZZZ,...
В теле оператора CMD записывается последовательность длинных
(8 восьмеричных цифр) или коротких (4 восьмеричные цифры) машин-
ных команд. Операнды машинных команд здесь только цифровые, что
существенно сужает сферу их применения и усложняет стыковку
с идентификаторами бейсик-программы.
9.2. Использование библиотеки машинных подпрограмм
Возможность обращения к любой из подпрограмм эксплуатирую-
щегося на ЭВМ библиотечного набора'характерна для ранних бейсик-
систем. Она была навеяна технологией работы с библиотеками про-
цедур на ЭВМ первых поколений, когда этот инструмент был, по сути
дела, единственным средством расширения возможностей программиста.
Основные преимущества работы с хорошо организованной библио-
текой сводятся к двум пунктам. Во-первых, в рамках бейсик-системы
сравнительно несложно сформировать обращение к той или иной под-
программе. Во-вторых, использование библиотечных процедур может
существенно повысить быстродействие системы, так как выполнение
подпрограммы происходит уже не на уровне интерпретации.
К недостаткам работы с библиотекой машинных процедур можно
отнести следующие моменты, связанные с развитием системы. Для
составления новых подпрограмм, хорошо приспособленных к специфике
ЭВМ и удовлетворяющих принятым принципам организации библио-
теки, требуются квалифицированные программисты. Другим слабым
местом является необходимость модификации соответствующих таблиц
бейсик-системы при подключении новых подпрограмм. От такой пере-
делки можно было бы избавиться, разрешив включение машинных
170
команд в текст исходной программы. Но и этим средством могли
пользоваться только профессионалы.
Известно несколько систем, в которых была предпринята попытка
организовать стыковку бейсик-программ с традиционно использовав-
шимися библиотеками машинных процедур. Среди них бейсик-система
на ЭВМ типа М-20, разрешавшая доступ к подпрограммам ИС-2 (ИС-22),
диалоговая система Бейсик-гамма, функционировавшая на ЭВМ
Минск-32*, некоторые модификации бейсик-интерпретатора на ЭВМ
М-6000.
Пользователю системы бейсик-222 предоставлялись две возмож-
ности. Он мог обратиться к стандартной программе с заданным номе-
ром с помощью самых обычных машинных команд. Например, для
вычисления определителя матрицы А размерностью 12х 12 с помощью
подпрограммы с номером Ncn = 57 это обращение выглядело так!
100 БЭСМ 46', * + 1/ 7501','7610'
ПО БЭСМ '52', (А),'57','14'
120 БЭСМ , 'l'„D
125 БЭСМ
Такой вариант предъявлял к уровню знаний пользователя достаточно
высокие требования. Поэтому наряду с ним была включена возмож-
ность вызова нужной подпрограммы с помощью оператора CALL.
Процедура, абсолютно идентичная приведенным выше четырем опера-
торам БЭСМ, теперь имела вид
100 CALL DET(A, 12, D)
Аналогичный путь был избран авторами системы Бейсик-гамма,
только вместо оператора CALL они ввели оператор LP (от Library
Program—библиотечная программа):
LP. имя. (параметры)
Среди параметров, передаваемых вызванной подпрограмме, могли при-
сутствовать простые переменные арифметического или символьного
типа, имена массивов, имена внутренних нестандартных функций,
номера операторов.
Более удачный подход с точки зрения стыковки с открытой,
т. е. допускающей расширение, библиотекой программ был предложен
сотрудниками Латвийского университета, которые отказались от зада-
ния имени вызываемой программы в операторе CALL. Вместо этого
они зарезервировали первый аргумент под номер библиотечной под-
программы и возложили на библиотеку функции по извлечению исход-
ных данных и засылке результатов. Модифицированный таким обра-
зом оператор CALL допускает переменное число параметров и не
требует изменения бейсик-интерпретатора при появлении новой библио-
течной процедуры:
CALL (Ncn> ai, аа, ., г)
171
9.3. Использование программ, составленных
на ассемблере
Программные модули, полученные в результате трансляции соот-
ветствующего текста на ассемблере, обладают всеми преимуществами
традиционных машинных процедур. По сравнению с библиотеками
подпрограмм использование этих модулей связано с некоторыми
накладными расходами. Приведение модуля в вид, готовый для выпол-
нения, требует предварительной настройки на соответствующие адреса
оперативной памяти и на возможные контакты с другими совместно
работающими модулями. Однако после загрузки и настройки ассембле-
ровский модуль может быть многократно использован и при хорошей
организации обеспечит максимальное быстродействие в выполнении
запрограммированной функции.
Для большинства современных мини- и микроЭВМ характерна
возможность так или иначе включить в состав бейсик-программы
один или несколько модулей, написанных на ассемблере. Так, напри-
мер, в одной из ранних версий бейсик-интерпретатора для ЭВМ
Электроника-60 была предусмотрена возможность обратиться к внеш-
ней функции:
100 LET Y = EXF(X + 5)
В пределах программы такая функция может быть только одна.
Однако количество ее аргументов не ограничивается. Поэтому имеется
возможность написать многовходовую ассемблеровскую подпрограмму,
при обращении к которой можно, например, первым параметром
задавать номер входа: EXF (Nbx » ах, а2, ...).
При загрузке ассемблеровской программы, как правило, пользо-
ватель должен задать ее начальный адрес в оперативной памяти.
Существует несколько способов выбора такого адреса. Во-первых,
имеется возможность установить максимальный или минимальный
адреса, доступные бейсик-системе. Тем самым мы освобождаем конец
или начало оперативной памяти для размещения загруженных моду-
лей. Во избежание неприятностей мы должны знать длины подклю-
чаемых программ. Однако операционная система, как правило, умеет
загружать несколько модулей последовательно—друг за другом —
и сама ведет учет свободных ячеек памяти.
Другой способ определения места в памяти для загружаемого
модуля использует стандартную функцию FRE, которая выдает адрес
первой свободной ячейки:
140 LET N = FRE(X)
Входной язык бейсик-систем на современных ПЭВМ разрешает
распределить в памяти до 10 ассемблеровских программ. Обычно для
этой цели используются операторы DEF USRs
172
150 DEF USR0 = N
160 DEF USR1=N+LO
170 DEF USR2 = N + LO + L1
Здесь N—начальный адрес пользовательских программ, L0—длина
программы с именем USRO, L1 —длина программы с именем USR1....
Заметим, что физическую загрузку нужной программы по ука-
занному адресу оператор DEF USR не производит. Эта процедура
осуществляется с помощью одной из директив операционной системы.
Например, на IBM PC для этой цели используется директива В LOAD:
BLOAD «имя» [ , адрес]
Для обращения к подпрограмме с условным номером i (i = 0, 1,2» 4 > 19)
используется функция USRi:
220 Y = USRi(X)
В качестве аргумента X, передаваемого вызываемой функции, может
быть, в частности, адрес той или иной программной переменной.
Например:
250 Z = USR5(VARPTR(A1))
В некоторых версиях бейсика для обращения к ассемблеровской про-
грамме используется оператор CALL:
CALL адрес (параметры)
Здесь адрес —число или значение переменной, соответствующее точке
входа в загруженную подпрограмму. Соглашения о способах передачи
фактических аргументов зависят от операционной системы и, есте-
ственно, должны учитываться при проектировании ассемблеровской
программы.
9.4. Доступ к ячейкам оперативной памяти
Возможность обмена с ячейками оперативной памяти может быть
использована для передачи параметров подпрограмме или для управ-
ления работой некоторых устройств.
Современные версии бейсика обычно предлагают для этой цели
две следующие процедуры:
В-РЕЕК(А)
РОКЕ А,В
Функция РЕЕК выдает содержимое байта оперативной памяти с адре-
сом А в виде целого числа из диапазона [0, 255]. Оператор РОКЕ
выполняет обратную операцию. С его помощью значение второго
аргумента (В) заносится в байт памяти по указанному адресу А.
173
Адреса ячеек оперативной памяти могут задаваться как в виде целых:
десятичных чисел (значений выражений), так и в виде шестнадцате-
ричных или восьмеричных констант.
В версиях бейсик-интерпретаторов, эксплуатируемых на мини-*
и микроЭВМ производства ГДР, наряду с указанными однобайтовыми
процедурами обмена используются их двухбайтовые аналоги—DEE К
и DOKE.
Дополнительные возможности по обмену информацией могут быть
реализованы с помощью упоминавшейся выше функции VARPTR
(от VARiable PoinTeR — указатель переменной). Эта функция сооб-
щает адрес простой переменной или элемента массива, указанных
в ее аргументе.
Иногда в качестве адресата по обмену может выступать специа-
лизированная память, например ячейки видеопамяти, в которых хра-
нится отображаемая графическая информация, или регистры, управ-
ляющие работой генераторов звуковых сигналов. Подобного рода
процедуры можно встретить в составе MSX-BASIC.
9.5. Использование подпрограмм, составленных
на других алгоритмических языках
Наиболее последовательным в этом плане нам представляется
расширение функций бейсик-интерпретатора на ЭВМ М-7000 (СМ-2,
СМ-2М). Здесь в полном объеме реализован аппарат вызова и испол-
нения внешних подпрограмм или функций, составленных на форт-
ране. Операторы обращения при этом ничем не отличаются от фортра-
новскях:
100 CALL RUNGE (X, Т, Н, FPR)
200 LET Y —BESL(I, N, Zf2)*SIN(Z)
9.6. Статическая сборка бейсик-программы
из библиотечных заготовок
Статический режим компоновки исходного текста программы
характерен тем, что формирование бейсик-программы завершается к мо-
менту начала ее выполнения. Он обычно используется в системах
компилирующего типа, в которых можно осуществить предварительный
просмотр текста программы и замену соответствующих ее строк на
специальным образом заготовленные библиотечные фрагменты.
Рассмотрим вариант такой компоновки на примере системы про-
граммирования Бейсик-EC. В этой системе наряду с основным режи-
мом ввода текста исходной программы предусмотрен еще один, уста-
навливаемый по директиве SUB и обеспечивающий ввод так называемых
библиотечных вставок.
174
По своему виду библиотечная вставка очень напоминает текст
исходной программы. Единственное отличие состоит в том, что номера
строк здесь начинаются с символа &. Например:
SUB
&10 LET S = 0
&20 FOR 1 = 1 TO N
&30 LET S = S + A(I)
&40 NEXT I .
В пределах вставки допускаются операторы перехода, в теле которых
могут фигурировать внутренние номера к стр ок, снабженные отличи-
тельным символом &(GOTO &30).
При вводе библиотечной вставки система производит стандартный
контроль номеров строк и имен операторов, расположенных сразу
вслед за номером. После ввода библиотечную вставку можно только
записать в архив по директиве SAVE или распечатать по директиве
LIST.
В режиме SUB в ЭВМ можно ввести несколько различных вста-
вок, запоминаемых в архиве системы, или откорректировать вставки,
уже находящиеся в архиве:
SUB
текст первой вставки
SAVE имЯ1
NEW
текст второй вставки
SAVE имя2
OLD имя3
исправления архивной вставки
SAVE имя3
Для возврата в режим обычного ввода исходной программы исполь-
зуется директива PROG.
Любая библиотечная вставка может быть вызвана из архива и
включена в текст исходной программы с помощью оператора COPY:
105 COPY SUMMAS
Если предположить, что имя SUMMAS соответствует фрагменту сум-
мирования массива А, приведенному выше, то в результате выполне-
ния оператора 105 в текст исходной программы будет считана и на-
строена по месту указанная вставка:
176
105 COPY SUMMAS
106* LET S = 0
116* FOR 1 = 1 TO N
126" LET S = S+A(I)
136* NEXT I
Звездочками условно помечены строки, появившиеся в результате
копирования библиотечной вставки. Удаление оператора 105 из текста
исходной программы приведет к одновременному удалению и всех
помеченных звездочками строк.
Настройка скопированного фрагмента всегда осуществляется сле-
дующим образом. Если N — номер строки с оператором COPY, то
первой прочитанной строке присваивается номер N + 1, а остальные
строки нумеруются с сохранением смещения относительно первой
строки. Если в теле вставки встречаются операторы, использующие
переход по относительному адресу (например, GOTO &30), то такие
адреса переходов заменяются на истинные.
Библиотечные вставки в системе бейсик-ЕС обеспечивают нечто
среднее между возможностями ассемблеровского оператора COPY,
позволяющего включить заготовленный фрагмент без каких-либо
изменений, и хорошо развитой системой макрогенерации. Последняя
«умеет» настраивать не только номера (метки) внутренних строк, но
и производить замену внутренних формальных параметров на их
истинные значения. Использование команд условной генерации может
изменить количество и последовательность вставляемых строк. На
наш взгляд, развитие оператора COPY в этом направлении могло бы
представить интерес и для бейсика.
9.7. Организация цепочки последовательно работающих
программ
Если большой программный комплекс легко расчленяется на
последовательно выполняющиеся фрагменты, целиком помещающиеся
в оперативной памяти, то их можно оформить в виде отдельных
программ и расположить во внешней памяти. Работа такого комплекса
начинается с вызова стартового сегмента, который, отработав, авто-
матически вызывает своего преемника. Результаты работы текущего
сегмента (значения переменных, массивы) тем или иным способом пе-
редаются вызванной программе.
При решении проблемы стыковки последовательно работающих
модулей приходится сталкиваться с несколькими моментами. Во-пер-
вых, алгоритм загрузки новой программы может предусматривать
следующие варианты:
— текст текущей программы уничтожается полностью и на ос-
вобожденное место помещается вызываемая программа;
176
— вызываемая программа накладывается на текущую подобно
тому, как это происходит при дополнительном вводе новых операто-
ров к уже существующему тексту;
— перед вызовом преемника в текущей программе удаляется
один или несколько фрагментов, а затем вызываемая программа
объединяется (сливается) с остатками своего предшественника.
Второй момент связан с передачей управления после выполнения
загрузки. Здесь тоже может быть несколько решений. Простейшее
решение состоит в том, что выполнение начинается с оператора, име-
ющего наименьший номер. Другое решение заключается в передаче
управления на оператор с заданным номером. Еще существует воз-
можность продолжить работу с оператора, следующего за оператором
вызова.
Третий, наиболее важный момент связан с передачей информации
от одной программы к другой. Наиболее распространенный подход к
решению этой проблемы заключается в дифференцированном исполь-
зовании оперативной памяти. Для внутренних переменных и масси-
вов, действие которых локализовано в пределах работающей программы,
отводится один участок ОЗУ. Переменным и массивам, значения ко-
торых должны быть переданы последующей программе, выделяется
место в другом участке памяти. По аналогии с фортраном эта область
носит название общей памяти. Да и сам оператор, предписывающий
поместить то или иное данное в общую память, отчасти заимствован
из фортрана:
COMMON Al, В( ), CQ
или
COM Al, В( ), CQ
Скобки вслед за именем означают, что в общую память должен быть
вынесен массив. В некоторых версиях бейсика описание размеров
массива и указание об его J принадлежности к транзитным данным
разделяют.
Другие системы позволяют совместить описание массива с опера-
тором COMMON:
10 COMMON А(1), В(12, 8), CQ
В связи с тем что в оперативной памяти появляется несколько
областей, некоторые версии бейсика предлагают пользователю средства
по очистке того или иного набора данных. Например, в состав ди-
ректив системы программирования на ЭВМ Искра-226 включены сле-
дующие модификации директивы CLEAR:
CLEAR — очистка поля программы и всех областей с внутренними
и транзитными переменными;
177
CLEAR V—очистка полей внутренних и общих переменных
с сохранением текста текущей программы;
CLEAR N — очистка поля внутренних переменных;
CLEAR Р [Ni][,N2] — очистка поля программы или удаление
заданного фрагмента с сохранением значений всех переменных.
Переход к следующей программе из заготовленной цепочки обычно
осуществляется с помощью оператора CHAIN. В простейшем слу-
чае (ДВК, СМ-Рафос, СМ-ОС РВ) этот оператор имеет следующий
формат:
CHAIN "имя* [, N]
При его выполнении текущая программа и значения внутренних пе-
ременных уничтожаются. После загрузки указанного программного
файла управление передается либо в его начало (N не задано), либо
оператору с номером N.
На современных ПЭВМ оператор CHAIN допускает больше воз-
можностей для маневра:
CHAIN [MERGE] "имя" [, [NBx] [, ALL]
[, DELETE N1~N2]J
Параметр MERGE задается в том случае, если вся текущая программа
или ее остаток после уничтожения фрагмента [Ni—N2] сливается с
вызываемой программой. Если параметр MERGE отсутствует, то ука-
зание о предварительном стирании DELETE Ni— N2 смысла не имеет.
Параметр ALL означает, что вызываемой программе передаются
значения как общих, так и внутренних переменных. Если он не за-
дан, то сохраняется только поле общих переменных.
Необязательный параметр NBx используется для задания точки
входа, с которой должен быть продолжен счет, если эта точка не
совпадает с началом новой программы.
Аналогичные возможности предлагает и оператор FETCH, реа-
лизованный в рамках диалоговой системы программирования ИКИ АН
СССР:
FETCH [Nx, N2] 'имя' [, NBX]
9.8. Динамическая загрузка и выполнение подпрограмм,
написанных на бейсике
Как частный случай цепочки последовательно работающих про-
грамм можно рассматривать ситуацию, когда основная программа,
постоянно находящаяся в оперативной памяти, динамически загружает
очередной библиотечный модуль и при необходимости передает
ему управление. Такой режим доступен при работе на ДВК, СМ-3,
178
СМ-4 под управлением операционных систем типа ОС ДВК, ОС
РВ, Рафос.
Дозагрузка программы с указанным именем осуществляется с по-
мощью оператора OVERLAY:
OVERLAY "имя" [, N]
Если в операторе OVERLAY опущен номер строки N, то загружае-
мый модуль присоединяется к текущей программе и выполнение
объединенной программы продолжается с оператора, следующего за
OVERLAY.
Если номер N задан, то после загрузки управление передается
указанной строке так, как если бы выполнялся оператор GOSUB N.
Завершение работы загруженного модуля по оператору RETURN пе-
редает управление основной программе.
Глава 10. ЭЛЕМЕНТЫ ПРОГРАММИРОВАНИЯ В РЕЖИМЕ
РЕАЛЬНОГО ВРЕМЕНИ
10.1. События и прерывания. Управление процессами
Термин «событие» интуитивно знаком любому человеку. Каждому
из нас <.приходится сталкиваться с массой различных событий — важ-
ных и второстепенных, радостных и печальных, запланированных и
неожиданных, не терпящих отлагательства и спокойно ожидающих
принятия соответствующих мер. Зазвонил будильник — это событие
мы запланировали на вполне определенное время. А вот вызов теле-
визионного мастера и неопределенный ответ диспетчера: «в течение
дня» — ситуация менее предсказуемая. Реакция на то или иное событие
может быть связана с определенными ответными действиями, в про-
цессе выполнения которых могут произойти одно или несколько дру-
гих событий (например, во время телефонного разговора раздался
стук в дверь и закипел чайник на кухне). Подобная ситуация совер-
шенно естественна для вычислительной машины. Действительно, обмен
между ЭВМ и внешним устройством представляет собой цепочку
взаимосвязанных событий —опрос готовности со стороны ЭВМ, ответ
устройства, передача или прием очередной порции данных, анализ
результатов обмена, повторение сбойной операции и т. п. Работа ЭВМ
связана с параллельным обслуживанием нескольких внешних устройств,
и все это происходит на фоне выполнения программ пользователей.
Управление процессами подобного рода осуществляется операционной
системой ЭВМ, точнее—ее частью под названием супервизор (монитор)
ввода/вывода. Последний, по сути дела, представляет собой анализа-
тор событий и набор соответствующих обрабатывающих программ.
В архитектуре современных ЭВМ уделяется большое внимание
развитию аппаратных и программных средств обработки прерываний,
Среди функциональных узлов вычислительной машины, имеющих пря-
мое отношение к этому вопросу, необходимо выделить регистр преры-
ваний и регистр маски прерываний. Возникновение того или иного
события приводит к занесению единицы в соответствующий разряд
регистра прерываний. Если при этом одноименный разряд регистра
маски «открыт», то выполнение текущего программного процесса
прекращается и управление передается операционной системе. В про-
180
тивном случае (разряд в регистре маски «закрыт») сигнал прерыва-
ния либо игнорируется, либо его обработка откладывается.
Обработка прерывания начинается с запоминания состояния
прерванного процесса—адреса текущей команды, содержимого реги-
стров, значения управляющих признаков, выработанных в предыдущей
команде, и т. п. Затем операционная система принимает предусмот-
ренные меры, по окончании которых обработанный разряд в регистре
прерываний сбрасывается, производит восстановление запомненного
состояния ЭВМ и возвращает управление прерванному процессу. Во
время обработки текущего прерывания операционная система может
блокировать менее важные события, вызываемые параллельно рабо-
тающими устройствами. Более приоритетные сигналы могут прервать
выполнение текущего обработчика, и эта ситуация напоминает ту,
что происходит при обращении к вложенным подпрограммам.
Работа с разрядами регистров прерываний и маски осуществляется
с помощью привилегированных машинных команд, которыми может
пользоваться только операционная система. Однако обработка неко-
торых прерываний программного или аппаратного характера может
быть передана пользователю. К таким событиям относятся програм-
мные ошибки, фиксируемые в процессе выполнения операторов, исчер-
пание данных на внешнем носителе, истечение определенного интер-
вала времени, появление сигналов от нажатия некоторых управляющих
клавиш на терминале ,или игровых пультах, обработка сигналов в
системах управления технологическими процессами и т. п. Програм-
мная обработка сигналов, поступающих от различных датчиков, и
выдача соответствующих управляющих воздействий характерны для
так называемых систем реального времени (real time system). Появился
даже термин «RT-BASIC», и его пользователям предлагается новая
расшифровка аббревиатуры BASIC—Beginner’s Automation language
for Simple Interactive Control problems (автоматический язык для
простого интерактивного управления). За последние годы появилось
много версий бейсика, обеспечивающих такие возможности. Среди них
RTE-B (Hewlett Packard), ВASIC/RT-11 и INDUSTRIAL BASIC (DEC),
ADAPTS и PROSIC (Varian)f POWER BASIC (Texas Instruments),
XYBASIC (Mark Williams), PROCESS BASIC (Unicomp), K-90 BASIC
(Kent Automation), FPL (Foxboro), CASIC В (Schlumberger), BASEX
(Dietz).
Взаимодействие между программой пользователя и операционной
системой по поводу обработки прерываний строится следующим обра-
зом. Вначале перечисляются события, на которые пользователь хотел
бы реагировать сам, и указываются точки входа в соответствующие
подпрограммы. Обычно для этой цели используется та или иная мо-
дификация оператора ON:
ON тип события GOSUB Ni, N2, ...» Nk
181
Задание нескольких входов для обработки прерывания связано с тем,
что события определенного типа могут быть порождены несколькими
причинами. Переключатель (ON) позволяет свести к минимуму ра-
боту по анализу источника прерывания. Иногда в таком назначении
могут присутствовать дополнительные условия, при выполнении ко-
торых программа должна начать обработку прерывания. Невыполне-
ние указанного условия приведет к игнорированию возникшего со-
бытия.
Два других, типа оператора используются для безусловного вклю-
чения или безусловной отмены блокировки сигнала прерывания в
случае наступления соответствующего события. Чаще всего они имеют
следующий формат:
тип события ON — разрешение (включение) прерывания
тип события OFF — блокировка (отключение) прерывания
Имеется еще одна разновидность временной блокировки перехода на
подпрограмму обработки возникшего события. Это так называемые
«замороженные» прерывания. Если мы заморозили определенное со-
бытие, а оно наступило, то эта ситуация запоминается. Как только
будет включено разрешение на обработку указанного события, отло-
женное прерывание мгновенно сработает. На ряде персональных
компьютеров такое временное замораживание выполняется с помощью
следующего оператора:
тип события STOP
Формат и наименования операторов, связанных с обработкой преры-
ваний, в других версиях языка могут отличаться от приведенных
выше. В качестве еще одного примера в табл. 10.1 приведен набор
Таблица 10.1
Формат оператора Выполняемая функция
ENABLE N, n, i, m, k DISABLE N IMASK m TRAP mx TO N IRTN Назначение входа (N) в подпрограмму обра- ботки прерываний от устройства (порта) вво- да/вывода с номером п при выполнении усло- вий, заданных кодами i, m, k Блокировка перехода на подпрограмму обра- ботки прерываний (N — точка входа в подпрог- рамму) Установка маски, блокирующей прерывания с номером уровня, большим m Условный переход на оператор с номером N, если уровень обрабатываемого прерывания со- ответствует пи Выход из подпрограммы обработки прерываний
182
соответствующих операторов «мощного» бейсика (POWER ВД$1С).
Выполняемые ими функции довольно сходные с ранее описанными.
Существуют и другие средства, пользуясь которыми задача мо-
жет манипулировать с битовыми шкалами, переходить в режим ожи-
дания одного или нескольких событий, производить измерения вре-
менных интервалов и т. п. Ниже мы рассмотрим конкретные примеры
программирования обработки подобного рода.
10.2. Операции с битовыми шкалами
Операции над битовыми шкалами наиболее полно представлены в
версиях бейсика на ЭВМ типа Wang 2200 и Искра-226. Здесь в состав
входного языка включены семь арифметико-логических операторов,
полный перечень и форматы которых приведены в табл. 17.7. Боль-
шинство из них по форме записи напоминает машинные команды
двухадресных ЭВМ:
ОПЕРАЦИЯ (Al, А2)
Имя арифметико-логического оператора эквивалентно коду операции
соответствующей машинной команды. В качестве операндов могут
выступать цепочки смежных байтов оперативной памяти, в которых
размещены значения текстовых переменных или элементов текстовых
массивов. Длина таких цепочек ограничена объемом ОЗУ. Результат
арифметико-логической операции, как и результат машинной команды,
заносится на место первого операнда. Дополнительное сходство с ма-
шинными командами придает и литеральный способ задания второго
операнда в форме явной однобайтовой константы (две шестнадцате
ричные цифры на месте А2).
Операнды в арифметико-логических операциях задаются тексто-
выми переменными, однако их содержимое выступает в операции как
многобайтовая логическая шкала. Самый правый байт операнда рас-
сматривается как восемь младших разрядов логической шкалы, и
при выполнении операций шкалы-операнды выравниваются по правому
краю. Если второй операнд А2 представлен однобайтовой константой,
то операция выполняется только над младшим байтом шкалы А1.
В остальных случаях длины аргументов выравниваются путем припи-
сывания короткому операнду недостающего количества нулевых бай-
тов. Так что после выполнения операции длина А1 может измениться.
Начальные значения разрядов логической шкалы можно сформи-
ровать по байтам с помощью оператора BIN, преобразующего целое
число .из диапазона {0, 255] в восьмиразрядный двоичный, код. На-
пример:
10 DIM А0(2)1
20 BIN (AQ(1)) = 25
30 BIN (AQ(2))==53
183
В результате двухбайтовая шкала, расположенная на месте массива AQ',
примет следующий вид:
10 15141312 11 10 9 8765432 1
к________v у__________________________>
AM) AM)
Такую шкалу можно было бы сформировать и с помощью обычного
оператора присваивания. Например:
20 LET BQ = HEX (1935)
Для очистки всех разрядов логической шкалы может быть ис-
пользован оператор IN IT:
150 INIT (00) AQ( ), BQ
Оператор INIT обеспечивает «роспись» одним и тем же кодом всех
байтов простой текстовой переменной или текстового массива. Раз-
множаемый таким образом код задается в круглых скобках либо в
виде двух шестнадцатеричных цифр, либо одиночным символом (А),
либо кодом из первого байта некоторой текстовой переменной (A5Q).
Шкалу из сплошных единиц можно сформировать, например, так:
10 DIM CQ(8) 10
60 INIT (FF)CQ( )
Удаление обработанного разряда из логической шкалы можно
выполнить с помощью логического умножения. Пусть, например, нам
нужно удалить пятый разряд из описанной выше шкалы AQ. Вы-
полняется эта операция так:
180 AND (AQ(2), DF)
Для вписывания единицы в заданный разряд шкалы нужно восполь-
зоваться операцией логического сложения. Приведенный ниже опера-
тор заносит единицу в 14-й разряд шкалы AQ:
190 OR (AQ(1), 20)
Оператор XOR (исключающее ИЛИ) может быть использован для
сравнения двух логических шкал на совпадение. Если в результате
получится тождественный нуль, то сравниваемые операнды совпадают.
Однако не надо забывать, что в результате такого сравнения первый
операнд будет испорчен. Поэтому более удобно сравнивать две тек-
стовые переменные обычным способом:
200 IF AQ = BQ THEN 240
184
Универсальная операция BOOL позволяет моделировать любое логи-
ческое действие путем выбора нужного кода операции Y, задаваемого
в виде шестнадцатеричной цифры:
/ ( YY А \
BOOLY(v,n. })
Результат операции BOOL, помещаемый на место первого one.
ранда (viQ), формируется в соответствии с табл. 10.2.
Таблица 10.2
Vi = l 1 0 0
Код Y Наименование операции V8=l 0 1 1 0
Результат
0 Vi: — 0 0 0 0 0
1 НЕ ИЛИ 0 0 0 1
2 НЕ ИМПЛИКАЦИЯ 0 0 1 0
3 НЕ V! 0 0 1 1
4 НЕ ИМПЛИКАЦИЯ 0 1 0 0
5 НЕ v2 0 1 0 1
6 ИСКЛЮЧАЮЩЕЕ ИЛИ 0 1 1 0
7 НЕ И 0 1 1 1
8 И 1 0 0 0
9 ЭКВИВАЛЕНТНОСТЬ 1 0 0 1
А vi: = v2 1 0 1 0
В , ИМПЛИКАЦИЯ (v2CZvi) 1 0 1 1
С Vi: = Vi 1 1 0 0
D ИМПЛИКАЦИЯ (viCZv2) 1 1 0 1
Е ИЛИ 1 1 1 0
F vi: = l 1 1 1 1
Сложение битовых шкал выполняется с помощью операторов ADDC
или ADD. Отличаются эти операторы друг от друга только тем, что
в одном случае (ADDC) перенос, возникающий в старшем разряде
байта, передается на суммирование с младшим разрядом следующего
(более левого) байта, а во втором случае (ADD) межбайтовый перенос
игнорируется.
Наконец, последняя из серии арифметико-логических операций —
ROTATE выполняет циклический сдвиг влево на n (1 п 7) раз-
рядов с переносом выдвигающихся старших разрядов байта в его же
младшие разряды. Например, после выполнения оператора ROTATE
(AQ, 5) шкала AQ (см. выше) примет вид
7g#141312 10 9 S 7 6 5 А З 2 1
||г|о|7|ф|ф|/?|
185
В реальных установках обычно используются короткие логические
шкалы —длиной 1—2 байта. Поэтому для их хранения вполне доста-
точно места, занимаемого в памяти простыми арифметическими пе-
ременными. Именно по такому пути пошли разработчики бейсик-си-
стем, эксплуатируемых под управлением операционной системы СР/М
или ее аналогов на различных микроЭВМ. Для хранения логических
писал здесь используются двухбайтовые переменные целого типа. Их
значения рассматриваются как 16-разрядные двоичные шкалы, над
которыми можно выполнять логические операции типа: NOT (отрица-
ние), AND (умножение), OR (сложение), XOR (исключающее ИЛИ),
EQV (эквивалентность) и IMP (импликация). Например:
48 AND 18= 1100002& 0100102 = 0100002= 16
25 OR 5 = 110012 V 001012 = 111012 = 29
19 XOR 19=100112ф 100112 = 000002 = 0
Не следует забывать, что в ЭВМ отрицательные целые числа обычно
представлены в дополнительном коде (—5~111...1011). Поэтому
операцией NOT надо пользоваться крайне аккуратно.
Довольно удачное решение, связанное с анализом и формирова-
нием битовых шкал, найдено в версии POWER BASIC (TI). Здесь
введены функция и оператор BIT, используемые соответственно для
анализа любого разряда шкалы или его установки в нужное значение.
Например:
100 IF BIT (V5, 12) THEN 240
140 BIT (V5, 6)=1
180 BIT (V5, 12) = 0
Здесь V5—имя переменной, значение которой выступает в качестве
логической шкалы. Номер проверяемого или устанавливаемого раз-
ряда задается вторым аргументом функции (оператора) BIT.
При работе с двоичными шкалами могут пригодиться и различ-
ные функции, выполняющие прямые или обратные преобразования
над целыми десятичными числами и их двоичными, восьмеричными
или шестнадцатеричными эквивалентами. Примерами таких процедур
являются функции BIN и BIN$ (BINQ), ОСТ и ОСТ$ (OCTQ),
HEX и НЕХ$ (HEXQ).
С помощью функций РЕЕК и DEE К можно извлечь соответственно
однобайтовую или двухбайтовую шкалу, расположенную по указан-
ному адресу оперативной памяти. Запись по заданному адресу вы-
полняется операторами РОКЕ (один байт) или DOKE (два байта).
186
10.3. Обработка пультовых сигналов прерывания
Терминальная аппаратура современных мини- и микроЭВМ снаб-
жается разнообразными техническими средствами, обеспечивающими те
или иные методы взаимодействия пользователя с исполняющейся
программой. Среди них —функциональная клавиатура, предназначен-
ная для выполнения фиксированных или программируемых действий,
устройства для организации интерактивного графического взаимодей-
ствия (световые перья, рычаги управления перемещением специальных
отметок, двухкоординатные устройства управления типа «шар» или
«мышь», координатоскопы), сенсорные клавиши или панели, различ-
ные игровые пульты. Большинство этих устройств отличается актив-
ным характером воздействия на ЭВМ. С их помощью человек готовит
информацию, предназначенную для передачи программе, а затем
нажимает кнопку или клавишу, вызывающую прерывание. В этот
момент необходимо прервать работающую программу, принять подго-
товленное пользователем сообщение и учесть его в дальнейшей работе.
Другие устройства имеют пассивный характер. Они не вызывают
прерываний и поэтому используются в программах, построенных по
принципу «вопрос-ответ». Например, программа выдает на экран
дисплея определенное меню, а спустя некоторое время опрашивает
координаты курсора и точки сенсорной панели, с помощью которых
пользователь мог отреагировать на запрос ЭВМ.
Ниже мы рассмотрим основные приемы программирования, свя-
занные с использованием наиболее распространенных пультовых
средств управления.
10.3.1. Использование программируемой функциональной кла-
виатуры. Непременной принадлежностью современных дисплейных
терминалов являются программируемые функциональные клавиши.
Их специфика состоит в том, что в момент нажатия j-й функциональ-
ной клавиши в ЭВМ вместе с сигналом прерывания поступает код,
однозначно определяющий номер клавиши. По этому коду обработчик
прерываний может передать управление соответствующей системной
или пользовательской программе. Отсюда и название клавиши — про-
граммируемая, т. е. допускающая оперативную смену выполняемой
функции.
Системная функция, закрепляемая за клавишами такого типа,
обычно состоит в ускоренном наборе часто используемых слов или
предложений. Например, приписываем первой функциональной кла-
више (ПФ1) текст «FOR К=1 ТО N», а второй (ПФ2) клавише —
текст «NEXT К». Тогда в режиме ввода программы с автоматической
нумерацией строк для набора операторов цикла достаточно нажатия двух
клавиш—ПФ! и ВВОД или ПФ2 и ВВОД. На самом деле мы можем
включить в состав приписываемого текста и управляющий символ, соот-
ветствующий клавише ВВОД. На разных ЭВМ это делается по-раз-
187
ному—либо с помощью функции CHAR$, либо с помощью шестнадцате:
ричной константы. Тогда набор указанных операторов вообще может
быть сведен к нажатию единственной функциональной клавиши.
Обычно этим пользуются для набора и выполнения наиболее употре-
бительных директив, не требующих задания параметров (RUN, CONT,
TRON, TROFF и т. п.).
Клавиатура ЭВМ Искра-226 содержит 16 функциональных кла-
виш, которые в сочетании с переключателем регистров (верхний —
нижний) обеспечивают выдачу 32 различных сигналов прерывания.
Можно считать, что в нашем распоряжении имеются как бы 32 кла-
виши, за которыми закреплены номера 0, 1, 2, ..., 31. Для того
чтобы система «запомнила» текст, присваиваемый клавише с номером j,
необходимо указать этот текст в теле оператора DEF FN'j. Например:
100 DEF FN'l 'FOR К=1 ТО N'
105 DEF FN'2 'NEXT К"
На других ЭВМ аналогичная процедура может выполняться несколько
иначе. Так, например, клавиатура персональных компьютеров фирм
IBM и Sanyo предоставляет в распоряжение пользователя 5 функцио-
нальных клавиш, которые в сочетании с переключателем регистра
(Shift) дают 10 комбинаций с номерами 1, 2, ..., 10. Приписка
к j-й клавише текста, заданного явно в виде константы или неявно
в форме значения переменной, осуществляется с помощью одного из
следующих операторов:
KEY j, "SA ... Sk'
KEY j, v$
Длина текста, присвоенного таким образом, не допжна превышать
15 символов (0^к<: 15). Входной язык этих систем наряду с набо-
ром новых текстов обеспечивает возможность просмотра ранее припи-
санных «значений». Можно, например, выдать на экран дисплея пол-
ный список всех десяти текстов, воспользовавшись оператором (дирек-
тивой) KEY LIST. Дополнительная и более удобная возможность
состоит в постоянном отображении приписанных текстов на экране.
Для этой цели используется специально выделенная служебная строка.
По оператору KEY ON в эту строку заносятся начальные 6 символов
текста, закрепленного за каждой из клавиш. При длине строки
в 40 символов отображаются тексты, приписанные клавишам F5—F10.
Наличие постоянной подсказки в служебной строке существенно
облегчает ориентацию пользователя. Более того, без нее трудно
обойтись, если на разных этапах диалога «значение» функциональной
клавиши будет меняться. Сброс служебной строки производится с по-
мощью оператора KEY OFF.
Другая сфера применения функциональной клавиатуры опреде-
ляется возможностью исполнения подпрограммы, составленной поль-
188
зователем, по нажатию соответствующей клавиши. В простейших
случаях такая возможность превращает ЭВМ в запрограммированный
калькулятор. С этой целью мы вводим в оперативную память несколько
подпрограмм. Они могут быть либо полностью независимыми, либо
использовать результаты работы других подпрограмм, так как все они
имеют доступ к общему набору глобальных переменных. Запуск такой
подпрограммы осуществляется нажатием одной функциональной кла-
виши, а после окончания работы подпрограммы управление возвра-
щается пользователю. Именно таксой режим обслуживания возможен
на ЭВМ Искра-226. Установление связи между номером функцио-
нальной клавиши j (0< j <31) и точкой входа в приписываемую
подпрограмму осуществляется с помощью Оператора DEF FN'j, поме-
щаемого в начале процедуры. Пусть, например, нам понадобилось
многократно вычислять значения гиперболического синуса (shx). Это
можно было бы организовать следующим образом:
150 DEF FN'3
160 INPUT "ВВЕДИТЕ АРГУМЕНТ"; X
170 PRINT (ЕХР(Х) —ЕХР(—Х))/2
180 RETURN
Нажатие клавиши ПФЗ вызовет переход на оператор 150. Конечно,
такую процедуру можно было бы реализовать и по-другому, например
заменить оператор RETURN на STOP и передавать управление
процедуре по директиве GOTO 160.
Другая, более интересная возможность связана с использованием
функциональной клавиатуры во время выполнения программы. При
нажатии функциональной клавиши в этом случае происходит преры-
вание вычислительного процесса и управление передается подпрограмме
обработки, приписанной к данной клавише. После завершения ее
работы можно либо продолжить прерванный процесс, либо передать
управление в заранее предусмотренное место. Для организации такого
возврата из подпрограммы обработки прерываний в первом случае
используют оператор RETURN, а во втором —RETURN N. Выход
по оператору GOTO N не допустим по тем же причинам, по которым
им’нельзя пользоваться для возврата из обычных подпрограмм. Дело
в том, что начальная фаза системной обработки прерываний напоми-
нает выполнение оператора GOSUB. Адрес оператора исходной про-
граммы, перед исполнением котррого зафиксирован сигнал прерыва-
ния, заносится в стек возвратов. Поэтому обычный оператор RETURN,
встретившийся в процедуре обработки прерывания, возвратит нас на
продолжение прерванного процесса. А оператор RETURN N кроме
передачи управления на строку с номером N произведет еще и
очистку верхушки стека возвратов. Если этого не сделать, то после-
дующее выполнение операторов RETURN может привести к непредска-
зуемым последствиям.
189
Описанный выше способ использования функциональной клавиа-
туры реализован на персональных компьютерах фирм IBM и Sanyo'
Задание входных точек, связанных с обработкой прерываний от раз-
ных клавиш, производится с помощью оператора ON KEY. Напри-
мер, если наша программа ориентирована на обработку прерывания
от трех разных клавиш, то в нее необходимо включить оператор типа
10 ON KEY GOSUB 180, 300, 200
Сразу же надо предупредить, что метка 180 вовсе не означает точку
входа для обработки сигнала прерывания от клавиши F1. Для первой
подпрограммы обработки прерываний можно назначить любую функ-
циональную клавишу, например F5, для второй подпрограммы—F3,
для третьей — F2. Соответствие между входами в операторе ON KEY.,,
и номерами клавиш устанавливается в порядке выполнения операто-
ров, разрешающих прием сигналов прерывания:
20 KEY (5) ON
30 KEY (3) ON
40 KEY (2) ON
Конечно же, не надо доводить эту возможность до абсурда. И проще
будет запомнить, что первая (F1) клавиша соответствует первой (180)
подпрограмме, вторая (F2)—второй и т. д.
Блокировка приема и обработки сигнала прерывания от той или
иной клавиши осуществляется с помощью оператора KEY(n) OFF
(здесь п — номер блокируемой клавиши).
Довольно удачный пример, демонстрирующий временную диаг-
рамму взаимодействия основной программы и подпрограммы обработки
прерывания, приведен в руководстве по персональному3 компьютеру
фирмы Sanyo. Прокомментируем этот пример, так как он хорошо
иллюстрирует некоторые нюансы использования операторов KEY(n) ON,
KEY(n) OFF и KEY(n) STOP.
Пример 10.L Обработка прерываний (простейший вариант).
10 ON KEY GOSUB 100
20 KEY(l) ON
30 SCREEN 2
40 LINE (50, 50)—(200, 150),, В
50 GOTO 40
100 REM ОБРАБОТКА ПРЕРЫВАНИЯ
ПО BEEP : CLS
120 FOR K=10 TO 90 STEP 10
130 CIRCLE (120, 100), К
140 NEXT К
150 CLS
160 RETURN 40
190
Простейший вариант состоит из основной программы (операторы 10—
ЙО) и подпрограммы реакции на нажатие клавиши F1 (операторы
100—160). В основной программе объявляется точка входа в под-
программу обработки прерывания (оператор 10) и дается разрешение
на прием сигналов от нажатия F1. Затем головная программа вклю-
чает графический режим работы с экраном (оператор 30) и зацикли-
вается на операторе 40, осуществляющем построение прямоугольника
с указанными координатами противоположных угловых точек. В момент
Рис. 10.1. Диаграмма смены изображений с блокировкой прерываний
первого нажатия клавиши F1 выполняется переход на подпрограмму
с одновременной блокировкой повторных прерываний до завершения
работы подпрограммы. Подпрограмма заявляет о начале обработки
звуковым сигналом (ВЕЕР) и очисткой экрана (CLS). Затем она
начинает строить 9 концентрических окружностей с центром в точке
(120, 100), а по окончании работы стирает экран и передает управление
на 40-й оператор основной программы. Дальше картина повторяется.
Новое нажатие F1 вызывает звуковой сигнал, стирание прямоуголь-
ника и построение семейства окружностей. Условная блок-схема этого
процесса приведена на рис. 10.1. Действия в блоках с штриховыми
контурами выполняются системными программами. Что произойдет,
если во время работы подпрограммы повторно нажать клавишу F1?—
Работа подпрограммы не прерывается, но факт нажатия запоминается.
И, как только сработает выход из подпрограммы, основная программа
будет прервана сразу же. Прямоугольник на экране появиться
не успеет.
Системный запрет на временную блокировку прерываний в под-
программе можно отменить, выполнив повторно оператор KEY(l) ON.
Например, его можно включить в приведенный выше фрагмент под
номером 105. Теперь уже вторичное нажатие клавиши F1 во время
вывода концентрических окружностей прервет этот процесс и заставит
подпрограмму начать свою работу заново. Соответствующая схема
взаимодействия отражена на рис. 10.2.
191
Более сложная цепочка смены изображений может быть реализо-
вана подпрограммой (см. пример 10.2), в которой часть операторов
выполняется с разрешенными прерываниями, а часть — в режиме вре-
менно замороженного прерывания.
Рис. 10.2. Диаграмма смены без блокировки прерываний
Пример 10.2. Подпрограмма с частичной блокировкой преры-
вания.
100 REM ПОДПРОГРАММА
105 KEY(l) ON
ПО ВЕЕР : CLS
120 FOR К= 10 ТО 90 STEP 10
130 CIRCLE (120, 100), К
135 IF К = 50 THEN KEY(l) STOP
140 NEXT К
150 CLS
160 RETURN 40
Если теперь повторное нажатие Fl произойдет до момента построения
пятой (К = 50) окружности, то оно прервет работу подпрограммы и
вызовет переход на оператор 100. Если же пятая окружность уже
появилась на экране, то нажатие F1 прерывания не вызовет, так как мы
его заморозили по оператору KEY(l) STOP. Но зато после возврата
в основную программу запомненное системой прерывание мгновенно
срабатывает. Для того чтобы вообще заблокировать реакцию на пре-
рывание от клавиши F1, придется выполнить оператор KEY(l) OFF.
10.3.2. Маркировка объектов и манипуляция изображениями на
экране дисплея. Диалог между пользователем и программой сущест-
венно обогащается благодаря применению различных электронных
«указок>/, с помощью которых можно выделять тот или иной стати-
ческий предмет на экране дисплея или управлять перемещениями
движущихся изображений. Такие возможности очень важны в задачах
машинной графики, в обработке текстовых документов, в программи-
ровании электронных игр.
Одним из средств целеуказания является «световое перо», которое
по своей форме напоминает авторучку или карандаш, снабженный
192
светочувствительным элементом и микровыключателем. Существуют
и другие конструкции, в которых вместо механического выключателя
применяется емкостный датчик. Для целеуказания световое перо под-
водят вплотную к выбранному объекту на экране дисплея и нажимают
микровыключатель. В этот момент срабатывает электронная схема,
которая подсчитывает число шагов, пройденных лучом развертки от
начальной позиции (левый верхний угол) до точки встречи со свето-
чувствительным элементом. По найденному числу формируются коор-
динаты отмеченной точки, а затем в ЭВМ поступает сигнал прерыва-
ния. Если программа пользователя 'готова к обработке указанного
события, то управление передается в соответствующую точку.
Привязка точки входа в подпрограмму обработки прерывания на
IBM PC осуществляется с помощью оператора ON PEN GOSUB N.
Если указанный номер строки N равен нулю, то это эквивалентно
игнорированию прерывания. Назначение входа в подпрограмму обра-
ботки еще не означает, что ей будет передано управление в момент
возникновения прерывания. Для этого должно быть включено разре-
шение на переход, выполняемое оператором PEN ON. Временная
задержка с обработкой прерывания устанавливается по оператору
PEN STOP. С помощью оператора PEN OFF устанавливается режим,
при котором сигналы прерывания от светового пера вообще игно-
рируются.
Получив управление, подпрограмма обработки может опросить
состояние светового пера с помощью функции PEN(k). При разных
значениях к (0*Ск^9) эта функция выдает соответствующую инфор-
мацию об отмеченной точке (координату х или у, номер строки или
столбца) или о положении дополнительного переключателя на световом
пере. Этими данными можно воспользоваться для реализации преду-
смотренных процедур над отмеченным объектом — изменения окраски,
перемещения, стирания и т. п.
Другим средством интерактивного графического взаимодействия
являются различные управляющие рычаги, шары, вращающиеся
в гнезде, или коробочки типа «мышь», похожие на детскую игрушку,
которую можно катать по поверхности стола. Обычно они располагают
двумя степенями свободы, каждая из которых связана с перемещением
регулятора соответствующего потенциометра. Вырабатывая две состав-
ляющие напряжения, эти устройства позволяют установить связь между
положением рычага (шара) и координатами электронной указки — мар-
кера на экране дисплея. Форма этого маркера может быть любой,
так как его изображение генерируется программой пользователя и
перемещается по экрану также под управлением программы.
Управляющий орган обычно снабжается одной или несколькими
кнопками, с помощью которых в ЭВМ можно передать не только
новые координаты маркера, но и цифровой код, интерпретируемый по
выбранному пользователем алгоритму. Сигналы прерывания передаются
7 ю. л. Кетков 193
в ЭВМ шт нажатию одной’ из управляющих кнопок: или поступают
с определенной частотой, регулируемой аппаратными средствами.
В- качестве примера рассмотрим возможности рычажного управле-
ния на. персональном компьютере MSX. Его клавиатура допускает
использование трех независимых средств управления. Первое—это
обычная- клавиша пробела, около которой, размещен кнопочный выклю-
чатель. В отжатом положении, выключателя клавиша пробела преры-
ваний. не вызывает, и используется обычным образом. Если кнопка
выключателя утоплена, то каждое нажатие клавиши пробела генери-
рует сигнал прерывания. В примере 10.3 очередное нажатие клавиши;
пробела вызывает изменение цвета экрана. Параметр S-, задающий код:
цвета, при этом циклически пробегает значения от 0 до 15.
Пример 10.3. Изменение окраски экрана.
10 ON STRIG GOSUB 100
20 STRIG(O) ON
30 S=0 : CLS
40 GOTO 40
100 COLOR , S, S
110 S = S+1 : IF S > 15 THEN S = 0
120 RETURN 40
Ниже мы остановимся более подробно на функциях операторов ON
STRIG ... и STRIG(n).
Два других устройства управления—рычажного типа. Каждое
из -них напоминает рычаг переключения скоростей в автомобиле и
имеет девять фиксируемых положений. Нейтральная «скорость» соот-
Рис. 10.3.
ветствует вертикальному положению рычага,
которому приписан нулевой номер. Осталь-
ные восемь пронумерованы по часовой
стрелке (рис. 10.3). Программа пользователя
может опросить состояние каждого рычага
с помощью одной из функций:
У = 8ТГСК(1)
Y = STICK(2)
В качестве результата будет получено це-
лое число из диапазона от 0 до 8.
Наличие двух рычагов позволяет программировать игры с уча-
стием двух партнеров. Каждый из рычагов снабжен двумя кнопками
с условными номерами 1 и. 2. Нажатие любой из них запоминается
на соответствующем триггере системы управления и вызывает сигнал
прерывания. Таким образом, перечисленные устройства являются
инициаторами возникновения пяти - разных событий — нажатие кла-
виши пробела при утопленном положении выключателя, нажатие пер-
вой кнопки на первом рычаге, нажатие первой кнопки на втором
194
рычаге и т. д. Для их обработки в программе пользователя мы должны
установить соответствие между номером события и меткой входа в ту
или иную подпрограмму. Делается это с помощью оператора ON
STRIG GOSUB ...» в теле которого можно указать до пяти входов:
ON STRIG GOSUB NnP, Nllf N21, N12, N22
Мнемоника индексов в этой строке призвана подчеркнуть тип соот-
ветствующего события (Njj — i-й рычаг, j-я кнопка).
«Любое из указанных событий мы можем разрешить, запретить
или заморозить, используя один из операторов вида STRIG(n) ON,
STRIG(n) OFF или STRIG(n) STOP. Числовой параметр п, соответ-
ствующий номеру события, может принимать значения от 0 до 4.
Независимо от того, тде мы находимся —в основной программе
или в подпрограмме обработки какого-нибудь прерывания, всегда
имеется возможность опросить состояние любого из пяти управляющих
триггеров, связанных с перечисленными выше событиями. Делается
это с помощью функции X = STRIG(n), где и—номер опрашиваемого
триггера (n=0, 1, *..,4). Управляющий триггер хранит информацию
о связанном с ним событии с момента его возникновения (нажатия
соответствующей кнопки или клавиши) до момента сброса. Сброс
триггера n-го события происходит либо в момент передачи управления
подпрограмме обработки этого события, либо в момент опроса состоя-
ния триггера с помощью функции STRTG(n). В качестве значения
этой функции выдается 0, если соответствующее событие в данный
момент не зарегистрировано, и 1, если указанное событие имело место.
Использование функции STRIG(0) позволяет несколько видоизменить
приведенный ранее пример 10.3 с чередованием цвета экрана.
Пример 10.4. Модификация программы изменения цвета экрана.
10 S = 0 : CLS
20 COLOR, S, S
30 IF STRIG(0) = 0 THEN 20
40 S = S+1 : IF S > 15 THEN S = 0
50 GOTO 20
Сочетание функций STICK и STRIG позволяет выводить на экран и
перемещать по нему различные маркеры или фигурки в соответствии
с запрограммированным алгоритмом.
10.4. Временные измерения и организация
«будильника»
Нынешним пользователям могут показаться странными некоторые
приемы программистов первого поколения, которые контролировали
прохождение своих задач на глаз и на слух. Если на пульте управ-
ления устанавливалась застывшая конфигурация светящихся индика-
торов или резко нарушалось характерное для данной задачи звуковое
7* 195
сопровождение *), то надо было принимать срочные меры. Дополни-
тельным средством контроля могли служить обычные часы. Если
в течение заданного интервала времени программа не выдавала на
печать ожидаемых результатов, то оператору предписывалось снять
задачу, проверить ЭВМ и повторить запуск программы.
Сегодня автоматическое обслуживание пакетного или диалогового
режимов обработки программ немыслимо без учета временных харак-
теристик многочисленных процессов, проистекающих в ЭВМ. Среди
них контроль за временем отклика различных внешних устройств,
распределение ресурсов центрального процессора между параллельно
работающими пользователями, протоколирование событий и т. п.
Поэтому современные ЭВМ снабжены разнообразными электронными
приборами, регистрирующими календарные даты и астрономическое
время, контролирующими истечение заданного временного интервала,
учитывающими временную статистику работы отдельных устройств и
блоков ЭВМ. Ниже рассматриваются основные функции и операторы,
включенные в состав различных версий бейсика для использования
временных характеристик в программно-управляемых процессах.
Наиболее распространенные процедуры связаны с установкой и
опросом текущих показаний календаря (даты) и часов. Конечно, на
ЭВМ с круглосуточным режимом работы не так уж и часто прихо-
дится менять текущую дату и время. Но персональный компьютер мы
можем выключить, уходя на обед. Поэтому некоторые версии бейсика
позволяют производить начальные установки даже на уровне опера-
торов языка. В ряде реализаций введены так называемые системные
переменные, текущие значения которых формируются аппаратно-
программным способом. Обозначения этих переменных на разных ЭВМ
варьируются незначительно: CLKQ (от clock —часы), Т1МЕ$ (от
time—время), DATQ или DATE$ (от date—дата). Их значения
обычно формируются в виде цепочки символов ЧЧ-ММ-СС (часы-
минуты-секунды), ДД-МММ-ГГ (день-месяц-год). Программа может
извлечь интересующие ее данные обычными операторами присваивания:
100 LET TQ = CLKQ
ПО LET DQ = DATQ
Сравнительно просто преобразовать символьный формат получен-
ного значения в числовой. Для этой цели используются стандартные
функции типа VAL или STR. Таким образом, программа может
зафиксировать время начала процесса и время его окончания, а по их
разности судить о длительности того или иного процесса.
В других системах хронометраж процессов делается гораздо
проще, без каких-либо преобразований символьных данных в число-
♦) Звуковой контроль обеспечивался с помощью самодельных при-
способлений типа подключения динамика к одному из разрядов управ-
ляющего регистра.
196
вне. Например, в версии POWER BASIC существует функция Т1С(Х\
которая выдает числовую разницу между текущим показанием дат*
чика времени и значением аргумента X.
Описанная выше техника измерения временных интервалов кон-
статирует длительность процесса после его завершения. В задачах
реального времени очень важную роль играет так называемый «будиль-
ник». Для его организации используется программно или аппаратно
реализуемый интервальный таймер, т. е. счетчик, работающий на
вычитание. В нем устанавливают заказанное значение, из которого
по каждой временной отметке операционная система или аппаратура
вычитает по единице. Как только содержимое интервального таймера
оказывается нулевым, вырабатывается сигнал прерывания, по которому
управление может быть передано ждущему процессу. Такая возмож-
ность реализована на PC MSX. Занесение начального значения и пуск
таймера осуществляются здесь с помощью следующего оператора:
100 ON INTERVAL = 200 GOSUB 350
Единица измерения времени в этой ЭВМ равна 1/50 с; таким образом,
приведенный выше оператор начинает отсчет четырехсекундного интер-
вала. По его истечению будет выработан сигнал прерывания. Он либо
сработает, т. е. управление будет передано строке с номером 350,
либо этог переход будет заморожен до поступления соответствующего
разрешения, либо указанный переход вообще не состоится. Выбор
одной из трех перечисленных возможностей зависит от режима обра-
ботки прерываний интервального таймера, устанавливаемого с по-
мощью операторов INTERVAL ON, INTERVAL STOP, INTERVAL
OFF.
10.5. Обработка программных ошибок
Процесс выполнения бейсик-программы сопровождается тщатель-
ным контролем, предотвращающим возникновение таких ситуаций,
как переполнение разрядной сетки ЭВМ, выход индексного или пере-
ключающего выражения за объявленные границы, неправильная орга-
низация циклов и обращений к подпрограммам, исчерпание блока
данных и т. п. Возникновение ошибочной ситуации приводит к прекра-
щению выполнения программы. Но в развитых бейсик-системах поль-
зователю предоставляют возможность перехватить прерывание, вы-
званное программной ошибкой, и разобраться с ним по своему
усмотрению.
Наиболее распространенным вариантом для решения указанной
задачи является использование оператора ON ERROR... и систем-
ных переменных ERR и ERL. Так принято на многих зарубежных
персональных ЭВМ, на мини- и микроЭВМ, выпускаемых в странах
СЭВ. Рассмотрим эти средства более подробно.
197
Точка входа в пользовательскую подпрограмму обработки преры-
вания по программной ошибке задается следующим образом:
10 ON ERROR GOTO 250
Естественно, что выполнение такого оператора должно предшествовать
моменту возникновения первой программной ошибки. В дальнейшем
бейсик-система продолжает вести предусмотренный контроль за ходом
выполнения программы, но не снимает ее в аварийных ситуациях
и не выдает сообщения об ошибках. Возникновение любой программ-
ной ошибки теперь приводит к передаче управления в указанную
пользователем точку.
Для анализа ситуации программа обработки может воспользо-
ваться системными переменными ERL и ERR. В первой из них хра-
нится номер строки исходной программы, при выполнении которой
обнаружена ошибка. Порядковый номер ошибки по принятой их
классификации на данной установке заносится в переменную ERR.
После анализа и принятия предусмотренных мер программе поль-
зователя предоставляются три возможности:
— вернуться на ошибочную строку и попытаться выполнить опе-
ратор повторно;
— передать управление на оператор, следующий за ошибочным;
— передать управление в заданную точку исходной программы.
Выполняются эти действия с помощью специального оператора
RESUME, допускающего соответственно три варианта употребления —
RESUME (или RESUME 0), RESUME NEXT и RESUME N (N —
номер строки).
Для отладки подпрограммы обработки ошибочных ситуаций можно
прибегнуть к оператору ERROR, имитирующему ошибку с заданным
номером. Например:
100 ERROR 28
Если предварительно был исполнен оператор ON ERROR ..., то
управление после оператора 100 сразу же передается в подпрограмму
обработки ошибок, а в системных переменных ERL и ERR будут
находиться соответственно значения 100 и 28.
В некоторых версиях языка имеется возможность программной
обработки ошибочных ситуаций, но вместо системных переменных
ERL и ERR в операторе ON ERROR ... задаются имена двух
программных переменных, выполняющих ту же самую функцию.
Так, например, принято в версии бейсика, эксплуатируемой на ЭВМ
Wang 2200 и Искра-226:
ON ERROR AQ, BQ GOTO N
Код ошибки и номер ошибочной строки в символьном формате зано-
сятся соответственно в переменные AQ и BQ.
Глава 11. ЯЗЫК СИСТЕМНЫХ КОМАНД
Операторы бейсика используются для составления программы,
реализующей алгоритм решения нашей задачи. Но после того, как
программа подготовлена и введена в ЭВМ, «жизнь» программы еще
только начинается. От конечного результата нас отделяет довольно
много ступенек, по которым придется пройти. Среди них можно вы-
делить следующие:
— запоминание текста программы в архиве с целью избежания
потерь времени на ее ввод при повторных сеансах;
— проверка программы на наличие в ней синтаксических ошибок
путем пробного пуска;
— исправление ошибок, обнаруженных бейсик-системой;
— выявление и устранение алгоритмических ошибок с использо-
ванием тех или иных отладочных средств;
— выполнение расчетов с различными наборами исходных данных.
Перечисленные процедуры и ряд других действий, пока остав-
шихся вне поля нашего зрения, выполняются операционной системой
ЭВМ по соответствующим заявкам пользователя. Последние состав-
ляются на специальном управляющем языке, известном под назва-
нием язык системных команд или директив.
На разных ЭВМ функционируют различные операционные си-
стемы. Поэтому состав системных команд и форматы сходных по
своему назначению директив могут несколько различаться. Хотелось
бы обратить внимание читателя в первую очередь на содержательную
сторону той или иной процедуры, предоставляемой системой в рас-
поряжение пользователя.
11.1. Изначальный ввод программы с терминала
На этой стадии набору программы обычно предшествует дирек-
тива NEW (новая). Ее действие сводится к начальным установкам —
чистке различных областей памяти и управляющих таблиц, сбросу
указателей и т. п. Одной из модификаций директивы NEW является
возможность задания имени будущей программы:
NEW ZARPLATA
199
Наименование программы обычно состоит из букв и цифр и не должно
превышать по количеству символов максимальной границы, установ-
ленной конкретной операционной системой.
Еще одна директива, ускоряющая процедуру ввода программы,
обеспечивает автоматический набор номера очередной строки. Уста-
навливается такой режим по директиве AUTO (авто) и сбрасывается
в момент исполнения любой другой директивы. При вводе с автома-
тической нумерацией строк по нажатию клавиши В К текущее значе-
ние номера увеличивается на 10. Параметры директивы AUTO обеспе-
чивают возможность установки любого значения начального номера (No)
и шага нумерации (AN):
AUTO [No] [,AN]
Аналогом директивы AUTO является клавиша STMT NO, рас-
положенная на клавиатуре ЭВМ Искра-226.
11.2. Формирование исходной программы
с использованием архива
Архив программ, который имеется практически на каждой ЭВМ,
ускоряет процедуру формирования текущей программы в оперативной
памяти. В архиве можно хранить текст программы, с которой мы
работали в предыдущий раз, а также различные программные заго-
товки, из которых можно формировать новую программу.
Каждый элемент архива снабжается уникальным именем. Это имя
используется при извлечении архивной программы (файла) или лю-
бого ее фрагмента. В последнем случае кроме имени файла прихо-
дится указывать еще и интересующий нас диапазон строк (Ni—N2
или Ni, N2).
При формировании текста программы с использованием архивного
файла имеются две возможности: либо архивный файл или его фраг-
мент присоединяется (добавляется) к тексту уже имеющейся в памяти
программы, либо перед вызовом из архива содержимое оперативной
памяти стирается полностью или частично. В первом случае добав-
ляемые программные строки могут затирать операторы текущей про-
граммы с такими же номерами или попадать в интервал между уже
существующими строками. Частичное стирание следов текущей .про-
граммы во втором случае может иметь смысл тогда, когда надо уда-
лить отработавшую программу, но сохранить значения ее переменных.
Загрузка архивной программы в оперативную память производится
с помощью одной из директив —OLD (старая), LOAD (загрузить),
GET (извлечь) — или их модификаций. Основным параметром таких
директив является имя загружаемой программы:
OLD ROTOR
LOAD "CAS1 : PROG5"
200
CLOAD PROG5
BLOAD "A : RAMAH
Модификации CLOAD и BLOAD выполняют загрузку из архива
на магнитной ленте и на магнитном диске соответственно. Мнемоника
дополнительного символа происходит от английских слов casette (кас-
сета) и binary (двоичный). Последнее означает, что .на диске хра-
нится не символьный текст бейсик-программы, а результат ее обра-
ботки компилятором — двоичный код. Такую программу можно только
исполнить, но нельзя распечатать.
Для присоединения архивной программы или ее фрагмента ис-
пользуются директивы MERGE (слить), CHAIN (скрепить в цепь),
APPEND (добавить в хвост). Конкретные форматы этих директив
можно найти в материалах по соответствующим бейсик-системам
(см. ч. II).
11.3. Корректировка текущей программы
Нумерация каждой строки бейсик-программы существенно облег-
чает процедуры дополнительного ввода новых строк, замены или уда-
ления уже существующих строк (см. разд. 1.2). Наряду с этими
возможностями большинство бейсик-систем предоставляет в распоря-
жение пользователя целый ряд средств по редактированию текущей
программы. Мы рассмотрим лишь наиболее употребительные из ди-
ректив этой группы.
Первая из них позволяет удалить фрагмент текущей программы,
начиная со строки (или с самого начала) и до строки с номером
/У2 включительно (или до самого конца):
DELETE [Ni] [~[N2]]
В качестве разделителя граничных номеров обычно используется за-
пятая или тире. Например:
(удаление строк с 50-й по 100-ю)
дление строк с 50-й и до конца)
даление строк до 200-й включительно).
Употребление директивы DELETE (удалить) без параметров при-
водит к удалению всей программы. В некоторых системах допускается
сокращенный вариант директивы—DEL.
Очень удобной функцией является возможность перенумерации
строк программы или любого ее фрагмента. К этой процедуре при-
ходится прибегать в тех случаях, когда не хватает промежуточных
201
DELETE 50,100 1
DELETE 50—100 f
DELETE 50, 1
DELETE 50— J (У
DELETE ,200 1
DELETE —200 j (
свободных номеров для вставки новых строк или когда перенумера-
ция позволяет исключить наложение строк текущей программы и до-
бавляемого архивного сегмента. Перенумерация не сводится к меха-
нической замене старых номеров строк новыми, надо произвести еще
коррекцию и в теле всех операторов передачи управления. Например:
а) до перенумерации
105 IF А^М THEN 108
106 LET М=А
108 PRINT 'MINIMYM = -; М
б) после перенумерации (NHOB = 200, AN = 10)
200 IF А^М THEN 220
2Ю LET М = А
220 PRINT 'MINIMYM = '; M
Перенумерацию обычно выполняют с помощью одной из разно-
видностей директивы RENUMBER (RENUM, REN, RESEQ):
RENUMBER No, AN, Nlt Na
RENUM No, Nf, AN
RESEQ No, Ni—Na
Здесь No — новый начальный номер, AN — шаг перенумерации, Nlf
N2—граничные номера строк перенумеруемого фрагмента.
При одном или нескольких опущенных параметрах директивы
RENUMBER (перенумеровать) действуют .следующие соглашения:
начальное значение N0 = 10, шаг перенумерации AN = 10, при отсут-
ствии Nx устанавливается минимальный номер, при отсутствии Na —
максимальный номер текущей программы.
Если текущая программа снабжена именем, то пользователю
предоставляется возможность заменить его с помощью директивы
RENAME (переименовать):
RENAME новое имя
В качестве ситуации, в которой может возникнуть такая нужда,
приведем следующий пример. Из архива загружена программа с име-
нем А. После ее коррекции мы решили записать новый текст про-
граммы в архив. Но там уже есть программа с именем А, а портить
предыдущий вариант не резонно. Поэтому текущую программу пере-
именовывают и записывают в архив уже под другим именем.
В ранних бейсик-системах, ориентированных на работу с электро-
механическими терминалами или примитивными дисплеями строчного
типа, можно встретить директивы по коррекции строки с указанным
номером:
EDIT N
SUB N§SiS2.. .SkCgTiTa.. .Тп^тп
202
Первая из них вызывает на терминал строку с номером N (точнее —
перемещает указатель программного файла в указанное место). После
этого заданная строка становится текущей, и с ней можно произво-
дить различного рода исправления.
Директива SUB осуществляет замену (Substitution — подстановка)
цепочки символов SiS8...Sfc в строке с номером N на группу Сим-
волов TiT2...Tn. Параметр m задает при этом порядковый номер
вхождения заменяемого контекста. Если длина замещающей группы
равна нулю, то происходит удаление указанной цепочки символов.
Например:
105 FOR F=1 ТО 10 STEP F5
SUB 105@ F @ К @ 2
105 FOR К=1 ТО 10 STEP F5
В этом примере буква F входит в редактируемый текст трижды —
FOR, F=... , F5. Замена же осуществлена во втором вхождении.
11.4. Просмотр и распечатка текущей программы
После внесения изменений в текст исходной программы очень
важно сохранить ее распечатку. Она может пригодиться при обдумы-
вании нового варианта программы между сеансами связи с ЭВМ.
Из программистского опыта известно, что исправление одной ошибки
с очень большой степенью вероятности может повлечь за собой но-
вую ошибку. Поэтому надо хранить все версии программ с подроб-
ными комментариями по поводу внесенных изменений и достигнутых
результатов.
Для вывода текста текущей программы, упорядоченного по воз-
растанию номеров строк, используется директива LIST или ее моди-
фикации. Основным параметром этой директивы являются граничные
номера строк выводимого фрагмента:
LIST [NJ [,[N2J]
или
LIST [Ndf-[N2]J
Отсутствие параметра Nf означает, что вывод начнется со строки
с минимальным номером, а отсутствие параметра N2 приведет к вы-
воду до ее конца.
Основным режимом работы директивы LIST является вывод текста
на экран дисплея. При этом длина выводимой порции может превы-
сить количество строк, отображаемых на терминале. Разные системы
справляются с этой ситуацией по-разному. Иногда текст на экране
дисплея перемещается вверх с фиксированной или регулируемой ско-
203
ростыо, а пользователю предоставляется возможность приостановить
выдачу нажатием одной или двух управляющих клавиш. В других
системах вывод организуется по кадрам. При этом переход к новому
кадру происходит либо автоматически по истечении регулируемой
задержки, либо после приема разрешающего сигнала от пользователя.
Для получения твердой копии используется либо директива LLIST
(PLIST), либо директива LIST с предварительной коммутацией ка-
нала вывода. В последнем случае директиве LIST должна предшест-
вовать процедура переназначения устройства вывода (см. разд. 11.8).
Среди других модификаций директивы LIST отметим следующие:
LIST.—вывод текста оператора, во время выполнения которого
обнаружена программная ошибка;
LISTS NlfN2—постраничный вывод;
LISTQ Ni,N2 — печать всех операторов программы, передающих
управление на строки из интервала [Ni,N2];
LISTV а,р — печать всех операторов, в которых использованы
имена переменных или массивов, начинающиеся с букв из интер-
вала [а,р];
LISTNH Ni — N2—вывод текста программы без стандартного за-
головка, включающего имя программы, дату и время.
11.5. Выполнение текущей программы
Запуск текущей программы для выполнения осуществляется по
директиве RUN (пуск). Без дальнейшего вмешательства пользователя
выполнение программы может прекратиться по одной из следующих
причин:
— произошло нормальное завершение при выходе на оператор END;
— произошел запланированный останов при выходе на оператор
STOP;
— обнаружена программная ошибка.
Если ни одно из этих событий в допустимом временном интервале
не наступило, то вполне возможно, что программа «зациклилась».
Большинство систем предусматривает те или иные средства для пре-
кращения работы программы по инициативе пользователя. К ним
относятся директива STOP или одновременное нажатие двух клавиш —
управляющей (CNTRL или УПР) и фиксированного символа (S или С).
Получив такой сигнал от пользователя, система прерывает выполне-
ние программы и сообщает номер оператора, на котором произошел
останов.
После нормального завершения задачи возможен ее повторный
запуск по директиве RUN.
Выполнение программы, приостановленной по оператору STOP
или по инициативе пользователя, можно продолжить с точки оста-
нова, набрав на терминале директиву CONTINUE (CONT). Если
204
бейсик-система допускает непосредственное (прямое) выполнение опе-
ратора GOTO, то работу приостановленной программы можно про-
должить с любой точки.
Среди наиболее распространенных модификаций директивы RUN
можно отметить следующие:
RUN N-^-пуск текущей программы, начиная со строки с указан-
ным номером;
RUNNH N — то же самое без печати стандартного заголовка,
предшествующего выводимым результатам;
RUN "имя" [,N] — вызов из архива и исполнение программного
файла с указанным именем.
Аналогом последней директивы является команда XEQUTE, ис-
пользуемая в системе Бейсик-плюс на ЭВМ типа СМ-4.
, 11.6. Отладочные средства
Выдача каких-то результатов и выход на один из операторов
STOP или END еще не являются свидетельством правильности функ-
ционирования программы. Понадобится довольно много прогонов
с различными наборами тестовых данных, чтобы удостовериться
в качестве самого алгоритма и его программной реализации.
Если нужно произвести останов в заданной точке программы и
посмотреть значения тех или иных переменных, то языковых средств
бейсика вполне достаточно. После предусмотренного останова по опе-
ратору STOP пользователь может набрать любое количество операто-
ров PRINT в режиме непосредственного исполнения, а затем про-
должить работу программы до следующего отладочного останова.
Операторы дополнительной печати можно было бы включить в текст
исходной программы и без операторов STOP.
Однако таким образом довольно трудно проследить за логикой
выполнения программы, количеством повторений и вложенностью цик-
лов, цепочкой обращений к подпрограммам. Для решения указанных
вопросов и получения максимальной информации о ходе выполнения
программы в большинстве систем предусмотрен специальный отладоч-
ный режим — трассировка. Этот режим может быть распространен
либо на всю программу, либо на отдельные ее фрагменты.
В режиме трассировки сведения о каждом выполняющемся опе-
раторе выводятся на дисплей или в специальный отладочный файл,
содержимое которого потом можно будет просмотреть. Для операторов
условного перехода в отладочном файле фиксируются номера текущей
и следующей строки, если переход состоялся. Для операторов типа
присваивания (LET, INPUT, READ) фиксируются значения и имена
соответствующих переменных. По этой информации можно будет
оценить и правильность вычислительных схем, и логику всех пере-
ходов.
205
Включение й б'тключеййд режима трассировки обеспечиваются
парами директив типа TRACE (включить)—NOTRACE (отключить),
TRACE ON (включить) —TRACE OFF (отключить), TRON—TROFF.
В ряде систем эти директивы могут использоваться и как операторы
исходной программы. С их помощью можно организовать рабо-
ту в отладочном режиме только на определенных участках про-
граммы.
На ЭВМ первого поколения отладка программ зачастую велась
в режиме покомандного исполнения. За одно нажатие кнопки «пуск»
в однотактном режиме выполнялась одна машинная команда. После
этого программист просматривал содержимое интересующих его ре-
гистров и ячеек памяти, корректировал необходимые величины и про-
должал «простукивать» программу.
По аналогии с таким режимом отладки некоторые бейсик-системы
дают возможность исполнить программу в пооператорном режиме.
После нажатия специально выделенной клавиши ЭВМ выполняет
очередной оператор и останавливается. Такой шаговый режим харак-
терен, например, для ЭВМ Искра-226 (клавиша HALT/STEP), системы
Бейсик-плюс на ЭВМ типа СМ-4 (директива STEP) и др. Отмена
шагового режима обычно осуществляется при повторном исполнении
директивы STEP.
11.7. Работа с архивом программ
Внешние запоминающие устройства позволяют организовать архив,
в котором можно хранить программы и наборы данных. С точки
зрения внутренней структуры архив состоит из файлов с записями
фиксированной или переменной длины и оглавления — каталога. Роль
записей в программных файлах играют программные строки. В файлах
данных записями могут быть символьные строки или массивы машин-
ных слов.
Каждый набор данных или программных строк выступает в ар-
хиве под уникальным именем, выполняющим функцию инвентарного
номера. В каталоге на каждый элемент архива заводится строка,
содержащая имя набора (файла), сведения об его расположении (внеш-
ний адрес, длина, количество блоков), информацию о владельце и дате
поступления в архив,’’'различные служебные сведения (тип файла,
режим доступа и др.).
Набор операций с архивными данными включает следующие про-
цедуры:
— просмотр или распечатку каталога;
— извлечение архивного файла целиком или фрагментами в опе-
ративную память;
— запись нового файла в архив;
— замещение уже существующего архивного файла новым|
£06
-—переименование архивного файла;
— удаление файла из архива.
Ниже рассматриваются вопросы, связанные с хранением и исполь-
зованием программных файлов, так как основные приемы работы
с файлами данных были изложены в разд. 11.6.
Для идентификации файлов в разных операционных системах ис-
пользуются разные обозначения. Если на вычислительной установке
представлен единственный архив на магнитной ленте или гибком
диске, то в качестве спецификации файла применяют последователь-
ность алфавитно-цифровых символов SiS2...Sfc— имя файла. Это имя
должно начинаться с буквы, а общее количество символов не должно
превышать 6 или 8.
Если ЭВМ комплектуется несколькими носителями, на каждом
из которых может находиться архив, то для спецификации файлов
используется составное имя вида «имя устройства: имя файла». Иногда
к этой спецификации через точку добавляется от одной до трех
букв, характеризующих тип данного файла. Например, обозначение
"В : RADUGA . В AS" может расшифровываться как текст программы
на бейсике (добавка В AS), который хранится под именем RADUGA
на дискете, установленном на дисководе В.
Для просмотра каталога архива обычно используется одна из
директив типа CATALOG (CAT, CTLG) или FILES. Основным пара-
метром этой директивы является имя устройства. В некоторых си-
стемах имеется возможность выборочного просмотра каталога путем
задания шаблона для отбора имен. Такой режим, в частности, пред-
лагается пользователям IBM PC:
FILES "*.BAS"—вывод всех имен файлов вида XXXXXXXX.BAS,
хранящихся на дискетах А и В (здесь X — произвольный сим-
вол);
FILES "В : *.*"—вывод всех имен файлов, хранящихся на
дискете В;1,
FILES "AH24??.BAS"—вывод всех имен файлов, начинающихся
с символов АН24 и имеющих приставку BAS (AH24XXXX.BAS).
Об извлечении файлов при сборке текста текущей программы
по архивным заготовкам уже упоминалось в разд. 11.2.
Запись текущей программы в архив обычно производится по ди-
рективе SAVE (сберечь) или ее модификациям:
SAVE спецификация файла
В качестве дополнительных параметров, этой директивы могут
использоваться указание диапазона номеров строк [Nf, N2] запоми-
наемого фрагмента или какие-то признаки, характеризующие тип и
формат записываемых в архив данных.
При замещении существовавшего в архиве файла текущей про-
граммой чаще употребляется директива REPLACE.
207
Переименование архивного файла осуществляется с помощью одной
из директив NAME или RENAME:
NAME старое обозначение AS новое обозначение;
RENAME старое имя, новое имя [,имя устройства].
Довольно большое разнообразие существует в наименованиях ди-
рективы удаления файла из архива—DELETE (исключить), ERASE
(стереть), KILL (уничтожить), UNSAVE (не хранить). Однако выпол-
няемые ими функции абсолютно идентичны. В качестве основного
параметра здесь задается имя или спецификация удаляемого файла.
11.8. Управление внешними устройствами
Директивы, связанные с обслуживанием внешних устройств, можно
условно разделить на две группы. К первой из них относятся так
называемые средства назначения физических устройств. С их помощью
к программе пользователя подключаются нужные программы ввода/вы-
вода. Например, дисплей терминала может работать в режиме вывода
алфавитно-цифровой и графической информации. В первом случае он
выступает как устройство (файл) (к логическим номером nf, а во вто-
ром случае это же физическое устройство имеет логический номер п2
и обслуживается совершенно другой сервисной программой.
Если вывод графической информации в задаче встречается до-
вольно часто, то вместо указания номера устройства в выводном
списке можно временно зафиксировать связь между системным устрой-
ством PRINT*) и нужным физическим устройством с помощью ди-
рективы SELECT (выбрать) или ASSIGN (назначить). Например, на
ЭВМ Искра-226 такая процедура выглядит следующим образом:
SELECT #nf 05
SELECT PRINT 10
В первом случае логическому устройству (файлу) с номером щ
ставится в соответствие физическое устройство с номером 05, т. е. экран
дисплея в режиме вывода алфавитно-цифровых данных. Во втором
случае системным устройством вывода объявляется физическое устрой-
ство отображения графической информации. После такого назначения
действие операторов | PRINT zftnf, список | и | PRINT список | ста-
новится эквивалентным. Это позволяет опускать задание номера
устройства в начале выводного списка.
Аналогичная ситуация с назначениями имеет место в том случае,
когда по техническим причинам приходится переставлять гибкий диск
с одного устройства на другое. Вместо того чтобы вносить исправления
*) Под системным устройством с именем PRINT подразумевается
устройство, на которое осуществляется вывод оператором PRINT.
208
в соответствующие операторы обмена, нужно произвести переназначе-
ние системного дисковода:
SELECT DISK В
Вторую группу директив работы с внешними устройствами со
ставляют команды, с помощью которых можно опросить или изменить
состояние устройства, произвести его проверку, переместить носитель
информации или установить соответствующий указатель в нужное
положение и т. п. Эта группа представлена довольно большим коли-
чеством директив, и ее состав существенным образом зависит от опе-
рационной системы. Поэтому остановимся лишь на некоторых командах
управления внешними накопителями (магнитными лентами и дисками)
и функциональной клавиатурой, которые в первую очередь могут
понадобиться пользователю бейсик-системы.
11.8.1. Работа с магнитной лентой. Среди директив, используе-
мых при работе с накопителями на МЛ, остановимся на следующих:
CLOAD, CLOAD?, CSAVE, MOTOR, REWIND и SKIP. Первые три
ив них связаны с чтением (загрузкой) и записью программных файлов.
Модификация CLOAD? используется в MSX-бейсике для контроля за
правильностью записи. Она осуществляет фиктивное чтение файла
с указанным именем, во время которого происходят контрольное сум-
мирование читаемых кодов и проверка правильности каждого счи-
танного байта (контроль по четности или нечетности).
Директива MOTOR предназначена для дистанционного включе-
ния или выключения двигателя магнитофона. При использовании
бытового магнитофона по его прямому назначению мы включаем пита-
ние и приводим ленту в движение путем нажатия соответствующих
клавиш. Если магнитофон подключен к ЭВМ, то операции чтения/за-
писи инициируются по сигналам ЭВМ и им должно предшествовать
автоматическое включение двигателя. Параметром директивы MOTOR
может быть либо служебное слово ON (вкл.) или OFF (выкл.), либо
числовой код, равный нулю или отличный от нуля. Если этот пара-
метр опущен, то директива осуществляет установку режима работы
двигателя, противоположного текущему состоянию (вкл.—>выкл.—►
•—► вкл. —► выкл. —> ... ).
Перемотка ленты в начало производится по директиве REWIND.
С помощью одной из модификаций директивы SKIP осуществляется
пропуск указанного количества блоков в текущем файле (SKIP п В),
перемотка МЛ до конца текущего файла (SKIP END) или пропуск
заданного числа файлов (SKIP n F).
11.8.2. Работа с магнитными дисками. Для того чтобы разобраться
с составом и функциями директив управления накопителями на МД,
мы остановимся на некоторых сведениях общего характера.
Организацию данных на диске можно сравнить с книгой, содер-
жание, размеры и количество глав в которой могут изменяться.
209
С целью ускорения поиска нужного материала на каждом дисковом
пакете выделяется место под оглавление—каталог (CATALOGy
DIRECTORY и др.). В каталоге диска фиксируются наименования
заведенных разделов—файлов, информация об их размещении на по-
верхности диска, другие служебные сведения.
Из-за переменных размеров дисковых файлов место под их хра-
нение иногда приходится выделять не сплошным участком, а пор-
циями-блоками. Чаще эти блоки имеют фиксированный размер
(128, 256 или 512 байт), но некоторые системы предоставляют поль-
зователю возможность задавать и нестандартную длину. Между по-
следовательными блоками файла устанавливаются связи с помощью
различного рода указателей, а в каталог заносится ссылка на первый
блок. При удалении файла на диске образуются «дыры», т. е. свобод-
ные участки памяти, которые присоединяются к цепочке свободных
блоков. Таким образом, свободная память на диске состоит из двух
областей—участка со сплошной адресацией и цепочки разрозненных
блоков. Информация о расположении этих областей и их длинах
также является составной частью каталога.
Среди директив управления накопителями на МД можно выде-
лить следующие процедуры:
— подготовка нового дискового пакета к работе (инициализация),
включающая распределение памяти (каталог+свободное простран-
ство), разметку дисковой поверхности на блоки и проверку их работо-
способности, формирование начального состояния каталога. К этой
группе относятся директивы типа SCRATCH DISK;
— перераспределение памяти между областями каталога и фай-
лов (директива типа MOVE END на ЭВМ Искра-226};
— проверка работоспособности отдельных участков дисковой па-
мяти (директива VERIFY);
— просмотр нли распечатка оглавления диска. Довольно много-
численная группа, включающая директивы типы FILES, CATALOG,
LIST DC, DIR;
— копирование содержимого дискового пакета- целиком или вы-
борочно— по файлам (директивы COPY, MOVE);
— удаление файла (директивы типа DELETE, ERASE, KILL,
UNSAVE).
В ряде операционных систем для выполнения указанных проце-
дур используются специальные служебные программы—утилиты-
Обычно эти программы работают в режиме диалога, запрашивая у
пользователя всю информацию, необходимую для реализации заказан-
ной процедуры. Как правило, такие утилиты оказывают пользователю
помощь на всех этапах своей работы.
11.8.3. Управление функциональной клавиатурой. Сфера примене-
ния функциональных клавиш, характерных для большинства совре-
менных терминалов, ограничивается двумя приложениями. Во-первых,
210
с их помощью можно ускорить процедуру набора наиболее часто
встречающихся служебных слов или словосочетаний. Для этого не-
обходимы средства закрепления соответствующего текста за опреде-
ленной функциональной клавишей.
В MSX-бейсике эта процедура реализуется о помощью следую-
щей директивы:
KEY i/'S^ ... Sk"
После выполнения указанной директивы нажатие функциональной
клавиши с номером i (К К 10) приводит к появление текста
SiS2 ... Sk в текущей строке, начиная с позиции, отмеченной марке-
ром. Максимальная длина такого текста не должна превышать
15 символов.
Директива KEY LIST позволяет выдать на терминал все тексты,
закрепленные за каждой из функциональных клавиш.
Другим применением функциональной клавиатуры является орга-
низация прерывания работающей программы по инициативе пользова-
теля. С помощью директив типа KEY ON или KEY OFF произво-
дится установка режима, разрешающего {ON) прием таких прерыва-
ний или блокирующего (OFF) указанные сигналы.
11.9. Служебные директивы
В последнюю группу выделены директивы, выполняющие раз-
личные служебные функции, связанные с установкой или опросом
различных системных переменных (дата, время, объем занятой и сво-
бодной оперативной памяти и т. п.), с изменением некоторых кон-
стант (нижняя и верхняя границы оперативной памяти, доступные
бейсик-системе, максимальное количество одновременно открытых фай-
лов и др.), с выходом из бейсик-системы (директивы BYE, QUIT,
SYSTEM).
Форматы служебных директив варьируются ют системы к системе;
более подробные сведения о них можно найти в материалах ч. II.
Глава 12. К ВОПРОСУ СТАНДАРТИЗАЦИИ БЕЙСИКА
В предисловии редактора перевода книги Брауна П. Дж. Мобиль-
ность программного обеспечения — М.: Мир, 1980, очень четко сформу-
лирована одна из центральных проблем повышения эффективности
использования средств вычислительной техники. «.. .На практике сле-
дует стремиться к «универсальному» программированию, направлен-
ному на экономию «человеческих ресурсов»,— программированию,
при котором однажды созданная программа (или система программ)
могла бы стать достоянием всех пользователей, на какой бы машине
и в какой бы стране они ни работалй». Решению этой проблемы
в значительной мере содействуют стандартизация алгоритмических
языков, унификация способов записи, кодирования и представления
данных на внешних носителях, разработка различных инструменталь-
ных средств переноса программ и т. п.
Первый стандарт бейсика был принят спустя почти 15 лет после
рождения языка. Американский "национальный институт стандартов
(ANSI), утвердивший этот документ под номером Х3.60—1978, при-
своил ему наименование — минимальный бейсик [1]. Тем самым при-
знавалось, что стандарт вобрал в себя далеко не все возможности,
предлагавшиеся наиболее развитыми версиями того времени. В стан-
дарте 1978 г., по сути дела, был зафиксирован минимальный набор
базовых операторов и стандартных функций, предложенных в «Дарт-
мутской версии» и с небольшими отклонениями входивших в состав
наиболее распространенных реализаций.
Некоторые положения минимального стандарта могут показаться
довольно странными: операторы надо записывать, начиная с первой
позиции строки, номер строки обязан отделяться от имени оператора
по крайней мере одним пробелом, пробелы внутри номера строки не-
допустимы, строки в исходной программе должны следовать в порядке
возрастания. Последнее ограничение сводит почти на нет диалоговую
сущность бейсика и обедняет его естественные средства редактирования.
Стандарт на минимальный бейсик был положен в основу специаль-
ной системы тестов [2], разработанных Национальным бюро стандар-
тов (NBS) США, выдержав которые транслятор или интерпретатор
бейсика мог получить официальное признание. Основные сведения по
минимальному бейсику воспроизводятся нами по результатам анализа
212
тестов NBS и протоколов прохождения тестовых программ. Некото-
рые требования стандарта, с которыми нам трудно согласиться, отме-
чены по тексту знаком вопроса.
12.1. Минимальный бейсик
Алфавит: прописные буквы латинского алфавита (А—Z), циф-
ры (0 — 9), знаки арифметических операций (+, —, *, /, возве-
дение в степень), знаки операций отношения (>, =, <), прочие
символы (круглые скобки, апостроф, точка, двоеточие, точка с запя-
той, запятая, пробел, подчерк, &, !, zft, %, ?, $).
Константы: текстовые и числовые вещественного типа. Текстовые
константы обычно заключаются в апострофы. Число значащих десятич-
ных цифр в арифметических константах должно быть не менее шести,
диапазон допустимых значений — от —1.70141Е — 38 до 1.70141Е-f-38.
На конкретных установках допускается отклонение от этих ограни-
чений в сторону расширения. Числовые константы в тексте программы
могут выходить за пределы допустимого диапазона, однако интерпре-
татор или компилятор должен осуществлять необходимые замены
с выдачей соответствующего предупреждения.
Переменные: текстовые и арифметические. Текстовые пере-
менные только простые. Для их обозначения используется двухсим-
вольное сочетание—буква и знак $. Длина значения текстовой пере-
менной не более 18 символов. Простые арифметические переменные
обозначаются буквой или буквой с цифрой (A—Z, АО—Z0,
А1—Z1, ...» А9—Z9). Для обозначения числовых массивов исполь-
зуются однобуквенные идентификаторы. Одновременное использование
массива А и простой переменной А в пределах одной программы
запрещено (?). Начальные значения арифметических переменных, как
правило, нулевые, а текстовых пустые.
Стандартные функции: включают 11 математических
функций—— ABS, ATN, COS, EXP, INT, LOG, RND, SGN, SIN, SQR,
TAN. Функция RND употребляется без аргумента. Никаких функ-
ций для работы с текстовыми значениями в минимальном бейсике не
предусмотрено.
Нестандартные функции: описываются пользователем
с помощью оператора DEF. Описание функции должно предшество-
вать ее упогреблению. Обозначение нестандартной функции—трех-
буквенное, начинающееся с символов FN. Количество аргументов —
не более одного (?).
Программная строка: может содержать только один опера-
тор. Номер строки должен начинаться с первой (?) позиции. Он дол-
жен принадлежать интервалу [1, 9999] и не может (?) содержать про-
белов. Между номером строки и именем оператора должен быть по
крайней мере один пробел. Длина строки — не более 72 символов.
213
Набор операторов: включает 20 процедур—DATA, DEF,
DIM, END, FOR, GOSUB, GOTO, IF, INPUT, LET, NEXT, ON,
OPTION BASE, PRINT, RANDOMIZE, READ, REM, RESTORE,
RETURN, STOP. Ниже излагаются некоторые особенности операто-
ров, связанные с ограничениями минимального бейсика.
DATA: текстовые константы в теле оператора, не совпадающие
по написанию с числовыми, разрешается не заключать в апострофы.
Можно задевать числовые значения, выходящие за пределы машин-
ного диапазона. В- момент их выборки из блока данных система дол-
жна произвести соответствующую замену на минимальнее или макси-
мально допустимое число в данной ЭВМ.
DIM: объявление массивов должно предшествовать их употребле-
нию. Смечет индексов по умолчанию ведется' от нуля или от еди-
ницы, если перед первым оператором DIM находится указание
OPTION BASE 1.
END: обязательный оператор. Употребление END в середине
программы считается ошибкой.
FO R - N Е X Тг условием окончания цикла считается выполнение
неравенства | итек — укон I При несовместности значений па-
раметров цикла тело цикла обходится.
IF: для сравнения текстовых значений могут использоваться про-
верки либо на равенство, либо на неравенство.
IN Р U Т: текстовые значения, вводимые с терминала, могут на-
бираться и без кавычек (апострофов). Но тогда действует ряд ограни-
чений—такое значение не должно содержать символов «запятая»,
«точка с запятой», «вопросительный знак»; символы = воспри-
нимаются как пробелы; в начале и в конце текста пробелы отбрасы-
ваются. Если количество данных, набранных пользователем, меньше
числа переменных в списке оператора INPUT, то ввод данных повто-
ряется заново.
LET: служебное слово LET опускать нельзя.
О N: выход значения переключающего выражения за установлен-
ные пределы воспринимается как программная ошибка.
PRINT: для зонной печати используется пять зон по 14 позиций.
При печати чисел с фиксированной запятой выдается не более шести
значащих цифр и подавляются незначащие нули справа. Для печати
чисел с плавающей запятой предлагается формат вида ±a0.aia2a3a4a6E4:
±pip2i—jlj. Выводимые данные прижимаются к левой границе зоны.
Разделитель «точка с запятой» после [числовых данных вызывает
сдвиг на одну позицию вправо, а после вывода текстовых данных
к дополнительному сдвигу не приводит. Указатель ТАВ(е) переме-
щает пишущий узел в позицию с номером е, если она находится пра-
вее текущей позиции.
214
12.2. В ожидании нового стандарта
Научно-техническая комиссия лри ГКНТ по языкам и системам
программирования в 1983 г. одобрила документ «Описание языка
программирования бемсикэ, предписав использовать его в качестве
рабочего впредь до утверждения соответствующего стандарта. Единст-
венные отличия указанного документа от стандарта ANSI—1978 со-
стояли в расширении алфавита набором русских букв (А—Я), замене
символа $ на знак Q и исключении символа zft. По сути дела, это
был тот же минимальный бейсик. Однако бейсик 80-х годов уже не
был тем игрушечным языком, который годился только для удовлетво-
рения потребностей начинающих пользователей. Успехи бейсика на
рынке мини- и микроЭВМ заставили ряд ведущих фирм пересмотреть
свое отношение к этому языку и организовать серьезные исследова-
ния по развитию его функциональных возможностей. Так появились
версии бейсика, которые ни в чем не уступали, а по некоторым пара-
метрам (обработка символьных данных, интерактивная машинная гра-
фика, работа с файлами, управление реальными процессами) и пре-
восходили своего грозного соперника—фортран. Однако конкурент-
ная борьба между фирмами, разрабатывающими индивидуальное про-
граммное обеспечение, уводит нас от идей «универсального» програм-
мирования.
Новые версии бейсика существенно отличаются друг от друга, по-
являются функции и операторы с дублирующимися названиями,
но имеющими совершенно различные назначения. Пользователей,
работающих на разных ЭВМ, постоянно сбивают те или иные
нюансы конкретной реализации (разные символы — разделители опе-
раторов в строке, разнобой в записи операторов LET, различные
трактовки ошибочных ситуаций и т. п.). Поэтому в начале 80-х годов
рядом международных организаций было решено выработать новый
стандарт на столь популярный язык программирования.
Проект предлагаемого стандарта бейсика был выдвинут в 1982 г.
комитетом X3J2 Американского национального института стандартов
и рабочими группами двух европейских организаций — ЕСМА (Ассоциа-
ция вычислительных средств) и EWICS (Комитет промышленных средств
вычислительной техники). Проект изложен в документе X3J2/82—17 [5],
значительная часть предложений была опубликована в 1983 г. После
обсуждения был подготовлен уточненный проект X3J2/84—26 [9],
отдельные положения которого продолжают совершенствоваться. Из-
лагаемый ниже краткий обзор новых предложений сделан по материа-
лам работ [6, 11].
Конспективный характер изложения в отдельных местах объяс-
няется тем, что этот материал уже нашел свое отражение в преды-
дущих разделах.
215
12.3. Общие сведения
Новый стандарт предполагает наличие ядра, обязательного для
всех реализаций, и возможности подключения ряда расширений, огова-
риваемых в проекте. Подключаемые к ядру модули обеспечивают
такие средства, как расширенная работа с файлами, машинная гра-
фика, управление процессами, арифметика с фиксированной запятой,
элементы редактирования.
Алфавит языка расширен строчными буквами. Однако в служеб-
ных словах, обозначениях переменных, функций и других программ-
ных единиц прописные и строчные буквы считаются эквивалентными
(LET = Let = let). Отличаются они только в текстовых константах и
значениях символьных выражений.
В новом проекте допускаются идентификаторы, содержащие до
31 символа. Среди них—прописные и строчные буквы, цифры,
а также символ «подчерк», который можно использовать для разде-
ления составных наименований. Например: Дом_который_ построил_
Джек.
По умолчанию переменные относятся к арифметическому вещест-
венному типу. Значения таких переменных должны быть представ-
лены в ЭВМ форматом с плавающей запятой, обеспечивающим хране-
ние 10 значащих десятичных цифр. Однако в конкретных реализа-
циях для обеспечения эффективности вычислений допускается ариф-
метика с точностью 5—6 десятичных цифр.
Одним из расширений ядра является возможность использовать
арифметику с фиксированной запятой, в которой количество знаков
в целой и дробной частях устанавливается пользователем. Например:
10 OPTION ARITHMETIC FIXED*10.2
При этом для конкретных арифметических переменных сохраняется
возможность переопределить их характеристики с помощью оператора
DECLARE:
20 DECLARE NUMERIC * 6.4 А5 (1 ТО 20)
Здесь введен массив А5, содержащий 20 элементов. Каждый элемент
массива А5 хранится с шестью знаками в целой части и четырьмя
в дробной, тогда как для других арифметических переменных сохра-
няется 10 знаков в целой части и два в дробной.
Текстовые переменные выделяются тем, что последним символом
идентификатора является знак $. Длина их переменная, но не дол-
жна превышать 132 символов. Для конкретных переменных пользо-
ватель имеет возможность устанавливать и меньший верхний предел.
Например:
35 DECLARE STRING NAME$ * 18
216
Для обозначения фрагментов текстовых переменных (подстрок) в но-
вом проекте использованы предложения фортрана-77. Например:
100 Y$ = NAME$ (5:8)
105 NAME$ (1:6) =’ИВАНОВ’
В качестве стандарта для кодировки символов в текстовых данных
предполагается восьмиразрядный код ASCII. Однако в конкретных
реализациях допускается и использование других кодировок. В связи
с этим в состав входного языка включен необязательный оператор
OPTION COLLATE NATIVE.
Довольно существенные изменения предложены по поводу описа-
ния массивов. В первую очередь, любой массив должен описываться
и его объявление должно предшествовать первому использованию эле-
ментов массива. Описание массива может быть выполнено с помощью
оператора DIM или оператора объявления типа DECLARE. Вторая
важная особенность связана с возможностью указания граничных
значений индексов. Наряду с прежним форматом, предусматривавшим
описание только верхней границы и стандартное начало отсчета
(OPTION BASE 0 или OPTION BASE 1), вводится алголоподобная
запись с указанием нижней и верхней границ индексов. При этом
допускается существование и отрицательных границ. Например:
5 DIM А (—2 ТО 10, 1 ТО 5)
Наряду с одномерными и двумерными массивами новый стандарт
разрешает работу и с трехмерными массивами.
Максимальная длина элементов текстовых массивов может быть
задана одновременно с объявлением массива:
40 DECLARE STRING TABLE$ (20) * 80
В одномерном массиве TABLE$ содержится 20 или 21 (в зависимости
от OPTION BASE) элементов, каждый из которых может занимать
до 80 байт.
Когда имена массивов используются в качестве параметров под-
программ, то их выделяют с помощью пустых скобок (одномерные
массивы) или скобок, содержащих одну или две запятые (двумерные
или трехмерные массивы). Например:
5 SUB ADAMS (F ( ), R (,)» T, H, EPSILON, RFUN)
Параметры-массивы имеют те же границы, которые были присвоены
им в вызывающей программе.
В проект нового стандарта включено более 40 стандартных
арифметически к функций. Среди них полный набор прямых и обрат-
ных тригонометрических функций, гиперболические функции, различ-
ные операции округления, отсечения и определения машинной точ-
ности. Угловые величины разрешено задавать в радианах или граду-
217
сах. Для выбора единицы измерения углов используется оператор
OPTION ANGLE, аргументом которого может быть служебное слово
DEGREES (градусы) или RADIANS (радианы). Для обработки тексто-
вых значений набор стандартных ^функций предлагает 14 процедур,
Среди них — вычисление длины, анализ вхождения, отсечение конеч-
ных пробелов, различные преобразования.
Программная строка может содержать до 132 символов и допускает
размещение нескольких операторов, разделенных двоеточиями. В каж-
дой строке допускается включение комментария, отделяемого от тела
оператора восклицательным знаком. Восклицательный знак в начале
строки заменяет оператор REM. Например:
100! Подпрограмма анализа
ПО FACT=1: IF N = 0 THEN 150! Обход особого случая
12.4. Расширение набора базовых операторов
и модификация традиционных форм
В состав базовых операторов вошли, наконец, матричные про-
цедуры, включающие формирование специальных матриц, алгебраиче-
ские операции над матрицами и векторами, вычисление определите-
лей, транспонирование и инвертирование матриц, нахождение ска-
лярного произведения векторов. В процессе вычислений допускается
переопределение размерностей массивов. Однако в новом массиве не
должно быть элементов больше, чем ему отводилось по первоначаль-
ному объявлению (DIM или DECLARE). Кроме того, изменения не
должны коснуться количества индексов и минимальных значений их
границ. Матричные операции распространены и на текстовые массивы,
над элементами которых можно выполнять процедуры конкатенации
или росписи пустыми значениями. Например:
155 МАТ А$ = В$ + С$
160 MAT DELTAS = ZERO
Включены матричные операции и в состав модуля расширенной ра-
боты с файлами (MAT INPUT #, MAT PRINT #, ...).
Существенное пополнение связано с вводом новых управляющих
структур. Этот шаг можно рассматривать как попытку завоевать рас-
положение приверженцев структурного программирования. Наряду
с общепринятыми операторами перехода IF-THEN, GOSUB-RETURN,
ON-GOTO, ON-GOSUB, FOR-NEXT в предлагаемый стандарт вклю-
чены циклы с пред- и постусловием (DO-WHILE, DO-UNTIL LOOP-
WHILE, LOOP-UNTIL), структурные блоки IF-ENDIF, оператор
выбора (SELECT CASE), оператор досрочного выхода из циклов
(EXIT FOR, EXIT DO). Для логических условий, используемых
в операторе IF, разрешены сложные логические выражения, состав-
ляемые из простых отношений путем их объединения операциями
218
AND, OR, NOT. Действие новых операторов проще всего уяснить на
конкретных примерах.
Пример 12.1. Фрагмент программы решения квадратного урав-
нения по коэффициентам, набираемым пользователем.
100 INPUT PROMPT "ВВЕДИТЕ КОЭФФИЦИЕНТЫ А, В,
С": А, В, С
ПО DISC = B*B — 4*А*С
120 IF А = 0 THEN
130 PRINT "ЕДИНСТВЕННЫЙ КОРЕНЬ" i GOTO 180
140 ELSE IF DISC < 0 THEN
150 PRINT "КОРНИ КОМПЛЕКСНЫЕ" : GOTO 210
160 ELSE PRINT "КОРНИ ВЕЩЕСТВЕННЫЕ" t GOTO 260
170 ENDIF
00
Пример 12.2, Суммирование членов ряда 2 (—1)л-1/А2 (цикл
Л=1
с предусловием).
100 LET S = 0 : V=1 : К=1
ПО DO WHILE V>= IE —8
S = S+V : K=K+1 i V = —V/(K*K)
120 LOOP
Пример 12.3. Вариант примера 2 (цикл с постусловием).
100 LET S = 0 ; V=1 : К=1
ПО DO
S = S+V : К = К+1 : V = -V/(K*K)
120 LOOP UNTIL V> IE —8
Пример 12.4. Анализ первого символа текстового значения.
100 SELECT CASE SIMWOL$ (1:1)
ПО CASE "А" ТО "Z", "а" ТО "z"
120 PRINT SIMWOL$; "-буква"
130 CASE "0" ТО "9"
140 PRINT SIMWOL$; "—цифра"
150 CASE ELSE
160 PRINT SIMWOL$; "—недопустимый символ"
170 END SELECT
Структурные единицы типа IF-ENDIF, DO-LOOP, SELECT-END
SELECT организуются подобно циклам. Вход в эти модули разрешен
только через соответствующий оператор заголовка.
В новом стандарте введен оператор форматного вывода PRINT
USING. Описание формата в теле оператора может быть задано либо
текстовой константой, либо ссылкой на значение текстовой перемен-
ной или на номер оператора IMAGE. Числовые значения могут быть
напечатаны в целом виде, в форме с фиксированной или плавающей
219
запятой. При этом имеется возможность подавить или принудительно
напечатать незначащие нули слева, заменить их лидирующими звез-
дочками, повлиять на позицию, в которой размещается знак числа,
разделить цифровые позиции запятыми и т. п. При печати текстовых
величин имеется возможность прижать текст к левому (если есть
знак <) или правому краю поля. Ниже приведены несколько при-
меров, демонстрирующих способы описания числовых и символьных
полей, а также соответствующие образцы вывода информации
10 LET X = 18
20 PRINT USING "В жизни раз бывает ## лет" • X
В жизни раз бывает 18 лет
100 LET А$ = '#### ###•#
ПО PRINT USING А$ : 1, 2, 3
ljljlj 1 i_ji_i2.0 30.00Е—01
200 PRINT USING 210 : "САША", "САША"
210 IMAGE : < ####
САШАш ljCAUIA
300 LET В$ = "День рождения %% ###### 19%% г"
310 PRINT USING В$ : "Маши", 9, "января", 71
День рождения Маши: 09 января 1971 г.
Подверглась модернизации и процедура считывания значений
из блока данных. В операторе READ добавлена возможность про-
граммной реакции на событие, связанное с исчерпанием данных.
Пример 12.5. Суммирование до исчерпания блока данных.
100 LET SUMMA = 0
ПО DO
120 READ IF MISSING EXIT DO : X
130 LET SUMMA = SUMMA+ X
140 LOOP
150 PRINT "Сумма равна"; SUMMA
При исчерпании блока данных (IF MISSING) происходит выход из
бесконечного цикла (DO-LOOP) на оператор с меткой 150. За опера-
тором RESTORE узаконена функция возврата указателя блока дан-
ных в начало любой порции, описанной заданным оператором DATA.
Операторы ввода данных (INPUT) и символьных строк (LINE
INPUT) позволяют «разбросать» в списке ввода несколько подсказок,
относящихся к разным переменным. Появилась возможность ограни-
чить время, отведенное пользователю для набора данных, а также
зафиксировать фактически затраченное время. Например:
160 INPUT TIMEOUT 20, ELAPSED Т : XI, Х2, ХЗ
220
Здесь пользователю отведено на обдумывание не более 20 с, а фак-
тическое время набора трех значений будет зарегистрировано в пере-
менной Т.
12.5. Сегментация программ
Новый стандарт бейсика предоставляет пользователю возможность
разбивать исходную программу на составные части. Каждая такая
часть представляет собой программную единицу, которую можно раз-
работать, отладить отдельно от других частей и записать в библио-
теку. Затем архивные сегменты могут быть использованы при компо-
новке более сложных программных комплексов. Среди сегментов
можно выделить головной, с которого начинается выполнение про-
граммного комплекса. Другие сегменты могут вызываться в процессе
выполнения головного модуля или замещать его при организации
цепочки последовательно работающих самостоятельных программ.
Вызываемые модули, в свою очередь, могут обращаться к другим
несамостоятельным сегментам из цепочки программ,
К несамостоятельным программным единицам ртносятся внешцце
функции, обычные и графические подпрограммы. Внешние функции
по своему смыслу мало чем отличаются от внутренних нестандарт-
ных функций, определяемых с помощью оператора DEF. Дело в том,
что новый стандарт разрешает присваивать внутренним функ-
циям пользователя имена любой длины и допускает многостроковые
описания.
Пример 12.6. Внутренняя функция-минимум двух величин.
10 DEF MIN (X, Y)
20 MIN = X
30 IF Y < X THEN MIN = Y
40 END DEF
В отличие от внутренних функций для оформления внешних
функций, выделяемых в отдельный программный сегмент, использу-
ются операторы заголовка (FUNCTION) и окончания (END FUNC-
TION).
Пример 12.7. Внешняя функция —минимальная компонента
вектора.
10 FUNCTION MIN—VEC (Х( ), N)
20 LET М=Х (1)
30 FOR К = 2 ТО N
40 IF X (К) < М THEN М = Х (К)
50 NEXT К
60 LET MIN_VEC = M
70 END FUNCTION
221
В программе, использующей внешние функции, необходимо пере-
числить их имена в операторе DECLARE:
10 DECLARE FUNCTION MIN_VEC, INTEGRAL
Среди аргументов внешних и внутренних функций могут быть стро-
ковые или арифметические значения, скалярные переменные и мас-
сивы.
Несмотря на общее сходство между внутренними и внешними
функциями, имеется и существенное различие. Главное заключается
в том, что внешней функцией может воспользоваться любой про-
граммный сегмент. Внутренняя же функция является собственностью
той программной единицы, где она описана, и никакая внешняя сек-
ция обратиться к ней не может. Внутренняя функция наряду с фор-
мальными параметрами может использовать значения глобальных
переменных, принадлежащих секции-хозяину. Все переменные внеш-
ней функции, не входящие в список формальных параметров, для
вызывающей программы не доступны.
Внешняя подпрограмма начинается с заголовка — оператора SUB
и оканчивается оператором END SUB. В отличие от внутренних под-
программ в этом описании отсутствуют операторы возврата—RETURN.
Пример 12.8. Внешняя подпрограмма —нормирование матрицы.
10 SUB МАТ_NORM (А (,), N, М, ERR)
15 ERR=0
.20 FOR J = 1 TO N
30 D = 0
40 FOR K=1 TOM
50 Q = A(J, K) : D = D+Q*Q
60 NEXT К
70 IF D = 0 THEN ERR = 1 : EXIT FOR
80 Q = SQR(D)
90 FOR K=1 TOM
100 A (J, K) = A(J, K)/Q
110 JNEXT К
120 NEXT J
130 END SUB
К оформленной таким образом подпрограмме обращаются с помощью
оператора CALL. Например:
60 CALL MAT__NORM (DELTA(,), 10, 12, Z)
Среди параметров, передаваемых вызываемой подпрограмме, могут
присутствовать числовые и строковые значения, имена переменных,
массивов и файлов, номера каналов ввода/вывода.
О цепочке последовательно работающих программ говорилось
в разд. 9.7. Остается добавить, что следующая по цепочке программа
222
вызывается с помощью оператора CHAIN. При этом указывается имя
вызываемой программы, и. имеется возможность передать ей параметры
подобна оператору CALL. Необходимо только, чтобы аналогичный
список формальных параметров* присутствовал в списке оператора
PROGRAM,, с которого может начинаться самостоятельная програм-
мная единица.
Последний вид программных единиц—графические подпро-
граммы— рассматривается ниже.
12.6. Работа с файлами
Новый проект уделяет большое внимание организации файловых
структур и взаимодействию программ с внешними устройствами.
По способу доступа к данным стандарт выделяет четыре типа
организации файлов—последовательные (SEQUENTIAL), потоковые
(STREAM), относительные (RELATIVE) и ключевые (KEYED),.
Файл с последовательной организацией представляет собой сово-
купность наборов данных (записей), которые обрабатываются по по-
рядку. В таком файле мы всегда обращаемся к следующей записи.
Наряду с этим имеются возможности в любой момент вернуться
к началу файла (BEGIN) или «перешагнуть» через последнюю запись
(END). Последняя процедура полезна для пополнения уже сущест-
вующего файла новыми записями.
Файл с потоковой организацией представляет собой набор данных,
не разделяющихся на записи. Он скорее напоминает блок данных,
расположенный на внешнем носителе. Каждое числовое или текстовое
значение в нем отделяется друг от друга каким-то разделителем,
например запятой.
Файлы с ключевой и относительной организацией не принадлежат
к ядру стандартного бейсика, а относятся к его расширению.. В этих
файлах каждая запись снабжается индивидуальным «именем» — сим-
вольным ключом или порядковым номером. Оба типа файлов обеспе-
чивают как последовательную обработку записей, так и доступ к нуж-
ной записи. Порядковые номера представляют собой частный случай
записей с ключами. Ключевые записи можно отсортировать в нужней
порядке с целью ускорения или упрощения последующих процедур
обработки. Способ доступа к данным по ключу или по номеру записи
в литературе носит название прямого (DA—direct access)* или случай-
ного (RA—random access) доступа.
По способу представления- данных различают три типа (REC-
TYPE) записей — символьные (DISPLY), записи с внутренним (IN-
TERNAL) форматом данных и записи, сформированные по нестан-
дартному шаблону (NATIVE). Файлы с символьным форматом обычна
ориентированы на устройства ввода/вывода, для которых символьное
представление данных наиболее естественно (дисплей, АЦПУ). Внут-
223
ренний формат соответствует представлению данных, принятому на
конкретной ЭВМ. Такими данными можно обмениваться между опе-
ративной памятью ЭВМ и внешними устройствами типа МЛ или МД
без какого-либо преобразования, что существенно экономит время и
ресурсы ЭВМ. Преобразование данных по заданному шаблону позво-
ляет обмениваться информацией между различными системами про-
граммирования или между разными ЭВМ.
По характеру доступа (ACCESS) файлы классифицируются на
вводные (INPUT), выводные (OUTPUT) и рабочие (OUTIN), обеспе-
чивающие двусторонний обмен.
Работе с файлом предшествует процедура открытия, выполняемая
по оператору OPEN, в котором с архивным именем (NAME) файла
связывается внутренний программный номер канала (4фп). Дополни-
тельно в операторе открытия устанавливаются такие характеристики
файла, как способ организации (ORGANISATION), характер доступа
(ACCESS), тип записей (RECTYPE), максимальный размер записи
(RECSIZE), режим предварительной сортировки ключевых записей
(COLLATE). Например:
105 OPEN #2 : NAME "TAB —1", ACCESS &
& OUTIN ORGANISATION &
& KEYED, RECTYPE INTERNAL
110 OPEN #3 : NAME A$, RECTYPE NATIVE, &
& RECSIZE VARIABLE LENGHT 80
Разрыв связи между файлом и программным номером канала (т. е.
закрытие) осуществляется по оператору CLOSE:
250 CLOSE #3
Основные процедуры обмена с файлами — это ввод (чтение) или
вывод (запись) данных. К первой группе относятся операторы
INPUT #, LINE INPUT #, MAT INPUT #, MAT LINE INPUT #,
READ MAT READ :|ф. Вторая группа объединяет операторы
PRINT #, PRINT # ... USING, MAT PRINT #, WRITE #, MAT
WRITE #. К ней же примыкают еще три оператора, обеспечивающие
возможность изменения уже существующих записей в файлах с отно-
сительной или ключевой организацией — REWRITE МАТ
REWRITE #, DELETE
Операторы типа INPUT или PRINT применяются при работе
с последовательными файлами с символьно-форматной структурой
записей (DISPLY). В операторе ввода могут находиться дополни-
тельные указания, обеспечивающие начальную установку указателя
файла (BEGIN) или определяющие действия на случай исчерпания
данных (IF MISSING ... ). В этом случае перед вводным списком
ставится разделитель — двоеточие.
224
Например:
100 INPUT #2, BEGIN : А, В, С
150 INPUT #3, IF MISSING EXIT FOR : A$, B$, C$
Дополнительные указания в операторах типа PRINT связаны со ссыл-
кой на формат преобразования вводимых данных. Например:
250 PRINT #4, USING 300 : А, В, С
260 PRINT #6, USING FORMATS : А, В, С
Операторы типа READ или WRITE обеспечивают обмен с фай-
лами любой организации. Для последовательных файлов их функции
немного уже, так как форматных преобразований типа USING ...
здесь не предусмотрено. Однако при работе с записями, формируе-
мыми по нестандартному шаблону (NATIVE), операторы READ/WRITE
используют ссылку (WITH...) на соответствующее указание по об-
работке.
Продемонстрируем на примерах основные возможности операторов
READ и WRITE.
Пример 12.9.
100 READ 1 • А, В, С 1 "Аналог оператора
INPUT # 1 : А, В, С"
ПО READ #2, RECORD N : А, В, С
120 READ #2, IF MISSING 250, RECORD
N + 2 : А, В, C
130 READ #3, KEY N$ : А, В, C
140 READ #4, WITH SH$ : А, В, C
Для проведенной группы операторов ввода характерно то, что счи-
тываемая запись должна содержать три значения. Операторы 100 и
140 обращаются к файлам с последовательной организацией. Файл
с номером должен иметь относительную организацию, так как
доступ к его данным производится по номеру записи. Файл с номе-
ром 4£3 предполагает записи с ключами. Оба файла (ф|:2 и 4£3)
содержат записи с данными, представленными во внутреннем фор-
мате. Если в файле 1 содержимое записи представлено в символь-
ном виде с разделителями, то в файле 4£4 записи организованы по
нестандартному формату (шаблону), определяемому значением пере-
менной SH$. В операторе с меткой 120 предусмотрен переход на
строку 250, если в файле 2 не окажется записи с номером N-|-2.
Пример 12.10.
200 MAT WRITE 4£5 : А$ I "Аналог оператора
MAT PRINT #5, А$"
210 WRITE #6, WITH 300 : А + В, С$, D
220 WRITE #7, RECORD М, IF THERE
350 : X, Y, Z
8 Ю. Л. Кетков
225
Оператор 200 осуществляет запись текстового массива А$ в файл 5
с последовательным доступом. В операторе 210 использована ссылка
на строку 300, где должно находиться описание структуры записи
(оператор TEMPLATE). Оператор 220 предусматривает блокировку по-
вторного вывода данных наместо уже существующей (IF THERE... )
записи в файле с относительной организацией. Если бы здесь не был
предусмотрен условный переход на строку с номером 350, то повтор-
ный вывод на одно и то же место привел бы к регистрации- програм-
мной ошибки.
Операторы REWRITE или MAT REWRITE используются
для замены существующей записи в файле с ключевой или относи-
тельной организацией. Если делается попытка обновить запись, кото-
рой в файле нет, то фиксируется программная ошибка. Избежать
снятия задачи в этом случае можно, предусмотрев ситуацию IF
MISSING:
30 REWRITE #3, KEY "ВАСЯ", IF MISSING EXIT
DO : Al, Bl, Cl
50 REWRITE #3, SAME : A2, B2,-C2
Служебное слово SAME означает, что производится замена текущей
записи, которая была либо считана, либо создана предшествующим
оператором ввода/вывода.
Оператор DELETE позволяет удалить существующую запись
в файле с ключевой или относительной организацией. Например:
440 DELETE #3, SAME
450 DELETE #7, RECORD M, IF MISSING 200
460 DELETE #3, KEY "ВАСЯ"
Более мощные средства по удалению данных из файлов с после-
довательной, ключевой или относительной организацией предостав-
ляет оператор ERASE. С его помощью можно очистить весь файл
целиком (ERASE) или удалить все записи от текущего положения
указателя файла до конца (ERASE REST).
Операторы READ, WRITE и REWRITE при работе с записями
типа NATIVE используют шаблон структуры записи, заданный либо
в виде текстовой константы, либо посредством ссылки на номер опе-
ратора TEMPLATE. Шаблон представляет собой список описаний
полей в порядке их расположения в записи. Например: -
100 SHABLON$ = "STRING*10, NUMERIC*6.2,
NUMERIC* Е"
200 TEMPLATE : STRING*10, NUMERIC*6.2,
NUMERIC*E
Оба шаблона описывают запись, состоящую из трех полей. Пер-
вое поле, занимающее 10 байт, предназначено для размещения сим-
226
вольной информации. На втором поле может находиться числовое
значение, округленное до двух десятичных цифр после запятой и не
превосходящее по абсолютной величине 106. Третье поле предназна-
чено для размещения числового значения с несколькими значащими
цифрами в соответствии с форматом, реализованным на данной ЭВМ
или описанным в операторе объявления форматов арифметических
данных (ARITHMETIC).
Если запись содержит несколько подряд идущих полей с одина-
ковой структурой, то, подобно фортрану, можно объединить их опи-
сания в одно более компактное. Например:
150 TEMPLATE : NUMERIC*6.2, NUMERIC*6.2,
NUMERIC*6.2
160 TEMPLATE : 3 NUMERIC*6.2
При обмене с использованием шаблона записи можно пропускать
отдельные поля, применяя указатель SKIP.
Пример 12.11. Использование шаблонов с пропусками полей.
10 Fl$ = "STRING*10, NUMERIC*6.2,
NUMERIC*8.3"
20 F2$ = "SKIP STRING*10, NUMERIC*6.2,
NUMERIC*8.3"
30 F3$ = "STRING*10, SKIP NUMERIC*6.2,
NUMERIC*8.3"
100 WRITE #1, RECORD 10, WITH
Fl$ : A$, В, C
105 READ #1, RECORD 10, WITH
F2$ : X, Y
110 READ #1, RECORD 10, WITH
F3$ : TIME$, Z
Описание короткого шаблона может быть помещено в виде литераль-
ной константы непосредственно в операторе обмена:
200 WRITE #5, KEY А$, WITH "5NUMERIC*4" : Al,
A2, A3, A4, A5
При этом значения переменных Al, А2, ie., А5, округленные до
целого, будут помещены в запись с ключом А$. Ситуация, когда
арифметическое значение не помещается в отведенном поле, воспри-
нимается как программная ошибка.
Кроме описанных выше процедур открытия, закрытия и обмена
с файлами новый стандарт предоставляет пользователю возможность
определения характеристик файла и его состояния. Для этой цели
используется оператор ASK, в теле которого в любой комбинации
могут быть заданы опрашиваемые параметры.
8*
227
Среди них:
CAPABILITY — для выявления отношения, с чем мы имеем дело—
с истинным файлом или устройством;
MARGIN —для определения длины строки файла с организацией
типа DISPLY;
ZONE WIDTH — для определения размера зоны в строке сим-
вольно-дисплейного файла;
KEY — для опроса значения ключа, соответствующего текущей
записи;
RECORD — для опроса номера текущей записи;
DATUM —для выяснения, является ли очередной элемент в файле
с потоковой (STREAM) организацией числом или символьной кон-
стантой;
POINTER — для опроса состояния указателя файла (возможные
ответы: BEGIN — в начале, MIDDLE — в середине, END — в конце,
UNKNOWN — не определено).
Каждый такой параметр задается в паре с переменной арифме-
тического или текстового типа, в которую заносится значение опра-
шиваемой характеристики. Например:
100 ASK #3 : KEY А$
Еще одна возможность по управлению файлами предоставляется
оператором RESET, действие которого связано с перемещением ука-
зателя файла. Указатель открытого файла—это некоторая служебная
переменная, имя и адрес которой пользовательской программе не
доступны. Однако изменить ее значение можно следующим образом:
100 RESET zftl, BEGIN 1 Возврат указателя
в начало файла.
НО RESET 2, END I Перевод указателя
в конец файла.
120 RESET NEXT ! Перевод указателя
в начало следующей записи.
130 RESET 4£4, SAME ! Возврат в начало
только что обработанной записи.
140 RESET KEY "ВАСЯ" I Установка в начало
указанной записи
150 RESET #6, RECORD N 1
С помощью оператора RESET можно убедиться в существовании
или отсутствии указанной записи. Например:
200 RESET # К, KEY А$, IF THERE EXIT FOR
210 RESET # К, RECORD 5, IF MISSING 300
228
12.7. Программные средства обработки
особых ситуаций
Особые ситуации возникают во время выполнения программы,
когда ее действия не укладываются в рамки, предусмотренные стан-
дартом языка. Например, делаются попытки разделить на нуль, найти
логарифм отрицательного числа, обратиться к закрытому файлу,
передать управление по несуществующему адресу и т. п. Всего
в стандарте предусмотрено порядка 150 нарушений такого рода.
Некоторые из них не вызывают фатальных последствий. Например,
ошибка в задании аргумента табуляторного пропуска TAB (—2) при-
водит к выдаче предупреждающего сообщения. Однако выполнение
программы не прерывается — система сама подправляет аргумент
(—2->4-1). К сожалению, с большинством ошибок дело обстоит
несколько хуже. Их появление приводит к снятию задачи.
О некоторых мерах предупреждения особых ситуаций (IF MISSING)
мы уже упоминали. Более общий подход к обработке прерываний
обеспечивается путем выделения контролируемых сегментов в поль-
зовательской программе. Начинается такой фрагмент с оператора
WHEN EXCEPTION, а заканчивается оператором END WHEN.
В конце выделенного таким образом блока помещается программа
обработки прерываний, возникающих в пределах этого блока. Вход
в программу обработки прерываний обозначается оператором USE.
Управление в эту точку передает система в момент возникновения
особой ситуации. Для анализа ситуации программа обработки пре-
рывания может воспользоваться служебными переменными EXLINE
и EXTYPE, определяющими номер строки, где произошел сбой, и код
соответствующего прерывания.
Выделение контролируемого сегмента в. блок с помощью опера-
торов WHEN EXCEPTION —END WHEN накладывает следующие
ограничения на логику работы программы:"
— вход в такой блок может быть осуществлен только через его
заголовок;
— выход за пределы контролируемого участка с помощью обыч-
ных операторов перехода запрещен.
Довольно часто в программе приходится выделять не один, а
несколько контролируемых участков, в которых используется сте-
реотипная схема обработки прерываний. Чтобы не повторять ее в каж-
дом блоке, такую обработку выделяют подобно внутренним подпро-
граммам в так называемый обработчик прерываний. Подрограмма-
обработчик снабжается именем, которое указывается в опера-
торе HANDLER. Признаком конца обработчика является оператор
END HANDLER. Для того чтобы воспользоваться такой подпро-
граммой, в контролируемом фрагменте помещается оператор USE
229
с именем необходимого обработчика. Выход из подпрограммы обра-
ботки прерывания можно осуществить одним из четырех способов:
— повторно выполнить оператор, в котором произошло прерыва-
ние (для этого используется оператор RETRY);
— передать управление на оператор, следующий за ошибочным
(для этого используется оператор CONTINUE);
— передать управление вызывающей программе, если ошибка
произошла в подпрограмме, или системе с помощью оператора EXIT
HANDLER;
— передать управление на оператор, следующий за контролируе-
мым блоком (это происходит при попадании на оператор END WHEN
или END HANDLER).
Рассмотрим описанные схемы обработки прерываний на двух
следующих примерах.
Пример 12.12. Обработка ошибки несоответствия типов при
вводе числовых данных по оператору INPUT.
100 WHEN EXCEPTION IN ! Программа обработки
внутри блока
ПО PRINT "Введите свою фамилию"
120 INPUT NAME$
130 PRINT "Введите свой возраст и вес"
140 INPUT А, В
150 PRINT "Введите свой рост"
160 INPUT С
170 USE ! Точка входа при ошибках
в строках 140, 160
180 PRINT "Вы должны вводить только числа"
190 RETRY ! На повтор ошибочного оператора
200 END WHEN
В примере 12.12 прерывание может возникнуть либо при вводе
значений А и В, либо при вводе значения С. Все указанные пере-
менные являются числовыми, и стоит пользователю ошибиться при
наборе соответствующих данных, как наступит аварийная ситуация.
По сигналу прерывания система передает управление оператору 170—
входу в программу обработки ошибок. После выдачи предупреждаю-
щего сообщения (оператор 180) управление передается на неудачно
выполненный оператор ввода. Если ввод С завершился нормально,
то управление будет передано на оператор, следующий за строкой 200.
Пример 12.13. Обработка ошибок при динамическом открытии
файлов по именам, введенным пользователем.
100 DO
ПО LET PRIZNAK=1
120 PRINT "Введите имя первого файла"
130 INPUT А$
230
140 WHEN EXCEPTION USE EROPEN
150 OPEN # 1 : NAME A$
160 END WHEN
170 ! Точка ввода при нормальном или ошибочном
завершении оператора 150
180 LOOP WHILE PRIZNAK-1
200 DO
210 LET PR1ZNAK= 1
220 PRINT "Введите имя второго файла"
230 INPUT А$
240 WHEN EXCEPTION USE EROPEN
250 OPEN # 2 : NAME A$
260 END WHEN
270 ! Точка ввода при нормальном или ошибочном
завершении оператора 250
280 LOOP WHILE PRIZNAK=1
500 ! Подпрограмма-обработчик прерываний
510 HANDLER EROPEN
520 LET PRIZNAK = 0
530 IF EXTYPE = 7107 THEN LET М$ = "не существует"
540 ELSEIF EXTYPE =7102 THEN LET
М$ = "не того типа"
550 ELSE LET M$ = "нельзя использовать"
560 ENDIF
570 PRINT "файл"; A$; M$; "наберите еще раз"
580 END HANDLER
В примере 12.13 продемонстрирована подпрограмма обработки
ошибок, вынесенная за пределы контролируемых фрагментов. Если
файл # 1 (оператор 150) или файл # 2 (оператор 250) не может быть
открыт по тем или иным причинам, система передает управление на
вход обработчика прерываний (оператор 510). По коду ошибки, преду-
смотренному проектом стандарта, здесь производится анализ причины
прерывания. После выдачи пояснительного сообщения управление пе-
редается оператору 170 или 270. Переменная PRIZNAK используется
в качестве условия выхода из бесконечного цикла.
12.8. Предложения по стандартизации
графической компоненты
Проект стандарта X3J2/82-17 включал и предложения по гра-
фике, однако они не очень удачно согласовывались с уже принятым
международным графическим стандартом GKS [8]. Поэтому излагае-
мый ниже материал можно рассматривать лишь как некоторое приб-
231
лижение к стандарту на взаимодействие с графическим дисплеем".
Ориентация на дисплей не налагает запрета на использование дру-
гих графических устройств. Однако при работе с пассивными реги-
страторами изображений пользователь может употреблять только
операторы графического вывода.
Рабочее поле представляется максимальным квадратом, вписы-
вающимся в отображаемую область экрана. На нем вводится декар-
това система координат с началом в левом нижнем углу. Верхнему
правому углу квадрата соответствует точка с координатами (1, 1).
Если отображающая поверхность экрана представляет собой прямо-
угольник, вытянутый по горизонтали или вертикали, то рабочий
квадрат прижимается к правому верхнему углу экрана. Расположение
рабочего поля на экране может быть изменено путем ограничения
ширины и высоты части экрана, используемой под графику. Выпол-
няется эта процедура с помощью оператора установки границ, имею-
щего следующий формат:
40 SET BOUNDS X, Y
Такое назначение должно быть произведено до выполнения какой-
либо процедуры графического ввода-вывода.
Выделение прямоугольной области в пределах рабочего поля,
предназначенной для отображения очередной порции графических
данных, осуществляется с помощью оператора SET VIEWPORT:
100 SET VIEWPORT Xmin, Xmax, Ymin, Ymax
Указанная здесь четверка значений, каждое из которых должно
принадлежать интервалу [0,1], выделяет очередную область рисунка.
Перевод программных координат отображаемых точек в экранные
координаты производится по формулам, аналогичным (8.1). Установка
пределов изменения программных значений по координатам X и Y
соответственно выполняется оператором SET WINDOW:
' НО SET WINDOW Xmln, Xmax, Ymin, Ymax
Простейшими операторами, управляющими перемещениями луча
в выделенной области, являются PLOT, MAT PLOT и MAT FILL.
Первый из них моделирует работу оператора PRINT с той лишь
разницей, что рабочее поле на экране дисплея по мере заполнения
не перемещается. Элементами выводного списка оператора PLOT
являются пары арифметических выражений, значения которых вос-
принимаются как координаты X и Y очередной точки воспроизво-
димого полигона. Например:
120 PLOT 20, 20; 20, 30; 30, 30; 30, 20; 20, 20
Каждая пара координат отделяется от предыдущей пары точкой
с запятой. Такой разделитель можно поставить и в конце выводного
232
списка. Это будет означать, что последняя вершина, отображенная
данным оператором PLOT, будет соединена с первой точкой из сле-
дующего оператора PLOT.
Пример 12.14. Построение синусоиды в цикле.
100 FOR Х=0 ТО 6.28 STEP 0.01
НО PLOT X, EXP (— X)*SIN (X);
120 NEXT X
130 PLOT
Последний оператор PLOT с пустым списком включен в этот
фрагмент, чтобы разорвать связь последней точки нашего графика
с последующими графическими объектами.
Оператор MAT PLOT оперирует с двумя числовыми массивами,
в которых должны быть сформированы координаты X и У для всех
вершин воспроизводимого полигона.
Пример 12.15. Построение синусоиды с помощью матричного
оператора.
100 FOR К=1 ТО 100
ПО LET А (К) = (К—1)*0.01
120 LET В (К) = SIN (А (К))
130 NEXT К
140 MAT PLOT A, В
Другая модификация оператора MAT PLOT позволяет работать с од-
ним двумерным массивом C(N, 2), в котором координаты вершин
попарно перемежаются: С(1, 1) = Xlt С (1, 2)=Yi, С (2, 1) == Х2,
С(2, 2) = У2, ... В этом случае формат оператора вывода таков:
20 MAT PLOT 50: С
Число, расположенное перед именем массива, определяет количество
первых точек, участвующих в построении.
Оператор MAT FILL отличается от оператора MAT PLOT тем,
что соединяет последнюю точку воспроизводимого полигона с первой.
В результате формируется замкнутая многоугольная область, которая
дополнительно может быть окрашена, если графический дисплей
такую возможность предусматривает.
Существенно более широкие изобразительные средства обеспечи-
ваются графическими процедурами, т. е. подпрограммами, формирую-
щими изображение объекта с заданными параметрами. Описание та-
ких объектов начинается с оператора PICTURE, вслед за которым
указываются имя объекта-процедуры и список формальных параметров,
заключенных в скобки. Например, подпрограмма построения правиль-
ного n-угольника описывается следующим образом.
Пример 12.16. Подпрограмма построения п-угольника.
2000 PICTURE POLYGON (N)
2010 LET P = 2*PI/N
233
2020 FOR UO TON
2030 PLOT COS(P*I), SIN (P*I);
2040 NEXT I
2050 PLOT
2060 END PICTURE
В описании одной графической процедуры может встретиться обра-
щение к другой процедуре. Например, для воспроизведения окруж-
ности можно воспользоваться правильным многоугольником с доста-
точно большим (п=100) числом сторон. И тогда описание окружности
может выглядеть следующим образом.
Пример 12.17. Подпрограмма построения окружности.
2100 PICTURE CIRCLE
2110 PLOT POLYGON(IOO)
2120 END PICTURE
Вызов н исполнение графической процедуры осуществляются опера-
тором PLOT, расположенным среди группы выполняемых операторов.
В отличие от этого оператор с меткой 2110 принадлежит к группе
описательных операторов и немедленному исполнению не подлежит.
В теле оператора PLOT кроме имени вызываемой процедуры и списка
фактических параметров может содержаться ссылка на матрицу
геометрических преобразований. Например:
100 PLOT POLYGONS) WITH А
В этом случае координаты каждой воспроизводимой точки перед
построением множатся на матрицу преобразований, имеющую размер-
ность 4x4. О подобных схемах пересчета однородных координат мы
уже писали в разд. 8.2. Выбор размерности преобразующей матрицы
в проекте стандарта сделан с запасом на случай работы с трехмер-
ными объектами. Формирование матриц для наиболее распространен-
ных геометрических преобразований осуществляется с помощью стан-
дартных процедур, приведенных в табл. 12.1.
Таблица 12.1
Формат процедуры Результат действия формируемой матрицы
SCALER) SCALER, р) SHIFT(AX, Ау) ROTATE(a) SHEAR(a) Масштабирование, при котором точка (х, у) переходит в точку (kx, ky) Раздельное масштабирование по каждой координате: (х, у) —► (kxt ру) Параллельный перенос: (х, у) —> —>(Х+Ах, + Поворот на угол а, отсчитываемый от осих против часовой стрелки Наклон вертикальных линий вправо на угол a
234
Кажадя из этих процедур формирует свою матрицу преобразований.
Процедуры можно комбинировать, перемножая в нужном порядке
для получения более сложных результирующих матриц. Например:
100 МАТ В — ROTATE(PI/4)*SCALE(2)*SHIFT(2.5, 3)
Оператор матричного присваивания в проекте стандарта специально
расширен для формирования матрицы преобразований с помощью
такого рода выражений.
В операторе PLOT может использоваться ссылка либо на мат-
рицу стандартного преобразования, либо на массив, сформированный
путем последовательного применения нескольких стандартных преоб-
разований:
ПО PLOT CIRCLE WITH SCALE(2)
120 PLOT POLYGONS) WITH В
Для совмещения графического изображения с текстовой инфор-
мацией в проекте стандарта предусмотрен оператор GRAPHIC
PRINT, обеспечивающий вывод пояснительных подписей в заданном
месте экрана:
150 GRAPHIC PRINT AT X, Y: "ПОДПИСЬ''
Каждый символ отображаемого текста окаймлен квадратом, в котором
условно введена локальная система координат с началом (0, 0) в ле-
вом нижнем углу и точкой (1, 1) в правом верхнем углу. Оператор
GRAPHIC PRINT использует координату точки (X,Y) для привязки
текста по следующему алгоритму:
— если перед, этим был установлен «левый прижим», т. е. был
выполнен оператор SET JUSTIFY 0, 0, то в точку с координатами
(X, Y) помещается нижний левый угол квадрата, окаймляющего
первый символ текста;
— если перед этим был установлен «средний прижим», т. е. был
выполнен оператор SET JUSTIFY 0.5, 0.5, то в точку с координа-
тами (X, Y) помещается центр квадрата, окаймляющего средний
символ^ текста;
— если перед этим был установлен «правый прижим», т. е< был
выполнен оператор SET JUSTIFY 1, I, то в точку с координатами
(X, Y) помещается правый верхний угол квадрата, окаймляющего
последний символ текста.
Дополнительно к указанным средствам расположения надписи
имеется возможность изменить высоту символов (SET CHARACTER
HEIGHT) и установить угол наклона надписи (SET TEXT ANGLE).
Среди других возможностей, содержащихся в проекте стандарта,
следует отметить операторы: очистки экрана (CLEAR); установки
основного (COLOR) и фонового (BACKGROUND COLOR) цветов;
определения типа линии —сплошная, пунктирная или штрихпунктир-
235
ная (SET LINE STYLE); включение или отключение режима, отсе-
чения частей изображения, выходящих за границы, установленные
с помощью оператора VIEWPORT (SET CLIP ON или SET CLIP
OFF).
Оператор ввода GRAPHIC INPUT позволяет локализовать пози-
цию точки, в которой находится маркер (курсор) или какое-либо
другое средство целеуказания (световое перо, рычажное или шаровое
координатное устройство). Таким образом можно ввести не только
координаты отмеченной точки, но и прочитать символ, расположен-
ный в окрестности указанной точки.
12.9. Редактирование исходной программы
Необязательный модуль редактирования демонстрирует попытку
стандарта распространить свое влияние не только на алгоритмичес-
кий язык, но и на язык общения с системой программирования.
В состав этого модуля включены четыре директивы—DELETE,
EXTRACT, LIST и RENUMBER. Первые две из них позволяют
удалить из программы либо заданный фрагмент (DELETE 50, 100),
либо все, кроме указанных фрагментов (EXTRACT 100 ТО 200, 300,
50 ТО LAST). Директива LIST используется для распечатки текста
исходной программы или ее фрагментов:
LIST
LIST 50 ТО 100
LIST FIRST ТО 200
LIST 80 ТО LAST
Служебные слова FIRST (первый) и LAST (последний) соответствуют
строкам программы с наименьшим и наибольшим номерами.
С помощью директивы RENUMBER осуществляется перенумера-
ция строк исходной программы, включая и перенастройку операторов,
связанных с этой процедурой. По умолчанию нумерация выполняется
с шагом 10, начиная с оператора 100.
12.10. Управление реальными объектами и процессами
Программа, работающая в режиме реального времени (RT—Real
Time), оформляется как совокупность параллельно выполняющихся
процессов—PARACT'ob. Головного модуля в RT-программе не су-
ществует. Основное назначение PARACT'a — поддерживать контакты
со своим объектом управления, принимать или передавать управляю-
щие сигналы, вводить или выводить информацию, связанную с рабо-
той объекта, ждать наступления тех или иных событий и своевре-
менно реагировать на их появление, осуществлять контроль за особыми
ситуациями и т. п,
236
Описание процесса начинается с оператора PARACT (PARallel
ACTivity), в котором указывается имя процесса. Это имя в дальней-
шем может фигурировать в операторах запуска или останова про-
цесса. Вслед за заголовком располагаются операторы с опиранием
портов, используемых в рамках данного процесса. Порт представляет
собой программно-аппаратный узел связи, обеспечивающий обмен
управляющей информацией или данными между различными абонен-
тами (аналог почтового отделения). Порты данных обеспечивают
совместное использование общего блока данных между двумя или
более PARACT'aMH. Порты сообщений используются для обмена ин-
формацией между двумя PARACT'aMH. Существуют активные и пас-
сивные порты, обеспечивающие связь между процессом и управляемым
объектом.
При описании порта указываются его тип, имя и формат соот-
ветствующих данных. Для портов, связанных с конкретной аппара-
турой, приводится идентификатор соответствующего физического
устройства.
Пример 12.18. Фрагмент процесса-регулятора напряжения,
10 PARACT VOLTMETR
20 STRUCTURE SI .-STRING, 2 OF NUMERIC,
NUMERIC(IO)
30 STRUCTURE S2 : 2 OF NUMERIC
40 MESSAGE POCHTA OF SI ! Порт сообщений
50 PROCESS INPUT VOLTAGE OF S2 "физич. номер"
60 SHARED B(5) OF SI ! Порт общих данных
Тело процесса обычно представляет собой бесконечный цикл,
в котором операторы обращения к портам перемежаются операто-
рами WAIT, переводящими процесс в состояние ожидания. Для
общения с разными портами используются следующие параметры:
IN — чтение данных из порта, связанного с управляемым процес-
сом (устройством);
OUT—вывод данных в управляющий порт;
GET — чтение из порта, связанного с общими данными;
PUT—вывод в порт, связанный с общими данными;
RECEIVE — прием сообщения из указанного порта;
SEND — посылка сообщения в указанный порт.
Завершается описание процесса оператором END PARACT.
При запуске RT-программы стартует процесс, описанный первым.
Запуск других процессов осуществляется с помощью оператора START.
Стартовавшие процессы переводятся в режим ожидания с помощью
операторов WAIT, в которых перечисляются ожидаемые события.
Например:
200 WAIT TIME "11 : 30 : 00"
237
210 PRINT "ПОРА ОБЕДАТЬ"
Процесс может быть «разбужен» не только в результате наступления
указанного события, но и по истечении установленного времени
ожидания. * Например:
250 WAIT EVENT PAR, TIMEOUT 5
Если в течение пяти секунд.не наступит событие PAR, то процесс
все равно будет выведен из состояния ожидания.
Дополнительное управление событиями осуществляется с помощью
операторов CONNECT, DISCONNECT и SIGNAL. Первый снимает
блокировку с прерывания, возникающего в момент возникновения
события. Это позволяет «разбудить» процесс или процессы, ждавшие
указанного события. Оператор DISCONNECT включает блокировку
прерываний от данного события. Таким образом можно на время
замаскироваться от менее приоритетного события. Оператор SIGNAL
моделирует прерывание, которое должно наступить в результате
свершения события с указанным именем. Им можно воспользоваться
для тестирования или отладки программы в случае отсутствия или
неисправности соответствующей аппаратуры.
СПИСОК ЛИТЕРАТУРЫ К ГЛАВЕ 12
1. American National Standard for Minimal BASIC, ANSI X3.60.
ANSI, 1978.
2. Cugini J. V., Bowden J. S., Skall M. W. NBS Minimal
BASIC Test. Programms-Version 2. User’s Manual. Vol. 2—Source
Listings and Sample Output. NBS Special Publication 500-70/2.
Washington, 1980, 487 p.
3. Draft International Standard ISO/DIS 6373:Data processing-Pro-
gramming Languages-Minimal BASIC. ISO, 1982.
4. К u r t z T. E. On the way to Standard BASIC. Byte, 1982, v. 7,
N 6, p. 182—218.
5. Draft Proposed Standard for BASIC. ANSI X3J2/82-17, ANSI,
1982
6. H a r 1 e J. The proposed Standard for BASIC. SIGPLAN notices,
v. 18, N 5, May 1983, p. 25—40.
7. В u 1 1 G. M. The current programming language standards scene.
VI. BASIC. Computer & Standards, N 2, 1983, p. 97—99.
8. Draft international standard ISO/DIS 7942: Graphics Kernel System.
ISO, 1983.
9. Draft Proposed American National Standard for BASIC, ANSI
X3J2/84-26. ANSI, 1984.
10. Vose G. M. True BASIC. Byte, vol. 10, N 5, 1985, p. 279—282,
284, 286, 288.
ПёМахачка Иво. Бейсик —ретроспектива и перспектива буду-
щего//Программирование. — 1985.—№ 5. — С. 55—63.
Часть II. СПРАВОЧНОЕ РУКОВОДСТВО
ПО КОНКРЕТНЫМ РЕАЛИЗАЦИЯМ
Глава 13. ОСНОВНЫЕ ЭТАПЫ РАЗВИТИЯ
ДАРТМУТСКОЙ ВЕРСИИ
В 1978 г. в журнале SIGPLAN Notices была опубликована
статья [1] мемуарного характера, принадлежащая перу одного из
соруководителей работ над проектом бейсик-системы в Дартмутском
колледже. Начало этих работ датируется 1963 г.
Первая Дартмутская версия была разработана в 1964 г. и экс-
плуатировалась на вычислительном комплексе, объединявшем основ-
ной (GE-235) и связной (Datanet-ЗО) процессоры. В качестве терми-
нального оборудования использовались телетайпы. Начальная версия
включала всего 14 операторов (DATA, DEF, DIM, END, FOR, GOSUB,
GOTO, IF, LET, NEXT, PRINT, READ, REM, RETURN) и 10 ма-
тематических функций (ABS, ATN, COS, EXP, INT, LOG, RND,
SIN, SQR, TAN). Короткие идентификаторы (буква, буква с» цифрой)
были выбраны авторами по следующим соображениям. Во-первых,
короткие имена быстрее набирать. Во-вторых, фиксация сравнительно
небольшого количества переменных существенно упрощает процедуру
распределения памяти. Наконец, короткие имена позволили устранить
некоторые неоднозначные ситуации. Например:
10 FOR I = JTOTOK
Поскольку пробелы в бейсике смысловой нагрузки не несут, то
указанный оператор мог трактоваться по-разному:
10 FOR I = JTO ТО К
или
10 FOR I = J ТО ТОК
Вторая авторская версия датируется октябрем 1964 г. По сути
дела, была предпринята попытка создать на базе бейсика систему
компилирующего типа. Она даже носила название CARDBASIC,
поскольку предусматривала ввод исходной программы с перфокарт
и выдачу результатов счета на АЦПУ. Единственное существенное
239
изменение входного языка связано с появлением нулевых индексов
в массивах. Аргументацией к этому послужила принятая в матема-
тике система индексации коэффициентов алгебраических полиномов
(Р„ (х) = аохп + а1х"”1+ .. . + в«-1* + ап)- Дополнительным толчком
могло быть и упрощение программы, вычисляющей адрес элемента
массива. Однако это новшество внесло серьезную сумятицу, и в по-
следующих редакциях авторы от нулевых индексов отказались.
Третья Дартмутская версия появилась в 1966 г. в связи с пере-
водом бейсик-системы на более мощную ЭВМ типа GE-635. В этой
редакции были сделаны два существенных дополнения. Первое из
них связано с появлением оператора INPUT, второе — с подключе-
нием группы матричных операций (MAT READ, MAT PRINT, МАТ
А = В + С, МАТ А = В —С, MAT А = В*С, MAT A=INV(B), МАТ
A = TRN(B), MAT А = (е)*В, MAT A = ZER, MAT A = CON, МАТ
A=IDN). В операторе MAT READ была предусмотрена возможность
переопределения размерности массивов.
Среди других новшеств, характерных для третьей редакции,
отметим появление функции SGN и возможность установки указателя
блока данных на начало соответствующей порции (100 DATA ...»
120 DATA........... 250 RESTORE 120 ...).
Информация о четвертой редакции бейсик-системы Дартмутского
колледжа появилась в 1968 г., хотя сама система была введена
в эксплуатацию годом ранее. Наиболее важной особенностью этого
варианта следует считать появление текстовых переменных и одно-
мерных текстовых массивов. В связи с этим возникли два разделен-
ных блока данных, в одном из которых собирались числовые кон-
станты, а в другом — текстовые. Для их раздельного восстановления
были введены модификации оператора RESTORE : RESTORE 4t
(для чисел) и RESTORE $ (для текстов). Обычный оператор RESTORE
восстанавливал оба блока данных одновременно.
Среди менее значительных усовершенствований языка отметим
следующие. Появилась алголоподобная форма оператора присваивания
(LET vi = v2= ... = v^ = e), были добавлены операторы ON.. .GOTO,
RANDOMIZE, MAT A = B. В операторе PRINT стало возможным
позиционирование печатающего механизма (TAB). Был реализован
оператор MAT INPUT для одномерных массивов.
Пятая Дартмутская версия датируется 1970 г. Наиболее важное
дополнение бейсика здесь связано с файлами прямого и последова-
тельного доступов. Для обмена с файлами прямого доступа были
введены операторы READ * и WRITE 4k при работе с последова-
тельными файлами использовались операторы INPUT 4# и PRINT 4k
Появились дополнительные средства по управлению файлами (LOC —
опрос положения указателя, LOF — опрос длины файла, RESET —
переустановка указателя файла, IF END...—реакция на исчерпание
данных).
240
Вторым важным новшеством в этой редакции были элементы
сегментации программ. Были введены оператор CHAIN — для органи-
зации цепочки последовательно работающих программ, опера-
тор CALL — для оверлейной загрузки и выполнения подпрограмм,
оператор COMMON — для распределения транзитных переменных
в специально выделенной области ОП.
Среди менее существенных добавок отметим ряд новых сервисных
функций (CLK$ —опрос времени, DAT$ — опрос текущей даты,
LEN — вычисление длины текстового выражения, STR$ —преобразо-
вание числовых данных в символьный формат, VAL—обратное пре-
образование, ASC — значение кода ASCII для символа, TIM—уста-
новка максимального времени выполнения задания), возможность
оперировать с двумерными массивами текстового типа, снятие запрета
на использование рекурсивных многострочных функций.
Последняя авторская версия была опубликована в 1971 г. В этой
редакции появились более развитые средства для работы с файлами
и подпрограммами.* Для описания и использования подпрограмм были
введены фортраноподобные операторы SUB, SUBEND, CALL. Весьма
существенная добавка в шестой редакции заключалась в средствах
управления форматом вывода (операторы PRINT USING и «image»).
Появились две новые функции работы со строками — SEG$ (выделение
подстроки) и POS (анализ вхождения одной строки в другую).
До 1966 г. работа по программе «Бейсик» проводилась силами
сотрудников и студентов Дартмутского колледжа. Возглавлял эту
группу профессор Дж. Кемени. С весны 1966 г. параллельные работы
начали проводиться одним из отделов фирмы General Electric. В по-
следующие годы на базе Дартмутской версии были построены системы
разделения времени на вычислительной технике фирм Hewlett-Packard
и Digital Equipment Corp. Среди других зарубежных фирм, приняв-
ших бейсик на свое вооружение и приложивших, немало усилий к его
совершенствованию, необходимо отметить Data General, Wang Labora-
tories, Apple Computer, Microsoft Corp.
СПИСОК ЛИТЕРАТУРЫ К ГЛАВЕ 13
1. Kurtz Т. BASIC. ASM SIGPLAN Notices, 1978, V. 13, N 8.—
P. 103—118.
2. Kemeny J. G., К u r t z T. E. BASIC Instruction Manual. Hano-
ver NH: Dartmouth College. 1964, June.
3. Kemeny J. G., Kurtz T. E. BASIC, ,2rd ed. Hanover NH:
Dartmouth College Computation Center. 1964, October.
4. Kemeny J. C., Kurtz T. E. BASIC, 3rd ed. Hanover NH:
Dartmouth College. 1966.
5. Dartmouth 1968. BASIC, 4th ed. Hanover NH: Kiewit Dartmouth
College.
6. Dartmouth 1970. BASIC, 5th ed. Hanover NH: Kiewit Computation
Center.
7. M a t h e r D. G., W a i t e S.V.F. (eds.) 1971. BASIC, 6th ed., Hano-
ver NH: University Press of New England.
Глава 14. Бейсик НА ОТЕЧЕСТВЕННЫХ ЭВМ
2-ГО ПОКОЛЕНИЯ
14.1. Бейсик-система для ЭВМ типа М-20
Одна из лучших отчестве иных ЭВМ первого поколения — вычис-
лительная машина М-20—продолжила свою жизнь в совместимых
с ней по системе команд ЭВМ второго поколения—М-220, М-220А,
М-220М, БЭСМ-ЗМ, БЭСМ-4, БЭСМ-4М. Вычислительные машины типа
М-20 работали со скоростью от 20 тыс. до 27 тыс. оп/с. Они обладали
оперативной памятью объемом от 8К до 32К слов (длина слова—45
разрядов) и были укомплектованы внешними запоминающими устрой-
ствами на магнитных барабанах и магнитных лентах.
Именно на этих машинах, эксплуатировавшихся в крупнейших
вычислительных центрах страны, были созданы наиболее популярные
системы программирования и их компоненты — интерпретирующая си-
стема ИС-2(22) с развитой библиотекой стандартных программ, транс-
ляторы с алгоритмического языка алгол-60 (ТА-1, ТА-2), альфа-система.
На ЭВМ типа М-20 впервые появились операционные системы пакет-
ной обработки (ДМ-222, ОСЛО), включавшие трансляторы с символи-
ческого языка машинных команд (автокод) и фортрана (Ф-20), загрузчик
и редактор связей, средства обслуживания библиотек исходных и объ-
ектных модулей.
В 1969—1970 гг. для ЭВМ типа М-20 была разработана первая
отечественная система программирование, использующая бейсик в ка-
честве входного языка. Из-за отсутствие терминалов первый вариант
функционировал в пакетном режиме. Однако его основу составляли
шаговый компилятор и система управления, обеспечивающая поопера-
торное выполнение рабочей программы. Это позволило сравнительно
легко перейти от последовательной пакетной обработки бейсик-программ
к диалоговой системе коллективного пользования. С 1973 г. ДСКП
функционировала на базе ЭВМ М-222, укомплектованной И терми-
налами.
По решению математического совета Комиссии по эксплуатации
ЭВМ при Президиуме АН СССР бейсик-система была рекомендована
к включению в состав штатного матобеспечения вычислительных машин
типа М-20.
242
14.1.1. Описание входного языка (первая редакция).
Алфавит: латинские буквы (А—Z), дополнительный набор букв
русского алфавита (Б, Г, ..., Я), цифры (0—9), знаки арифметиче-
ских операций (+, —, *, /, f или **—возведение в степень), знаки
операций отношения (>, или >=, <> ^ или < = , =, т=), про-
чие символы (точка, запятая, точка с запятой, апостроф, кавычки,
скобки, пробел, О)-
Константы: текстовые константы, допустившие употребление
любых символов алфавита, могли употребляться только в списке опе-
ратора PRINT. Числовые константы вещественного типа по модулю
принадлежали диапазону от 10“19 до 1019. Максимальное количество
значащих цифр—девять.
Простые переменные: только арифметического типа. Обо-
значения—стандартные (А, АО, ..., А9, В, ВО, ..., Z9). Начальные
значения — нулевые.
Массивы: одномерные и двумерные. Индексы отсчитываются
от единицы. Максимальное значение индекса — 256, по умолчанию—10.
Математические функции: базовый набор из И стан-
дартных функций — ABS, ATN, COS, EXP, INT, LOG, RND, SGN,
SIN, SQR, TAN. Функция RND использовалась без аргумента.
Программная строка: начиналась с номера строки, принадлежа-
щего диапазону [1, 9999]. Заканчивалась символом <>, выполняющим
роль признака конца оператора. Максимальная длина строки —
60 символов.
14.1.2. Специфика базовых операторов. Базовый набор включал
18 операторов—DATA, DEF, DIM, END, FOR, GOSUB, GOTO, IF,
INPUT, LET, NEXT, ON, PRINT, READ, REM, RESTORE, RETURN,
STOP. В основном их форматы следовали общепринятым правилам.
В операторе LET допускался алголоподобный вариант присвоения
одного и того же значения нескольким переменным. Нестандартной
функции разрешалось иметь до 15 аргументов. Редактирующий ука-
затель ТАВ(е) трактовался как сдвиг пишущего узла из текущего
положения вправо на е позиций.
14.1.3. Матричные операторы. Входной язык бейсик-системы вклю-
чал 12 матричных операций, список которых приведен в табл. 14.1.
Таблица 14.1
Формат Формат Формат
МАТ А = В МАТ А = В + С МАТ А = В— С МАТ А = В*С МАТ А=(е)*В МАТ А = INV MAT А= TRN(B) MAT A = CON MAT A = ZER MAT A=IDN MAT READ А, В, С ... MAT PRINT А, В; С ...
243
Отсутствие аргумента в операторе INV объясняется тем, что об-
ратная матрица располагалась на месте исходной.
Ни один из матричных операторов не допускал переопределения
размерностей результирующего массива.
14.1.4. Особенности входного языка (вторая редакция). Вторая
редакция системы, известная под названием бейсик-222, представляла
собой расширение первой версии. В состав стандартных функций была
включена процедура TIM, обеспечивающая опрос диспетчерского
таймера.
Форматы базовых операторов языка подверглись весьма незначи-
тельной модернизации. Наряду с алголоподобным форматом в опера-
торе присваивания было разрешено в пределах одной строки задавать
несколько списков:
LET vn = Vi2= ... =еь vai = v22 = ;.. =е2; ...
Эта идея в дальнейшем привела к появлению многооператорных строк.
Появилась возможность управлять положением указателя в блоке
данных:
RESTORE [е]
Целая • часть значения е задавала смещение указателя от текущего
положения «вперед» (е > 0) или «назад» (е < 0) на заданное количе-
ство чисел с естественным ограничением по началу или концу блока
данных.
Основные изменения в новой версии были связаны с введением
форматной печати, возможностью использования библиотеки системных
подпрограмм и отладочных средств.
Указания о формате вывода числовых данных включались в состав
выводного списка и предусматривали три следующие возможности:
* Iw* — указание о печати целых чисел (w*C 15);
* Fw.d*—указание о печати чисел в форме с фиксированной точкой
(w<;15, d^8);
* Ew.d*—указание о печати чисел в форме с плавающей точкой
(w 15, d*C8).
Два дополнительных редактирующих указателя PAGE и ТАБ(е)
вызвали соответственно переход к печати новой страницы и установку
печатающего механизма (точнее, указателя выводной строки) в пози-
цию с номером е.
В конце выводного списка допускалось употребление оператора
GOTO N, обеспечивающего переход в указанное место программы после
завершения печати (еще один элемент многооператорных строк).
Для обращения к системным подпрограммам в состав входного
языка был введен оператор CALL:
CALL имя (параметры)
Список системных подпрограмм приведен в табл. 14.2.
244
Т а б л и ц а 14.2
Наименование программы Выполняемая функция
DET (A, N, R) GAUSS (A, N, В) ASIN (X, Y) AVOST (N) ЗПМБ (A, N, R) ЗАПМБ (A, N, V) ЧТМБ (A, N, R) ЧТНМБ (A, N, V) ЗПМЛ (A, N, R) ЗАПМЛ (A, N, V) ЧТМЛ (A, N, R) ЧТНМЛ (A, N, V) ВВОД1 (А) ВВОД2 (А) PUNCH (A, N) ПФК (A, N) Вычисление определителя (R = det(A)) N-ro порядка Решение системы линейных алгебраиче- ских уравнений Ах = В Y = a resin (X) Объявление точки входа (оператор N) в программу обработки аварийной ситуа- ции Запись массива А, содержащего N ячеек, на магнитный барабан (МБ) с адреса R (R — число) Запись на МБ по адресу, определяемому значением переменной V Чтение — обратная операция по отноше- нию к ЗПМБ Чтение —обратная операция по отноше- нию к ЗАПМБ Запись на магнитную ленту (МЛ) в зону, номер которой равен числу R Запись на МЛ в зону, номер которой задан значением( переменной V Чтение — обратная операция по отноше- нию к ЗПМЛ Чтение—обратная операция по отноше- нию к ЗАПМЛ Ввод числовых данных во внутреннем формате с перфокарт в массив А Ввод числовых данных в двоично-деся- тичном формате с перфокарт Вывод числового массива А на перфо- карты во внутреннем формате Вывод числового массива А на перфо- карты с перекодировкой в двоично-деся- тичную систему
Среди отладочных средств, подключенных к системе бейсик-222,
были операторы DUMP, CHECK и TRACE. Оператор DUMP обеспе-
чивал вывод на печать значений всех переменных, использованных
в задаче. Оператором CHECK ON включался режим прокрутки, при
котором в отладочный файл выводились номера операторов и значения,
присваиваемые переменным и нестандартным функциям. Отключение
режима прокрутки осуществлялось по оператору CHECK OFF. Опе-
ратором TRACE включался или отключался режим трассировки, при
котором в отладочный файл выводились все передачи управления.
245
СПИСОК ЛИТЕРАТУРЫ К РАЗДЕЛУ 14.1
1. Белослудцева М. М., Бочаров В. В., Ильин Э. Н.
и др. Использование алгоритмического разговорного языка BASIC
на ЭВМ типа БЭСМ-4. / Труды II Всесоюзной конференции по
применению ЭВМ и математических методов в планировании и управ-
лении предприятием.— Горький, 1971.— С. 242—245.
2. Белослудцева М. М., Бочаров В. В., Ильин Э. Н.
и др. BASIC-система пакетной обработки задач на ЭВМ типа
БЭСМ-4, М-220, М-222: Учеб, пособие / Под ред. Ю. Л. Кеткова.—
Горький: Изд-во Горьковского ун-та, 1973.— 193 с.
3. Павлов Б. М., Посохов И. Н. Математическое обеспечение
ЭВМ типа М-20.— М.: Наука, 1975,— 192 с.
4. Кетков Ю. Л., Рябов А. Н. Программирование на бейсике.
Входной язык системы программирования бейсик-222: Учеб, посо-
бие.— Горький: Изд-во Горьковского ун-та, 1977.— 73 с.
5. Кетков Ю. Л. Программирование на бейсике.— М.: Статистика,
1978.— 158 с.
6. Кетков Ю. Л., Рябов А. Н. Эффективная система програм-
мирования BASIC-222 //Программирование.— 1978.— № 1.
14.2. Система разговорного
программирования Бейсик-гамма
Система коллективного пользования Гамма предназначалась для
сбора и обработки экспериментальных данных в реальном масштабе
времени. Она была<разработана на базе ЭВМ «Минск-32» в 1972—1974 гг.
сотрудниками Института математики АН БССР; в качестве разговор-
ного языка использовала бейсик. Система Бейсик-гамма могла обслу-
живать до 16 одновременно работающих абонентов. Связь с ЭВМ осу-
ществлялась с помощью электрифицированных пишущих машинок
типа Консул-254 (Консул-264).
Интересной особенностью было одновременное существование
в рамках одной системы интерпретатора и компилятора. Первый исполь-
зовался на стадии отладки программ, а второй позволял получать
быстро работающую машинную программу.
14.2.1. Основные объекты.
Алфавит: латинские буквы (А — Z), цифры (0—9), знаки ариф-
метических операций (+, —, X, /, t — возведение в степень), знаки
операций отношения (>, ^, <» «^, =, т=), прочие символы (точка,
запятая, точка с запятой, круглые скобки, кавычки, пробел, *, !, =).
В текстовых константах разрешалось употребление русских букв.
Константы: текстовые и числовые. Максимальное количество
значащих цифр в числовой константе—семь.
Переменные: текстового и арифметического типов. Для обо-
значения текстовых переменных использовалось двухсимвольное соче-
тание вида а* (а—буква). Обозначения арифметических переменных—
стандартные,
246
Массивы: одномерные и двумерные, арифметического типа.
Индексы отсчитывались от 1. В некоторых матричных операциях
допускалось переопределение размерности.
Математические функции: базовый набор из 11 стандарт-
ных функций.
Программная строка: начиналась с номера, принадлежа-
щего диапазону [1, 99999]. В строке один оператор. Максимальная
длина строки — 70 символов.
14.2.2. Специфика базовых операторов. Входной язык системы
Бейсик-гамма включал 18 базовых операторов—DATA, DEF, DIM,
END, FOR, GOSUB, GOTO, IF, INPUT, LET, NEXT, ON, PRINT,
READ, REM, RESTORE, RETURN, STOP. В большинстве своем их
форматы совпадали с общепринятыми. Небольшие отклонения касались
следующих операторов.
Оператор IF допускал два дополнительных формата:
IF е Ni, N2, N3
IF END номер файла THEN N
Первая модификация копировала арифметический IF из фортрана,
вторая была связана с исчерпанием данных в файле.
Оператор DEF наряду с одностроковым определением нестандарт-
ной функции допускал многостроковое описание, заканчивавшееся
оператором FNEND. В этом случае аргументами нестандартной функ-
ции наряду с простыми переменными могли быть имена массивов,
например FNA (X, Z( )).
Переключатель ON использовался не в сочетании ON-GOTO,
а в комбинации ON-THEN.
Некоторые особенности были связаны и с оператором RESTORE,
который использовался не только для восстановления блока данных,
но и для перемещения указателя в файлах:
RESTORE = номер файла
14.2.3. Дополнительные( возможности. Среди дополнительных
средств входного языка системы Бейсик-гамма необходимо отметить
форматный вывод, матричные операции, сегментацию программы
и работу с файлами.
Форматная печать. Для ее' организации использовалась
модификация оператора PRINT (PRINT, ... ) в комбинации с опера-
тором FMT, абсолютно точно воспроизводившего функции фортранов-
ского оператора FORMAT. Например:
100 PRINT , 200, А, В, С, D*
200 FMT 18, F6.2, 2Х, ’С=’, Е15.4/А8
Сегментация программ. Пользователь системы Бейсик-
гамма имел возможность оформлять программные сегменты и записывать
247
их в личный архив. От такого сегмента требовалось, чтобы он не со-
держал операторов DIM и заканчивал свою работу оператором
RETURN. Архивный сегмент можно было в любой момент вызвать
и исполнить по оператору CALL, единственным параметром которого
было имя сегмента.
Для обращения к библиотечным программам в системе Гамма был
предусмотрен довольно мощный оператор LP:
LP имя (список параметров)
Среди фактических параметров, передаваемых вызываемой программе,
можно было употреблять простые переменные арифметического и тек-
стового типа, символьные константы, имена массивов, имена внутрен-
них нестандартных функций, номера операторов.
Работа с файлами. Входной язык системы был дополнен
двумя операторами—FILES и WRITE (MAT WRITE). Первый опе-
ратор использовался для установки соответствия между архивным
именем файла и временно присваиваемым ему программным номером п.
Операторы чтения представляли собой модификацию оператора READ:
READ == п, список переменных ;
MAT READ = n, список массивов.
Для записи данных в файл использовались операторы
WRITE ==п, список выражений;
MAT WRITE— п, список массивов.
Архивные файлы предусматривали только последовательную органи-
зацию. В любой момент времени указатель файла можно было вернуть
в начальное состояние (RESTORE ~п).
Матричные операции. Список матричных операций приве-
ден в табл. 14.3. Звездочками отмечены операторы, в которых может
быть изменена размерность результирующего массива.
Таблица 14.3
№ Операция № Операция
1 МАТ А = В 8* MAT A =ZER [(...)]
2 МАТ А = В+С 9* MAT A = CON [(...)]
3 МАТ А = В —С 10* MAT A=IDN [(...)]
4 МАТ А = ВхС 11* MAT READ [=п,] А [(..,)].
5 МАТ А = (е)хВ в[(...)] ...
6 MAT A = TRN(B) 12* MAT INPUT А[(...)]. В [(.
7 MAT A=INV(B) 13* MAT PRINT А, В; С ...
248
СПИСОК ЛИТЕРАТУРЫ К РАЗДЕЛУ 14.2
1 Б у кат Г. М., Дорошко Н. Н., Скачек А. В. Разговорные
языки в системе Гамма //УСиМ.— 1974.— № 1.— С. 76—77.
2. Букат Г. М., Дорошко Н. Н. Структура языка Бейсик-гамма
и организация исходной программы Ц Электронно-вычислительная
техника и программирование: Сб. статей. Вып. 6.— М.: Стати-
стика, 1974.— С. 26—30.
3. Дорошко Н. Н., Л и пн ев и ч В. Н. Система разговорного
программирования Бейсик-гамма.—Препринт / Институт математики
АН БССР.—Минск, 1976.—67 с.
14.3. Диалоговая система BASIC-6
Экспериментальная компилирующая система BASIC-6 была раз-
работана в 1972—1974 гг. сотрудниками вычислительного центра
СО АН СССР. Она функционировала на ЭВМ БЭСМ-6 под управле-
нием операционной системы ОС ИПМ. Максимальное количество одно-
временно работающих абонентов—10. В качестве терминального обо-
рудования могли использоваться стандартные телетайпы и дисплеи
«Видеотон-340». Интересной особенностью системы BASIC-6 было дву-
язычие—она одинаково хорошо «понимала» английские и русские
обозначения операторов. В табл. 14.4 приведено их соответствие.
14.3.1. Основные объекты.
Алфавит: латинские буквы (А—Z), русские буквы (А — Я),
цифры (0—9), знаки арифметических операций (+, —, х, /, t —
возведение в степень), знаки операций отношения (>, <, =,
#), прочие символы (точка, запятая, точка с запятой, круглые и квад-
ратные скобки, кавычки, пробел). Из-за несоответствия клавиатуры
терминалов принятому алфавиту некоторые символы приходилось заме-
нять подходящими цепочками (:>>->->= или ’GE’, f -> +:-)-•
и т. п.).
Константы: числовые и текстовые. Числовые константы должны
были соответствовать машинным ограничениям (диапазон от 10“19 до
10+Х9, число значащих цифр 10).
Переменные: текстового и арифметического типов. Имена
текстовых переменных состояли из двух букв, второй могла быть
только буква С. Для арифметических переменных использовались
стандартные обозначения.
Массивы: для арифметических переменных разрешались одно-
мерные и двумерные массивы, для текстовых — только одномерные.
Индексы отсчитывались от 1.
Математические функции. Входной язык BASIC-6
помимо базового набора из 11 стандартных функций предлагал поль-
зователю еще две—СОТ (ctg х) и ACN (arcsinx).
Функции для обработки текстовых строк. Для ра-
боты с текстовыми переменными в состав языка были введены три
249
функции —LEN, PRT и CTN. Функция LEN (vC) использовалась для
определения длины символьной переменной vC. С помощью функции
PRT (vC, i, j) можно было вырезать подстроку (i — начальная пози-
ция, j —число вырезаемых символов). Функция CTN (vjC, v2C) была
предназначена для объединения (конкатенации) двух стррк.
Программная строка. Начинается с номера, принадлежа-
щего диапазону [1, 9999]. В одной строке может быть только один
оператор. Максимальная информационная емкость строки —69 сим-
волов.
14.3.2. Специфика базовых операторов. Входной язык системы
BASIC-6 включал 18 базовых операторов (полный список служебных
слов и соответствующих им русских наименований приведен
в табл. 14.4). В большинстве случаев базовые операторы следовали
общепринятым форматам. Некоторые отклонения касались следующих
операторов.
Таблица 14.4
Английская версия Русская версия Английская версия Русская версия
DATA ДАННЫЕ NEXT цикл
DEF ФУНК ON ПРИ
DIM РАЗМЕР PAUSE ПАУЗА
end КОНЕЦ PRINT ВЫВОД
FNEND КОНФ READ взять
FOR для REM КОМ
GOSUB ВХОД REST СНОВА
GOTO НА RETURN ВЫХОД
IF ЕСЛИ STEP ШАГ
INPUT ВВОД STOP СТОП
LET ПУСТЬ THEN то
MAT МАТ TO ДО
В операторе DIM допускался алголоподобный вариант объедине-
ния массивов с одинаковой размерностью:
10 DIM А (20), В (20), С (20)
или
10 DIM А, В, С (20)
Оператор DEF позволял использовать многострочное описание
нестандартной функции, заканчивавшееся оператором FNEND. В этом
случае результат вычисления присваивался служебной переменной
с именем РЕФ.
В операторе IF разрешалось использование составных условий,
представлявших собой обычные сравнения, объединенные служебными
250
словами OR. Количество простых условий, входивших в составное,
не должно было превышать трех.
Оператор END мог встречаться в программе несколько раз,
и в этом смысле он мало чем отличался от оператора STOP.
Для оператора восстановления блока данных вместо полного наиме-
нования RESTORE был использован сокращенный вариант.
14.3.3. Дополнительные возможности.
Матричные процедуры. Входной язык BASIC-6 включал
12 матричных операций, форматы которых мало чем отличались от
общеупотребительных. В большинстве матричных процедур имелась
возможность переопределить размерность результирующего массива,
а в ряде случаев и не описывать его вообще. Размерность такому
массиву присваивалась в соответствии с требованиями матричной
алгебры. При обращении матрицы (MAT A = INV(B)) вычислялся до-
полнительно и детерминант матрицы В, значение которого заносилось
в служебную переменную DET.
Отладочные средства. В системе BASIC-6 было преду-
смотрено четыре режима работы (А, В, С и D), включение которых
осуществлялось по директиве MODE (РЕЖИМ). Режим А соответ-
ствовал автоматическому выполнению рабочей программы без выдачи
какой-либо отладочной информации. В режиме В наряду с выдачей
результатов счета задачи печатались все номера выполнявшихся опе-
раторов. Дополнительная выдача в режиме С позволяла проследить
логику переходов в процессе выполнения рабочей программы. В ре-
жиме D рабочая программа выполнялась в однотактном режиме —
после выполнения текущего оператора на терминал выдавался номер
следующей строки и ЭВМ «ждала» разрешения от пользователя на
продолжение работы.
СПИСОК ЛИТЕРАТУРЫ К РАЗДЕЛУ 14.3
1. Леонов П. К., Сердюк Г. И. Язык и архитектура системы
BASIC-б/ Труды Всесоюзного симпозиума «Теория языков и ме-
тоды построения систем программирования».— Киев —Алушта.
1972.—С. 228—243.
2. Леонов П. К., Сердюк Г. И. Внутренняя структура рабочих
программ системы BASIC-6. Там же.— С. 244—256.
3. Леонов П. К., Сердюк Г. И. Компилятор в системе BASIC-6/
Вычислительная техника: Сб. трудов.— Новосибирск: СО АН СССР,
ВЦ, 1973.—С. 273—278.
4. Головлева Н. В., Леонов П. К., Сердюк Г. И. и др.
Система BASIC-6 как универсальный диалоговый процессор // Ки-
бернетика.— 1976.— Xs 3.— С. 29—32.
Глава 15. РЕАЛИЗАЦИИ БЕЙСИКА НА ЕС ЭВМ
15.1. Система программирования Бейсик-ЕС
Система Бейсик-EC была предназначена для эксплуатации на
младших моделях ЕС ЭВМ под управлением дисковой операционной
системы ДОС-2.0. Разработана она сотрудниками Горьковского уни-
верситета с ориентацией на использование в учебном процессе. Система
позволяла совместить пакетную обработку обычных заданий в ДОС
с диалогом на бейсике, который могли вести одновременно до восьми
пользователей.
Наряду с диалоговым режимом бейсик-компилятор обеспечивал
и пакетную обработку задач, подготовленных на внешнем носителе
(перфокарты, магнитная лента и т. п.). Причем пропускная способ-
ность бейсик-системы в пакетном режиме на студенческих задачах
(объемом .50—100 операторов) примерно в 25—30 раз превосходила
скорость работы транслятора с ФОРТРАНА. В качестве терминалов
использовались дисплеи типа ЕС-7927.
15.1.1. Основные объекты языка Бейсик-ЕС.
Алфавит: латинские буквы (А — Z) и дополнительный набор
букв русского алфавита (Б, Г, Я), цифры (0—9), знаки арифме-
тических операций (+, —, *, , /, ** — возведение в степень), знаки
операций отношения (>, =, <), прочие символы (точка, запятая,
точка с запятой, двоеточие, апостроф, кавычки, скобки, пробел, #)•
Константы: текстовые константы могли употребляться только
в списке оператора PRINT. Числовые константы — вещественного типа
из диапазона от 10“79 до 10+7?. Максимальное количество значащих
цифр— семь.
Простые переменные: только числовые, вещественного
типа. Обозначения—стандартные.
Массивы: одномерные и двумерные, вещественного типа. Обо-
значения— стандартные. Индексы отсчитываются от 1, максимальное
значение индексного выражения — 32 767.
Математические функции: базовый набор из 11 стан-
дартных функций — ABS, ATN, COS, EXP, INT, LOG, RND, SGN,
SIN, SQR, TAN. Функция RND употребляется без аргумента.
Программная строка: номер строки принадлежит диапа-
зону [1, 9999]. В строке может быть записано несколько операторов,
разделенных символом Максимальная длина строки — 80 символов,
252
15.1.2. Специфика базовых операторов. Входной язык Бейсик-ЕС
включал 18 операторов базового набора—DATA, DEF, DIM, END,
FOR, GOSUB, GOTO, IF, INPUT, LET, NEXT, ON, PRINT, READ,
REM, RESTORE, RETURN, STOP. Наряду с общепринятыми фор-
матами ряд операторов допускал следующие отклонения:
DATA: при перечислении подряд идущих одинаковых констант
имелась возможность задавать коэффициент повторения, который за-
писывался перед константой в скобках:
10 DATA (5)1Е —4, (150)2.5, (30)-1.5
Многократно повторяющиеся константы, расположенные последова-
тельно друг за другом, в оперативной памяти не тиражировались.
D Е F: описание нестандартной функции могло занимать только
одну строку. Количество аргументов не ограничивалось.
END: этот оператор мог отсутствовать.
GOSUB, GOTO: в качестве адреса перехода могла выступать
переменная. Ее значение определяло номер строки, на которую должно
быть передано управление. Например:
105 LET А5 = 220
180 GOTO А5
I F: оператор условного перехода допускал следующие модифи-
кации:
/THEN .
IF условие {GOTO > Jномер строки I
IgosubJ W"* f
IF условие NEXT v.
LET: оператор присваивания допускал алголоподобный формат:
LET vi = v2 = «. * = Vk = e
ON: наряду с переключателем строк имелась возможность осу-
ществлять переключение подпрограмм по явному (номер строки) или
неявному (значение переменной) адресу перехода (АП):
fTHEN
ON выражение j GOTO | АПх, АП2, ..., АПк
VGOSUBJ
PRINT: функция TAB (п) перемещала печатающий механизм
(курсор) вправо на и позиций от текущего положения. Появился новый
разделитель элементов выводного списка—двоеточие, которое не вы-
зывало дополнительного перемещения указателя выводной строки.
Новые редактирующие указатели предусматривали следующие воз-
можности:
FMT (Iw) — установка режима вывода целых чисел;
253
FMT (Fw.d) — установка режима вывода вещественных чисел с фик-
сированной точкой;
FMT (Ew. d) — установка режима вывода вещественных чисел
с плавающей точкой;
RPT (n, ’SA ... Sk’) — n-кратное повторение текстовой константы
в выводной строке;
PGR (n, S)—занесение символа S в позицию выводной строки
с номером п.
R Е S Т О R Е:-" кроме возврата указателя блока данных в началь-
ное состояние имелась возможность вернуться в начало любой порции,
соответствующей оператору DATA с указанным номером (RESTORE N).
15.1.3. Матричные операции. Список матричных процедур языка
Бейсик-EC приведен в табл. 15.1. К особенностям отдельных операций
Таблица 15.1
Формат Формат
MAT A = CON MAT A=IDN MAT A = ZER MAT READ А, В, ... МАТ А=В МАТ А = В4-С МАТ А = В—С МАТ А = В»С МАТ А = В*(е) MAT A = TRN(B) MAT A=INV MAT INPUT А, В, ... MAT PRINT А, В; С : D ...
относятся следующие. Обратная матрица размещается на месте исход-
ной. Вывод элементов массива происходит под управлением установ-
ленного формата. В операторе MAT PRINT имеется возможность
указать границы отображаемого фрагмента:
120 MAT PRINT А (3:8, 5:12), В (4:28)
15.1.4. Библиотечные вставки. В системе Бейсик-EC был преду-
смотрен режим ввода библиотечных вставок—фрагментов исходных
программ с относительной нумерацией строк:
&10 DIM А (40), В (2, 12)
&20 FOR К=1 ТО 40
Для извлечения библиотечной вставки из архива и ее настройки по
месту (по номерам) использовался оператор COPY (более подробно
см. разд. 9.6).
15.1.5. Работа с временным файлом данных. В проекте Бейсик-ЕС
предусматривалось следующее расширение функций блока данных.
Пользователь имел возможность создавать и формировать содержимое
254
временного файла данных. Для этой цели можно было использовать
фрагменты числовых наборов, находящихся в архиве, а также резуль-
таты вычислений. Сборка архивных фрагментов осуществлялась с по-
мощью операторов (директив) INDATA:
INDATA имя, [NJ, [N2] [,М]
Параметры Nx, N2 определяли начало и длину извлекаемого фрагмента
из архивного файла с указанным именем. Четвертый аргумент (М)
задавал положение указателя временного файла, т. е. место, начиная
с которого вписывалась найденная порция архивных данных.
Для обмена с содержимым временного файла предлагались опе-
раторы GET и PUT, которые осуществляли чтение и запись числовых
данных во внутреннем формате. Файл данных был снабжен указате-
лем, который автоматически перемещался в процессе выполнения об-
мена. Переустановка этого указателя осуществлялась с помощью
оператора RESET:
RESET [е] [,v]
Здесь е—выражение, значение которого определяет новое положение
указателя; v — имя переменной, в которой запоминается предшество-
вавшее значение указателя.
Содержимое временного файла или любого его фрагмента можно
было сохранить в архиве с помощью оператора (директивы) OUTDATA:
OUTDATA имя, [Nx], [N2] [,М]
Освобождение временного файла происходило автоматически в момент
завершения задачи.
15.1.6. Протоколирование работы пользователя. В связи с тем что
основным средством диалогового общения пользователя с ЭВМ был
дисплей, в системе Бейсик-EC была предусмотрена возможность стра-
ничного вывода и копирования содержимого экрана на АЦПУ. Со
стороны пользователя управление этими возможностями сводилось
к нажатию той или иной функциональной клавиши.
СПИСОК ЛИТЕРАТУРЫ К РАЗДЕЛУ 15.1
1. Кетков Ю. Л. Программирование на бейсике.— М.: Статистика,
1978.— 158 с.
2. Кетков Ю. Л., Максимов В. С., Ильин Э. Н. Опыт раз-
работки системы программирования Бейсик-ЕС // Труды Всесоюзн.
конф, по методам трансляции.— Новосибирск, 1981.
3. Кетков Ю. Л.,’ Куракина И. М. Программирование на
алгоритмических языках бейсик и фортран: Учеб, пособие.— Горь-
кий: Изд-во Горьковского ун-та, 1983.— 104 с.
4. Ильин Э. Н., Кетков Ю. Л., Максимов В. С., Макси-
мова Ю. В., Тафорина Н. М. Основные характеристики диа-
логовой системы программирования Бейсик-ЕС // Материалы III
Всесоюзной конф. «Диалог 83» (Протвино, 1983), Серпухов,
1984,—С. 103,
255
15.2. Диалоговая система ИКИ АН СССР
Диалоговая система программирования, использующая бейсик
в качестве входного языка, была разработана в 1977—1978 гг. сотруд-
никами лаборатории системного программирования Института косми-
ческих исследований АН СССР. Она эксплуатируется на ЭВМ ЕС-1040
под управлением расширенной версии ДОС-2.2 и обслуживает до 10
одновременно работающих пользователей. Система поддерживает работу
с дисплейными станциями типа BSAN (производство ГДР) и ЕС-7066.
В системе использован интерпретатор, обеспечивающий суммар-
ную производительность до 10 000 арифметических операций в секунду.
При интенсивной загрузке системы каждое задание «продвигается» со
скоростью порядка 103 оп/с.
Система позволяет обрабатывать задачи, содержащие не более
200 операторов. Однако динамическая загрузка сегментов из библио-
теки исходных модулей обеспечивает возможность работы цепочки
программ.
15.2.1. Основные объекты.
Алфавит: латинские буквы (А — Z), цифры (0—9), знаки ариф-
метических операций (+, —, *, /), знаки операций отношения (>,
<, ==, ^), прочие символы (точка, запятая, точка с запятой, ка-
вычки, апостроф, круглые и квадратные скобки, ~"|). Отсутствие рус-
ских букв объясняется спецификой клавиатуры дисплеев BSAN. Однако
любые символы терминальной- клавиатуры могут использоваться в тек-
стовых константах и в операторе REM.
Константы: текстовые константы могут заключаться в ка-
вычки или апострофы. Внутренняя кавычка в текстовой константе
удваивается. Числовые переменные — вещественного типа. Диапазон
числовых данных определяется возможностями ЕС ЭВМ (от 10“78 до
10+75). Используется обычная точность, обеспечивающая вычисления
с 7—8 значащими цифрами.
Переменные: только арифметического типа. Обозначения —
стандартные (А, АО, А1, ..., А9, ..., Z9). Начальные значения пе-
ременных— специальный код, предупреждающий ошибки.
Массивы: одномерные и двумерные. Индексы отсчитываются
от нуля.
Математические функции: из базового набора не пред-
ставлена только функция SGN (X). Функция RND употребляется
с аргументом.
Программная строка: начинается с номера, принадлежа-
щего диапазону [1, 9999]. В строке один оператор. Длина строки =—
64 символа (специфика дисплея).
Командная строка: начинается со служебного слова — ди-
рективы или оператора. Большинство выполняемых операторов допус-
кает прямое исполнение.
256
15.2.2. Специфика базовых операторов. Базовый набор включает
18 операторов —DATA, DEF, DIM, END, FOR, GOSUB, GOTO, IF,
INPUT, LET, NEXT, ON, PRINT, READ, REM, RESTORE, RE-
TURN, STOP. В большинстве своем их форматы совпадают с обще-
принятыми. Небольшие отклонения обсуждаются ниже.
D Е F: число аргументов нестандартнрй функции ограничено толь-
ко длиной строки.
IF: допустимы различные сочетания, эквивалентные условиям
типа (> =, =>), <(<=,= <), $£ (—| =, < >, > <).
INPUT: в теле оператора возможны пояснительные указания:
INPUT 'А=', А, 'В=', В
LET: допускается алголоподобный формат:
LET: vi = v2= ... =vrt=e.
ON: при выходе значения переключающегося выражения за пре-
делы допустимого диапазона выполняется оператор, следующий за ON.
Таблица 15.2
Формат директивы Выполняемая функция
CLEAR [Nb N2] CLEAR V CONTINUE LIST [Nr [, N2]J LISTS LOAD 'имя' LOADP 'имя'' RENUMBER [N] [, AN] RUN [NJ SAVE 'имя' [Ni [, N2]J SELECT PRINT STOP TRACE {°Nf} Удаление фрагмента из текущей про- граммы или всей программы целиком Присвоение всем переменным значения «не определено» Продолжение выполнения прерванной программы Вывод указанного фрагмента программы Вывод очередной страницы (15 строк) на дисплей Загрузка указанной программы из биб- лиотеки со стиранием предыдущей про- граммы и данных Аналогичная процедура с сохранением содержимого памяти Перенумерация строк текущей программы Выполнение текущей программы. Если N не задано, то все переменные приво- дятся в состояние «не определено» Запоминание в библиотеке текущей про- граммы или ее фрагмента Установка режима, при котором все вы- дачи на дисплей копируются в рабочем файле, а затем распечатываются на АЦПУ Прерывание выполнения текущей про- граммы Включение или отключение режима трас- сировки
9 Ю. Л. Кетков
257
PR INT: выводная строка длиной в 64 символа делится на
четыре зоны по 16 позиций.
RESTORE: имеется возможность переустановки указателя
блока данных на начало числовой порции, соответствующей заданному
оператору DATA.
15.2.3. Дополнительные возможности. В дополнение к базовом^
набору операторов диалоговая система ИКИ АН СССР обеспечивает
выполнение ограниченного набора матричных операций и возможность
динамической загрузки очередного программного сегмента из библио-
теки исходных программ.
В операторе МАТ предусмотрено выполнение четырех операций
над матрицами —сложение, вычитание, умножение и обращение. Раз-
мерность операндов при этом не должна превышать 30x30.
Оператор динамической загрузки, напоминающий по своим функ-
циям оператор CHAIN, имеет следующий формат:
FETCH [Ni, N2] 'имя' [N3]
При его выполнении в текущей программе удаляются строки из диа-
пазона [Ni, N2], программа с указанным именем считывается из биб-
лиотеки и сливается с остатками текущей программы, результат слия-
ния начинает выполняться с оператора N3. Если уничтожаемый диа-
пазон [Ni, N2] не задан, то текущая программа стирается целиком.
При отсутствии параметра N3 выполнение загруженной программы
начинается с самого начала.
3.2.4. Набор директив (табл. 15.2).
СПИСОК ЛИТЕРАТУРЫ К РАЗДЕЛУ 15.2
1. Диалоговая система ИКИ АН СССР / А. В. Ананьев, С. К. Но-
восельцев, И. Г. Орлов, Т. Г. Семчишина.— Препринт / ИКИ АН
СССР.—М., 1980,—№ Пр-527.—39 с.
2. Бейсик. Описание языка и руководство для программиста / Ор-
лов И. Г.— Препринт / ИКИ АН СССР.— М., 1979.— № 476.—42 с.
15.3. Диалоговая система программирования Дисп-ЕС
Система диалогового программирования Дисп-ЕС функционирует
либо как обычная прикладная программа под управлением ОС ЕС
(версии 6.1 и выше), либо в составе системы разделения времени
(СРВ ОС). Одним из входных языков системы Дисп-ЕС является
бейсик, который обслуживается * соответствующим интерпретатором.
15.3.1. Основные объекты.
Алфавит: латинские буквы (А—Z) и приравненные к ним
спецсимволы (4t, О» @), (цифры 0—9), знаки арифметических опера-
ций (+, —» *,*/, t — возведение в степень), знаки операций отноше-
ния (>, ^*, <, =С, =, #), прочие символы (точка, запятая, точка
258
с запятой, двоеточие, кавычки, пробел, &, ?, !). На терминалах типа
ЕС-7906 и ЕС-7927 возможны некоторые замены (f~**, ^~ > = ,
< ==» 9е '**' < >)•
Константы: текстовые и числовые. Числовые константы —
вещественного типа, принадлежащие диапазону от 10“78 до Ю75.
^(зависимости от параметров, задаваемых при запуске системы Дисп-ЕС,
имеется возможность работать с короткими вещественными констан-
тами (7 цифр)' или длинными (до 15 цифр). К константам числового
типа относятся три именованные константы:
&Е = 2.718282 (основание натуральных логарифмов—е),
&Р1 = 3.141593 (число л),
&SQR2 = 1.414214 (число УЗ?).
При работе с длинными константами они могут быть представлены
е большей точностью.
Текстовые константы заключаются в кавычки или апострофы и
не должны содержать более 18 символов.
Переменные: текстовые и числовые. Обозначения переменных—
стандартные. К имени переменной текстового типа добавляется сим-
вол Q. Длина текстовой переменной зафиксирована —18 символов.
Начальное значение текстовых переменных — строка из 18 пробелов
(это несколько противоречит общепринятому значению «пусто», со-
стоящему из нулевого количества символов). Начальные значения
арифметических переменных — нули.
Массивы: одномерные массивы обоих типов — числовые и тек-
стовые, двумерные массивы — только арифметические. Индексы отсчи-
тываются от 1, максимальное значение индекса — от 255.
Таблица 15.3
Функция Вычисляемое значение
ACS (X) ASN (X) CSC (X) СОТ (X) DEG (X) DET (А) NCS (X) NTH (X) NSH (X) LGT (X) LTW (X) RAD (X) SEC (X) arc cos (x) arcsln (x) cosec (x) etg (x) Перевод из радиан в градусы Вычисление определителя матрицы ch (х) th(x) sh (х) lg w log, (x) Перевод из градусов в радианы sec (х)
9*
259
Математические функции: наряду с полным базовым
набором стандартных функций Бейсик-Дисп предлагает пользователю
еще 13 арифметических функций, список которых приведен в табл. 15.3.
Программная строка: начинается с номера строки, принадлежа-
щего диапазону [1, 99999]. В строке может быть размещен только
один оператор. О
15.3.2. Специфика базовых операторов. Входной язык системы
Бейсик-Дисп включает 17 базовых операторов—DATA, DEF, DIM,
END, FOR, GOSUB, GOTO, IF, INPUT, LET, NEXT, PRINT,
READ, REM, RESTORE, RETURN, STOP. В основном их форматы
следуют общепринятым правилам. Небольшие отклонения касаются
следующих операторов.
Вместо обычного переключателе ON-GOTO используется модифи-
кация фортрановского оператора GOTO:
GOTO NbN2,...,Nk ON e
В операторах END, STOP и RESTORE допускается наличие ком-
ментария.
Оператор LET разрешает многократное присваивание (vi=v2=..«
...=е), и, подобно фортрану, может употребляться без служебного
слова.
В нестандартной функции может быть только один аргумент.
15.3.3. Дополнительные возможности. Новые возможности, обеспе-
чиваемые дополнительным набором операторов, связаны с организацией
форматного вывода, обмена с файлами и выполнением матричных
процедур.
Среди дополнительных операторов входного языка еще одно подра-
жание фортрану—оператор PAUSE. Он позволяет временно приоста-
новить выполнение программы. Для продолжения ее работы вводится
пустая строка. Каких-либо новых возможностей по сравнению с опе-
ратором STOP здесь не существует.
15.3.4. Форматный вывод. Для организации форматной печати
используется оператор PRINT USING, ссылающийся на оператор
с описанием форматов полей выводной строки. Например:
100 PRINT USING 200,Al,A2,B,CQ
200:Al =###.# A2 = #.###!!!l ###### C =
Оператор формата имеет односимвольное обозначение ( : ). Это поз-
воляет использовать под описание полей максимальное число позиций.
Кроме приведенных в примере описаний числовых и текстовых
полей имеется возможность указать способ печати знака числа с по-
мощью символов «+» и «—».
15.3.5. Обмен с файлами. Система Бейсик-Дисп обеспечивает обмен
только с последовательными файлами. Чтение из файла осуществляется
с помощью операторов GET йли MAT GET:
GET 'имя', список переменных,
MAT GET 'имя', список массивов.
260
Для записи данных в файл предназначены операторы PUT или МАТ
PUT:
- PUT 'имя', список выражений,
MAT PUT 'имя', список массивов.
Открытие файла выполняется системой автоматически. Если первым
встретился оператор GET, то файл открывается как вводный, в про-
тивном случае — как выводной. Одновременно вводным и выводным
файл быть не может.
Размещаются выводные файлы в личной библиотеке пользователя.
Вводные файлы могут быть расположены и в общей библиотеке.
Для работы с файлами предназначены две вспомогательные
процедуры — RESET и CLOSE. Первая возвращает указатель файла
в начало, подобно оператору RESTORE. Оператор CLOSE закрывает
доступ к данному файлу.
15.3.6. Матричные процедуры. Список матричных операций, орга-
низуемых с помощью оператора МАТ, приведен в табл. 15.4. Опера-
ции, допускающие динамическое переопределение размерности резуль-
тирующего массива, отмечены символом *.
Т а б л и ц а 15.4
№ Операция № Операция
1 МАТ А = В 9* MAT A = CON
2 МАТ А = В + С 10* MAT A=IDN
3 МАТ А = В —С 11* MAT READ А, В, С...
4 МАТ А = В*С 12* MAT GET А, В, С...
5 МАТ А = (е)*В 13 MAT PRINT А, В; С...
6 MAT A=INV(B) 14 MAT PRINT USING п, А, В, С...
7 MAT A = TRN(B) 15* MAT PUT А, В, С...
8* MAT A = ZER 16* MAT INPUT А. В. С...
СПИСОК ЛИТЕРАТУРЫ К РАЗДЕЛУ 15.3
1. Единая система электронных вычислительных машин. Операционная
система. Режим разделения времени. Диалоговая система програм-
мирования. Общее описание. Е 11.804.004 Д1.
2. Единая система электронных вычислительных машин. Операцион-
ная система. Режим разделения времени. Диалоговая система про-
граммирования. Бейсик. Руководство программиста. Е 11.804.004 Д4.
3. Диалоговая система программирования ДИСП/И. М. Булко,
Н. Н. Дорожко, И. И. Пилецкий и др.— М.: Финансы и стати-
стика, 1981.— 240 с.
4. Цагельский В. И., Булко И. И., Стрюк К. П. Диало-
говая система программирования для режима разделения времени.
Инф. бюллетень ВНТИЦ «Алгоритмы и программы». Вып. 5, 1981 г.,
per. номер П004858.
Глава 16 БЕЙСИК НА МИНИЭВМ
16.1. Бейсик на миниЭВМ М-6000 (СМ-1)
и М-7000 (СМ-2)
Вычислительная машина М-6000 и двухпроцессорная система
М-7000 принадлежат к так называемым агрегатным средствам вычи-
слительной техники (АСВТ) и являются одними из первых миниЭВМ,
серийный выпуск которых был освоен нашей промышленностью.
ЭВМ М-6000 построена на базе 16-разрядного процессора с быстро-
действием порядка 150 — 200 тыс. оп/с. Программное моделирование
арифметических операций с плавающей запятой над 32-разрядными
вещественными числами резко снижает производительность М-6000.
Объем оперативной памяти—до 64 Кбайт.
В двухпроцессорном варианте (М-7000) объем оперативной памяти
расширен до 256 Кбайт и вдвое повышена скорость работы каждого из
процессоров за счет сокращения цикла обращения к ОЗУ. Дополни-
тельное увеличение производительности на М-7000 достигнуто за счет
схемной реализации арифметики с плавающей точкой.
Последующие модификации этих ЭВМ —СМ-1 и СМ-2 (СМ-2М)
отличаются меньшими габаритами и повышенным быстродействием.
На ЭВМ М-6000 эксплуатируется однозадачная диалоговая опе-
рационная система ДОС М-6000, а на ЭВМ М-7000 — многозадачная
версия ДОС АСПО (ДМСРВ). В их состав включены бейсик-интерпре-
таторы, особенности входных языков которых обсуждаются в настоя-
щем разделе.
16.1.1. Особенности языка бейсик на М-6000. В интерпретаторе
на М-6000 реализована очень простая версия бейсика, совпадающая
с первыми редакциями Дартмутского колледжа.
Алфавит: латинские буквы (А—Z), дополнительный набор букв
русского алфавита (Б, Г, ..., Я), цифры (О — 9), знаки арифметических
операций (+» —» *» A t— возведение в степень), знаки операций
отношения (>, =, <, #—не равно), прочие символы (точка, запя-
тая, точка с запятой, круглые скобки, кавычки, пробел).
Константы: числовые константы— из диапазона от 10“38 до
)038. Максимальное количество десятичных цифр — шесть. Для целых
чисел из диапазона [—32 768, 32 767] используется двухбайтовый ма-
262
шинный формат, для всех остальных — четырехбайтовый с плавающей
точкой.
Простые переменные: только числовые. ‘Обозначения —
стандартные.
Массивы: одномерные и двумерные числового типа. Индексы
отсчитываются от 1, максимальное значение индекса —255.
Математические функции: базовый набор из 11-стан-
дартных функций—ABS, ATN, COS, EXP, INT, LOG, RND, SGN,
SIN, SQR, TAN. Функция RND употребляется с фиктивным аргу-
ментом.
Программная строка: начинается с номера строки, при-
надлежащего диапазону [1, 9999]. В строке располагается единствен-
ный оператор. Максимальная длина строки — 72 символа.
Специфика базовых операторов. Базовый набор включает 17 опе-
раторов—DATA, DEF, DIM, END, FOR, GOSUB, GOTO, IF, INPUT,
LET, NEXT, PRINT, READ, REM, RESTORE, RETURN, STOP.
Почти все операторы следуют общепринятым правилам. В списке
оператора LET может быть задано несколько переменных:
LET vi = v2= ... =vn = e
Нестандартная функция может иметь только один аргумент.
Дополнительные возможности. Среди отечественных разработок,
связанных с расширением функциональных возможностей бейсик-интер-
претатора для М-6000, выделим две. Первая из них {3] включает блок,
обеспечивающий переход с английской мнемоники для наименований
операторов на русскую. Для этого набор директив был дополнен двумя
указаниями — RUSSIAN и АНГЛИЙСКИЙ. Перечень соответствий
между терминами приведен в табл. 16.1. Некоторые из этих предло-
жений, на наш взгляд, менее удачны, чем в версии BASIC-6.
Вторая разработка связана с созданием библиотеки системных
подпрограмм, расширение которой не вызывает каких-либо изменений
в бейсик-интерпретаторе. Обращение к компонентам этой библиотеки
осуществляется с помощью оператора CALL, но не по имени, а по
номеру N вызываемой подпрограммы:
CALL (N, Bi, а2, ..., а^)
Основное наполнение системной библиотеки относится к организации
обмена с контрольно-измерительной аппаратурой и другими нестан-
дартными внешними устройствами. Более подробную информацию о
составе библиотеки и функциях отдельных подпрограмм можно найти
в работах [4 — 6].
16.1.2. Особенности языка бейсик на М-7000. Входной язык интер-
претатора М-7000 включает базовую версию бейсика, практически
полностью совпадающую со своим предшественником для М-6000,
и набор дополнительных средств.
263
Таблица 16.1
Английский вариант Русский вариант Английский вариант Русский вариант
DATA DEF DIM END FOR... TO...STEP GOSUB GOTO IF...THEN INPUT LET ДАННЫЕ ОПР MAC КОНЕЦ ОТ...ДО...ШАГ ПОДПР ИДИ ЕСЛИ... ТО ВВОД ПРИ NEXT PRINT READ REM RESTORE RETURN STOP RUN LIST цикл чП вывод 1 БЕРИ >ЭТО ПРЕЖНИЕ ВОЗВРАТ СТОП ПУСК ЛИСТ
В базовой версии языка по сравнению с М-6000 появилась воз-
можность работать с восьмеричными константами и использовать логи-
ческие выражения. Восьмеричные числа записываются в следующем
виде:
±@b!b2...be (bf = O, 1; bk=0, 1, 2, ..., 7)
Логические выражения в основном используются при формировании
составных условий в операторе IF. Операндами логических выраже-
ний могут быть результаты операций отношения (>, >=, <, <=,
= , =£), принимающие значения истина (1), или ложь (0), или обычные
арифметические величины (числа, переменные, формулы). Последние
выступают как логические значения «истина» (величина, не равная
нулю) или «ложь» (величина, равная нулю). В качестве знаков опе-
раций в логических выражениях используются служебные слова AND,
OR или NOT.
Небольшое изменение произошло в операторе IF, где наряду
с основным форматом условного перехода появилась следующая моди-
фикация:
IF условие оператор (без служебного слова THEN !)
Набор дополнительных средств расширяет возможности базового
языка по следующим направлениям: использование внешних функций
и подпрограмм, операции с двоичными шкалами, работа с файлами
и устройствами, матричные процедуры, управление процессами, обмен
с контрольно-измерительной аппаратурой.
Ниже приведены основные сведения по каждому из перечисленных
разделов.
Использование внешних процедур. Внешние функции и подпро-
граммы оформляются с использованием стандартных средств и согла-
264
шений фортрана. Для вызова внешней подпрограммы из бейсик-задачи
используется оператор CALL:
CALL имя (список параметров)
Служебное слово CALL может быть опущено, если имя вызываемой
|процедуры не совпадает с наименованиями бейсик-операторов.
В списке параметров могут встречаться числа, переменные, ариф-
метические выражения и имена массивов. В связи с тем что фортран
различает значения целого и вещественного типов и по-разному пред-
ставляет их в ЭВМ, предусмотрены средства преобразования данных.
Причем скалярные величины преобразуются к нужному формату самим
бейсик-интерпретатором, а для преобразования массивов введены два
новых оператора, реализованных в виде внешних подпрограмм:
FLTA (L, A, N [ , М])
FIXA (A, L, N [ , М])
Процедура FLTA преобразует массив целого типа L размерности
N х М (или N-мерный вектор) в массив вещественных значений А той
же размерности. Процедура FIX А выполняет обратное преобразование.
Вызов внешних функций в бейсик-программе ничем не отличается от
соответствующих правил фортрана. Например:
100 LET A5 = BESL(I, N, Z|2)*SIN(Z)
Дополнительный канал обмена информацией между бейсик-про-
граммой и внешними процедурами использует общую память. Бейсик-
программа распределяет свои массивы в общей памяти с помощью
оператора СОМ. Например:
50 СОМ А(24), В(2, 16)
Работа с внешней памятью построена по аналогии с фортраном. Это
означает, что внешний модуль достает нужную ему информацию или
размещает результаты вычислений, ориентируясь не на «чужие»
названия общих данных, а на их относительное расположение в соот-
ветствующей области памяти. Пусть, например, в вызываемой под-
программе был использован следующий оператор:
COMMON X, Y(20), Z(3), С(2, 16)
Тогда переменной А(1) из бейсик-программы соответствует перемен-
ная X, переменной А(2) — элемент У(1) и т. д. Элементам массива В
из вызывающей программы поставлены в соответствие одноименные
элементы массива С.
Работа с двоичными шкалами. Двоичная шкала представлена
в бейсике двухбайтовым словом. Список операций, выполняемых над
шкалами с помощью внешних функций, приведен в табл. 16.2.
265
Таблица 16.2
Формат обращения Результат
Z = IBAND (X, Y) Z = IBOR (X, Y) Z = IBNOT (X) Z = IBEOR (X, Y) Z=IBSET (X, n) Z = IBCLR (X, n) Z = IBTST (X, n) Z=IBSHFT (X, ± n) Z = X&Y Z = XvY Z = X + Y (mod 2) Установка в «1» n-го разряда в шкале X Установка в «0» n-го разряда в шкале X Проверка n-го разряда в шкале X Сдвиг шкалы X на п разрядов влево (+п) или вправо (—п)
Работа с файлами и устройствами. Процедуры обмена информа-
цией с. дополнительными внешними устройствами предусматривают два
формата данных — символьный и двоичный. Символьный формат харак-
терен для операторов PRINT и INPUT Двоичный обмен пре-
дусматривает передачу данных в их машинном представлении. Он
выполняется с помощью операторов WRITE # и READ
В качестве указателя устройства, с которым производится обмен,
используется так называемый «логический номер» (ЛН). С этим номе-
ром связывается конкретное физическое устройство. Операционная
система М-7000 допускает использование ЛН из диапазона [1, 99]
и представляет средства для выполнения нужных назначений.
Работа с устройствами отличается от работы с файлами только
тем, что устройства не надо «открывать» или «закрывать». Для диско-
вых и ленточных файлов такая процедура необходима, и выполняется
она .с помощью следующих операторов:
OPEN (ЛН Ь К°Д защиты]^,
/ г f °Я\
CLOSE ( Л Н J 1? )•
\ [ 1J J/
Второй параметр в приведенных процедурах уточняет характер выпол-
нения операции. Процедура OPEN (ЛН,0...) открывает соответствую-
щий файл. С помощью оператора OPEN (ЛН, 1...) файл сначала
создается, а потом открывается. По оператору CLOSE (ЛН, —1) ди-
сковый файл закрывается и уничтожается.
В операторах обмена предусмотрена возможность указать адрес
перехода по случаю аварийного завершения операции:
100 PRINT #5, А, В, С FAIL 220
Если во время вывода система контроля зафиксирует сбой оборудо-
вания, то управление будет передано оператору с меткой 220.
266
В программе обработки аварийной ситуации пользователю доступны
две системные функции — ЮЕ(х) и EOF(x). Первая из них выдает
код ошибки, который следует проанализировать, прежде чем продол-
жить работу. Вторая функция сигнализирует о ситуации исчерпания
данных в файле.
L Список операторов, используемых для управления устройствами,
шриведен в табл. 16.3.
Таблица 16.3
Формат оператора Выполняемая функция
BEGINT (ЛН) POS1TF (ЛН, NR) POSITT (ЛН, NF, NR) REWIND (ЛН) SKIPL (ЛН, NL) WEOT (ЛН) Установка перфоленты в начало данных Пропуск NR записей в дисковом файле Пропуск NF файлов и NR записей в файле на магнитной ленте (МЛ) Перемотка МЛ в начало Пропуск NL строк на печатающем устройстве Запись признака конца файла
Матричные процедуры. Набор матричных процедур и их форматы
приведены в табл. 16.4. Операторы «росписи» стандартными значе.
ниями (ZER, CON, IDN) допускают изменение границ массивов.
Таблица 16,4
1
Формат Формат
MAT A = ZER [(n[,m])J MAT A = CON I(n[,mJ}] MAT A=IDN[(n, fti)] MAT A = B MAT A = B + C MAT A = B—C MAT A=B*C MAT A=(e)*B MAT A = TRN(B) MAT A = INV(B) MAT READ A, B, C.i. MAT PRINT А, В; C... MAT INPUT #ЛН, A, B...[FAIL N] MAT WRITE #ЛН, A, B...[FAIL N] MAT PRINT #ЛН, A, B...(FAIL N] MAT READ # ЛН, A, В... [FAIL N]
Управление процессами. Программа, работающая в режиме реаль-
ного времени и поддерживающая связь с различными датчиками
и регулирующими устройствами, состоит из стартового блока и набора
процессов. Под процессом здесь понимают фрагмент бейсик-программы,
оформленный в виде подпрограммы. Основное назначение процесса —
обработка того или иного события (прием сигналов определенного
датчика, выдача управляющего воздействия и т. п.). Номер первого
оператора процесса отождествляется с номером процесса.
267
Каждому процессу может быть присвоен приоритет—целое число
из диапазона 1 до 99. Этот приоритет влияет на очередность запуска
процессов, готовых к исполнению.
Процесс приводится в состояние готовности при наступлении
одного- из следующих событий: наступило указанное время суток,
истекло заданное время ожидания, появился сигнал прерывания от
внешнего устройства, обслуживаемого данным процессом. чп
Запуск процесса можно заблокировать путем выдачи соответствую-
щей запрещающей команды. В соответствующий момент эту блоки-
ровку можно отменить. Процесс может управлять ходом выполнения
или влиять на работу других процессов.
Перечень операторов, используемых для управления процессами,
приведен в табл. 16.5.
Таблица 16.5
Формат оператора Выполняемая функция
DSABL (N) ENABL (N) SET (N, р) SENSE (ЛН, п, i, Nnp) START (N, Ат) TIME (vi, v2, v3) TRAP Nnp GOSUB N TRNON (N, r, m, c) TTYEV (ЛН, Nnp) Блокировка запуска процесса N Отмена блокировки Присвоение приоритета р процессу N Запуск процесса, связанного с обработкой прерывания номер Nnp, поступившего с устройства ЛН в момент изменения со- стояния n-го разряда (~| i—► i) в счи- тываемых данных Запуск процесса N через Ат с от теку- щего значения времени Опрос текущего времени (vi:= часы, v2: = минуты, v3: = секунды) Установка точки входа в процесс, свя- зываемый с обработкой прерывания, имеющего номер Nnp Установка стартового времени (г — часы, • гл — минуты, с —секунды) для запуска процесса N Запуск процесса, связанного с обработ- кой прерывания номер Nnp, по сигналу от внешнего устройства)
Обмен информацией с контрольно-измерительной аппаратурой.
Номенклатура АСВТ включает достаточно широкую гамму контрольно-
измерительной аппаратуры, на базе которой могут строиться различ-
ные управляющие комплексы. Все эти средства можно распределить
на три группы по характеру управляющих сигналов и воздействий.
К первой группе относятся аналоговые средства, вырабатываю-
щие или приводимые в действие сигналами в форме непрерывных кри-
вых. При вводе в ЭВМ такая информация должна быть преобразо-
268
вана из аналоговой формы'в цифровую, а при выводе—подвергнута
обратному преобразованию. Такие процедуры выполняются аппарат-
ным способом преобразователями типа ЦАП (цифра —> аналог) или АЦП
(аналог—► цифра), обеспечивающими кодирование или декодирование
сигнала с точностью до 8 или 10 двоичных разрядов.
Вторую группу составляют дискретные контрольно-измерительные
приборы, выдающие показания или воспринимающие воздействиё
в цифровом виде.
Наконец, к третьей группе относятся средства управления, на
вход которых подаются импульсные сигналы регулируемой дли-
тельности.
Однотипные датчики или органы управления объединяются в так
называемые модули ввода или вывода. Каждый модуль ввода может
содержать до 16 входов, т. е. подключаться максимум к 16 датчикам.
Модуль вывода может обслужить до 16 выходных линий.
Процедура опроса показаний аналоговых датчиков предусматри-
вает два варианта. В первом случае (AISQ) данные с датчиков вво-
дятся последовательно, и для этого требуется указать адрес первого
датчика (ADD1) и их количество (ND). Во втором случае (AIRD)
показания соответствующих приборов могут сниматься в произволь-
ном порядке, для чего приходится задавать последовательность инте-
ресующих нас адресов (массив ADD). При обмене информацией
с дискретными или импульсно-временными приборами единицей обслу-
живания является модуль, так что в соответствующих операторах
задаются адреса обслуживаемых модулей (массив ADM) и их коли-
чество (NM).
Параметр АИНФ обозначает поле оперативной памяти (массив),
предназначенный для хранения информации, участвующей в обмене.
Во всех процедурах обмена предусмотрен параметр, именуемый
кодом возврата (КВ). Он определяет характер завершения обмена.
Т а б л и ц а 16.6
Формат оператора Назначение
AIRD (ND, ADD1, АИНФ, КВ, ЛН) AISQ (ND, ADD, АИНФ, КВ, ЛН) АО (NC, ADC, АИНФ, КВ, ЛН) CDI (NDP, ADP, АИНФ, КВ, ЛН) DI (NM, ADM, АИНФ, КВ, ЛН) DOL (NM, ADM, АИНФ, ММ, КВ, ЛН) DOM (NM, ADM, АИНФ, Ат, КВ, ЛН) Опрос аналоговых датчиков » » » Вывод аналоговых сигналов Опрос цифровых измеритель- ных приборов Опрос дискретных датчиков Вывод дискретных сигналов Вывод импульсных сигналов длительностью Ат*, 100 мкс
269
Значение КВ = 1 свидетельствует о нормальном выполнении операции,
значение КВ=3 устанавливается при сбое оборудования.
Перечень операторов обмена с контрольно-измерительной аппара-
турой приведен в табл. 16.6. Все они реализованы в виде внешних
подпрограмм.
Набор директив. В табл. 16.7 приведен набор директив, связан-
ных с формированием и хранением текстов исходных программ. Осталь^
ные средства общения с операционной системой ДМСРВ заинтересо-
ванный пользователь может найти в руководстве [2].
Таблица 16.7
Формат директивы Назначение
DEL [Nl [, N2J] KILL "имя* [, код защиты] LIST [Nl [, N2J] LOAD ("имя"] [, Nl N2J] MERGE ["hmh"][,N1 [. N2J] PL 1ST [Nl [, N2]] RUN SAVE ["имя"] [, Nl [. N2J] Удаление текущей программы цели- ком, отдельного оператора (N1) или фрагмента (Nl, N2) Уничтожение дискового файла Вывод текущей программы, отдельной строки или фрагмента на пульт опе- ратора Загрузка исходной программы или ее фрагмента с дискового файла («имя») или с устройства ввода Присоединение загружаемой програм- мы или ее фрагмента к текущей про- грамме Вывод текущей программы или ее фрагмента на устройство системной печати Переход к исполнению текущей про- граммы Вывод текущей программы или ее фрагмента на системное устройство вывода или запоминание («имя») в дисковом файле
СПИСОК ЛИТЕРАТУРЫ К РАЗДЕЛУ 16.1
1. Интерпретирующая система бейсик. Руководство по пользованию.
3.134.000.ОП. Программное обеспечениеМ-6000 АСВТ, СПО-бОООА.—
Северодонецк: НПО «Импульс», 1972.— 109 с.
2. Диалоговые многозадачные системы реального времени. Краткое
описание и руководство по пользованию. 3.620.000.Т. Программное
обеспечение М-7000 АСВТ-М и СМ ЭВМ.— Северодонецк: НПО
«Импульс», 1979.— 147 с.
3. Школ дин В. Н. Русский вариант лексических понятий языка
BASIC для М-6000//Управляющие системы и машины.— 1976.—
№ 2. С. 88—89.
270
4. Кузьмина Л.М.; Кузьмин Ю. Я. Расширение BASIC М-6000.
Кибернетизация научного эксперимента: Межвед. сб. научных тру-
дов НИИ физики твердого тела. Изд-во Латв, ун-та.— 1978, № 8.
С. 46—58.
5. Васильев Е. П., Л ы ш е н к о В. И. Расширение возможностей
языка бейсик. Электронная техника. Серия 9. Экономика и си-
-шстемы управления, 1980, вып. 4 (37), с. 25—26.
6<n.K узьмина Л. М. Расширение языка Бейсик М-6000. Электрон-
, ная техника. Серия 9. Экономика и системы управления, 1983,
вып. 2 (47), с. 40—43.
16.2. Бейсик в составе операционных
систем ОС РВ и Рафос (СМ-3, СМ-4)
В составе операционных систем ОС РВ и Рафос эксплуатируется
несколько версий бейсика, мало чем различающихся по структуре
входного языка. Одна из этих систем является разновидностью одно-
пользовательской версии пакета BASIC/RT-11, другая продолжает
многопользовательский вариант MU BASIC/RT-11. Однотерминальный
и многотерминальный варианты отличаются между собой способами
использования ресурсов (диски, ленты, АЦПУ и т. п.) и средствами
защиты пользователей.
16.2.1. Основные объекты.
Алфавит: латинские буквы (A—Z), русские буквы (А—Я),
цифры (0—9), знаки арифметических операций ( + ♦ —, *> /» “1 —
возведение в степень), знаки операций отношения (>, =, <), про-
чие символы (пробел, двойные кавычки, апостроф, точка, запятая,
точка с запятой, круглые скобки, =fc, 0, %, &, ?, X)-
Константы: текстовые и арифметические двух типов — целые
и вещественные. Текстовые константы заключаются в двойные кавычки
или апострофы. Внутри кавычек одного типа могут встречаться ка-
вычки другого типа. Максимальная длина текстовой константы—
255 символов. Окаймляющие кавычки при этом не учитываются.
Константы целого типа выделяются тем, что справа от числа
записан символ %. В оперативной памяти целая константа занимает
2 байта, и ее значение должно принадлежать диапазону [—32 768,
4-32 767]. Все остальные арифметические константы считаются веще-
ственными. Для их хранения отводится 4 или 8 байт памяти в зави-
симости от начальной настройки операционной системы. Диапазон
представления вещественных констант—от 10”88 до 1038. Короткие
вещественные константы могут содержать до 8 значащих цифр, длин-
ные—до 15. К вещественным относится константа с именем PI (в ряде
руководств ее причисляют к функциям).
Простые переменные: трех типов — текстовые, целые и
вещественные. К стандартному обозначению (буква, буква с цифрой)
добавляется символ Q для указания текстового типа и символ % для
арифметических переменных целого типа. В программе могут одиовре-
271
менно существовать переменные А2, А2% и A2Q. Максимальная
длина текстовой переменной — 255 символов.
Массивы: трех типов, одномерные и двумерные. Обозначение—
буква или буква с цифрой с последующей добавкой символа % или
Q. Допускается одновременное существование массивов А, А % и AQ.
Индексы отсчитываются от нуля. Максимальное значение ин-
декса — 32 767. Однако из-за небольшого объема оперативной памяти
в реальных задачах приходится иметь дело с массивами более скром-
ных размеров. Для каждого элемента одномерного или двумерного
текстового массива резервируется фиксированное число байтов. Длина
эта задается в операторе DIM или выбирается по умолчанию—255 байт.
Текстовые выражения: операндами текстовых выражений
могут быть текстовые переменные или функции текстового типа. Опе-
ранды объединяются в порядке их следования с помощью операции
конкатенации, обозначаемой символами + или &.
Математические функции: базовый набор включает 11
стандартных функций —ABS, ATN, COS, EXP, INT, LOG, RND,
SGN, SIN, SQR, TAN. Генерация случайных чисел требует задания
фиктивного аргумента у функции RND. Для перенастройки генера-
тора на новую случайную точку используется оператор RANDOMIZE.
Дополнительный набор включает единственную функцию —
LOGIO(X), выдающую значение десятичного логарифма своего аргу-
мента.
Функции для обработки т е к ст о в (табл. 16.8).
Таблица 16.8
Формат Результат
LEN(eQ) Число символов в текстовом выражении
POS(eiQ, e2Q, е) Вхождение подстроки е2 Q в строку eiQ, начиная с позиции е
SEGQ(eQ, еъ е2) Выделение подстроки из eQ, начиная с позиции ei и до позиции е2 включи- тельно
TRMQ(eQ) Отсечение начальных и конечных про- белов
Функции для преобразования типов данных
(табл. 16.9)
Календарные функции: две функции — точнее системные
переменные DATQ и CLKQ—выдают соответственно текущую дату
и астрономическое время в виде строк:
ДД-МММ-ГГ (день, месяц, две младшие цифры года),
ЧЧ-ММ-СС (часы, минуты, секунды).
272
Таблица 16.9
Формат Результат
ASC(eQ) BIN('bkbk_i...bo) CHRQ(e) OCT('okok_f...o;) STRQ(e) VAL(eQ) Числовой код ASCII, соответствующий первому символу eQ Числовой эквивалент двоичной строки Символ, код которого в ASCII равен значению е Числовой эквивалент восьмеричной строки Символьное представление значения чис- лового выражения е Машинный формат числового значения, представленного символьным выраже- нием eQ
Системные функции: входной язык интерпретатора
МТ-бейсик представляет в распоряжение пользователя набор систем-
ных функций (табл. 16.10), с помощью которых производятся раз-
личные установки, блокируются или разблокируются те или иные
прерывания, осуществляется связь с операционной системой.
Программная строка: начинается с номера строки, кото-
рый должен принадлежать интервалу [1, 32767]. В программной
строке допускается несколько операторов, разделенных символом
обратной наклонной черты (\).
Командная строка: начинается со служебного слова — обо-
значения директивы или оператора. Большинство выполняемых опе-
раторов допускает непосредственное исполнение.
16.2.2. Специфика базовых операторов. Базовый набор включает
18 операторов —DATA, DEF, DIM, END, FOR, GOSUB, GOTO, IF,
INPUT, LET, NEXT, ON, PRINT, READ, REM, RESTORE,
RETURN, STOP.
В табл. 16.11 приведены форматы базовых операторов, отличаю-
щиеся от общепринятых.
Ниже приводятся особенности использования базовых операто-
ров, которые из соображений удобства поиска упорядочены в алфа-
витном порядке.
DATA: числовые и текстовые константы в теле оператора могут
следовать вперемежку. Текстовые константы, не содержащие запятых
и концевых пробелов, можно записывать без кавычек. Оператор DATA
может быть либо последним, либо единственным в программной строке.
D Е F: описание нестандартной функции может не содержать фор
мальных параметров. Например, DEF FNA = A~12. Но в обращении
к такой функции следует писать скобки; в данном примере Z = FNA().
273
Таблица 16.10
Формат Выполняемое действие
ABORT(I) CTRLC RCTRLC RCTRLO SYS(ei, e2) SYS(1, e2) SYS(2, e2) SYS(3) SYS(4) SYS(5) SYS(6) SYS(7, b SYS(8) TTYSET(255%, e) Прекращение выполнения программы с сохранением ее текста в памяти (1 = 0) или со стиранием (1 = 1)^ Отмена блокировки прерывания про- граммы по нажатию клавиш CTRL/C Блокировка прерывания программы по нажатию клавиш CTRL/C Блокировка или отмена блокировки прекращения вывода по нажатию кла- виш CTRL/O Системная функция, действие которой определяется аргументами ех и е2 Ввод символа с терминала или из файла с номером е2 и перекодировка в 7-раз- рядный код КОИ-7 Изменение идентификатора пользователя Отмена привилегированного статуса пользователя Выход из МТ-бейсика в Рафос Выдает значение статуса пользователя Выдает 1 или 0 при блокировке RCTRLC в зависимости от того, нажимал ли пользователь комбинацию CTRL/C или нет Разрешает (1 = 0) или запрещает (1 = 1) использование нижнего регистра (рус- ских букв) на вводе Разрешает выполнить команду BYE из программы Установка длины (е— 1) выводной строки на терминале
END: оператор END в программе может отсутствовать.
FOR: при наличии несовместимых условий тело цикла обходится.
GOTO: оператор GOTO либо единственный, либо последний
в программной строке.
1 F: если оператор IF находится в середине программной строки,
то невыполнение условия приводит к переходу в начало следующей
программной строки.
ON: при выходе значения переключающего выражения за пре-
делы диапазона [1, к] фиксируется программная ошибка.
PRINT: длина выводной строки—пять зон по 14 позиций. Для
организации форматной печати используется оператор PRINT USING
со следующими редактирующими возможностями:
— комментарий перед числовым полем fSiSa.. .Sk ##.#*)»
274
— числовое поле целого типа ("фффф"),
— числовое поле с фиксированной точкой ("ффф.фф"),
— числовое поле с плавающей точкой ("фф.фф"-!"-!"-!”*]"),
— печать знака минус справа ("фф.ффф —"),
— замена лидирующих нулей символом ♦(*♦ ♦*#•#*)>
— печать символа 0 перед числом ГСЮ## •##*)»
— разделение числовых позиций запятыми ("фф,ффф")»
— прижим текста влево (' 'LLL"),
— прижим текста вправо (" 'RRRR"),
— центральное расположение текста (* 'СССС"),
— прижим текста влево с возможностью расширить поле
("ЕЕ").
Таблица 16.11
Оператор Формат Примечание
DEF DIM IF LET ON RESTORE DEF FNaJ % >[(xi, x2...)] = lol (e 1 = <e% > bo J DIM AQ(20)=80, BQ(10,4)=40 DIM #n A(...) IF условие |gOTo} N IF условие THEN оператор fv 1 fe ) [LET]<k%Ub%} IvQj leQj . . (THEN ) ON Co/ < GOTO > Iе /o!\ GOSUB | Ni, N2 Nk RESTORE RESTORE #n Число аргументов — от 0 до 5 Объявление текстового массива с указанием максимальной длины эле- ментов Объявление виртуаль- ного массива Условный переход на строку N Условное выполнение оператора Переключатель номеров строк или подпрограмм по значению е Возврат указателя блока данных в начало Возврат в начало указа- теля файла с номером п
READ: допускается считывание числовой константы из блока
данных в текстовую переменную. Чтение текстовой константы в ариф-
метическую переменную приводит к программной ошибке.
275
Разновидностью базового оператора INPUT является оператор
LINPUT, обеспечивающий ввод текстовых строк с терминала. На
каждую переменную из его списка пользователь отвечает набором
одной строки. Концевые пробелы и знаки препинания вводятся при
этом, как обычные символы.
16.2.3. Файлы последовательного доступа. Файлы с последова-
тельным доступом создаются на магнитном диске и открываются с по-
мощью оператора OPEN:
OPEN "u : I” [FOR {oUTPUt}] AS F1LE *n
[DOUBLE BUF] [FILESIZE m]
Спецификация файла «и : f» состоит из имени устройства u (DPi —
сменный диск с номером i, DXj —гибкий диск с номером j) и специ-
фикации файла f, содержащей имя файла (от одного до шести симво-
лов) и его тип (обычно три символа). Для краткости мы будем назы-
вать именем файла составную конструкцию вида «устройство : имя. тип».
Имя открываемого или вновь создаваемого файла запоминается
операционной системой. В дальнейшем вместо имени файла в про-
грамме фигурирует номер файла 41= п. По умолчанию файл, сущест-
вующий на диске, открывается для ввода (FOR INPUT). Вновь соз-
даваемый файл может быть использован только для ввода. Сущест-
вующий на диске файл может быть открыт и для вывода, но в этом
случае с его прежним содержимым придется расстаться.
В файле последовательного доступа информация хранится в сим-
вольном виде подобно тому, как мы записываем ее в теле оператора
DATA. При записи данных в файл автоматически добавляются
кавычки, ограничивающие символьные значения, и запятые, отделяю-
щие одно значение от другого.
Считывание данных из файла с номером # п производится с по-
мощью оператора INPUT # п или LINPUT =4= п. Запись очередной
порции данных в файл выполняется по оператору PRINT # п. При
очередном обращении к файлу последовательного доступа могут быть
исчерпаны находившиеся там данные или превышен объем отведен-
ной (FltESIZE m) памяти. Контроль за этой ситуацией осущест-
вляется с помощью оператора IF END в котором можно
либо реализовать переход в нужную точку по обнаружению признака
конца файла, либо выполнить указанное действие.
Оператор (директива) CLOSE без параметров закрывает доступ
ко всем открытым файлам. Точно такая же процедура происходит и
при выполнении оператора END. Чтобы закрыть один или несколько
файлов, необходимо указать их номера в теле оператора (директивы)
CLOSE (нс — номер строки):
[нс] CLOSE # пь # n2, ...
276
Останов по оператору STOP или по программной ошибке не приводит
к закрытию файлов.
16.2.4. Работа с виртуальными массивами. Виртуальный массив
представляет собой разновидность файла прямого доступа. Разме-
щается он на диске, где для него выделяется необходимый участок
памяти в соответствии с объявленными в DIM параметрами. На-
пример:
10 DIM #2%, AQ(20) = 80
В одном операторе DIM # п может быть объявлен только один вир-
туальный массив любого типа. Файлу с указанным программным но-
мером затем следует присвоить инвентарное имя, которое понадобится
операционной системе. Эта процедура совмещается с открытием файла:
20 OPEN "DX1 : MACH' FOR OUTPUT AS FILE #2
Специальных операторов обращения к элементам виртуальных
массивов не существует. Их имена используются в программе так же,
как и имена элементов внутренних массивов.
- Виртуальный массив на диске может быть переименован с по-
мощью процедуры NAME (NAME «старое имя» ТО «новое имя»). Для
удаления виртуального массива используется процедура KILL. Однако
обе эти процедуры скорее относятся к функциям операционной си-
стемы, нежели к входному языку бейсик-интерпретатора.
В пределах одной программы можно использовать до семи одно-
временно открытых виртуальных массивов.
16.2.5 . Организация больших программ. Для организации слож-
ных программных комплексов пользователю представляются три воз-
можности— обращение к подпрограммам, составленным на ассемблере,
динамическая загрузка очередного программного сегмента, присоеди-
Таблица 16.12
Оператор Формат Примечания
CALL CHAIN COMMON OVERLAY CALL "имя" [(ai, a2, ...)] CHAIN "имя" [, N] COMMON Vi, v2, ... OVERLAY "имя" [, N] Вызов подпрограммы, на- писанной на ассемблере Переход к выполнению сле- дующей программы, напи- санной на бейсике Размещение простых пере- менных и массивов в общей памяти Динамическая дозагрузка очередного фрагмента про- граммы на бейсике
277
Таблица 16.13
Формат Выполняемая функция
APPEND 'имя' CLEAR COMPILE ['имя'] DEL [Ni] [-] [N2] LENGTH LIST [Nd [—] [Na] LISTNH [Nil[—] [Na] NEW ['имя'] OLD ['имя'] RENAME 'имя' REPLACE 'имя' RESEQ No, Nf —N2 RUN ['имя'] RUNNH ['имя'] SAVE 'имя' SAVE LP: SAVE PC: SCR SUB NOSjSa.i.OQi Qa- • 4@n] UN SAVE 'имя' Объединение указанной программы с те- кущей Очистка массивов и символьных буферов с сохранением имени программы Компиляция указанной или текущей про- граммы Удаление строк из текущей программы Определение количества ячеек памяти, занятых программой, и числа свободных ячеек в буфере пользователя Вывод фрагмента программы с заголовком (имя программы, дата, время) То же, без заголовка Очистка памяти и установка имени теку- щей программы Вызов программы из архива Переименование текущей программы Замена существующего архивного файла текущей программой Перенумерация строк в фрагменте Nf—N2, No — новый начальный номер Запуск текущей или указанной програм- мы с выводом заголовка То же, без вывода заголовка Запоминание текущей программы в ар- хиве или на указанном носителе Вывод текущей программы на АЦПУ То же, на перфоленту Очистка памяти с уничтожением имени текущей программы Редактирование строки с номером N Цепочка символов SiS2... заменяется на символы QiQ2... . Замена осуществляется в п-м вхождении цепочки Удаление файла с внешнего запоминаю- щего устройства
няемого к текущей программе, и организация исполнения цепочки
последовательно работающих программ. Список соответствующих опе-
раторов и их форматы приведены в табл. 16.12.
Ниже приводятся особенности употребления каждого из этих
операторов.
CALL: список подпрограмм, к которым будет производиться
обращение, предварительно сообщается операционной системе для
загрузки соответствующих модулей в память. Среди фактических ар-
гументов в операторе вызова могут фигурировать переменные всех
278
типов, имена массивов и выражения. Операционная система предус-
матривает специальные правила оформления подпрограмм и способы
обмена данными.
OVERLAY: производит дозагрузку указанной программы на
бейсике, которая присоединяется к текущей программе с возмож-
ным затиранием прежних программных строк в случае совпадения
номеров. Если в списке аргументов не указан адрес перехода N, то
работа продолжается с оператора, следующего за оператором OVER-
LAY. В вызываемом фрагменте программы не должны присутствовать
операторы DEF и DIM.
COMMON: предназначен для вынесения транзитных перемен-
ных и массивов в общую память, используемую при работе цепочки
программ. Массивы, перечисленные в списке оператора COMMON, не
должны определяться по оператору DIM. Количество наименований,
выносимых в общую память, не должно превышать 255.
CHAIN: используется для вызова очередной программы из це-
почки с возможным указанием точки начала счета, если она не сов-
падает с первым выполняемым оператором вызываемой программы.
Перед вызовом новой программы стирается предыдущая, закрываются
все открытые файлы и производится очистка поля внутренних пере-
менных и массивов.
16.2.6 . Перечень основных директив (табл. 16.13).
16.3. Бейсик-плюс на ЭВМ типа СМ-4
Система программирования Бейсик-плюс была разработана в 1975 г.
и функционировала на различных моделях PDP/11 под управлением
операционной системы RSTS/E (Resourse Sharing Timesharing System/
Extended). Модификация этого программного средства включена в со-
став операционной системы разделения времени ДОС РВР, эксплуа-
тируемой на ЭВМ типа СМ-4 [1]. Современная версия входного языка
известна под названием Бейсик-плюс-2 [3].
16.3.1. Основные объекты.
Алфавит: прописные буквы латинского алфавита (А—Z),
цифры (0 — 9), знаки арифметических операций (+, —, *, /, возве-
дение в степень: f, или /ч, или **), знаки операций отношения
(>, =, <), прочие символы (пробел, круглые скобки, кавычки,
апостроф, двоеточие, запятая, точка с запятой, $ или Q, !, ?,
%, .&> @). Входной язык ДОС РВР допускает ограниченное употреб-
ление букв русского алфавита (А—Я).
Константы: текстовые, арифметические целого и веществен-
ного типов. Последние могут быть представлены с обычной (7 цифр,
диапазон от 10-38 до 10+38) или с удвоенной (16 цифр) точностью
в зависимости от параметров, установленных при генерации опера-
ционной системы. К вещественным константам относится число Р1
279
(я = 3,1415927). Признаком Целой константы является символ %, рас-
полагаемый правее числа. Диапазон констант целого типа от —32 768
до +32 767. Длина текстовых констант—-до 188 символов.
Простые переменные: трех типов — текстовые, целые и
вещественные. Обозначения переменных — стандартные (буква, буква-
цифра). К имени текстовых переменных добавляется символ $ (Q)\
имена переменных целого типа сопровождаются символом %.
Массивы: трех типов — текстовые, целые и вещественные. Обо-
значения— однобуквенные или двухсимвольные (буква-цифра). Коли-
чество индексов —не более двух. Индексы отсчитываются от нуля.
Максимальное значение индексного выражения — 32 767.
Математические функций: базовый набор из 11 стан-
дартных функций —ABS, ATN, COS, EXP, INT, LOG, RND, SGN,
SIN, SQR, TAN. Функция RND может употребляться как с аргу-
ментом, так и без него. Для перенастройки генератора случайных
чисел используется оператор RANDOMIZE.
Среди дополнительных функций — FIX (целая часть аргумента)
и LOG 10 (десятичный логарифм).
Функции для обработки текстов (табл. 16.14).
Та блица 16.14
Формат Результат
INSTRG, А$, В$) LEN(A$) LEFT(A$, n) MID(A$, i, n) RIGHT(A$,n) SPACE$(n) STRING$(n, N) Вхождение B$ в А$, начиная с i-ro символа А$ Длина текстового значения Левая подстрока, п символов Центральная подстрока, п символов Правая подстрока, п символов Строка из п пробелов Строка из п одинаковых символов, N — код символа в ASCII
Функции, предназначенные для организации
в в о д a/в ы в о д а: две из них — ТАВ(е) и POS(x) — используются для
управления устройством вывода (АЦПУ, терминал). Функция TAB
устанавливает печатающий механизм (курсор) в позицию с номером е
(для терминала eg[l, 72], для АЦПУ eg [1, 128]). С помощью функ-
ции POS опрашивается номер текущей позиции печатающего меха-
низма (курсора). Две другие функции BUFSIZ и STATUS исполь-
зуются соответственно для опроса размера буфера, выделенного файлу,
и состояния внешнего устройства.
Логические выражения: операндами выражений могут
быть результаты сравнения арифметических и текстовых величин,
280
а также целые числовые значения, представляемые в ЭВМ двухбай-
товыми двоичными числами. В качестве операций, связывающих опе-
ранды логической формулы, можно использовать логическое сложение
(OR), логическое умножение (AND), отрицание (NOT), исключающее
ИЛИ (XOR), импликацию (IMP) и эквивалентность (EQV). Резуль-
татом вычисления логического выражения является двухбайтовое целое
число, рассматриваемое как «ложь» в случае равенства нулю и как
«истина» в противном случае. Среди операций отношения, используе-
мых для сравнения вещественных значений, Бейсик-плюс допускает
достаточно необычную процедуру — проверку на приблизительное ра-
венство (А = = В).
Функции для преобразования типов (табл. 16.15)
Таблица 16.15
Формат Результат
ASCII(A$) CHR$(N) CVT%$(I) CVTF$(R) CVT$»/0(A$) CVT$F(A$) CVT$$(A$,I) NUM$(e) VAL(A$) XLATE(A$, B$) Целое число — код ASCII первого симво- ла А$ Символ, код которого в ASCII равен N Два символа, полученные в результате пере- обозначения целого числа I Четыре символа, полученные в результате переобозначения вещественного числа R Целое число, полученное в результате пере- обозначения двух первых символов А$ Вещественное число — результат переобозна- чения первых четырех символов А$ Редактирование символьного значения А$ в соответствии со шкалой I (1 I 383) Символьное представление числового значе- ния е Машинный формат числа, соответствующий его символьному представлению А$ Символьная строка, полученная в резуль- тате перекодировки исходного текста А$ с помощью словаря В$
Текстовые выражения: для формирования новых строк
из текстовых констант, переменных и подстрок может использоваться
процедура конкатенации, для обозначения которой применяется знак +•
Программная строка: начинается с номера строки, при-
надлежащего диапазону [1, 32 767]. Вслед за номером могут распола-
гаться операторы, разделяемые двоеточием или символом \ (обрат-
ная косая черта). Программная строка может занимать несколько
строк экрана дисплея. Максимальная длина строки — 255 символов.
16.3.2. Специфика базовых операторов. Бейсик-плюс включает
18 операторов базового набора — DATA, DEF, DIM, END, FOR,
281
qOSUB, GOTO, IF, INPUT, LET, NEXT, ON, PRINT, READ, REM,
RESTORE, RETURN, STOP. Наряду с общепринятыми стандартами
ряд операторов допускает следующие отклонения.
D Е F: имя нестандартной функции может содержать до пяти
символов: FN-буква-цифра-указатель типа. В качестве указателя
типа используются символы % и $ (Q). Количество формальных пара-
метров—от одного до пяти. Каждый из них может быть снабжен
указателем типа. Допускается описание нестандартных функций, содер-
жащее несколько операторов и заканчивающееся оператором FNEND.
В этом случае, подобно фортрану, вычисленное значение присваи-
вается имени функции. В многооператорных описаниях функций допу-
скается рекурсия.
FOR: при несовместимых значениях параметров тело цикла обхо-
дится. Наряду с общепринятым форматом используются две модифи-
кации оператора заголовка цикла:
FOR v = ef [STEP е2] WHILE условие
FOR v = ex [STEP e2] UNTIL условие
Первый вариант (WHILE) обеспечивает повторение цикла с монотонным
изменением значения управляющей переменной v до тех пор, пока
условие истинно (т. е. пока его значение отлично от нуля). Второй
вариант (UNTIL) обеспечивает повторение цикла до тех пор, пока за-
данное условие ложно. Оба цикла завершаются оператором NEXT v.
IF: наряду с основным форматом, в котором служебное слово
THEN может быть заменено словом GOTO, допускается альтерна-
тивная процедура:
IF условие THEN /Н0Мер СТр0КИ1 ELSE /Н0Мер строкИ1
[оператор ) [оператор )
INPUT: первым элементом списка может быть подсказка, заклю-
чаемая в кавычки:
INPUT "подсказка" Vi, v2, ...
Модификацией оператора является ввод символьной строки в тексто-
вую переменную:
INPUT LINE ["подсказка"] v$
LET: присвоение одного и того же значения нескольким пере-
менным одного типа осуществляется оператором вида
[LET] vb v2, .... vk=e
ON: наряду с организацией программных переключателей
(ON-GOTO) используется для назначения точки входа в подпрограмму
обработки программных ошибок:
ON ERROR GOTO N
282
В программе обработки Могут использоваться двухбайтовые. слу-
жебные переменные ERR и ERL, значениями которых являются целые
числа—код (номер) ошибки и номер строки, в которой ошибка эафик
сирована в момент выполнения программы. Для выхода из программы
обработки ошибок используется возврат либо на повторение оши-
бочного оператора (RESUME), либо в заданную точку программы
Resume nj.
PRINT: наряду с упрощенной печатью для вывода числовых
и текстовых данных может использоваться шаблон с описанием струк-
туры выводимой строки:
PRINT USING формат, список
Для описания форматов символьных полей применяются следующие
знаки:
! — первый символ текстового значения,
И—два первых символа текстового значения,
н ———- „ ————— п —— о ,,
\п пробелов\—п + 2 первых символа текстового
значения.
Форматы числовых полей описываются с помощью символов: « # »,
«точка», «НН» (или «АЛЛА»), «минус», «запятая», «*» и «$» (Q).
R Е М: Бейсик-плюс позволяет располагать комментарий в любом
операторе программы. Разделителем в этом случае служит восклица-
тельный знак.
16.3.3. Матричные операции. Список матричных операций, вхо-
дящих в состав Бейсика-плюс, приведен в табл. 16.16. Процедуры
CON, 1DN, ZER, INPUT и READ позволяют переопределить размер-
ность операндов. После выполнения операции MAT INV в служебной
переменной DET находится значение определителя обращаемой мат-
рицы. Нулевые индексы в матричных операциях игнорируются.
Таблица 16.16
Формат Формат
MAT A = CON MAT A=IDN MAT A = ZER MAT READ А, В, ... МАТ А = В МАТ А = ВЧ-С МАТ А—В —С МАТ А = В*С 1 МАТ А=(е)*В MAT A = TRN(B) MAT A=INV(B) MAT PRINT А, В; С, ... MAT PRINT #п, А, В, С, ... MAT INPUT А, В, С, ... . MAT INPUT #п, А, В, С, ...
263
Операторы MAT PRINT #n и MAT INPUT #n используются
для обмена, с файлами.
16.3.4. Многократное повторение оператора. Одной из интересных
особенностей языка Бейсик-плюс является возможность многократного
выполнения оператора. При этом количество повторений задается
либо по аналогии с оператором цикла, либо с помощью логического
условия:
оператор FOR v = ei ТО е2 [STEP е3]
оператор IF условие
оператор WHILE условие
оператор UNTIL условие
оператор UNLESS условие
На наш взгляд, такое обилие служебных слов в сочетании с логиче-
скими условиями вряд ли оправданно. Оно может только запутать
пользователя, так как ему вполне хватило бы основной формы IF
(WHILE условие = IF условие, UNTIL условие = UNLESS усло-
вие = IF NOT условие).
16.3.5. Работа с таймером. Два оператора (SLEEP, WAIT) и три
системные функции (DATE$, TIME$, TIME) используются для про-
граммирования временных процедур. Оператор SLEEP п приостанав-
ливает выполнение программы на п секунд. С помощью оператора
WAIT п устанавливается лимит времени в секундах, отводимый поль-
зователю на ввод данных по запросу оператора INPUT. Если за это
время пользователь не успевает набрать необходимые значения, то
происходит прерывание с кодом программной ошибки ERR = 15.
Таблица 16.17
Формат Значение функции
DATE$(0) DATE$(n) TIME$(0) TIMEg(n) TIME(O) TI?4E(1) TIME(2) TIME(3) Текущая дата в виде символьного значения "ДД-МММ-ГГ" Календарная дата дня с номером п, заданным отно- сительно 1.01.1970 Текущее время дня в виде символьного значения "ЧЧ-ММ" Астрономическое время в таком же виде для момента за п минут до полуночи Текущее время дня в секундах Время процессора, затраченное на решение задачи, в десятых долях секунды Время сеанса, исчисляемое в минутах от момента входа пользователя в систему Количество обращений к ячейкам ОП, состоявшееся с момента запуска задачи, в тысячах обращений
284
Результаты работы системных функций DATE$, Т1МЕ$ и TIME
зависят от значения своего целочисленного аргумента (табл. 16.17).
16.3.6. Файлы и виртуальные массивы. Спецификация файла (СФ)
представляет собой текстовую константу вида «имя устройства: имя
файла». Файлы открываются с помощью оператора OPEN:
1 Г I INPUT 1 1
ОРЕ№СФ” [F0R {outputf ]
AS FILE n [.RECORDSIZE mJ
[.CLUSTERSIZE m2] [.FILESIZE m3] [.MODE m4]
С открытым файлом связывается буфер ввода/вывода, находящийся
в ОП. Размер этого буфера зависит от типа устройства, на котором
располагаются данные (512 байт—для МЛ или МД; 160 байт—для
ввода с перфокарт; 128 байт—для АЦПУ, НГМД, перфоленточного
устройства, терминала). С помощью параметра пи (RECORDSIZE)
можно изменить размер буфера ввода/вывода. Опросить длину буфера,
связанного с файлом п, можно с помощью функции BUFSIZ(n).
Кластер — это группа смежных порций (блоков) в выводном файле
на магнитном диске. Использование крупных кластеров позволяет
сократить количество физических обращений к МД при условии, что
размеры буфера ввода/вывода также увеличены. Параметр CLUSTER-
SIZE задает количество (ш2) блоков емкостью по 512 байт, опреде-
ляющее размер кластера.
Параметр FILESIZE устанавливает количество т8 смежных бло-
ков, которое система добавляет к файлу в случае необходимости его
расширения.
С помощью параметра MODE формируется логическая шкала,
управляющая режимом работы соответствующего внешнего устройства.
Более подробную информацию об использовании перечисленных харак-
теристик файла можно найти в работе [1] и в руководстве по
ДОС РВР.
Файл, открытый без указания FOR INPUT или FOR OUTPUT,
допускает чтение (ввод) и запись (вывод).
В пределах одной задачи может быть одновременно открыто до
12 файлов. Закрываются файлы по оператору CLOSE.
Обмен с файлами последовательного доступа выполняется с по-
мощью различных модификаций операторов PRINT и INPUT:
PRINT #п, еь е2, ...
PRINT #п USING формат, еь е2,...
MAT PRINT #п, А, В, ...
INPUT #n, V1, v2, ...
INPUT LINE #n, vQ
MAT INPUT #n, A, B, ...
Обмен с файлами прямого доступа предполагает работу на уровне
физического содержимого записей. С этой целью буфер ввода/вывода
285
разделяется на символьные (байтовые) поля с помощью оператора
FIELD:
FIELD #n, li AS vi$, 12 AS v2$, ...
Здесь Ц—длины выделенных полей (в байтах), a Vi$ — присвоенные
им имена.
Запись с номером m из вводного файла перемещается в буфер
с помощью оператора GET 41= и, RECORD m. После этого содержимое
«переменных» vj$ можно использовать как текстовые величины, пере-
обозначать (функции CVT) или преобразовывать их значения и т. п.
Для того чтобы сформировать буфер выводного файла, исполь-
зуются операторы вида:
LSET Vi$ = e$
RSET vi$ = e$
Они переносят значение текстового выражения на указанное поле
буфера с прижимом влево (LSET) или вправо (RSET). Сформирован-
ный буфер переписывается на внешний носитель в запись с номером m
по оператору PUT #n, RECORD m.
Если в операторах GET, PUT указание о номере записи отсут-
ствует, то система обеспечивает обмен с текущей записью, номер
которой на единицу больше номера предшествовавшей записи.
Другой способ организации прямого доступа к данным, храня-
щимся на магнитном диске, связан с использованием виртуальных
массивов. В пределах одного файла может быть расположено несколько
виртуальных массивов разного типа. Привязка массивов к файлу про-
изводится с помощью модифицированного оператора DIM:
10 DIM #2%, А (500), Bl % (30, 40), CQ(200) = 80
В этом операторе перечисляются массивы, распределяемые в дисковом
файле с программным номером 2. Параметр, указанный после объяв-
ления размерности текстового массива CQ, задает длину каждого
элемента массива. По умолчанию под каждую компоненту символь-
ного массива отводится по 16 байт.
Файл с виртуальными массивами открывается с помощью опера-
тора OPEN без указания типа (FOR INPUT или FOR OUTPUT).
После этого с элементами виртуальных массивов можно работать, как
с обычными переменными.
СПИСОК ЛИТЕРАТУРЫ К РАЗДЕЛУ 16.3
1. Программирование на языке Бейсик-плюс для СМ-4/В. П. Семик,
Б. Р. Монцибович, Д. П. Непочатых и др.—М.: Финансы и ста-
тистика, 1982.— 246 с.
286
2. RISS: система управления реляционными базами данных для ма-
лых ЭВМ/М. Мелдман, Д. Маклеод, Р. Пелликор, М. Сквайр;
пер. с англ.— М.: Финансы и статистика, 1982.—144 с.
3. PDP-11 BASIC-PLUS-2 language reference manual. Order No. AA-
H074A-TC.— Maynard (Max.): Digital Equipment Corp. 1978.
16.4. Настольные миниЭВМ A5120 и A5130
МиниЭВМ А5120/А5130 выпускаются предприятием «Роботрон»
(ГДР). Их базовые комплекты включают: процессор с оперативной
памятью 32 Кбайт или 64 Кбайт, символьное или мозаичное АЦПУ
со скоростью печати от 35 до 400 знак/с, клавиатуру и алфавитно-
цифровой дисплей типа К7221 (16 строк по 64 знака) или К7222
(24 строки по 80 знаков), от одного до четырех накопителей на гиб-
ких магнитных дисках типа К5600.10 (емкость одного пакета порядка
130 Кбайт). В составе А5130 имеется устройство перфоленточного
ввода/вывода.
Операционная система UDOS-1526, эксплуатируемая на указан-
ных ЭВМ, включает бейсик-интерпретатор. В составе другой опера-
ционной системы SIOS-1526 [16.4.4] также имеется интерпретатор
с бейсика, однако его входной язык, возможно, отличается от описы-
ваемой версии.
16.4.1. Основные объекты.
Алфавит: латинские буквы (А—Z), цифры (0 — 9), знаки ариф-
метических операций (+, —, *, /, л—возведение в степень), знаки
операций отношения (>, =, <), прочие символы.
Константы: текстовые и арифметические двух типов — целые
и вещественные. Запись целых констант никаким специальным сим-
волом не выделяется. Для хранения целых чисел отводится 2 байта,
что соответствует диапазону от —32 768 до +32 767. Вещественные
числа хранятся в двоично-десятичном коде. Они могут содержать до
13 значащих цифр.
Диапазон вещественных чисел — от 10“128 до 10+127. Длина тексто-
вой константы практически не ограничена.
Простые переменные: обозначения стандартные. Для пере-
менных целого типа вслед за именем следует символ %, для тексто-
вых переменных — символ Q.
Массивы: арифметические массивы — одномерные и двумерные.
Текстовые массивы—только одномерные. Индексы отсчитываются от
единицы. Максимальное значение индексного выражения — 32 767.
Математические функции: базовый набор из 11 стан-
дартных функций —ABS, ATN, COS, EXP, INT, LOG, RND, SGN,
SIN, SQR, TAN. Функция RND употребляется с.фиктивным аргумен-
том. Для перенастройки генератора случайных чисел используется
оператор RANDOMIZE.
287
Функции для обработки текстов (табл. 16.18).
Таблица 16.18
Формат Результат
ASC(eQ) CHRQ(e) LEN(eQ) LEFTQ(eQ, n) RIGHT0(eQ,n) SEGQ(e0. n. m) POS(eiO, e,O) STR0(e) VAL(eQ) Преобразование первого символа в число Преобразование е (0^е^255) в символ Длина значения текстового выражения Выделение левой подстроки Выделение правой подстроки Выделение средней подстроки Вхождение e^Q в eiQ Преобразование числового значения в сим- вольный формат Преобразование числа из символьного пред- ставления в машинный формат
16.4.2. Специфика базовых операторов. Базовый набор включает
18 операторов —DATA, DEF, DIM, END, FOR, GOSUB, GOTO, IF,
INPUT, LET, NEXT, ON, PRINT, READ, REM, RESTORE, RETURN,
STOP.
Таблица 16.19
Оператор Формат Примечание
DEF IF INPUT LET ON PRINT RESTORE RETURN DEF FNa (xx, x2, ...) FNEND IF условие THEN оператор [ELSE оператор] INPUT ’подсказка’, vx, v2, ... LET Vi = ei, v2 = e2, ... ON e GOTO Nx, N2, ..., Nk ON e GOSUB Nx, N2, ..., Nk ON e RESTORE Nx, N2, ...,Nk PRINT USING ... RESTORE RESTORE N RETURN e Многострочное опре- деление нестандарт- ной функции Переключатель строк Переключатель под- программ Установка указателя блока данных на одну из указанных порций Форматный вывод Установка указателя блока данных в на- чальное положение Установка указателя блока данных в на- чало указанной пор- ции Выдача значения не- стандартной функции
288
В табл. 16.19 приведены форматы базовых операторов, отличаю-
щиеся от общепринятых.
Ниже приведены некоторые особенности использования базовых
операторов.
D Е F: кроме обычного однострочного описания нестандартной
функции допускается описание в виде подпрограммы-функции. Ре-
зультирующее значение должно быть возвращено с помощью опера-
тора RETURN. Допускается наличие рекурсивного обращения функ-
ции к самой себе. Например:
100 REM РЕКУРСИВНОЕ ОПИСАНИЕ FNF(K) = K 1
ПО DEF FNF(K)
120 IF К = 0 THEN RETURN 1
130 RETURN K*FNF(K—1)
140 FNEND
END: оператор END может быть не последним в программе, и их
может быть несколько. После оператора END могут располагаться
подпрограммы. Возможно использование END в теле условного опе-
ратора. Например:
150 IF X < 0 THEN END
IF: конструкция IF допускает наличие двух альтернативных дей-
ствий IF-THEN-ELSE. После служебных слов THEN и ELSE могут
быть указаны номера строк перехода, простые или составные опера-
торы. Составные операторы представляют собой цепочку простых опера-
торов, заключенных в операторные скобки — DO и DOEND. Например:
180 IF INT(N/2) = N/2 THEN DO
190 PRINT ’N —ЧЕТНОЕ’
200 LET N = 0
210 DOEND
220 ELSE DO
230 PRINT ’N —НЕЧЕТНОЕ1
240 LET N = 1
250 DOEND
Значение функции может быть целым, вещественным или текстовым.
Соответствующим образом должно быть выбрано и имя функции (FNK,
FNK% или FNKQ).
PRINT: в сочетании со служебным словом USJNG используется
для организации форматного вывода. Ссылка на формат может быть
явной (в теле оператора PRINT) или косвенной путем указания имени
текстовой переменной. Редактирующие указатели обеспечивают сле-
дующие возможности:
— печать целых чисел ("# # # # # #*);
— печать чисел с фиксированной точкой ("* # DD.D’);
10 ю. Л. Кетков
289
— печать чисел с плавающей точкой ("4£4t4tD.DDD~ Л Л ~*).
Буква D обозначает обязательную числовую позицию, которая
должна заполняться даже при наличии лидирующих нулей.
16.4.3. Работа с файлами. Операционная система UDOS представ-
ляет пользователям возможность работы с файлами прямого и после-
довательного доступа. Причем оба метода доступа могут быть при-
менены к одному и тому же физическому файлу. Содержимым файла
может быть либо символьная информация в коде ASCII, либо битовая.
Для работы с файлами используются следующие операторы:
FILE—для открытия файла и установления соответствия между
его именем на диске и программным номером #п (FILE =й=п, *имя*);
INPUT Vi, v2 ...— для чтения символьной информации из
файла;
LINPUT 4£п, vQ—Для чтения строки из файла в текстовую пере-
менную;
PRINT •. .^-для записи информации в символьный файл;
WRITE zftn, ...-—для записи информации в битовый файл;
SPACE zftn, ...-—для изменения положения указателя в файле;
TRUNCATE — Для усечения файла;
CLOSE 4£п—для закрытия файла.
Для анализа на исчерпание данных используется функция EOF(n).
Таблица 16.20
Директива Назначение
APPEND ASAVE CLEAR CONTINUE DELETE ERASE GET LIST NEW QUIT RENUMBER RSAVE RUN SAVE SIZE STEP XEQUTE Присоединение архивной программы к текущей Запоминание текущей программы в исходном виде Очистка памяти Продолжение обработки программы после останова Удаление строк из исходной программы Уничтожение файла на диске Вызов программы из архива Вывод текста исходной программы Подготовка к вводу новой программы Выход из бейсик-интерпретатора Перенумерация строк исходной программы Запоминание текущей программы на старом месте с уничтожением предыдущей копии Выполнение текущей программы Запоминание текущей программы в компактной форме Опрос состояния ресурсов памяти Переход на пошаговое исполнение исходной про- граммы Вызов и исполнение архивной программы
290
16.4.4. Организация больших программ. Для организации взаимо-
действующих программных комплексов можно использовать обращения
по оператору CALL к подпрограммам, составленным на ассемблере,
или формировать цепочки последовательно работающих программ (опе-
ратор CHAIN). В последнем случае транзитные переменные выносятся
в общую память с помощью оператора СОМ.
16.4.5. Директивы (табл. 16.20).
СПИСОК ЛИТЕРАТУРЫ К РАЗДЕЛУ 16.4
1. Тrinks D. BASIC-Dialogsystem fur UDOS. RD 21(1894).
N 4.—S. 10—13.
2. Voigt E. Einfuhrung in BASIC. Radio-fernsehenelektronik. Berlin.
1984. —V. 33, N 8. —S. 479—483.
3. Trinks D., Kohler D., Voigt E. BASIC fur Burocomputer
A5120/A5130, Edv-aspekte, 1983, N 2, S. 22—26.
4. Anwenderdokumentation. BASIC-Interpreter fur SIOS 1526. VEB
Robotron-Buchungsmaschinenwerk, Karl-Marx-Stadt. 1982.
Глава 17. БЕЙСИК НА МИКРОЭВМ И ПЕРСОНАЛЬНЫХ
КОМПЬЮТЕРАХ
17.1. Бейсик на микроЭВМ Электроника-60
Электроника-60 является одной из первых микроЭВМ, массовый
выпуск которой освоен нашей промышленностью. Ее широко приме-
няют в различных управляющих системах и в робототехнике. Отно-
сительно низкая стоимость обусловила использование Электроники-60
в учебном процессе и научно-исследовательской работе.
Основу ЭВМ составляет микропроцессор К581, обеспечивающий
выполнение коротких машинных операций со скоростью порядка
250 тыс. оп/с. По своей системе команд Электроника-60 совместима
с ЭВМ СМ-3. Однако в первых моделях объем ее оперативной памяти
составлял всего 8 Кбайт. Поэтому в базовом комплекте Электроники-60
(процессор, ОЗУ, Консул-260, устройство фотоввода и ленточный
перфоратор) эксплуатируется перфоленточная операционная система
(ПЛОС). При очередном включении ЭВМ ее приходится загружать
с перфоленты.
Подключение дополнительных блоков ОЗУ и ПЗУ позволяет рас-
ширить объем оперативной памяти до 56 Кбайт. На таких установках
при наличии внешних запоминающих устройств могут эксплуатиро-
ваться более современные операционные системы типа Фодос или
Рафос.
Ниже рассматриваются особенности входного языка перфоленточ-
ной версии бейсик-интерпретатора, поставляемого вместе с минималь-
ным базовым комплектом ЭВМ.
17.1.1 Основные объекты.
Алфавит: латинские буквы (А—Z), дополнительный набор
букв русского алфавита (Б, Г, ..., Я), цифры (0—9), знаки арифме-
тических операций (+, —, *, /, —)—возведение в степень), знаки
операций отношения (>, =, <), прочие символы (двойные кавычки,
точка, двоеточие, запятая, точка с запятой, круглые скобки, пробел).
Константы: числовые, вещественного типа. Максимальное
количество десятичных цифр — восемь, диапазон допустимых значений—
от 10“9а0 до 10980. Достигается это путем программного моделирова-
ния арифметических операций и приводит к резкому падению скоро-
292
сти вычислений. Текстовые константы заключаются в двойные кавычки
и могут использоваться только в операторе PRINT.
Простые переменные: только арифметического типа, обо-
значения — стандартные.
Массивы: одномерные и двумерные. Индексы отсчитываются
от нуля. Размеры массивов ограничиваются объемом ОЗУ.
Математические функции: базовый набор включает
10 стандартных функций — ABS, ATN, COS, EXP, INT, LOG, RND,
SGN, SIN, SQR. Функция RND используется с фиктивным аргумен-
том, для перенастройки генератора случайных чисел предназначен
оператор RANDOMIZE. Отсутствие функции TAN(X) объясняется
режимом экономии памяти. Бейсик-интерпретатор имеет еще одну
возможность для расширения памяти пользователя за счет отказа от
работы с программами вычисления стандартных функций. Отказ от
ATN, COS, SIN и SQR высвобождает порядка 500 байт. Дополни-
тельно можно исключить еще ЕХР(Х) и LOG(X).
Программная строка: начинается с номера строки, кото-
рый должен принадлежать диапазону [1, 8191]. В программной строке
допускается запись нескольких операторов, разделяемых двоеточием.
Командная строка: начинается со служебного слова —
директивы или оператора. Большинство выполняемых операторов до-
пускает непосредственное исполнение.
17.1.2. Специфика базовых операторов. Базовый набор включает
17 операторов —DATA, DEF, DIM, END, FOR, GOSUB, GOTO, IF,
INPUT, LET, NEXT, PRINT, READ, REM, RESTORE, RETURN,
STOP. В основном их форматы следуют общепринятым правилам.
Небольшие отклонения касаются следующих операторов.
D Е F: аргумент нестандартной функции только один.
END: может отсутствовать в программе.
I F: допускает модификации типа IF...GOTO и IF ...
THEN оператор. Арифметическое выражение после IF не должно
начинаться с переменной Т (I F Т1 <0 ...).
PRINT: зонная печать использует в строке 5 зон по 14 позиций.
17.1.3. Использование внешней функции. Внешняя функция,
составленная на ассемблере, может быть вызвана с помощью иденти-
фикатора EXF. Например:
100 LET Y = EXF(N, Х + 5)
Задача может обратиться к единственной внешней программе, однако
последняя может иметь несколько входов. И выбор того или иного
входа может осуществляться, в частности, по значению первого
аргумента. Число аргументов в обращении EXF не ограничено.
17.1.4. Набор директив. Набор директив бейсик-интерпретатора
так же скромен, как и состав входного языка. Их всего пять —
DELETE, LIST, OLD, RUN, SAVE. Первая используется для уда-
293
ления одной (DELETE 50) или нескольких (DELETE 50, 180) строк
исходной программы. По директиве LIST можно выдать на печать
всю программу (LIST), любую ее строку (LIST 40) или фрагмент
(LIST 40, 80). Директива OLD вызывает загрузку текста исходной
программы с перфоленты. По директиве SAVE текст текущей про-
граммы выдается на перфоленту.
СПИСОК ЛИТЕРАТУРЫ К РАЗДЕЛУ 17.1
1. Электронная вычислительная машина Электроника-60 15ВМ-16.
Бейсик. Программное обеспечение. 0.005.027 П02, 1978.
17.2. Электроника ДЗ-28
Электроника ДЗ-28 представляет собой настольную микроЭВМ
со встроенным кассетным магнитофоном и специальной клавиатурой,
используемой для работы на ДЗ-28 в режиме калькулятора или для
ввода в оперативную память команд в машинном формате с после-
дующим их исполнением. Так, например, производится начальная
загрузка бейсик-интерпретатора с магнитной ленты и его запуск.
Устройство управления магнитной лентой использует обычные
кассеты бытовых магнитофонов (тип кассет—МК60 или МК60-1).
На одной кассете размещается до 400 записей размером по 256 байт.
Скорость обмена с МЛ составляет 445 байт/с.
Процессор ЭВМ ДЗ-28 построен на микропрограммном управле-
нии, которое обеспечивает работу десятичной арифметики с быстро-
действием порядка 1000 сложений/вычитаний или 200 умножений/де-
лений в секунду. Время вычисления одного значения тригонометри-
ческой функции может достигать 0.06—0.12 с. Процессор укомплекто-
ван оперативным запоминающим устройством объемом 16 Кбайт или
32 Кбайт, в котором во время сеанса хранятся бейсик-интерпретатор,
исходная программа в сжатом формате и все рабочие поля, необхо-
димые для выполнения программы.
Для общения пользователя с ЭВМ предназначается отдельный
терминал, в качестве которого может выступать либо электрифици-
рованная пишущая машинка типа Консул-260.1, либо дисплей Элект-
роника. Дисплей позволяет отобразить на экране 25 строк по 80 сим-
волов в каждой строке. Одна из них (самая верхняя) пользователю
не доступна и предназначена для отображения служебной информа-
ции, включая показания таймера. Хотя аппаратура дисплея и по-
зволяет набирать на экране не только прописные, но и строчные
буквы, пользоваться этой возможностью при работе на бейсике нельзя.
Если мы попытаемся включить в тело оператора PRINT текстовую
константу со строчными буквами, то при выводе все они будут пере-
кодированы и заменены соответствующими эквивалентами прописных
294
букв. Изрядную долю путаницы в эту замену может внести исполь-
зование клавиш переключения регистров (РУС и ЛАТ).
-Описанный минимальный комплект (процессор + терминал) яв-
ляется наиболее распространенным, и на его базе чаще всего орга-
низуют учебные терминал-классы. Однако существует и много других
устройств, которыми может комплектоваться ЭВМ Электроника ДЗ-28.
Среди них — ленточный перфоратор типа ПЛ-150М, обеспечивающий
вывод информации на восьмидорожечную бумажную перфоленту со
скоростью 70—150строк/с, фотосчитывающие устройства типа СП-3 или
FS-1501, используемые для ввода данных с перфоленты со скоростью
порядка 1000—1500строк/с, термопечатающее устройство, позволяющее
выводить результаты на специальную бумагу со скоростью бОзн/с,
накопитель на гибких магнитных дисках, графопостроитель. В рам-
ках третьей редакции бейсик-интерпретатора из периферийных устройств
задействован только обмен с перфолентой и магнитной лентой.
Ниже излагаются основные сведения о составе и особенностях
входного языка, эксплуатируемого в указанной выше редакции
бейсик-интерпретатора на ЭВМ Электроника ДЗ-28. Для получения
более подробной информации рекомендуется обратиться к соответст-
вующим руководствам программиста, входящим в состав заводской
документации [1, 2].
17.2.1. Основные объекты.
Алфавит: латинские буквы (A—Z), цифры (0—9), знаки ариф-
метических операций (+, —, *, /, — возведение в степень), знаки
операций отношения (>, =, <), прочие символы (точка, двоеточие,
запятая, точка с запятой, апостроф, круглые скобки, пробел, #).
Константы: числовые константы содержат не более 12 знача-
щих цифр и принадлежат интервалу от 0.1*10“" до 10". Числовая
константа с обозначением # PI заменяет число л.
Текстовые константы представляют собой последовательность
любых символов (в том числе и русские буквы), за исключением
двоеточия. Текстовые константы заключаются в апострофы и могут
использоваться только в операторе PRINT.
Простые переменные: только арифметического типа.
Обозначения стандартные—А, АО, А1, ..., А9, В, ВО, ..., Z9.
Массивы: только арифметического типа. Обозначения нестан-
дартные— наряду с однобуквенными именами разрешается использо-
вать сочетания буквы с цифрой. Индексы отсчитываются от нуля.
Максимальное значение индексного выражения—255.
Математические функции: базовый набор включает 11
стандартных функций — ABS, ATN, COS, EXP, INT, LOG, RND,
SGN, SIN, SQR, TAN. Дополнительный набор состоит из 12 функ-
ций, список которых приведен в табл. 17.1.
Аргументы тригонометрических функций задаются в радианах.
Результат вычисления обратных тригонометрических функций полу-
295
Таблица 17.1
Обозначение Значение Обозначение Значение
ACS(X) АНС(Х) AHS(X) АНТ(Х) ASN(X) DEG(X) arccos х Arch х Arsh x Arth x arcsinx 180*х/л EXT(X) HCS(X) HSN(X) HTN(X) LGT(X) RAD(X) 10* chx sh x th x lg* л*х/180
чается также в радианах. Для перевода градусов в радианы и об-
ратного перевода используются соответственно функции RAD и DEG.
Функция RND употребляется только с аргументом. При ненуле-
вом аргументе функция RND выдает очередное случайное число из
диапазона (0, 1). При нулевом аргументе генератор случайных чисел
восстанавливается и выдает всегда одно и то же начальное число, с
которого начинается генерация псевдослучайной последовательности.
Программная строка: начинается с номера строки, кото-
рый должен принадлежать интервалу [1, 7999]. В программной строке
допускается запись нескольких операторов, разделяемых двоеточием.
Командная строка: начинается со служебного слова —
обозначения директивы или оператора. Большинство выполняемых
операторов допускает непосредственное исполнение. В частности, таким
путем можно отпечатать значения переменных, присвоить им новые
значения и продолжить счет после программного (STOP или END)
или аварийного останова.
17.2.2. Специфика базовых операторов. Базовый набор включает
18 операторов—DATA, DEF, DIM, END, FOR, GOSUB, GOTO, IF,
INPUT, LET, NEXT, ON, PRINT, READ, REM, RESTORE, RETURN,
STOP. Пробелы в обозначениях операторов недопустимы. В табл. 17,2
приведены форматы базовых операторов, отличающиеся от общепри-
нятых.
Ниже приводятся особенности использования базовых операторов,
которые из соображений удобства упорядочены в алфавитном порядке.
END: может отсутствовать.
FOR: при наличии несовместных параметров тело цикла обхо-
дится.
GOTO: переход по несуществующему номеру строки не считается
ошибкой. Счет продолжается с первого выполняемого оператора, рас-
положенного «ниже» указанной точки.
IF: проверка условия END F или END должна выполняться
вслед за операцией чтения (см. оператор LOAD).
296
Таблица 17.2
Оператор Формат Примечание
DEF IF INPUT LET ON PRINT DEF FNa(X) = e IF условие {goto} N IF условие THEN оператор IF END F THEN N IF END THEN N INPUT [’подсказка’;] Vi, v2, ... [LET] v = e ON e PRINT бь 62; ... PRINT I 04 1 6i, ... Только один аргумент Условный переход на стро- ку с номером N Условное выполнение опе- ратора Переход на строку с номе- ром N в случае считыва- ния признака конца файла Переход на строку N в случае обнаружения приз- нака конца ленты Текст подсказки выдается на терминал при выполне- нии оператора INPUT Целая часть е определяет адрес (номер строки) пере- хода Обычная печать Форматная печать
PRINT: выводная строка содержит пять зон по 20 позиций
для ЭПМ Консул и четыре зоны по 20 позиций для дисплея. Редак-
тирующий указатель ТАВ(е) перемещает пишущий узел в позицию с
номером е, если она расположена правее текущей позиции.
Форматные указатели обеспечивают следующие возможности при
выводе:
— печать числовых значений с фиксированной точкой
(PRINT I 8.4 ! X,Y);
— печать числовых значений с плавающей точкой
(PRINT I F2.6 ! X, Y).
Частным случаем формата с плавающей точкой является указа-
тель ! Е !, эквивалентный указателю ! F0.12 !. По умолчанию для
вывода используется формат ! F1.9 !.
17.2.3. Дополнительный набор операторов. Дополнительный набор
включает восемь операторов, список которых приведен в табл. 17.3.
Простые переменные и массивы могут быть размещены в одном
из двух участков памяти. По умолчанию простые переменные и мас-
сивы, объявленные с помощью оператора DIM, попадают на первый
участок памяти —внутреннее поле задачи. С удалением задачи из
памяти этот участок стирается. Второй участок памяти носит назва-
ние «общее поле». Сюда помещаются переменные и массивы, упомя-
297
Таблица 17.3
Оператор Формат Примечание
CALL CLEAR CMD COM LOAD REWIND SAVE SKIP CALL N CLEAR c CLEAR D CLEAR F CLEAR S CLEAR Ni, N2 CLEARP Nn N2 CMD XXXX [XXXX] COM vi, v2, ... LOAD ['имя файла'] [Nf, N2] DATA LOAD 'имя' DATA LOAD Vi, v2, ... REWIND SAVE SAVE Ni, N2 SAVE 'имя' [Ni, N2] SAVE END DATA SAVE OPEN 'имя' DATA SAVE eb e2, ... data save END SKIP n SKIP n F Обращение к внешней под- программе, загруженной в ОЗУ Очистка общей области па- мяти Очистка внутренних перемен- ных Сброс указателя вложен- ности циклов Сброс указателя вложен- ности подпрограмм Удаление фрагмента програм- мы от строки Ni до строки N2 включительно и перемотка МЛ в начало То же, без перемотки МЛ Исполнение команды, запи- санной в машинном формате Vi —имя простой переменной или имя массива с указанием границ, распределяемых в общей памяти Считывание исходной прог- раммы или ее фрагмента с магнитной ленты Перемотка МЛ в начало файла данных с указанным именем Считывание числовых данных из текущей записи Перемотка МЛ в начало Запись исходной программы из ОЗУ на МЛ в очередной файл (без имени) запись безымянного фрагмен- та исходной программы на МЛ Запись исходной программы или ее фрагмента в очередной файл с присвоением ему ука- занного имени Запись признака конца прог- раммного файла на МЛ Запись заголовка файла дан- ных Запись числовой информации в файл данных на МЛ Запись признака конца фай- ла данных на МЛ Пропуск п записей Пропуск и файлов
298
нутые в списке оператора СОМ. Общие переменные используются для
передачи данных из одной программы в другую.
17.2.4. Обмен с внешними устройствами. В качестве внешнего
носителя информации, на котором могут храниться тексты исходных
программ или числовые наборы данных, используется магнитная лента
(устройство с номером #0) или восьмидорожечная бумажная пер-
фолента (устройство с номером 1)-
Обмен с магнитной лентой организуется с помощью операторов
(директив) SAVE (SAVE 44=0) или LOAD (LOAD 4£0). При обмене
с перфолентой номер устройства указывается обязательно (SAVE 4Ф1,
LOAD # 1).
Программные файлы или файлы данных на внешнем носителе
снабжаются идентификаторами, которые записываются в начале файла.
При поиске по имени используются только первые шесть символов
идентификатора. Для того чтобы расшифровать содержимое неизве-
стной ленты, необходимо выполнить загрузку очередного файла (LOAD)
или установку в начало очередного файла данных (DATA LOAD OPEN).
После этого можно выдать на печать значение служебного поля
OPEN (PRINT OPEN). Так можно составить оглавление всех файлов,
записанных на ленте.
Загрузка очередной программы с внешнего носителя может быть
выполнена не только по директиве LOAD, но и по оператору LOAD.
Б этом случае надо учитывать следующие обстоятельства. Во-первых,
значения всех внутренних и общих переменных сохраняются. Во-вто-
рых, вновь вызываемые программные строки накладываются на
прежнюю программу, затирая старые строки с совпадающими номе-
рами. Наконец, управление передается не в начало загружаемой
программы, а на оператор, следующий за оператором LOAD. Воз-
можно, что на его месте окажется оператор из только что вызванной
программы.
Файлы числовых данных могут быть использованы в качестве
посредника при организации совместной работы нескольких программ.
В файл данных можно записывать значения любых арифметических
выражений (в частности, значения простых переменных или элементов
массива) и массива целиком. В последнем случае указывается имя
массива с пустыми скобками.
Например:
100 DATA SAVE X+Y*SIN(Z), В(5), С( )
СПИСОК ЛИТЕРАТУРЫ К РАЗДЕЛУ 17.2
1. Система подготовки программ 15 ИПГ. Бейсик-интерпретатор
(вариант 3). Руководство программиста. 1.419.001 Д23.
2. Система подготовки программ 15 ИПГ 16. Бейсик-интерпретатор
(вариант 3). Руководство программиста. И5М 1.419.001 Д23.
299
17.3. Диалоговые вычислительные комплексы (ДВК)
Название ДВК объединяет четыре конфигурации средств вычис-
лительной техники: ДВК-1, ДВК-2М, ДВК-3 и ДВК-4.
В научно-технической литературе можно встретить и несколько
иные названия этих комплексов. Поэтому для справки мы приводим
табл. 17.4 со старыми и новыми их наименованиями:
Таблица 17.4
Комплекс Старое наименование Новое наименование
ДВК-1 ДВК-2М двк-з Электроника МС 01100.1 (Электроника НЦ-80-20/1) Электроника НЦ-80-20/2М Электроника НЦ-80-20/3 Электроника МС 1501 Электроника МС 1501.02 Электроника МС 0502
Все они программно-совместимы с миниЭВМ СМ-3 и микроЭВМ
Электроника-60. Минимальный комплекс ДВК-1 включает процессор
с быстродействием порядка 500 тыс. оп/с, оперативную память ем-
костью 56 Кбайт и дисплей типа Электроника в качестве терминала.
В конфигурацию ДВК-2М дополнительно входят малогабаритное тер-
мопечатающее устройство и блок накопителей на гибких магнитных
дисках общей емкостью порядка 500 Кбайт. Исполнение ДВК-3 отли-
чается только типом алфавитно-цифрового печатающего устройства.
Наибольшим числом периферийных устройств комплектуется уста-
новка ДВК-4. В ее составе два терминала (черно-белый графический
и цветной алфавитно-цифровой дисплеи), графопостроитель, АЦПУ,
дисковый накопитель типа «Винчестер», гибкие магнитные диски.
На вычислительных установках типа ДВК обычно эксплуати-
руется‘операционная система с разделением функций ОС ДВК, кото-
рая является усеченным вариантом операционной системы Рафос
(RT-11) с мониторами SJ и FB. Первый обеспечивает диалоговое вы-
полнение одного задания, второй — одновременную обработку двух
заданий (диалог на фоне пакета).
Входной язык бейсик-интерпретатора на ДВК почти ничем не
отличается от соответствующих систем программирования, эксплуати-
руемых в составе операционных систем Рафос и ОС-РВ на СМ-3 и
СМ-4, только вместо символа ~] для операции возведения в степень
используется знак 'Х
СПИСОК ЛИТЕРАТУРЫ К РАЗДЕЛУ 17.3
1. Трояновский В. М., Шевченко А. Я., Лозовой И. О.
Операционная система для диалоговых вычислительных комплек-
сов.—1982.—39с. Информ, бюл. ВНТИЦ «Алгоритмы и программы»,
вып. 3(66).— 1985. Per. ном. Гос ФАП — П008141,
300
2. ДВК «Электроника НМС 011.00.1—05». Программное обеспече-
ние ДВК. Операционная система с разделением функций ОС ДВК.
Бейсик. Описание языка. У 1.20001-01 35 03.— 1982.
17.4. МикроЭВМ Искра-226
Выпускается с 1981 г. Базовый комплект включает процессор
с управляющей памятью (16 Кбайт—постоянная и 64 Кбайт—загру-
жаемая управляющая память), ОЗУ емкостью 128 Кбайт, экранный
дисплей со световым пером, выносную клавиатуру и встроенный на-
копитель на кассетной магнитной ленте. В текстовом режиме на экране
воспроизводятся 24 строки по 80 символов, в графическом режиме
рабочее поле дисплея представлено растром 256x560 точек. В более
поздних моделях растр содержит 256x512 точек. Объем одной кас-
сеты НМЛ — порядка 80 Кбайт, скорость обмена—200 байт/с.
Среди дополнительных внешних устройств, разработанных для
Искры-226, спаренный накопитель на гибких магнитных дисках (ем-
кость одного пакета — 256 Кбайт), накопитель на жестких магнитных
дисках на базе Изот-1370 — один постоянный и один съемный пакет по
2.4 Мбайт каждый, АЦПУ типа DZM-180, графопостроитель Н-306 с ра-
бочим полем 200Х.300 мм, планшет для ввода графической информации.
Микропрограммное управление обеспечивает выполнение арифме-
тических операций над 13-разрядными десятичными числами со ско-
ростью порядка 1000 оп/с.
В 1985 г. коллектив разработчиков ЭВМ Искра-226 и ее математи-
ческого обеспечения удостоен Государственной премии СССР. Работы
по совершенствованию программного обеспечения Искры-226 продол-
жаются, и с конца 1984 г. в составе ЭВМ поставляется интерпрета-
тор бейсик-2, входной язык которого излагается в настоящем разделе.
17.4.1. Основные объекты.
Алфавит: латинские буквы (А — Z), русские буквы (А—Я),
цифры (0—9), знаки арифметических операций (+, —, *, /, л—возве-
дение в степень), знаки операций отношения (>, =, <), прочие сим-
волы (двойные кавычки, апостроф, двоеточие, запятая, точка с запя-
той, круглые скобки, подчерк, I, ?, zft, Q, %, &, [, ], X, @)«
Константы: целого типа (1%,—5%), не превосходящие по мо-
дулю 7999. Вещественные константы — из диапазона от 10“" до 10+".
Максимальное количество значащих цифр—13. К вещественным отно-
сится константа 4£:Р1.
Текстовые константы заключаются в двойные кавычки или апо-
строфы. В последнем случае алфавитные символы в памяти ЭВМ пред-
ставлены кодами соответствующих строчных букв. Внутри кавычек
одного типа могут находиться кавычки другого типа. Максимальная
длина текстовой константы —253 символа. К текстовым относятся
шестнадцатеричные константы вида HEX (aia2...), где а/—шестнад-
цатеричные цифры.
301
Простые переменные: трех типов—текстовые, арифмети-
ческие целые и вещественные. Обозначения — стандартные: к именам
переменных целого типа добавляется символ %, к именам переменных
текстового типа —символ Q. Стандартная длина текстовой перемен-
ной—16 байт, по желанию пользователя можно установить длину
ат 1 до 253 байт.
Массивы: одномерные и двумерные всех трех типов. В преде-
лах текстового массива длина всех элементов одинаковая. По, умол-
чанию она равна L6, по объявлению —от 1 до 253 байт. Индексы
отсчитываются от единицы. Общее количество элементов в массиве не
должно превышать 7999 (в более поздних версиях — не более 9999).
Математические функции: включают базовый набор из
11 стандартных функций—ABS, ARCTAN, COS, EXP, INT, LOG,
RND, SGN, SIN, SQR, TAN.
Аргументы тригонометрических функций и результаты вычисле-
ния обратных тригонометрических функций измеряются в радианах,
градусах или градах в зависимости от программно устанавливаемого
режима (см. оператор SELECT). Град—довольно редко используемая
единица измерения плоских углов, равная одной сотой доле прямого
угла; для нее в математической литературе используется специальное
обозначение 1£=0.9° « 0.0157 рад.
Функция RND употребляется с аргументом. Если аргумент равен
нулю, то генератор случайных чисел начинает выдачу с одного и того
же числа.
К базовому набору добавлены две обратные тригонометрические
функции — ARCSIN (X) и ARCCOS(X), а также функция округления—
Таблица 17.5
Обращение Результат
LEN(vQ) NUM(vQ) POS(vQ-S) STR(vQ, n[, ID VAL(psQ}) Длина значения текстового выражения Количество цифровых символов в текстовом выражении (наряду с цифрами считаются символы точка, знаки ±, буква Е и про- белы) Поиск номера позиции в текстовом выраже- нии vQ, где находится символ, удовлетво- ряющий заданному условию (~ обозначает знак операции отношения) Выделение подстроки длиной 1 символов, на- чиная с n-й позиции в значении текстового выражения vQ. Если 1 не задано, то под- строка выделяется до конца vQ Преобразование первого символа в числовой код
302
ROUND(X, N). При положительном значении N функция ROUND
округляет аргумент X до N-й цифры в дробной части, при отрица-
тельном N—до N-й цифры в целой части.
Функции для обработки символьных строк (табл. 17.5).
Программная строка. Начинается с номера строки, при-
надлежащего диапазону [1, 7999] (в более поздних версиях—до 9999).
Вслед за номером может располагаться несколько операторов, разде-
ляемых двоеточием.
Таблица 17.6
Оператор Формат Примечание
DEF DIM GOSUB INPUT LET ON RESTORE RETURN STOP DEF FNa(Xb ...) = e DEF FN'k DEF FN'k (af, a2, ...» an) DEF FN'k"TeKCT* DIM A(15), BQ(2, 5)30, GOSUB 100 GOSUB'k GOSUB'k (bi, bft, ..., bn) ЖРиТ"подсказка", A,BQ,... [LET] vi, v2 vn = e ON e GOTO Ni, N2,...,Nk ON e GOSUB Nb N2 Nk ON ERROR AQ, BQ GOTO N RESTORE RESTORE n RETURN RETURN CLEAR STOP ["произв. текст"] a — буква или цифра Заголовок подпрограм- мы-функции без пара- метров Заголовок подпрограм- мы-функции с парамет- рами к (0^к^255) Закрепление текста за функциональной клави- шей с номером к (0 «С =Ск<31) Указание длины элемен- тов текстового массива и одиночных текстовых переменных Обращение к подпрог- рамме Обращение к подпрог- рамме-функции с име- нем FN'k Переключатель строк Переключатель подпрог- рамм Указатель входа в под- программу обработки ошибок Установка указателя бло- ка данных в начальное положение Установка указателя бло- ка данных на n-й элемент Выход из подпрограммы Стирание адреса в стеке возвратов
303
17.4.2. Специфика базовых операторов. Входной язык бейсик-
искра включает 18 операторов базового набора — DATA, DEF, DIM,
END, FOR, GOSUB, GOTO, IF, INPUT, LET, NEXT, ON, PRINT,
READ, REM, RESTORE, RETURN, STOP. В табл. 17.6 приведены
форматы базовых операторов, отличающиеся от общепринятых.
Ниже описываются некоторые особенности использования базо-
вых операторов.
DATA: в списке значений могут встретиться данные разных ти-
пов. Например:
10 DATA 1%, — 2.8,#PI, 'BASIC', "ИСКРА-226", НЕХ(1А)
D Е F: наряду с однострочными нестандартными функциями
имеется возможность описывать многострочные подпрограммы-функции
без параметров (бейсик-1) или с параметрами (бейсик-2). Например:
1000 REM ВЫЧИСЛЕНИЕ М = К 1
1005 DEF FN'80
1010 LET М=1
1020 FOR J = 1 ТО К : M=M*J : NEXT К
1030 RETURN
Для обращения к такой подпрограмме используется оператор GOSUB'80.
Если номер подпрограммы-функции к принадлежит диапазону [0, 31],
то ее можно исполнить с пульта путем нажатия функциональной кла-
виши с номером к. Выполнение оператора RETURN в этом случае
возвращает управление пользователю.
Вторая функция оператора DEF состоит в закреплении текста
за той или иной функциональной клавишей. Например:
10 DEF FN'5 "FOR J = 1 ТО 100"
После этой операции текст FOR J=1 ТО 100 появляется в наборной
строке в результате нажатия клавиши ФК5.
DIM: кроме массивов в списке могут присутствовать простые
переменные текстового типа, для которых объявляется нестандартная
длина.
END: может отсутствовать.
ON: кроме стандартных функций по организации программных
переключателей оператор ON используется для включения собственной
программы обработки ошибок. В этом случае (ON ERROR) задаются
две текстовые переменные, например AQ и BQ, и точка входа в про-
грамму обработки. При возникновении ошибочной ситуации в перемен-
ную AQ заносится код ошибки, а в переменную BQ-— номер строки
с ошибочным оператором.
PRINT: при организации зонной печати используются пять зон
по 16 позиций.
R Е Т U R N: наряду со стандартным действием используется для
очистки стека возвратов модификация RETURN CLEAR. Эта процедура
может оказаться полезной при обработке ошибок. Когда в подпро-
304
грамме возникла ошибочная ситуация, а мы не собираемся в нее воз-
вращаться, то стек возвратов надо очистить. В противном случае
цепочка возвратов может пойти по непредсказуемому пути.
17.4.3. Форматная печать. Вывод числовой информации по фор-
мату, устанавливаемому пользователем, производится с помощью опе-
ратора PRINT USING. Первым элементом в списке этого оператора
является ссылка на формат печати. Например:
100 PRINT USING 205, G, М, D
105 PRINT USING 210, X, Y
205 % ГОД ==#### МЕСЯЦ = ## ЧИСЛО = ##
210 % ###•#
Управление печатью знака числа или символа денежной единицы
осуществляется по первой позиции числового шаблона, в которой
необходимо задать +, — или Q.
По числовому формату может быть отпечатано и значение тексто-
вой переменной. При этом роль играет только количество позиций
в формате, каждая из которых замещается очередным символом текста.
17.4.4. Дополнительные операторы ввода-вывода. Входной язык
системы бейсик-искра включает четыре дополнительных оператора,
используемых при обмене с терминалом. Оператор LINPUT vQ обес-
печивает ввод символьной строки, набираемой пользователем в момент
предоставления ему инициативы. Оператор KEYIN позволяет ввести
код одного символа, соответствующего клавише, нажатой пользовате-
лем во время выполнения программы. Например:
100 KEYIN BQ,200,250
Здесь первый аргумент используется для запоминания кода (символа)
той клавиши, которую пользователь нажал по собственной инициа-
тиве. Если это был обычный символ алфавита, то после считывания
символа управление передается на строку с номером 200. Если была
нажата функциональная клавиша, то ее код запоминается в первом
байте переменной BQ, и управление передается на строку с номе-
ром 250. Если к моменту выполнения 100-го оператора пользователем
не была нажата какая-либо клавиша, то выполняется оператор, сле-
дующий за KEYIN.
Оператор HEXPRINT используется для вывода содержимого
текстовых переменных или массивов в шестнадцатеричном формате.
Например:
20 HEXPRINT AQ; BQ, CQ
Содержимое переменной BQ печатается через один пробел вслед за
последним байтом переменной AQ. Значение CQ выдается с начала
следующей строки.
305
Оператор PRINT AT(ei, e2, e3) позволяет установить курсор в за-
данную позицию (ei —номер строки, е2 — номер позиции в строке)
и стереть справа от нее указанное (е3) число символов.
17.4.5. Операции над битовыми шкалами. Список операторов,
используемых для работы с битовыми шкалами, приведен в табл. 17.7.
Большинство из них имеет по два операнда, и результат выполнения
Т а б л и ц а 17.7
Оператор Формат оператора Выполняемая функция
ADD ADDC AND BOOL INIT OR ROTATE XOR ADD(’o{S}) AODC (v,d. {*£}) А№ И’ {S}) BOOL Y (,,D. {XX}) INIT({XSX})V»0’V0)>- 0R {Si) ROTATE (viQ, n) X°R (v.O. {?£}) Сложение с блокировкой переносов между байтами Сложение двоичных кодов Логическое умножение Универсальная логическая операция. Результат зави- сит от кода операции Y Роспись всех байтов тексто- вых переменных или масси- вов заданным кодом Логическое сложение Циклический побайтовый сдвиг влево на п разрядов Исключающее ИЛИ
операции помещается на место первого операнда. В качестве первого
операнда обычно выступает идентификатор текстовой переменной, вто-
рой операнд может быть представлен либо текстовой переменной,
либо однобайтовой шестнадцатеричной константой. Детали выполне-
ния битовых операций подробно рассмотрены в разд. 10.2.
17.4.6. Преобразования числовых и символьных данных. Число-
вые данные в Искре-226 представлены двумя машинными форматами.
Целые числа занимают в памяти два байта, в которых один двоичный
разряд отведен под знак числа, а остальные используются для хра-
нения двоично-десятичных цифр. Так как для старшей цифры остается
всего три бита, то максимальное по модулю целое число равно 7999.
Вещественное число во внутреннем представлении занимает восемь
байтов. В семи из них хранятся 13 двоично-десятичных значащих цифр
мантиссы. Последний незанятый полубайт отведен под знаки числа и
порядка, а сам порядок в двоично-десятичном коде занимает вось-
мой байт.
306
Программное преобразование числовых данных из машинного фор-
мата в символьное представление и обратное преобразование выпол-
няются с помощью оператора CONVERT:
CONVERT е ТО vQ (формат)
CONVERT vQ ТО v
Форматный указатель для преобразования целых чисел имеет вид
+####, а для вещественных---------Количество
цифровых позиций в целой и дробной части определяется пользова-
телем.
Результат преобразования в символьный вид может быть напеча-
тан с помощью обычного, оператора PRINT.
Еще один вид форматного преобразования числовых данных свя-
зан с так называемой упаковкой-распаковкой. Упакованный формат
числа использует один байт памяти для хранения двух двоично-деся-
тичных цифр. Знак числа в упакованном формате занимает полубайт
в отдельном байте. Для числа в форме с плавающей запятой в этом
же байте хранится и знак порядка. Порядок числа с плавающей за-
пятой в упакованном формате занимает один байт. Позиция точки
в мантиссе упакованного числа специально не выделяется, она при-
сутствует только в форматном указателе. Перевод числовых данных
в упакованный формат осуществляется с помощью оператора РАСК:
РАСК (формат) FROM Л1(Ч, . ...
(vQOJ \ei f (e2 J
здесь формат следующий: (+)[##...#][•][##.. .#][ЛЛЛЛ]
vQ>vQ() — имя текстовой переменной или указатель текстового
массива, в который заносятся результаты преобразования числовых
данных в упакованном формате:
Vi(), ej — числовые значения (элементы числовых массивов или
выражения), подлежащие преобразованию.
Обратное преобразование выполняется с помощью оператора
UNPACK:
UNPACK (формат) /V£l Л то IV\ А» •••
(vQOJ (ViOf (Va() f
Естественно, что формат распаковки должен совпадать с форматом
упаковки.
Несколько более общие функции выполняют операторы QPACK
и QUNPACK, которые используются для формирования выводной
строки или распаковки принятого сообщения. В сочетании с опера-
торами ввода/вывода на физическом уровне (QGIO' и QGIO) эти
операторы могут быть использованы для построения программ обмена
с нестандартными внешними устройствами.
В состав операторов версии бейсик-2 включен оператор переко-
дировки символьной информации, который позволяет устранить зави-
807
симость от системы кодировки текстовых данных. Этот оператор до-
пускает два формата:
QTRAN (TQ(), S0()) [маска]
QTRAN (TQ(), RQ()) [маска] R
Указатель TQ() определяет перекодируемый текст. В первом случае
преобразование осуществляется с помощью словаря SQ( ). Пусть
oq — цифровой код i-ro символа Tj в перекодируемом тексте. Тогда
из словаря SQ выбирается (а^+1)-й байт, которым и заменяется
символ Tj. Если в операторе задана однобайтовая маска, то на нее
логически умножается код aj, а по результату производится вы-
борка байта из с^бваря. Модификация QTRAN...R отличается спосо-
бом замены. По коду cq символа Tj находится байт с идентичным
содержанием в векторе-подстановке RQ. Допустим, что этот байт рас-
положен на j-м месте в массиве RQ. Тогда в качестве байта замены
для Т1 выбирается содержимое (j—1)-го байта вектора RQ.
К числу операторов, корректирующих содержимое текстовых дан-
ных, относятся операторы BIN и REPLACE. Первый из них заме-
няет начальный символ в значении текстовой переменной по цифро-
вому коду арифметического выражения:
100 BIN (BQ) =124
Второй оператор обеспечивает контекстную замену в цепочке сим-
волов:
10'5 REPLACE A,CQ, "что", "на что"
Первый аргумент в этом примере соответствует счетчику замен, т. е.
количеству контекстов "что", обнаруженных в значении [переменной
CQ. Если такой контекст встречается, то его заменяют набором сим-
волов "на что". Набор заменяющих символов в операторе REPLACE
может отсутствовать, и тогда найденный контекст из исходного зна-
чения просто удаляется.
17.4.7. Управление распределением памяти. Простые переменные
и массивы могут быть распределены как во внутренней памяти зада-
чи, очищаемой после завершения обработки, так и в общей памяти,
сохраняемой от задачи к задаче. Перенос в общую память может быть
осуществлен явно путем указания имени переменной или специфика-
ции массива в списке оператора СОМ. Например:
5 COM А, В(20), CQ(10,4), DQ80
Оператор СОМ должен предшествовать операторам DIM и другим
операторам, в теле которых фигурируют переменные из общей памяти.
Неявное отнесение к общей области может быть осуществлено за счет
перевода группы переменных во внутреннюю память задачи. На-
308
Пример:
5 DIM А(20)
10 Х = А(1) : Y = A(2)4-B
6 COM CLEAR В
Оператор COM CLEAR предписывает перевести во внутреннюю па-
мять [переменную В и все переменные, которые встретились в про-
грамме после В. Напомним, что интерпретатор выделяет память под
переменные в том порядке, как они встречаются во вводимой про-
грамме. В нашем примере—массив А, переменные X, У, В, ... .
Заявив, что все переменные, начиная с В, находится во внутренней
Памяти, мы тем самым неявно отнесли все предшествующие перемен-
ные к общей памяти.
Для очистки полей внутренней и общей памяти используется одна
из модификаций директивы:
CLEAR — очистка программы и всех переменных;
CLEAR V—очистка внутренних и общих переменных с сохране-
нием текста исходной программы;
CLEAR N —очистка внутренних переменных;
CLEAR Р [Ni][,][N2]-—очистка программы или ее фрагмента
с сохранением значений переменных.
17.4.8. Матричные операторы. В состав входного языка бейсик-
искра включены 14 матричных операторов, список которых приведен
В табл. 17.8.
В отдельную группу матричных процедур выделены операто-
ры сортировки (табл. 17.9). Технология их употребления описана
В разд. 7.3.
17.4.9. Установка режимов работы и назначение внешних
устройств. Для этих целей используется одна из модификаций опе-
ратора SELECT, форматы которых приведены в табл. 17.10.1
Список логических устройств, к которым неявно обращается про-
грамма пользователя, приведен в табл. 17.11.
Каждому внешнему устройству, входящему в комплект ЭВМ,
приписан двузначный физический номер. Список этих номеров можно
найти в техническом описании машины. Оператор SELECT позволяет
подключить то или иное программное (логическое) устройство к нуж-
ному физическому. Зачем это делается? Во-первых, в комплекте ЭВМ
может оказаться несколько однотипных внешних устройств (например,
два гибких диска) и пользователь имеет возможность выбрать одно
из них. Во-вторых, несколько разных физических устройств могут
быть использованы для вывода одного и того же набора данных (на-
пример, графопостроитель и дисплей в графическом режиме). В-тре-
тьих, одно и то же устройство может выполнять несколько разных
функций (например, графический и текстовой режимы для дисплея).
809
Таблица 17.8
Формат оператора НР ЯР ТМ Выполняемая операция
МАТ А = В МАТ А = В+С МАТ А = В —С МАТ А = В*С МАТ А = (е)*С +++++ Копирование массива Сложение массивов Вычитание массивов Умножение матриц Умножение массива на скаляр
MAT A=INV(B), v MAT A=TRN(B) + + Обращение матрицы и вычисление определи- теля Транспонирование мат- рицы
MAT A = CON MAT A=IDN MAT A = ZER MAT INPUT А, М?Т READ А, BQ,- + + + + + + + Роспись массива едини- цами Формирование единич- ной матрицы Роспись массива нуля- ми Ввод элементов масси- ва с терминала Выборка элементов мас- сива из блока данных
MAT PRINT А; BQ, ... + Печать элементов мас- сива
MAT REDIM А (...), во (...), ... + + Переопределение раз- мерности массива
Примечания: HP — возможность неявного переопределения размерности результирующего массива; ЯР — возможность явного переопределения размерности результирующего массива. Для тек- стовых массивов может быть изменена и длина элементов; ТМ— возможность использования текстовых массивов в качестве опе- рандов.
Использование оператора SELECT упрощает формат других операто-
ров обмена, в которых иначе пришлось бы указывать дополнительный
параметр ^физический номер внешнего устройства.
310
Таблица 17.9
Формат оператора Выполняемая функция
MAT CONVERT А() ТО BQ() MAT COPY [—1 AQ(1) ТО [—1 BQ(J) MAT MERGE A0() TO RO), RO). L0() MAT MOVE BQ(), LQ(I) TO AQ() MAT SEARCH BQ(), ®{«P} TO LQ() [STEP n] MAT SORT AQO-TO RO). IO) Преобразование числового массива в текстовый Копирование массива или его фрагмента Построение массива-локатора для процедуры типа «слия- ние» Упорядоченная перепись эле- ментов массива Выделение байтов массива BQ, удовлетворяющих за- данному условию ((g) — знак операции отношения) Построение массива-локатора для процедуры типа порти- ровка»
Примечания: RiQ — рабочий массив с однобайтовыми элементами; R2Q— рабочий массив с двухбайтовыми элементами; LQ—массив-локатор.
17.4.10. Управление внешними устройствами.
Работа с дисплеем. Дисплей может быть использован для отобра-
жения алфавитно-цифровой и графической информации, хранящейся
в разных буферных запоминающих устройствах. Запись в алфавитно-
цифровой буфер выполняется по оператору PRINT /05... или по
Таблица 17.10
Формат оператора Выполняемая функция
SELECT D SELECT R SELECT G SELECT Pn SELECT лог. имя физ. номер [(длина строки)] Выбор градусов в качестве единицы изме- рения угловых величин Выбор радианов Выбор градов Установка величины задержки Дт (Дт=у = п/6 с) между выполнением двух после- довательных операторов PRINT Назначение устройства с заданным физи- ческим номером для выполнения функции устройства с указанным логическим именем
811
Таблица 17.11
Обозначение Назначение логического устройства
CI со DISK INPUT LIST PLOT PRINT TAPE Устройство ввода программы и директив Устройство вывода системных сообщений Накопитель на магнитном диске Устройство ввода данных по запросу программы Устройство для печати текста программы Устройство для вывода графиков Устройство для печати результатов счета Накопитель на магнитной ленте
обычному оператору PRINT, если действует назначение (SELECT
PRINT/05). В символьном режиме мы можем записывать в буфер
любые знаки алфавита по адресу, отмеченному позицией курсора, и
производить дополнительные управляющие воздействия, включая в со-
став выводимого текста специальные коды. Перечень этих кодов при-
веден в табл. 17.12, а в теле оператора PRINT они записываются
в виде шестнадцатеричных констант (HEX).
Запись в графический буфер выполняется по оператору PRINT/10
или по обычному оператору PRINT, если предварительно было вы-
полнено назначение SELECT PRINT/10. В графическом режиме мы
можем управлять перемещениями светового луча с указанием направ-
Таблица 17.12
Код Дисплейная функция
01 03 05 06 07 08 09 0А ОС 0D 11 Возврат курсора в левый верхний угол (начало) Возврат курсора в начало с очисткой экрана Засветка ранее погашенного курсора Гашение курсора Выдача звукового сигнала Сдвиг курсора влево на одну позицию (*-) Сдвиг курсора вправо на одну позицию (->) Сдвиг курсора вниз на одну позицию ( 4 ) Сдвиг курсора вверх на одну позицию ( f ) Возврат курсора в начало строки Установка нормального режима отображения (белые сим- волы на черном фоне)
12 Установка режима отображения в обратном контрасте (чер- ные символы на белом фоне)
85 Перевод курсора в начало следующей строки
312
ления и величины сдвига от текущего положения. Перемещение луча
может производиться как с фиксацией траектории движения (с зас-
веткой), так и без засветки. Коды и форматы графических команд
приведены в табл. 17.13. Большинство из них может быть использо-
вано и при работе с графопостроителем.
Таблица 17.13
Код Формат команды Выполняемая функция
01 02 03 04 05 06 07 08 09 0А ОВ ОС 0D 0Е 0F PRINT НЕХ(01) PRINT НЕХ(02), Дх, Ду PRINT НЕХ(ОЗ), Дх, Ду PRINT НЕХ(04), Дх, Ду PRINT НЕХ(05), Дх, Ду PRINT НЕХ(06) PRINT НЕХ(07) PRINT НЕХ(08), Дх PRINT НЕХ(09), Дх PRINT НЕХ(ОА), Ду PRINT НЕХ(0В) PRINT НЕХ(ОС), Ду PRINT HEX(OD) PRINT НЕХ(ОЕ) PRINT HEX(OF) Возврат графического курсора в левый нижний угол (начало) Сдвиг на величину — Дх, —Ду » » +Дх, —Ду » » —Дх, +Ду » » +Дх, -|-Ду Включение засветки Отключение засветки Сдвиг на величину —Дх » » +Дх » » —Ду Сохранение информации Сдвиг на величину +Ду Очистка экрана и возврат кур- сора в начало Блокировка отображения гра- фики на экране Отмена блокировки
В графических командах значения смещений Дх и Ду задаются
в дискретах экрана (0 Ах «С 559), (0 Ду «с 255). Перевод дисплея
в режим графического вывода можно выполнить, например, следую-
щим образом:
100 SELECT PRINT 10 : PRINT HEX(0D0F06)
При этом будет почищен экран, отменена блокировка вывода графи-
ческой информации и включена засветка. Обратный переход к работе
с алфавитно-цифровой информацией производится с помощью опера-
торов:
200 SELECT PRINT 05 : PRINT НЕХ(03)
Последний оператор сотрет изображение на экране и возвратит мар-
кер в левый верхний угол.
Работа с магнитной лентой. Магнитная лента используется как
архив программ и данных. Запись программы или ее фрагмента на
ленту осуществляется по директиве SAVE или SAVEP;
SAVE "имя" [Nlt NJ
313
По модификации SAVEP программа записывается в защищенном фор-
мате. Ее можно затем загрузить и выполнить, но нельзя распечатать
или откорректировать. Имя программы — последовательность от одного
до восьми символов.
Считывание программы с МЛ производится по директиве LOAD
["имя"]. Если имя не задано, то с ленты загружается очередной про-
граммный файл. Надо не забывать, что загрузка программы без сти-
рания предыдущей (CLEAR или CLEAR Р) приводит к слиянию но-
вой и старой программы.
Для обмена данными можно пользоваться логическими записями
или физическими записями-блоками. Логическая запись соответствует
порции данных, которую программа считывает в свои переменные
или записывает на ленту. Логические записи могут иметь разную
длину. Физические блоки —это порции данных равной длины, соот-
ветствующие участкам МЛ с непрерывно записанной информацией.
Если набор данных на ленте не существует, то для его создания
необходимо сформировать заголовок и открыть набор:
DATA SAVE OPEN "имя"
Для подвода ленты в начало существующего набора используется сле-
дующий оператор:
DATA LOAD "имя*
Обмен информацией с использованием логических записей произво-
дится с помощью операторов DATA LOAD (чтение) и DATA SAVE
(запись). В теле оператора DATA LOAD могут фигурировать отдель-
ные переменные или указатели массивов. Например:
НО DATA LOAD А, В(5), С(), DQ, EQ()
В списке оператора DATA SAVE наряду с именами переменных
и указателями массивов могут фигурировать арифметические и тек-
стовые выражения. Записав последнюю порцию данных на МЛ, мы
должны сформировать на ленте признак конца файла. Выполняется
эта процедура с помощью оператора DATA SAVE END. Во время
считывания информации из существующего набора данных мы можем
изменить содержимое очередной записи с помощью оператора DATA
RESAVE. Оператор DATA RESAVE позволяет изменить заголовок
существующего набора данных и даже уменьшить его длину, записав
новый признак конца в середину набора (DATA RESAVE END).
Обмен с физическими блоками осуществляется с помощью опера-
торов DATA LOAD ВТ и DATA SAVE ВТ. При этом в качестве опе-
ранда можно задавать только текстовый массив соответствующей
длины (256 байт).
Список дополнительных операторов управления лентой приведен
в табл, 17.14,
314
Таблица 17.14
Формат оператора Выполняемое действие
BACKSPACE пВ BACKSPACE nF BACKSPACE BEG REWIND SKIP nB SKIP nF Возврат назад на п физических блоков Возврат назад на п файлов Возврат в начало текущего файла Перемотка ленты в начало Пропуск п блоков (движение вперед) Пропуск п файлов (движение вперед)
Анализ признака конца данных в файле производится с помощью
оператора IF END THEN ....
Управление дисками. ЭВМ Искра-226 комплектуется магнитными
дисками двух типов—жесткими НМД с двумя дисками (съемным—R
и фиксированным—F) и гибкими НМД. За каждым дисководом за-
крепляется уникальный физический номер, который можно указывать
в командах обмена. Однако на разных установках может эксплуати-
роваться различное количество дисководов. Поэтому вместо физических
номеров устройств обычно пользуются логическими номерами — =(М>
#2, ..., #6. Привязка логических номеров к конкретным устрой-
ствам выполняется по директиве (оператору) SELECT. Большинство
программ, использующих в своей работе единственное дисковое устрой-
ство, может вообще не задавать никакого номера. Для этого вводится
понятие «текущего» диска (Т), назначение кбторого осуществляется
с помощью директивы (оператора) SELECT DISK.
Работа с дисковыми накопителями требует знания большого коли-
чества деталей, включая структуру информации в оглавлении и диско-
вых файлах, способы адресации и т. п. За этими деталями мы отсы-
лаем пользователя к соответствующим руководствам. Ниже приводятся
основные сведения, позволяющие понять механизм общения с диско-
вой памятью.
Рабочая поверхность диска делится на физические блоки-секторы
емкостью по 256 байт. Дисковая память условно разделяется на три
области — оглавление файлов, область файлов и свободную область.
Распределение места на дисковом пакете и начальная очистка выде-
ляемых областей производятся по директиве SCRATCH:
SCRATCH DISK
номер j *
[LS = ns,] [END = адрес]
Первый параметр здесь определяет физический или логический номер
устройства и его тип, второй (LS) отводит необходимое число секто-
315
ров под оглавление, третий (END) определяет конечный адрес области
файлов. Значение этого параметра в последующем можно изменить
с помощью директивы MOVE END.
По типу данных, хранящихся на диске, различают программные
файлы и файлы данных. Запись программного файла выполняется
с помощью директивы SAVE DC, в которой могут быть заданы спе-
цификация диска (тип, номер), имя прежней программы, на место
которой записывается текст текущей программы или ее фрагмент,
новое регистрационное имя, указание о защите. Выборка программного
файла с диска осуществляется по директиве LOAD DC с указанием
имени загружаемой программы и, если это необходимо, границ ее
фрагмента.
Для доступа к файлам данных используются три способа адреса-
ции— последовательный форматный обмен (DATA SAVE DC и DATA
LOAD DC), форматный обмен с указанием номера записи в файле
(DATA SAVE DA и DATA LOAD DA) и обмен неформатизованными
записями с указанием физических блоков (DATA SAVE ВА и DATA
LOAD ВА). При форматизованной записи на диск числовые данные
из машинного представления преобразуются в символьный вид подобно
тому, как это происходит при выполнении оператора PRINT. Чтение
форматизованных данных сопровождается обратным преобразованием
числовой информации. Все это связано с дополнительными наклад-
ными расходами (время, увеличение объема информации). Неформати-
зованные данные записываются или читаются без каких-либо преобра-
зований. Поэтому то, что записано по оператору DATA SAVE В А,
можно прочитать только по оператору DATA LOAD В А.
Начало работы с дисковым файлом последовательного доступа
связано с выполнением некоторых операций по настройке соответствую-
щих системных указателей. Выполняется эта процедура по оператору
DATA LOAD DC ... OPEN.
Далее с открытым файлом выполняют соответствующие операции
чтения или записи. Перед закрытием выводного файла обычно произ-
водят запись признака конца файла (DATA SAVE DC ... END).
Закрывается файл данных по директиве DATA SAVE DC ... CLOSE.
Смысл других операторов (директив), связанных с обслуживанием
дисков, отображен в табл. 17.15. Для краткости в списке параметров
операторов опущена спецификация файлов.
17.14.11. Средства машинной графики. Возможности программного
обеспечения Искры-226 по формированию и отображению графических
объектов (ГО) подробно описаны в разд. 8.3. Полный набор графи-
ческих операторов приведен в табл. 17.16—17.19.
17.4.12. Набор директив. Кроме директивы CLEAR, используемой
для очистки различных полей оперативной памяти, командный язык
интерпретатора бейсик-2 включает восемь управляющих процедур
(табл. 17.20).
316
Таблица 17.15
Оператор Параметры Примечание
COPY DBACKSPACE DSKIP LIMITS LIST DC MOVE VERIFY ...RF(aApb адр2) ...FR(aApi, адра) ...BEG .. .n .. .nS ...END .. .n ...nS ...["имя*,] Vi, Va> v3 END.. i = адрес ...FR ...RF ...[(адресу адреса)] Копирование сменного диска на постоянный Копирование постоянного диска на сменный Возврат в начало файла Возврат на п логических записей Возврат на п физических секторов Пропуск до конца файла Пропуск п логических за- писей Пропуск п физических сек- торов Опрос параметров файла: У1‘.=нач. адрес файла, v2: = конечный адрес файла, v3: = число секторов в файле Вывод на терминал или АЦПУ справочной информа- ции из оглавления диска Изменение конечного адре- са области файлов Перепись оглавления фикси- рованного диска на сменный Перепись оглавления смен- ного диска на фиксирован- ный Контроль правильности ин- формации на диске
Таблица 17.16
Общие установочные процедуры
Формат оператора Выполняемая функция
FRAME Xjnig, Xmax, Ymin, Yroax WINDOW Xmjn, Xraax, Упйп> Ушах Установка границ изменения координат точек графических объектов в программе пользо- вателя Установка границ окна вывода
317
Таблица 17.17
Операторы формирования ГО
Формат оператора Выполняемая функция
QOPEN [,]V1Q( ), v20( ),... DOT v0( ), x, у DDOT v0( ), Дх, Ду DNPLOT vQ( ), x, у NDOT v0( ), x, у DRAW v0( ), x, у DDRAW vQ( ), Дх, Ду NDRAW v0( ), x, у LABEL v0(), к, Дх, Ду, % S2..." QLET vQ( ) = v1Q() + v2Q()+... 0LET v0( )=0 0LET v0(i) = O Объявление графических объектов Включение точки в ГО Включение точки в ГО Включение невидимой точ- ки в ГО Удаление точки из ГО Включение отрезка прямой в ГО Включение отрезка прямой в ГО Удаление отрезка из ГО Включение надписи в ГО (^-масштабный коэффици- ент) Объединение ГО и компо- нент ГО Удаление всех компонент ГО Удаление i-й компоненты ГО
Таблица 17.18
Операторы преобразования ГО
Формат оператора Выполняемая функция
0MOVE v0( ), Дх, Ду ORIGIN v0( ), х0, у0 SCALE V0( ), kx, kv STRETCH v0( ), x, y, kx, ky TRANSFORM v0( ) TO w( ) TURN v0( ), x, y, <p Сдвиг ГО Установка нового начала коор- динат Изменение цены делений Масштабирование ГО относи- тельно заданной точки Преобразование описания ГО в массив координат точек (X/, Y/) Поворот ГО на угол <р вокруг точки (х, у)
318
Таблица 17.19
Операторы вывода
Формат оператора Выполняемая функция
QCOPY [куда.ЬгСК ) (, X, Y] QPEN vQ( ) PLOT <аъ yi>, <а2, Р2. Yt> > = • > Вывод ГО на экран или графопостроитель Переход в режим работы со световым пером Вывод графических при- митивов (отрезок, над- пись)
Таблица 17.20
Формат директивы Пояснение
CONTINUE HALT/STEP (клавиша) LIST [S] HNJ. [Na]J LIST {SJ0HN1J, [NJ] LIST [S]V[VJ, [V2] LIST *’контекст" [[Nj], [NJ] RENUMBER NHa4, N„0B, AN RESET (клавиша) RUN (NJ TRACE (клавиша) TRACE OFF STMT NO (клавиша) Продолжение обработки Переход на шаговый режим Распечатка исходной программы или ее фрагмента (S—указание о страничном выводе) Печать операторов передачи уп- равления в интервал [Ni, N2j Печать операторов, содержащих переменные или массивы из ука- занного диапазона Печать операторов с заданным контекстом Перенумерация строк исходной программы Общий сброс и перезагрузка сис- темы Переход на выполнение програм- мы с заданной точки Включение режима трассировки (отладка) Отключение режима трассировки Автоматический набор номера сле- дующей строки
319
СПИСОК ЛИТЕРАТУРЫ К РАЗДЕЛУ 17.4
1. System 2200 А/ -В. BASIC programming Manual. 3rd Edition, Wang
Laboratories, Inc., 1974.— P. 275.
2. Система Ванг-2200. Руководство для пользователей.— Рига.: Зина-
тне, 1974.— 254 с.
3. Wang BASIC-2 Language. Wang Laboratories, Inc., 1978.
4. Собельман В. И., Шахвердов В. И. МиниЭВМ Искра-226
// Программирование.—1983.-—№ 3.— С. 88—90.
5. Абрамович С. Н., Бойко В. В., Бутрин Б. П. и др.
Профессиональные персональные ЭВМ Искра-226 // Микропроцессор-
ные средства и системы.—1985.— № 2.— С. 29 — 36.
6. Пакеты прикладных программ для микроЭВМ Искра-226. Методи-
ческие материалы и документация по пакетам прикладных программ.
Вып. 28.—М.: МЦНТИ, 1985.—254 с.
7. Машина вычислительная электронная клавишная программноуправ-
ляемая Искра-226: Инструкция по программированию. 1.320.136 Д14.
17.5. Персональная ЭВМ Агат
ПЭВМ 'Агат сконструирована на базе 8-разрядного микропро-
цессора КР588 и предназначена для использования в системе школь-
ного образования. Объем ее оперативной памяти в штатном комплек-
те—64 Кбайт, однако имеется возможность расширения до 256 Кбайт.
В качестве внешних запоминающих устройств могут использоваться
накопитель на гибком магнитном диске емкостью 140 Кбайт и бытовой
кассетный магнитофон. Алфавитно-цифровое печатающее устройство
D-100 (производство ПНР) обеспечивает вывод текстовой информации
со скоростью 100 зн/с. В зависимости от плотности печати в строке
может располагаться от 80 до 132 символов.
Агат комплектуется цветным дисплеем, переоборудованным из
бытового телевизора (Юность Ц-404 или Шил ял ис-410) и обеспечиваю-
щим несколько режимов отображения. В текстовом режиме на экране
дисплея размещаются 32 строки по 32 символа в каждой. Все знаки
в пределах одной строки могут быть окрашены в один из восьми цве-
тов. Псевдографический режим превращает экран в матрицу, содер-
жащую 64x64 элементов, каждый из которых можно закрасить.
В графическом режиме среднего разрешения экран разбивается на
128x128 цветных элементов. Графический режим с высоким разреше-
нием позволяет работать с матрицей, имеющей размерность 256x256.
Однако все ее элементы могут быть только черно-белыми.
Для создания игровых программ предназначены два пульта упра-
вления, построенные на базе двухкоординатных потенциометрических
регуляторов.
ПЭВМ Агат совместима по архитектуре с системой MCS650X,
на базе которой в свое время были построены популярные микро-
компьютеры типа Apple и TRS. Операционная система, под управле-
нием которой функционирует Агат, близка по своим характеристикам
320
к ДОС-3.3, эксплуатируемой на микроЭВМ семейства Apple. Этим
и объясняется близость версий бейсик-агат и Applesoft BASIC, основ-
ные характеристики которых описываются ниже.
17.5.1. Основные объекты.
Алфавит: латинские буквы (А — Z), русские буквы (А—Я),
цифры (0 — 9), знаки арифметических операций (+, —, *, /, *—воз-
ведение в степень), знаки операций отношения (>, =, <), прочие
символы (точка, запятая, точка с запятой, двоеточие, кавычки, круг-
лые скобки, подчерк, #, Q, %, &, @, \, !, ?).
Константы: трех типов — числовые, шестнадцатеричные и тек-
стовые. Диапазон представления числовых констант от — 9.99999999Е—
— 37 до +9.99999999Е+37. Шестнадцатеричные константы начина-
ются с символа Q и могут принадлежать диапазону от Q0000 до
QFFFF. Текстовые константы окаймляются двойными кавычками
("SiS2 ... Sk") и могут содержать до 255 символов.
Простые переменные: трех типов—целые, вещественные
и текстовые. Для обозначения переменных используются два символа,
причем вторым может быть не только цифра, но и буква. К именам
целых переменных добавляется символ %, к именам текстовых пере-
менных— символ Q. Для хранения целых переменных в памяти выде-
ляется двухбайтовое слово, поэтому они могут принимать значение
из диапазона от —32 768 до 4-32 767. Текстовые значения могут
включать до 255 символов.
Массивы: трех типов. Максимальное количество индексов — три.
Индексы отсчитываются от 0.
Математические функции: базовый набор включает 11
стандартных функций — ABS, ATN, COS, EXP, INT, LOG, RND,
SGN, SIN, SQR, TAN. Функция RND употребляется с аргументом,
знак которого влияет на поведение генератора случайных чисел. При
х > 0 генератор вырабатывает очередное случайное число, при х < 0
изменяется начальное число в генерируемой последовательности, при
х=0 генератор повторяет выдачу предыдущего случайного числа.
Функции для обработки текстовой информации:
входной язык бейсик-агат включает 7 наиболее употребительных функ-
ций-ASC(AQ), CHRQ(e), LEFTQ(AQ, i), LEN(AQ), MIDQ(AQ, i, j),
RIGHTQ(AQ, i), VAL(AQ).
Логические выражения. Для формирования сложных
условий в операторе IF разрешается использовать знаки логических
операций — OR, AND, NOT
Программная строка. Начинается с номера строки, при-
надлежащего диапазону [1, 32 767]. Вслед за номером может распола-
гаться несколько операторов, разделяемых двоеточиями. Максималь-
ная длина строки — 255 символов.
17.5.2. Специфика базовых операторов. Входной язык бейсик-агат
включает 18 базовых операторов — DATA, DEF, DIM, END, FOR,
11 Ю. Л. Кетков 321
GOSUB, GOTO, IF, INPUT, LET, NEXT, ON, PRINT, READ; REM,
RESTORE, RETURN, STOP. Большинство из них следует общепри-
нятым правилам. Небольшие отклонения касаются операторов:
D Е F: разрешается использовать нестандартные функции только
с одним аргументом.
END: может отсутствовать.
IF: допускает режим условного выполнения оператора:
IF А > В THEN PRINT А. Проверяемое условие может быть состав-
ным: IF X>=AljANDljX<=B THEN ....
INPUT: допускает использование подсказки: INPUT "ВВЕДИТЕ
ФАМИЛИЮ"; ABQ
NEXT: имя управляющей переменной можно не указывать.
ON: наряду с основным форматом ON ... GOTO допускает пере-
ключение по входам подпрограмм—-ON ... GOSUB.
PRINT: служебное слово PRINT можно заменять вопроситель-
ным знаком.
17.5.3. Работа с экраном. Основную группу дополнительных опе-
раторов входного языка составляют процедуры управления экраном.
В их состав входят средства вывода текстовой и графической инфор-
Управление режимом отображения информации
Таблица 17.21
Формат оператора Выполняемая функция
GR = n HGR = n MGR = n ТЕХТ = п SPEED = n COLOR = n FLASH INVERSE NORMAL RIBBON = n Установка графического режима с низким (64 x 64) разрешением, и — номер страницы памяти емкостью 2Кбайт Установка графического режима с высоким (256 X Х256) разрешением, и — номер страницы памяти емкостью 8Кбайт Установка графического режима со средним (128x128) разрешением, п —номер страницы па- мяти емкостью 8Кбайт Установка текстового режима Установка скорости вывода текстовой информации (0 «С п «с 255) Установка кода цветности отображаемых точек и линий в графическом режиме (0<п<7) Установка режима мерцания при выводе тексто- вой информации • Установка режима отображения текстовой инфор-j мации в обратном контрасте Установка нормального режима отображения тек- стовой информации (в прямом контрасте и без мерцания) Установка кода цветности отображаемых символов (0<п<7)
322
Таблица 17.22
Агат Apple 11
Код цвета Цвет Код цвета Цвет Код цвета Цвет
0 Черный 0 Черный 8 Коричневый
1 Красный 1 Красный 9 Оранжевый
2 Зеленый 2 Темно-голубой 10 Серый
3 Желтый 3 Фиолетовый 11 Розовый
4 Синий 4 Темно-зеленый 12 Зеленый
5 Фиолетовый 5 Серый 13 Желтый
6 Г олубой 6 Голубой 14 Бирюзовый
7 Белый 7 Ярко-голубой 15 Белый
Управление курсором в текстовом режиме
Таблица 17.23
Формат процедуры Выполняемая функция
НТАВ X N = POS(0) VTAB Y Горизонтальное перемещение курсора в заданную позицию (0 «с X «С 31) текущей строки Опрос позиции курсора в строке Вертикальное перемещение курсора в строку с номером Y(0^Y=c31)
Элементы машинной графики
Таблица 17.24
.Формат оператора Выполняемая функция
DRAW J ATX.Y PLOT X,Y PLOT TO X, Y PLOT Xi, Yf TO X2, Ya PLOT Xf, Yf TO X2,Y2 TO X3,Ya TO X4,Y4 ROT = x SCALE = n Воспроизведение j-го шаблона (маски) с привязкой локальной системы коор- динат к точке (X,Y) Построение точки Построение отрезка прямой с началом в текущей точке и концом в точке с заданными координатами (X, Y) Построение отрезка прямой с задан- ными концевыми точками Построение ломаной линии (поли- гона) с заданными вершинами Установка угла поворота по часовой стрелке: х= 16(90°), х = 32(180°), ... Установка масштаба воспроизведения графических образов (1 и «С 255)
11*
323
Таблица 17.25
Формат оператора Выполняемая функция
APPEND имя [,устройство] OPEN имя [[, i] [, устройство]] CLOSE имя [[, г] [, устройство]] READ имя [, Rn], список WRITE имя [, Rn], список POSITION имя [, Rk] Открытие файла с установкой его указателя в конец для до- записи новых данных Открытие файла прямого или последовательного доступа Закрытие файла Чтение из файла (п —номер записи в файле прямого дос- тупа) Запись в файл Пропуск к записей в файле прямого доступа
мации, процедуры управления скоростью, цветностью и режимом
отображения, команды изменения положения курсора на экране
(табл. 17.21—17.24).
Количество оттенков и их нумерация на ПЭВМ Агат и Apple-II
не совпадают. Поэтому при переносе программ с цветовыми эффектами
следует подобрать возможный вариант замены, исходя из табл. 17.22.
Таблица 17.26
Формат процедуры Выполняемая функция
GET AQ ONERR GOTO N Y = PEEK(X) POKE X,Y POP RESUME N = SCRN(I, J) Y = USR (X) WAIT X,Y,Z Ввод символа по клавише, нажатой пользова- телем, без воспроизведения на экране Указание точки входа в программу обработки ошибочной ситуации Извлечение содержимого из байта оперативной памяти с адресом X Запись числа Y (0 «С Y «С 255) в байт опера- тивной памяти с адресом X Удаление из стека последнего адреса возврата Выход из программы обработки ошибочной ситуации и переход на оператор, при выпол- нении которого произошла ошибка Опрос кода цветности точки, расположенной на пересечении t-й строки и j-го столбца Обращение к ассемблеровской подпрограмме Ожидание события, при совершении которого в байте с адресом X окажется кодовая комби- нация Y&Z
324
17.5.4. Работа с файлами. Интерпретатор бейсик-агат обеспечи-
вает минимальный набор средств по работе с файлами прямого и по-
следовательного доступа. Перечень соответствующих операторов при-
веден в табл. 17.25.
17.5.5. Дополнительный набор операторов и функций (табл. 17.26).
17.5.6. Перечень основных директив (табл. 17.27).
Таблица 17.27
Формат директивы Назначение
CATALOG устройство CHAIN имя CONT DELETE имя [, устройство] LOAD имя [, устройство] NOTRACE RENAME ст. имя, нов. имя [, устройство] RUN [N] SAVE имя [, устройство] TRACE Вывод списка файлов Дозагрузка следующей программы Продолжение обработки программы Удаление файла Загрузка текста исходной программы Отмена режима трассировки Переименование файла Запуск программы Запись текста программы в архив Включение режима трассировки
СПИСОК ЛИТЕРАТУРЫ К РАЗДЕЛУ 17.5
1. Машина вычислительная электронная персональная «Агат». Интер-
претатор «Бэйсик-Агат». Описание применения. Фг. 00003 — 01
31 02, 1984.
2. Машина вычислительная электронная персональная «Агат». Интер-
претатор «Бэйсик-Агат». Описание языка. Фг. 00003—01 35 02,
1984.
3. Хелмс Г. Л. Языки программирования. Краткое руководство.—
М.: Радио и связь, 1985.—176 с.
Глава 18. MS-BASIC НА ПЕРСОНАЛЬНЫХ
КОМПЬЮТЕРАХ 80-Х ГОДОВ
Большинство персональных компьютеров первого поколения, по-
строенных на базе 8-разрядных микропроцессоров Z80 и Intel-8080,
работает под управлением одной из наиболее популярных операцион-
ных систем СР/М-80. Как правило, в состав этой системы входит та
или иная версия интерпретатора BASIC-80, разработанного фирмой
Microsoft Corp. Последняя приобрела известность не только благода-
ря компактному бейсик-интерпретатору, ей удалось создать сравни-
тельно простые и надежные операционные системы MS DGS, ориен-
тированные в первую очередь на работу с IBM PC и совместимыми
с ними моделями других персональных компьютеров., В процессе
разработки новых интерпретаторов и компиляторов входной язык
BASIC-80 претерпел ряд изменений. Объясняется это появлением но-
вых технических возможностей таких, как цветная графика и раз-
личные средства управления (световое перо, джойстики и т. п.), му-
зыкальное сопровождение, игровые пульты, работа с каналами связи
и др. Многообразие версий бейсика, с одной стороны, затрудняет их
классификацию/ а с другой—вынуждает нас это сделать во избежа-
ние многочисленных повторов при описании входных языков на раз-
ных установках. Поэтому мы ограничиваемся двумя версиями, кото-
рые дают довольно полное представление об основных компонентах
языка BASIC-80 и его расширения, известного под названиями Advan-
ced BASIC или MSX-BASIC. Именно с этими версиями или их под-
множествами придется столкнуться пользователям персональных ЭВМ
типа Изот 1031 С, Изот 1036 С (ЕС-1831), Изот 1037 С (ЕС-1832),
ЕС-1840, Правец 16,ХРоботрон 1715 и др.
18.1. Бейсик-80
Алфавит: прописные буквы латинского алфавита (А—Z),
цифры (0 — 9), знаки арифметических операций (+, —, *, /, л— воз-
ведение в степень), знаки операций отношения (>, =, <), прочие
символы (пробел, круглые скобки, кавычки, двоеточие, запятая, точ-
ка с запятой, точка, !, ?, #, $, %).
Константы: текстовые и арифметические константы целого и
вещественного типов. Последние могут быть представлены с обычной
326
(семь цифр, диапазон от 10“38 до 10+38) или с удвоенной (16 цифр,
диапазон от 10“308 до 1О+308) точностью. Признаком короткой веще*
ственной константы является знак !, располагаемый правее числа,
или использование буквы Е для обозначения десятичного порядка.
Для длинных вещественных констант соответственно используются
символ и буква D. Диапазон констант целого типа — от —32 768
до +32 767. Длина текстовых констант—до 255 символов.
Простые переменные: четырех типов — текстовые, целые,
вещественные с обычной точностью и вещественные с удвоенной точ-
ностью. Обозначения переменных — односимвольные и двухсим-
вольные.
В качестве второго символа может использоваться и буква. Тип
переменной определяется -по дополнительному символу, приписывае-
мому к имени (% — целая, ! — короткая вещественная, 4(z—длинная
вещественная, $ — текстовая), либо по первой букве имени (см. опе-
раторы DEF INT, DEF SNG, DEF DBL, DEF STR).
Массивы: четырех типов. Количество индексов — до трех. Ин-
дексы отсчитываются от 0 или от 1 (см. OPTION BASE).
Математические функции: базовый набор из 11 стан-
дартных функций—ABS, ATN, COS, EXP, INT, LOG, RND, SGN,
SIN, SQR, TAN. Функция RND употребляется без аргумента, для
перенастройки генератора случайных чисел используется оператор
RANDOMIZE. В состав языка введена функция FIX (X), осущест-
вляющая выделение целой части своего аргумента.
Функции для обработки текстов (табл. 18.1).
Таблица 18.1
Формат Результат
INSTR (А$,В$) LEN (А$) LEFT$ (А$,п) MID$ (А$, I, п) RIGHTS (А$,п) SPACES (п) STRINGS (п,А$) Вхождение В$ в А$ Длина текстового значения Левая подстрока, п символов Центральная подстрока, п символов Правая подстрока, п символов Строка из п пробелов Размножение первого символа А$
Функции преобразования типов (табл.-18.2).
Функции, предназначенные для организации
обмена и опроса с о с то я н и я (табл. 18.3).
Логические выражения: операндами логических выра-
жений могут быть результаты сравнения арифметических или тексто-
вых величин, а также арифметические величины, рассматриваемые
327
Таблица 18.2
Формат Результат
ASC (А$) CHR$ (и) CDBL (S) CINT (S) CSNG (D) CVD (А$) CVI (А$) CVS (А$) НЕХ$ (п) MKD$ (D) MKI$ (I) MKS$ (S) ОСТ$ (п) STRS (X) VAL (А$) Целое число — код ASCII первого символа А$ Символ, код которого в ASCII равен п Вещественное число с удвоенной точностью, полу- ченное в результате расширения вещественного значения с обычной точностью Целое число полученное в результате округления вещественного числа с обычной точностью Вещественное число с обычной точностью, полу- ченное в результате округления вещественного числа с удвоенной точностью Вещественное число с удвоенной точностью, полу- ченное в результате переобозначения 8-символьно- го аргумента Целое число, полученное в результате переобозна- чения 2-символьного аргумента Вещественное число с обычной точностью, полу- ченное в результате переобозначения 4-символь- ного аргумента Шестнадцатеричный эквивалент целого числа в символьном формате Символьный 8-байтовый эквивалент вещественного значения с удвоенной точностью Символьный 2-байтовый эквивалент целого значе- ния Символьный 4-байтовый эквивалент вещественного значения Восьмеричный эквивалент целого числа в символь- ном формате Символьное представление числового значения X Машинный формат числа, соответствующий его символьному представлению А$
как целые двухбайтовые двоичные числа без знака. Результатом
сравнения может быть либо истина, представляемая в ЭВМ двух-
байтовой двоичной константой из сплошных единиц (эквивалент це-
лого числа — 1), либо ложь, представляемая в ЭВМ целым числом 0.
В качестве операций, связывающих операнды логической формулы,
можно использовать логическое сложение (OR), логическое умноже-
ние (AND), отрицание (NOT), исключающее ИЛИ (XOR), имплика-
цию (IMP) и эквивалентность (EQV). Результатом вычисления логи-
ческого выражения является двухбайтовое целое число, рассматрива-
емое как «ложь» в случае равенства нулю и как «истина» в противном
случае. Значения логических выражений могут быть использованы
для формирования логических шкал и масок.
328
Таблица 18.3
Формат Результат
EOF (#п) ERL err FRE (X) FRE (Х$) INP (X) INPUT$ (X. Y) LOC (#п) PEEK (X) POS (X) SPC (п) TAB (п) USRn (Xlt X VARPTR (V) Опрос признака конца файла (0—данные не исчерпаны, I—исчерпаны) Номер строки, при выполнении которой обнаружена ошибка Числовой код программной ошибки Число свободных байтов в оперативной памяти Число свободных байтов в области памяти, отведенной для хранения строк Однобайтовое целое число, считанное из порта ввода с адресом X Строка из X байтов, считанных из файла с номером Y Характеристика файла с номером п (номер текущей записи, число записей и т. п.) Целое число, извлеченное из байта опера- тивной памяти с адресом X Номер позиции в строке, в которой сейчас находится курсор Запись п пробелов в выводную строку, на- чиная с текущей позиции Перемещение курсора в позицию с номером п, если она находится правее текущей Обращение к подпрограмме с условным но- мером п Адрес оперативной памяти, отведенной для хранения переменной V
Текстовые выражения: для формирования новых строк
из текстовых констант, переменных и подстрок может использоваться
операция конкатенации, для обозначения которой применяется знак +.
Программная стро к а: начинается с номера оператора,
вслед за которым могут быть расположены несколько операторов,
разделенных двоеточиями. Максимальная длина программной стро-
ки— 255 символов.
18.1.1. Специфика базовых операторов. Бейсик-80 включает 19
итераторов базового набора — DATA, DEF, DIM, END, FOR, GOSUB,
GOTO, IF, INPUT, LET, NEXT, ON, OPTION BASE, PRINT, READ,
REM, RESTORE, RETURN, STOP. В большинстве своем формат
указанных операторов следует общепринятым правилам. Некоторые
отклонения касаются следующих операторов.
D Е F: имя нестандартной функции может содержать до четырех
символов (FN ар). Снято ограничение на количество аргументов.
329
D IM: количество измерений в массивах увеличено до трех.
IF: появилась конструкция IF.. .THEN.. .ELSE. В качестве
альтернатив могут задаваться не только адреса перехода (IF А > В
THEN 100 ELSE 80), но и любые выполняемые операторы (IF А > В
THEN PRINT A ELSE Х = Х + 1).
ON: кроме двух установившихся форматов ON-GOTO и ON-
GOSUB введен оператор, используемый для обработки программных
ошибок (ON ERR GOTO N).
18.1.2. Дополнительные операторы общего назначения. Список
новых операторов приведен в табл. 18.4.
18.1.3. Работа с файлами (табл. 18.5).
Таблица 18.4
Формат оператора Выполняемое действие
DEF DBL Si [— S2] LSsi— s4]...] DEF INT Si [— S2) .Ss[—S4J ...] DEF SNG Si [— S2] ,S3[-S4]...] DEF STR Si[—S2] ,S8[-S4] ...] DEF USRn = адрес ERROR n • LINE INPUT v$. OUT X,Y POKE X, Y PRINT USING формат; список RANDOMIZE [n] RESUME SWAP vi, v2 WAIT X, M, Э Объявление вещественного типа с удво- енной точностью Объявление целого типа Объявление вещественного типа с обыч- ной точностью Объявление символьного типа Объявление точки входа в подпрограм- му с именем USRn Имитация программной ошибки с номе- ром п Ввод значения символьной переменной v§ по запросу ЭВМ Запись однобайтового числа Y в порт вывода с адресом X Запись целого числа Y в байт оператив- ной памяти с адресом X Форматный вывод на дисплей Перенастройка датчика случайных чисел Возврат из подпрограммы обработки программной ошибки на ошибочный опе- ратор (RESUME), на следующий за оши- бочным оператором (RESUME NEXT)' или в указанную точку (RESUME N) Обмен значениями между переменными Vj и v2 Ожидание события, состоящего в появ- лении в порту с адресом X байта В, удовлетворяющего условию (В XOR М) AND Э = 0
330 •
Таблица 18.5
Формат оператора Выполняемое действие
CLOSE [П1] [, П2. . .] FIELD #n, h AS vi$, 12 AS v2$, . . : GET #n, N INPUT 4Ф п, список ' LSET v/$=A$ (I 1 OPEN < 0 > , [4H n, имя IR J PRINT zftn, список PUT #п, N RSET vz$ = A$ Закрытие файлов Описание полей буфера, приписан- ного к файлу прямого доступа с но- мером п Чтение записи с номером N в буфер файла прямого доступа Чтение из файла последовательного доступа Перенос данных с прижимом влево на поле vz$ буфера, приписанного к файлу прямого доступа Открытие файла с номером (I —вводной последовательный, О —выводной последовательный, R —с прямым доступом) Вывод данных в последовательный файл Перенос буфера в N-ю запись файла прямого доступа Перенос данных с прижимом вправо на поле vz$ буфера, приписанного к файлу прямого доступа
СПИСОК ЛИТЕРАТУРЫ К РАЗДЕЛУ 18.1
1. Microsoft BASIC-80. Release 5.0. Reference Manual. Microsoft, 1979.
2. Погорелый С. Д., Слободянюк T. Ф. Программное обес-
печение микропроцессорных систем. Справочник.— Киев: Техшка,
1985.—240 с.
18.2. Расширенный бейсик-80
. Алфавит: добавлены строчные буквы латинского алфавита,
используемые в текстовых литералах и значениях переменных. В слу-
жебных словах и идентификаторах прописные и строчные буквы не
различаются. Входные языки бейсик-изот и бейсик-MSX допускают
ограниченное применение прописных и строчных букв русского ал-
фавита. Среди новых символов — знак операции деления нацело (\),
амперсанд (&) и подчерк (_).
Константы: появились два новые вида двухбайтовых число-
вых констант—шестнадцатеричные (&Н1, &Н1АЕ, &HFFFF) и вось-
меричные (&5, &О5, &177777, &O177777).
Переменные: длина идентификатора увеличена до 40 симво-
лов, среди которых наряду с буквами и цифрами можно использо-
вать подчерк.
331
Таблица 1816
Формат Результат
CSRLIN INKEY$ LOF(n) LPOS(X) Номер строки, в которой находится курсор Пустая строка (”), один (’S’) или два (&Н00, ’S’) символа в зависимости от нажатой пользователем клавиши на терминале Длина файла с номером п или число свободных байтов в соответствующем буфере ввода Номер текущей позиции печатающего механизма АЦПУ. Аргумент—фиктивный
Функции, предназначенные для организации
обмена и опроса состояния: к числу функций, приведен-
ных в табл. 18.3, добавились четыре новые функции (табл. 18.6).
Арифметические выражения: в формулах могут встре-
титься две новые операции — деление нацело (ei\e2) и нахождение
остатка от деления (ех MOD е2). Обе эти процедуры выполняются с
предварительным приведением операндов ei и е2 к формату целых
чисел, которые должны принадлежать диапазону [—32 768, +32 767].
Программная строка: в любом операторе можно разме-
стить комментарий, отделяемый от тела оператора кавычкой.
18.2.1. Специфика базовых операторов. В употреблении базовых
операторов набора бейсик-80 наблюдаются следующие отклонения.
D Е F: при описании нестандартной функции и ее имени может
быть добавлен один из символов %, !, # или $ в зависимости от
типа функции. По умолчанию значение функции относится к вещест-
венному типу с обычной точностью. Максимальная длина имени не-
стандартной функции — 40 символов, однако первыми двумя должны
быть буквы FN.
END: может находиться и в середине программы (IF EOF(2)
THEN END). Выполнение оператора END вызывает автоматическое
закрытие всех файлов, открытых программой.
FOR: при задании несовместимых параметров тело цикла обхо-
дится.
IF: в конструкции IF-THEN-ELSE сделана попытка приблизить
синтаксис к литературному за счет употребления необязательных за-
пятых (IF А > В, THEN X=l, ELSE Х = Х + 1).
INPUT: перед списком переменных может находиться подсказка
(10 INPUT 'ВВЕДИТЕ ЗНАЧЕНИЯ А, В, С'; А, В, С).
NEXT: в теле оператора может быть опущено имя переменной,
управляющей повторением цикла. Тогда считается, что оно соответ-
ствует последнему исполнившемуся оператору FOR. Для вложенных
332
завершение общим оператором NEXT:
циклов допустимо их
FOR К=... ' FOR K=..
FOR J=... FOR J = ...
NEXT J NEXT К NEXT J, К
ON: введена дополнительная функция, связанная с назначени-
ем или отменой процессов обработки различных сигналов прерыва-
ния (более подробно см. разд. 10.1).
PR INT: вместо служебного слова PRINT можно использовать
вопросительный знак.
REM: имя оператора REM может быть заменено кавычкой.
RESTORE: в теле оператора может быть задан номер строки,
соответствующей оператору DATA и определяющей начало порции
данных, на которую перемещается указатель блока данных.
Таблица 18.7
Формат Выполняемое действие
CALL v[(xx, x2, ...)] CHAIN [MERGE] имя файла [, [No] [,ALL] [.DELETE Ni-N2]] COMMON vb v2(), v3$, ... ERASE vi, v2, ... LPRINT список LPRINT USING формат; спи- сок TROFF TRON WEND WHILE выражение WIDTH [устройство,]W WRITE список Обращение к подпрограмме, точка входа в которую определяется значением v Вызов следующей программы из цепочки последовательно работаю- щих программ Размещение переменных и масси- вов в общей памяти Освобождение памяти, выделенной под указанные массивы Вывод данных на АЦПУ Форматный вывод на АЦПУ Отключение режима трассировки Включение режима трассировки Последний оператор в теле цикла, повторяемого по заданному усло- вию Первый оператор тела цикла, осу- ществляющий проверку заданного условия Установка длины выводной строки на дисплее или указанном устрой- стве Вывод на дисплей с включением разделителей числовых и тексто- вых данных
333
R E T U R N: добавлена модификация RETURN N, которая ис-
пользуется для выхода из подпрограмм обработки прерываний в ука-
занную точку. Перед выходом производится очистка стека возвратов.
STOP: в отличие от оператора END выполнение оператора
STOP не вызывает закрытия файлов. Этим обеспечивается возмож-
ность продолжения обработки программы после останова.
18.2.2. Новые операторы общего назначения. Список операторов,
дополнивших соответствующий раздел бейсика-80 (табл. 18.7).
18.2.3. Дополнительные возможности. Дополнительный набор опе-
раторов, включенных в ту или иную версию расширенного бейсика,
связан с реализацией следующих возможностей:
— управление экраном дисплея в текстовом и графическом
режимах;
— работа с функциональной клавиатурой;
— обслуживание светового пера;
— обработка прерываний от управляющих рычагов (джойстиков);
— дистанционное включение или отключение мотора кассетного
магнитофона;
— организация обмена с удаленными абонентами по каналам связи;
— установка или опрос временных датчиков;
— управление работой музыкального модуля.
Список указанных операторов приводится в описании конкретных
версий, эксплуатируемых на персональных компьютерах IBM PC.
MSX, Роботрон 1715, Изот 1031 С.
18.3. Персональный компьютер фирмы IBM
Корпорация IBM сравнительно недавно начала осваивать рынок
персональных ЭВМ. Первая модель IBM PC появилась в ав-
густе 1981 г. За бытовыми компьютерами последовали профес-
сиональные модели PC/XT (март 1983 г.), две модификации ХТ/370
и одна из наиболее развитых профессиональных ЭВМ—PC/AT
(1984 г.). В 1983 г. IBM выпустила 1 млн. персональных компьютеров.
По свидетельству журнала «Электроника» (№ 10, 1985 г.) на долю IBM
в конце 1984 —начале 1985 гг. уже приходилось 43% общего рынка
персональных компьютеров. Модели IBM PC возводятся в ранг между-
народного стандарта, и многие производители вычислительной техники
начинают под этот стандарт подстраиваться. .
Базовая модель PC/XT (XT—от eXTended — развитый, расши-
ренный) построена на микропроцессорах серии INTEL 8088 и 8087.
По сравнению со своей предшественницей она располагает вдвое боль-
шей оперативной памятью (128 Кбайт), которая может быть расширена
до 256 Кбайт, а при наличии специального адаптера—до 640 Кбайт.
Кроме оперативной памяти имеется постоянное запоминающее устрой-
ство (ПЗУ) емкостью 40 Кбайт, в котором хранится бейсик-интерпре-
334
татор. Более чем вдвое увеличена емкость накопителя на гибких
магнитных дисках (360 Кбайт против 160 Кбайт), добавлен жесткий
накопитель на магнитных дисках типа «Винчестер» емкостью 10 Мбайт.
Внешняя память допускает расширение до 720 Кбайт и 20 Мбайт
соответственно на гибких и жестких МД.
В качестве терминала используется монохроматический или цвет-
ной дисплей со световым пером. Каждый из дисплеев совмещает
в себе графические и алфавитно-цифровые возможности. В текстовом
режиме экран обеспечивает отображение 25 строк по 40 или 80 сим-
волов в каждой. В этом режиме наряду с прописными буквами на
экране можно воспроизводить строчные буквы латинского алфавита,
греческие буквы, разнообразные иероглифы. Цветной дисплей обеспе-
чивает отображение любого символа в цвете на фоне окрашенного
прямоугольного знакотеста. Количество программно-регулируемых
цветов для основной и фоновой окраски —16. Графический режим
со средним разрешением превращает рабочее поле экрана в матрицу
320x200. При этом каждая элементарная клеточка (dot) на цветном
мониторе может быть окрашена в один из четырех цветов. Высокое
разрешение в графическом режиме предоставляет пользователю мат-
рицу размером 640x200, однако изображение при этом может быть
только черно-белым. В новых моделях PC/XT количество точек растра
доведено до 640x400.
Печатающее устройство мозаичного типа также сочетает в себе
алфавитно-цифровые и графические возможности. Формируя символ
с помощью матрицы 9x9, оно обеспечивает вывод со скоростью
80 зн/с. Количество разных линий, с помощью которых пользователь
может воспроизводить графическую информацию, достигает 18.
Для использования PC/XT в качестве средства развлечения его
комплектуют рычажными органами управления и музыкальным моду-
лем. Последний представляет собой один или два программно управ-
ляемых звуковых генератора, в которых можно варьировать частоту
и длительность звучания сигнала.
Модель PC/AT (АТ—от Advanced Technology —передовая техника
и технология) построена на базе 16-разрядного микропроцессора
INTEL-80286. Выпускается она в двух модификациях, различающихся
объемом оперативной памяти (256 Кбайт и 512 Кбайт) и комплектом
внешних запоминающих устройств (комплект № 1 —гибкие диски
емкостью 1.2 Мбайт, комплект № 2 дополнен жесткими дисками
емкостью 20 Мбайт). Оперативная память в любой модификации может
бйй> расширена до 3 Мбайт, а объем В ЗУ может быть доведен
до 41.2 Мбайт. PC/AT обеспечивает подключение и одновременную
работу нескольких абонентов. На базе этого компьютера разработаны
локальные сети. Встроенный адаптер позволяет объединить в сеть
до 72 ЭВМ, расположенных в радиусе до 300 м.
На большинстве моделей IBM PC эксплуатируются операционные
335
системы, разработанные фирмой Microsoft. К ним относятся различные
редакции версий DOS-1, DOS-2, DOS-3. Для моделей ХТ/370 фирма
IBM предлагает серьезную операционную систему VM/PC, обеспечи-
вающую использование персонального компьютера в качестве отлад-
чика программ IBM/370 или интеллектуального терминала, подклю-
чаемого к сети больших ЭВМ.
Описываемая ниже версия языка носит наименование Advanced
BASIC. Она обслуживается интерпретатором, входящим в состав
операционной системы DOS-1.10.
Ядро языка составляют операторы расширенного бейсика, опи-
санного в п. 18.6.2. Дополнительная группа операторов в основном
связана с управлением внешними устройствами.
Работа с экраном (текстовой режим): для управле-
ния режимом вывода алфавитно-цифровой информации кроме опера-
торов PRINT, WIDTH и WRITE используются четыре дополнительных
оператора и одна функция (табл. 18.8).
Таблица 18.8
Формат процедуры Выполняемое действие
CLS COLOR [ОН] [ДФЦ] [,РЦ]] LOCATE [j], [j] [, [k] [> *нач> *конП SCREEN [Р] [, [Ц] [, Астр [. Встр]]| N=SCREEN (i, j [, zj) Очистка экрана с возвратом курсора в левый верхний угол Назначение основного (ОЦ), фоново- го (ФЦ) и окантовочного (РЦ) цветов Перемещение курсора в заданную по- зицию (i —строка, j — столбец), уста- новка признака видимости курсора (к=0 или к = 1) и ограничение по- лосы видимости курсора (iHaq— на- чальная строка, iK0H — конечная стро- ка в пределах микрорастра) Установка режимов отображения (Р) и цветности (Ц), фиксация номеров видимой (Встр) и активной (Астр) страниц Код ASCII символа, расположенного на пересечении i-й строки и j-ro столбца дисплея (при z = 0). При z £ 0 выдается однобайтовая величи- на, содержащая код цветности ука- занного символа и признаки его ото- бражения
Текстовый режим устанавливается оператором SCREEN с опущен-
ным или нулевым значением параметра Р. Второй аргумент этого
оператора включает (Ц = 1) или отключает (Ц = 0) цветность. Два
336
остальных параметра, значениями которых могут быть целые числа
от 0 до 7, устанавливают номера активной и/или отображаемой
страниц. Активная страница—это участок буферной памяти, в кото-
рой формируется текст, выдаваемый операторами PRINT или WRITE.
Отображаемая страница—это то, что мы видим на экране.
При работе с цветным дисплеем пользователь может выбирать
код цветности из диапазона от 0 до 31. Соответствия между кодом
и цветом приведены в табл. 18.9.
Таблица 18.9
Код Цвет Код Цвет
0 1 2 3 4 5 6 7 Черный Голубой Зеленый Бирюзовый Красный Пурпурный Коричневый Белый 8 9 10 И 12 13 14 15 Серый Ярко-голубой Ярко-зеленый Ярко-бирюзовый Ярко-красный Ярко-пурпурный Желтый Ярко-белый
Коды от 16 до 31 соответствуют тем же цветам, отображаемым
в режиме мерцания. Основным считается цвет символа, который может
быть размещен на фоне прямоугольника (знакоместа), окрашенного
в другой цвет. Для «стирания» символа или фрагмента текста можно
задать совпадающие коды основного и фонового цветов. Затем, изменив
один из цветов, можно «проявить» нужный фрагмент. Рамка, окайм-
ляющая рабочее поле экрана, окрашивается окантовочным цветом.
Пропуск того или иного параметра в операторе COLOR означает
сохранение предшествующего значения этого параметра.
Оператор LOCATE используется для перемещения курсора в по-
зицию указанного знакоместа. При необходимости можно ограничить
размер курсора, сделать его видимым или невидимым.
Графический режим. В этом режиме экран дисплея пред-
ставляется в виде матрицы смежных точек размером 200x320 (среднее
разрешение) или 200x 640 (высокое разрешение). Для работы с гра-
фикой используются 10 операторов и 1 функция, перечень которых
приведен в табл. 18.10. Детальное описание особенностей работы
каждой, графической процедуры приведено в разд. 8.4.
Йветовое перо: разрешение, блокировка или замораживание
сигналов прерывания от светового пера осуществляются соответственно
операторами PEN ON, PEN OFF и PEN STOP. Опрос состояния
пера производится с помощью функции PEN (п).
12 ю. Л. Кетков 337
Таблица 18.10
Формат процедуры Выполняемое действие
CIRCLE (х, у), R [, цвет [, анач» акон [> к]]] COLOR [цвет фона] [, палитра] DRAW . S/ GET (xi, ух) —(х2, у2), А LINE [(xi, У1)] —(х2, у2) [, цвет Ь В [F]]] PAINT (х, у) [, цвет области [, цвет границы]] PSET (х, у) [, цвет] PRESET (х, у) [, цвет] PUT (х, у), А, способ SCREEN [п], [т] N= POINT (X, Y) Построение полной окружности (эллипса) или дуги Установка фонового цвета и выбор палитры Выполнение графической про- граммы Считывание в массив А характе- ристик точек экрана, расположен- ных в заданной прямоугольной области Построение линии или прямоуголь- ника с возможностью окраски внут- ренних точек Окраска внутренних и /или гра- ничных точек замкнутой области Воспроизведение точки. По умол- чанию—основным цветом Воспроизведение точки. По умол- чанию— фоновым цветом Наложение массива точек на пря- моугольную область экрана с уп- равляемым способом формирования цветности Установка среднего (п = 2) или высокого (п — 1) разрешения в гра- фическом режиме с включением (т = 0) или отключением (т=1) цветности Опрос кода цветности точки с ко- ординатами (X, Y)
Управляющие рычаги (джойстики): PC IBM комп-
лектуется двумя рычагами с условными обозначениями А и В. Имеется
возможность разрешить (STRIG ON) или заблокировать (STRIG OFF)
сигналы прерывания от обоих рычагов сразу, а также выполнить
аналогичные процедуры с указанием конкретного рычага:
STRIG (n) ON ч
STRIG (n) OFF > п~0 для Рычага А>
STRIG (п) STOP I п = 2 для Рычага в-
Для опроса состояния переключателей на управляющих рычагах и
координат точек, соответствующих положению рычагов, используются
функции STRIG (п) и STICK (п).
Функциональная клавиатура: клавиатура включает
10 функциональных клавиш, за каждой из которых может быть
338
закреплена та или иная запрограммированная функция. Одна из таких
возможностей состоит в автоматическом наборе часто встречающегося
словосочетания по нажатию j-й клавиши. Установление соответствия
между номером клавиши j и пользовательским текстом выполняется
следующим образом:
KEY j, х$
Длина такого текста не должна превышать 15 символов. По оператору
KEY ON в служебной строке экрана (25-я строка) отображаются
тексты, закрепленные за функциональными клавишами. При длине
строки в 40 позиций на экран выдаются первые шесть символов
каждого текста, приписанного клавишам 5-10. При длине строки
в 80 позиций на экране появляются начальные фрагменты всех десяти
текстов. Для того чтобы выдать их на экран полностью, необходимо
воспользоваться директивой KEY LIST. Оператор (директива) KEY
OFF освобождает служебную строку, присоединяя ее к рабочему
полю пользователя.
Оператор KEY (п)... позволяет разрешить (ON), заблокировать
(OFF) или заморозить (STOP) прерывания от функциональных
клавиш (п=1, 2, ..., 10) или клавиш перемещения курсора
(п = 11, 12, 13, 14). С помощью указанных прерываний, инициируемых
пользователем, можно управлять работой программы.
Каналы с.в я з и: в комплект ЭВМ входят два порта для работы
с активными абонентами по каналам связи. Каналы выступают в про-
грамме как коммуникационные файлы. Работе с ними должна пред-
шествовать процедура открытия:
OPEN "COMn : [SPEED], [CHECK], [BINF],
[BSTOPf AS [#] н. ф
Здесь n — номер адаптера (0 или 1); SPEED—целое число из мно-
жества 75, ПО, 150, 300, 600, 1200, 1800, 2400, 4800, 9600, опреде-
ляющее скорость работы канала связи в бодах; CHECK—один
символ, определяющий способ контроля передаваемых байтов:
S — контрольный бит всегда равен нулю, М—контрольный бит всегда
равен единице, О—контрольный бит дополняет код до нечетного
числа единиц, Е — контрольный бит дополняет код до четного числа
единиц, N — контрольный бит не передается и не принимается;
В INF—количество информационных битов в передаваемом байте;
BSTOP — количество стоповых битов в передаваемом байте.
Сигналы прерываний, поступающие от устройств управления
каналами, могут быть заблокированы (COM(n) OFF), разрешены
(COM(h) ON) или заморожены (COM(n)STOP).
'Обмен информацией между программой и абонентом производится
побайтно с использованием буфера. Прием поступающих в буфер
данных выполняется оператором GET, передача информации або-
12*
339
ненту*—оператором PUT. С помощью функций LOC (н. ф) и LOF (н.ф)
можно определить номер символа, поступивший в буфер ввода, коли-
чество свободных байтов в буфере.
Музыкальный модуль: представляет собой звуковой
генератор с регулируемой частотой и длительностью сигнала. Входной
язык предусматривает три оператора для организации музыкальных
программ. Самый простой из них — ВЕЕР. Он выдает на динамик
сигнал частотой 800 Гц и длительностью порядка 0.25 с. Оператор
SOUND ©,т позволяет регулировать частоту (со) в диапазоне от 37
до 32 767 Гц и длительность (т) сигнала от 0 до 65 535 машинных
единиц времени (цена единицы порядка 55 мс). Во время звучания
сигнала работа программы продолжается. Однако если новый оператор
SOUND встретился до того, как завершено действие предыдущего
сигнала, то выполнение программы приостанавливается до освобож-
дения звукового канала. Звучание предыдущего сигнала можно
прекратить досрочно, если выдать очередной оператор SOUND с т = 0.
Оператор PLAY предоставляет программисту самые широкие
возможности по генерации произведений в соответствии с основными
правилами музыкальной грамоты. Средства управления длительностью
нот и пауз, сменой октав, изменением темпа исполнения, вкраплением
ранее описанных мелодий и т. п. задаются с помощью текстовых
констант и переменной. Формат этих операндов и их функции для
IBM PC аналогичны соответствующим музыкальным средствам MSX
(см. разд. 18.4). В более поздних моделях IBM PC используется
генератор сложного звука, включающий три звуковых канала и один
шумовой. Такой музыкальный модуль уже можно применять для ре-
шения профессиональных задач.
Управление двигателем кассетного магнито-
фона: обмен с МЛ может происходить только при работающем дви-
гателе, включение которого осуществляется нажатием соответствующей
клавиши. Для программного запуска или останова мотора лентопро-
тяжного механизма в состав входного . языка введен оператор
MOTOR п. Если аргумент п отличен от нуля, то двигатель выклю-
чается. При п = 0 осуществляется включение двигателя, а при опу-
щенном аргументе происходит переключение предыдущего состояния
питания на противоположное (выкл.—>вкл.—> выкл.—>вкл.—>...).
Календарные даты и время: в тексте исходной про-
граммы можно использовать служебные переменные DATE$ и Т1МЕ$.
При установке значений даты и времени эти имена фигурируют
в левой части оператора присваивания, при опросе текущих значе-
ний— в правой.
Модификация оператора OPEN: Бейсик—1ВМ^допу-
скает еще один формат оператора OPEN, обеспечивающий дополни-
тельную возможность —открытие последовательного выводного файла
с установкой его указателя в конец для дозаписи новых данных
340
(режим APPEND):
OPEN имя FOR
( INPUT A
{OUTPUT 1
(.append;
AS [#] n
СПИСОКЛИТЕРАТУРЫ К РАЗДЕЛУ 18.3
1. Трейстер P. Персональный компьютер фирмы ИБМ.—М.: Мир,
1986.-208 с.
2. Peckham Н. Hands-on-BASIC for the IBM Personal computer.
N. Y. McGraw-Hill, 1983, 208 p.
3. Strickland D., Rockwell D., Bowyer K. Games, Graphics
and Sound for the IBM PC. London: Prentice-Hall, 1983, 257 p.
4. Conk 1 i n D. PC Graphics: Charts, Graphs, Games and Art on the
IBM PC N. Y., Wiley, 1983. 192 p.
5. Graham N. Programming the IBM PC: Fundamentals of BASIC.
Eastbourne: Holt Saunders, 1984. 300 p.
6. Моррил Г. Бейсик для ПК ИБМ/Пер. с англ.—М.: Финансы
и статистика, 1987.
7. Пул Л. Работа на персональном компьютере.—М: Мир; 1986.
18.4. Бейсик на персональных компьютерах типа MSX
MSX—это торговая марка фирмы Microsoft. В Японии функцио-
нирует ее филиал ASCII Corporation, который привлек к выпуску
домашних компьютеров таких известных производителей средств бы-
товой электроники, как Matsushita Electronic Industrial Со., Cannon
Inc., Toshiba Corp.-, Nippon Gakki Co. (торговая марка —Jamaha),
Sanyo Electric Co. Бытовые компьютеры перечисленных фирм имеют
общее наименование MSX, так как на них эксплуатируется програм-
мное обеспечение фирмы Microsoft. О массовости этих изделий свиде-
тельствует одно из сообщений? опубликованное в журнале «Электро-
ника». Только в июле 1985 г. было продано порядка 650 тыс.
компьютеров MSX и MSX-2 в Японии и свыше 250 тыс. штук в
Южной Корее и Западной Европе. ЭВМ этих типов были закуплены в
1985 г. и для оснащения школьных тер ми нал-классов в нашей стране.
В комплект домашнего компьютера MSX входят отдельная кла-
виатура, цветной или черно-белый дисплей, накопитель на ГМД
емкостью 360 Кбайт (720 Кбайт) и миниатюрное печатающее устройст-
во. К MSX может быть подключен кассетный магнитофон, звуковой
модуль, средства управления телеиграми. Объем оперативной памяти
в базовом комплекте —64 Кбайт. Кроме этого в составе ЭВМ имеется
ПЗУ емкостью 32 Кбайт, в котором «зашит» бейсик-интерпретатор,
и видео ЗУПВ, обеспечивающее хранение и регенерацию изображе-
ний; на экране дисплея.
Модель MSX-2 выпускается с 1985 г. Ее терминал обеспечивает
отображение 80 символов в строке (предшествующая модель — 40).
В графическом режиме экран дисплея представляет собой матрицу
341
212x256 (было 192x256) в*графическом режиме с высоким разреше-
нием и матрицу 53x64 (было 48x64) в цветном режиме.
По своему составу MSX-BASIC очень мало отличается от вход-
ного языка бейсик-интерпретатора для IBM PC.
Средства машинной графики на MSX примерно те же, что и на
IBM PC. Наиболее существенная новинка связана с использованием
экранных масок (служебный массив SPRITE$, операторы PUT
SPRITE, SPRITE ON/OFF/STOP). Техника работы с этими графиче-
скими средствами подробно описана в разд. 8.5.
Немного по-другому организовано в MSX задание относительных
координат. В отличие от IBM PC, где такие координаты выделяются
путем задания знаков «+» или «—», здесь используется дополни-
тельное служебное слово STEP:
CIRCLE [STEP] (х, у), R, цвет, a0, an, kxy
LINE [STEP] (xb i^) —[STEP] (x2, y2) [ , В [FJ]
PAINT [STEP] (x, y)t цвет точки, цвет границы
PSET [STEP] (x, у) [ , цвет]
PRESET [STEP] (x, у) [ , цвет]
Оператор SCREEN, устанавливающий режим отображения, в
MSX имеет также несколько иной формат:
SCREEN Р, М, 3, V, А
Здесь Р — целое число (ОсРсЗ), задающее режим работы:
' 0 — текстовой режим (24 строки по 40 символов),
1—текстовой режим (24 строки по 32 символа),
2 —графический режим с высоким разрешением (192Х
Р ~ ' X256 точек),
3 —цветной графический режим с низким разрешением
(48X64);
М—целое число (О^М^З), задающее размерность экранных
масок; 3 —признак, управляющий блокировкой звукового сигнала,
выдаваемого при нажатии любой клавиши (при 3 = 0 сигнал вклю-
чен, при 3=1—выключен); V—целое число, задающее скорость
обмена данных с магнитофоном (1200 или 2400 бод); А —параметр,
задающий тип АЦПУ, подключенного к ЭВМ (А = 0, если печатаю-
щее устройство типа MSX; А=1, если АЦПУ другого типа).
Немного по-другому решена в MSX кодировка цветовых оттен-
ков (табл. 18.11).
Среди других, мало существенных расхождений отметим отсутст-
вие коммуникационных каналов связи и несколько иной подход к
работе с таймером. В составе MSX-BASIC имеются операторы, сцто-
мощыо которых организуются программные «будильники»
разд. 10.2), но зато отсутствуют служебные переменные DATEJ и
TIME$. MSX-BAS1C позволяет вести обмен с ячейками видео ЗУ
(VDP, VPEEK, VPOKE).
342
Таблица 18.11
Код Цвет Код Цвет
0 Бесцветный 8 Средне-красный
1 Черный 9 Светло-красный
2 Средне-зеленый 10 Темно-желтый
3 Светло-зеленый 11 Ярко-желтый
4 Темно-голубой 12 Темно-зеленый
5 Светло-голубой 13 Пурпурный
6 Темно-красный 14 Серый
7 Небесно-голубой 15 Белый
Появился еще один вид числовых констант—двоичные
(& В 10111001). С целью экономии оперативной памяти, отводимой
под управляющие блоки для работы с файлами, введен оператор,
Таблица 18.12
Номер регистра Назначение Диапазон значений
0 1 Частота звукового канала А » » > 0—255 0—15
2 3 Частота звукового канала В » » » 0—255 0—15
4 5 Частота звукового канала С » » » 0—255 0—15
6 Частота фонового канала 0—31
7 Коммутация каналов для генерации звука 0—63
8 Громкость канала А 0—15
9 Громкость канала В При значении 16 устанавливается режим управляе- мой громкости
10 Громкость канала С
1Г 12 Управление частотой изменения гром- кости сигнала 0—255 0—255
13 Управление формой сигнала 0—14
343
ограничивающий количество одновременно открытых файлов в пре-
делах данной задачи (MAXFILES= п).
В MSX более развито управление музыкальным модулем, хотя
набор операторов при этом остался прежним —ВЕЕР, PLAY, SOUND.
Дело прежде всего в том, что эти компьютеры комплектуются четы-
рехканальным программно управляемым звуковым генератором (ЗГ).
Каждый из трех его звуковых каналов (А, В, С) может работать
независимо от другого и воспроизводить звуки заданных тембра,
громкости и длительности. Работа звуковых каналов может совме-
щаться По времени с работой шумового канала.
На физическом уровне управление звуковым генератором сво-
дится к записи соответствующего числового значения в один из 14
однобайтовых регистров ЗГ (табл. 18.12).
Содержимое пары регистров с номерами 1 +1 и i (i = 0, 2, 4)
рассматривается как двенадцатиразрядный двоичный код пш, опреде-
ляющий частоту соответствующего звукового сигнала со в герцах:
1 789 772.5
16*0) — п“’
Например, для частоты со = 400 Гц значение nw равно 312 (в регист-
ре i+1 записана 1, в регистре i записано 56; 312 = 256*1+56).
Частота звучания фонового канала (Of определяется аналогичным
образом по содержимому 6-го регистра —nf.
Шесть младших разрядов 7-го регистра устанавливают коммута-
цию между звуковыми каналами и воспроизводящим устройством:
Фон + звук Звук
с В А С В ’ А
32 16 8 4 2 1
Единица в любом из указанных разрядов блокирует выдачу со-
ответствующего сигнала.
Три следующих регистра регулируют громкость, т. е. амплитуду
сигнала, генерируемого соответствующим каналом. При этом гп/=15
соответствует максимальной громкости звучания, а т/ = 0—минималь-
ной. Для т/= 16 устанавливается режим автоматически изменяющей-
ся громкости. Частота этого изменения со г определяется двухбайто-
вым целым числом пг, записанным в регистрах 12 и 11.
Г 1 789 772.5 ]
[ 256*0), J—Пг’
1 гц- < 65 535.
344
Управление законом изменения громкости обеспечивается содер-
жимым m регистра 13. Осциллограммы соответствующих сигналов
приведены на рис. 18.1.
Запись нужных числовых значений в один из перечисленных
регистров выполняется с помощью оператора SOUND:
SOUND номер регистра, выражение
Для управления ЗГ на уровне профессионального музыканта
используется оператор PLAY, который обеспечивает установку и уп-
равление такими параметрами, как выбор октавы, отработка звучания
указанных нотных знаков, изменение темпа игры и т. п.
А >6,7,15
ГТ7~д
В№
t
m~16 m~14
Рис. 18.1. Осциллограммы изменения громкости сигнала
t
Аргументами оператора PLAY являются строки или значения
символьных переменных. Максимальное количество этих аргументов —
три в соответствии с числом одновременно работающих звуковых ка-
налов. Каждый аргумент оператора PLAY представляет собой му-
зыкальную программу, состоящую из цепочки команд. Кодом музы-
кальной команды обычно является буква, вслед за которой задается
единственный числовой аргумент. Список букв и закрепленных за
ними функций приведен в табл. 18.13.
Числовой операнд каждой музыкальной команды может быть за-
дан не только константой, но и значением арифметической перемен-
345
Таблица 18.13
Формат команды Диапа- зон аргу- мента Выполняемая функция
ГЖ1 а К + У X Х[п] а£{А, В,С, D, Е, F, G} 1<п< <64 Спецификаци октаве С* С 4 D- я музыка - Л + / - 1 ЛЬНЫХ HOT Е Q# А* r+ G+ Д- б- । выбранной * h
п—обратная ноты А А А А А А А CD £ Г & А В величина длительности звучания
Ln 1<п< <64 Установка длительности звучания нот 1/ L2 L4 L8 L/ff 1Л2 \.64 . j j ; } J J (Начальное значение—L4)
Мп 1<п< <65535 Установка частоты изменения громкости, за- данной а помощью команды Sn. (Начальное значение М255)
Nn 0<п< <96 Хроматическая гамма, возрастает с увеличе- нием п на 1
On n <8 Выбор музыкальной октавы (п=1 обозначает контроктаву, п = 2 — большую октаву и т. д.). Начальное значение 04 (первая октава)
Rn 1<п< <64 Установка паузы: R7 R2 R4 R8 R/ff R32 - ~ } И i £ 4
346
Продолжение табл. 18.13
Формат команды Диапа- зон аргу- мента Выполняемая функция
Тп 32 < <п< <255 Задание темпа. Значение п определяет коли- чество четвертных нот, укладывающихся в 1 минуту. Начальное значение Т120
Vn 0<п< <15 Установка уровня громкости (громкость воз- растает с увеличением п). Начальное значе- ние V8
Xv$; Выполнение музыкальной программы, закоди- рованной значением текстовой переменной v$
• Каждая точка после ноты или паузы увели- чивает ее длительность в 1.5 раза ( С4. J. • R8’ ^*1* )
ной. В этом случае команда записывается, подобно оператору прис-
ваивания (' ... 0 = 1; ')•
Дополнительным средством для управления музыкальным модулем
в MSX-бейсике является функция PLAY (n). С ее помощью можно
узнать, «молчит» или продолжает генерировать звук тот или иной из
каналов (1<п<3). При п = 0 выдается сводная информация (логи-
ческая сумма) по всем трем каналам.
18.5. Особенности входного языка бейсик-изот
Персональный компьютер Изот 1031 С выпускается с 1984 г. Он
построен на базе 8-разрядного микропроцессора U880D, работающего
на частоте 2 МГц, обладающего высоким быстродействием (табл. 18.14).
ПЭВМ Изот 1031 С обладает оперативной памятью в 64 Кбайт и
снабжается двумя накопителями на гибких магнитных дисках (емкость
каждого дискета —64 Кбайт). Алфавитно-цифровой дисплей позволяет
отображать прописные и строчные буквы русского и латинского алфа-
витов. Среди дополнительных устройств — малогабаритное АЦПУ.
ГЦ ЭВМ Изот 1031 С эксплуатируется усеченный вариант опера-
ционной системы СР/М-2.2, который носит название UMKO и вклю-
чает интерпретатор и комиилятор с бейсика. Входной язык програм-
мирования практически совпадает с ядром расширенной версии
347
Таблица 18.14
Операция Время выполнения, мкс
целые числа вещественные числа
Переход 0.9 0.9
Пересылка 0.95 1.1
Сложение 1.3 1.8
Умножение 1.9 3.8
Вычисление sin (х) — 80.0
бейсик-80 (см. разд. 18.2). В качестве единственного отличия следует
привести оператор OPEN, в котором для указания типа файла вместо
символов 1, О и R в бейсике-изот используются двухбуквенные соче-
тания El, ЕО, ER.
Следующая модель Изот 1036. С (отечественный аналог—ЕС 1831)
построен уже на базе 16-разрядного процессора типа Intel 8086/8088
с тактовой частотой 4.77 МГц. Объем ее оперативной памяти в базо-
вом комплекте варьируется от 64 до 256 Кбайт с возможностью рас-
ширения до 640 Кбайт. Объем ПЗУ — 40 Кбайт. Базовая конфигура-
ция включает клавиатуру, алфавитно-цифровой дисплей (25 строк по
80 символов), один или два НГМД с емкостью дискетов 250 Кбайт
(односторонняя запись) или 500 Кбайт. Среди дополнительных внеш-
них устройств — АЦПУ, один или два накопителя на жестких дисках
типа «Винчестер» емкостью по 10 Мбайт.
На Изот 1036 С эксплуатируется операционная система типа
DOS PC. Бейсик-интерпретатор довольно близок к бейсику-IBM.
Последняя из моделей, выпускаемых объединением Изот, имеет
наименование 1037 С (отечественный аналог—ЕС 1832). От своей
предшественницы она отличается наличием алфавитно-цифрового
дисплея с графическими возможностями в черно-белом или цветном
исполнении. Изот 1037 С комплектуется гибкими и жесткими НМД,
АЦПУ с графическими возможностями. Эта ПЭВМ может использо-
ваться как интеллектуальный терминал при работе с ЕС ЭВМ.
СПИСОК ЛИТЕРАТУРЫ К РАЗДЕЛУ 18.5
1. Современные средства вычислительной техники из Болгарии //
Зарубежная электроника.— 1986. — № 3. — С. 92 — 95.
18.6. Особенности входного языка бейсик-роботррн
Базовый комплект Роботрон 1715 включает процессор с памятью
64 Кбайт, монохроматический алфавитно-цифровой дисплей (16 строк
по 64 символа или 24 строки по 80 символов), четыре НГМД (два
348
Таблица 18.15
Перечень основных директив
Формат директивы CQ MSX о co S РОБОТРОН Назначение
AUTO [No] [, AN] BLOAD имя [, адрес] BSAVE имя, адрес, длина CLEAR [,[ei] be,]] CLOAD имя CLOAD? имя CONT CSAVE имя [, V] DELETE [NJ [—[Na]] EDIT [N] FILES имя KILL имя LIST [NJ [— [N2]] [, имя] LLIST [NJ [— [NJ] [, имя] LOAD имя [, R] MERGE имя NAME ст. имя TO нов. имя NEW RENUM [NH0B] [,Nct] [, AN] RESET RUN [N] RUN имя [, R] SAVE имя [, /pj] SYSTEM TROFF TRON' + + + + + + + + + + + + + + + + + + + + + + ++ + + ++ + + + + ++++ ++ 4" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Автоматическая нумерация строк Загрузка двоичного файла Запоминание двоичного файла Очистка области данных Загрузка файла с МЛ Контрольное чтение с МЛ Продолжение обработки программы Запись исходной програм- мы на МЛ Удаление строк исходной программы Переход в режим редакти- рования Распечатка файлов Удаление файла Вывод файла на дисплей Вывод файла на АЦПУ Загрузка исходного файла Слияние файла с текущей программой Переименование файла Уничтожение текущей про- граммы и очистка всех полей Перенумерация строк Перезапуск системы Запуск текущей программы Запуск указанной програм- мы Запоминание текущей про- граммы Отключение режима трас- сировки Включение режима трасси- ровки
349
дискета по 128 Кбайт и два дискета по 512 Кбайт) и АЦПУ. Робот-
рои 1715 функционирует под управлением операционной системы SCP,
полностью совместимой с СР/М-2.2. Поэтому входной язык бейсик-
интерпретатора полностью совпадает с ядром расширенной версии
языка бейсик-80.
СПИСОК ЛИТЕРАТУРЫ К РАЗДЕЛУ 18.6
L Bedingunganleitung und Sprachebeschreibung fur den BASIC—Inter-
preter BASI (SPCX)* VEB Robotron, Buromaschinenwerk Sommer-
da, 1984, 123 S.
УКАЗАТЕЛЬ ВЕРСИЙ БЕЙСИКА*)
1. Дартмутская версия 239
2. М-20, БЭСМ-4 242, 168
3. Бейсик-222 244, 171
4. Бейсик-6 249
5. Бейсик-гамма 246, 171
6. Бейсик-ЕС 252, 93, 174
7. Бейсик-ИКИ 256, 178
8. ДИСП-ЕС 258, 96
9. М-6000 262
10. М-7000 263
11. СМ3, 4 271, 96, 117, 178
12. Бейсик-плюс 278, 86, 91, 96
13. А5120/А5130 287, 174
14. Электроника-60 292, 172
15. Электроника ДЗ-28 294, 95
16. ДВК 300, 117, 178
17. Искра-226 301, 196, 138, 149, 178, 183, 188
18. Агат 320, 170
19. Бейсик-80 326
20. Бейсик-80 (расш.) 331
21. BASIC-A (IBM PC) 334, 113, 157, 173, 178, 197
22. BASIC MSX 341, 164, 173, 190
23. Изот 1031 347
24. Роботрон 1715 348
25. Проект нового стандарта 216
) В первом столбце указан порядковый номер версии
УКАЗАТЕЛЬ ОПЕРАТОРОВ*)
ADD
ADDC
AIRD
AISQ
AND
AO
APPEND
ASK
BACKGROUND COLOR
BACKSPACE
BEEP
BEGIN
BIN
BIT
BOOL
БЭСМ
CALL
CDI
CHAIN
CHECK ON/OFF
CIRCLE
CLEAR
CLEAR C/D/F
CLEAR N
CLEAR P
CLEAR S
CLEAR V
CLOSE
CLOSE #
CLS
CMD
COLOR
185 17
185 17
269 10
269 10
184 17
269 10
324 18
227 25
235 25
315 17
340 21,22
267 10
183 17
186
185 17
169
171, 222 1, 3, 5,9—11,13
15, 16, 20—24
269 10
178 1, 7, И, 13, 16,
20, 21, 23, 24
245 3
159 21, 22
298 15, 17
298 15
309 17
298 15, 17
298 15
298 17
261 8, 10, 18—22,24
115 13
336 21, 22
170 15 к
158 18, 21, 22
*) Во втором столбце указаны ссылки на страницы, в третьем
столбце — порядковые номера версий.
352
сом 177 10, 13, 17
COM (n) ON/OFF/STOP 339 21
COMMON 177 1, 10, 11, 16, 20,
21, 23, 24
CONNECT 238 25
CONVERT 307 17
COPY 175, 317 6, 17
DATA 30, 55 1—25
DATA LOAD 155 15, 17
DATA LOAD OPEN 299 15
DATA RESAVE 314 17
DATA RESAVE END 314 17
DATA SAVE 155, 298 15, 17
DATA SAVE END 298 15, 17
DATA SAVE OPEN 298 15, 17
D BACKSPACE 317 17
DDOT 153 17
DDRAW 153 17
DECLARE FUNCTION 222 25
DECLARE NUMERIC 216 25
DECLARE STRING 216 25
DEF FN 55 1—25
DEF FNC 56, 189 17
DEF DBL 57, 330 19-24
DEF INT 57, 330 19—24
DEF SEG 57 21
DEF SNG/STR 57, 330 19—24
DEF USRn 57, 172 19—24
DELETE ib 226
DI 269 10
DIM 57 1—25
DIM # 117 11, 12, 16
DISABLE 182
DISCONNECT 238 25
DNPLOT 154 17 .
DO 219, 289 13
DO END 289 13
DO WHILE 218 25
DOKE 174
DOL 269 10
DOM 269 10
DOT 153 17
DRAW 153, 161 17, 18, 21, 22'
DSABL 268 10
DSKIP 317 17
DUMP 245 3
ENABL 268 10
ENABLE 182
END 58 1^-
END DEF 56, 59, 221 25
end Function 221 25
END HANDLER 229 25
353
END IF 59, 218 25
END PARACT 237 25
END PICTURE 234 25
END SECLECT 219 25
END SUB 59, 222 25
END WHEN 229 25
ERASE 226, 333 20—24
ERASE REST 226
ERROR 198 19—24
EXIT DO/FOR 218 25
EXIT HANDLER 230 25
FETCH 178, 258 7
FIELD 116 12, 19—21, 23,
24
FILE 4t 290 13
FILES 248 5
FIXA 265 10
FLASH 322 18
FLTA 265 10
FMT 105 5
FNEND 56 4, 5, 13
FOR 37, 59 1—25
FRAME 155 17
FUNCTION 221 25
GET 163, 260 6, 8, 18, 21, 24
GET 4b 116 12, 19—24
GOSUB 42, 60 1—25
GOSUB’ 62 17
GOSUB OF 61
GOSUB PROG 62
GOTO 45, 62 1—25
GOTO OF 63
GOTO ON , 260 8
GOTO PROG 63
GR 322 18
GRAPHIC INPUT 236 25
GRAPHIC PRINT 235 25
HANDLER 229 25
HEXPRINT 305 17
HGR 322 18
HTAB 323 18
IF END 59, 64 1, 5, 15, 17
IF EOF 64
IF — GOSUB 253 6
IF — GOTO 44, 63 6, 14, 15, 19—24
IF MISSING 220 25
IF — NEXT 64 6
IF — THEN 43, 63 1—25
IF — THEN — EISE 64 12, 13, 19—24
354
IF THERE
IMAGE
I MAS К
INDATA
INIT
INPUT
INPUT 4
INPUT LINE
INPUT LINE #
INPUT PROMPT
INTERVAL ON/OFF/STOP
INVERSE
IRTN
226 25
109 25
182
255 6
140, 184 17
30, 64 1—25
114 1, 10—13, 16,
19—24
282 12
285 12
65 25
197 21
322 18
182
KEY 188 21. 22
KEY LIST 188 21, 22
KEY ON/OFF/STOP 188 21, 22
KEY (i) ON/OFF/STOP 190 21, 22
KEYIN 305 17
LABEL 153 17
LET 29, 65 1—25
LIMITS 317 17
LINE 159 21, 22
LINE INPUT 78 19—22, 24
LINE INPUT # 114 19—24
LINE PRINT 69
LINPUT 78 11, 16, 17
LINPUT # 276, 290 11, 13
LIST DC 317 17
LOAD 298 15
LOAD # 299 15
LOCATE 336 21, 22
LOOP 219 25
LOOP UNTIL 219 25
LP 171 5
LPRINT 69 20—24
LPRINT USING 115 20—24
LSET 116 12, 19—21, 23, 24
MAT ASORT 138
MAT CONVERT 138 17
MAT COPY 141 17
MAT DOT 138
MAT DSORT 138
MAT FILL 232 25
MAT GET 138, 260 8
MAT INPUT 119 1, 5, 6, 8, 12,
17
MAT INPUT 4t 138 10» 12
MAT LINE INPUT it 224 25
MAT MERGE 140 17
355
MAT MOVE MAT PLOT MAT PRD MAT PRINT MAT PRINT USING 140 232 138 119 127 17 25
1—6, 8, 10, 12,
17
MAT PRINT # 138 10, 12
MAT PUT 138, 261 8
MAT READ 119 1—6, 8, 10, 12, 17
MAT READ 4b 138 10, 12
MAT READ г 248 5
MAT REDIM 310 17
MAT REWRITE 4fc 226 25
MAT SEARCH 141 17
MAT SORT MAT SUM 139 138 17
MAT WRITE 248 5
MAT WRITE 4b 138 10
MAT WRITE 248 5
MAT A = CON 119 1—6,8,10,12, 17
MAT A = IDN 119 1—6, 8, 10, 12, 17
MAT A = I NV (B) 119 1—6, 8, 10, 12, 17
MAT A = TRN (B) 119 1—6,8, 10,12, 17
MAT A = ZER 119 1—6, 8, 10, 12, 17
MAT A = В 119 1—6, 8, 10, 12, 17
MAT A = B+C 119 1—6, 8, 10, 12, 17
MAT A=B—C 119 1—6, 8, 10, 12, 17
MAT A=B*C 119 1—6, 8, 10, 12, 17
MAT A=(e)*B MAXFILES MESSAGE MGR MID$(...) = MOTOR MOVE 119 344 237 322 340 318 1—6,8,10,12,17 22 25 18 21, 22 21, 22 17
NPOT 154 17
NDRAW 154 17
NEXT 37, 66 1—25
NORMAL 322 18
NPLOT 154 17
ON COM (n) GOSUB — 21
ON ERROR 198
ON ERROR GOSUB 198
356
ON ERROR GOTO 198 12, 17, 19—24
ON GOSUB 67 11, 13, 16—24
ON GOTO 46, 67 1—7, 11 — 13, 15—24
ON INTERNAL GOSUB 197 22
ON KEY GOSUB 190 21, 22
ON PEN GOSUB 193 21
ON RESTORE 288 13
ON SPRITE GOSUB 167 22
ON STOP GOSUB — 21, 22
ON STRIG GOSUB 194 21, 22
ON THEN 247 5
ON ERR GOTO 324 18
OPEN 115 10—12, 16, 18—24
OPEN 224
OPTION ANGLE DEGREES 218 25
OPTION ANGLE RADIANS 218 25
OPTION ARITHMETIC 216 25
OPTION BASE 68 19—21, 23, 24
OPTION COLLATE NATIVE 217 25
OR 184 17
ORIGIN 155 17
OUT 330 19—24
OUTDATA 255 6
OVERLAY 178 IL
PACK 307 17
PAINT 161 21, 22
PARACT 236 25
PAUSE 260 8
PEN ON/OFF/STOP 193 21
PICTURE 233 25
PLAY 240 21, 22
PLOT 151, 232 17, 18
POKE 173 18—24
POP 324 18
POSITF 267 10
POSITION 324 18
POSITT 267 10
PRESET 158 21, 22
PRINT 31, 69 1—25
PRINT AT 306 17
PRINT USING 96 1, 8, 11 — 13, 16, 17, 19—24
PRINT # 69, 114 1, 10—13, 16, 19—24
PRINT 4b USING 69, 96, 114 12, 19—24
PRINT/ 150 17
PROCESS 237 25
PROGRAM 223 25
PSET 158 21, 22
PUT 163, 261 6, 8
PUT # 116 12,19—21,23,24
PUT SPRITE 167 22
367
RANDOMIZE 53, 70
READ 30, 71
READ # 71
READ s 248
REM 49, 71
REPLACE 308
RESET 255, 261
RESET 228
REST 250
RESTORE 48, 72
RESTORE n 72
RESTORE 4fc 72
RESTORE $ 72
RESTORE s 248
RESUME 198
RETURN 42, 72
RETURN e 73
RETURN N 73, 189
RETURN CLEAR 73
REWIND 267
REWRITE 4b 226
RIBBON 322
ROT 323
ROTATE 185
RSET 116
SAVE 298
SAVE # 299
SAVE END 298
SAVEP 313
SCALE 155, 323
SCREEN 157, 336
SELECT 309
SELECT CASE 219
SELECT D/G/P 311
SELECT PLOT/PRINT 150
SENSE 268
SET 268
SET BOUNDS 232
SET CHARACTER HEIGHT 235
SET CLIP ON/OFF 236
SET JUSTIFY 235
SET LINE STYLE 236
SET TEXT ANGLE 235
SET VIEWPORT 232
SET WINDOW 232
SHARED 237
SIGNAL 238
SKIP 298
SKIPL 267
SLEEP 284
SOUND 340
SPACE 4h 290
SPEED 322
1, 11 — 13, 16,
19—21, 23, 24
1—25
1, 10
5
1—25
17
1, 6, 8
25
4
1—25
3, 6, 13, 17
1, 11, 16
1
5
12, 18—24
1—25
13
17
15, 17
25
18
18
17
12, 19—21, 23,
24
15
15
15
17
17, 18
21, 22
25
17
17
10
10
25
25
25
25
25
25
25
25
25
25
15, 17
10
12
21, 22
13
18
358
SPRITE ON/OFF/STOP 167 22
START 237, 268 10
STOP 73 1—25
STOP ON/OFF/STOP __ 21, 22
STRECH 155 17
STRIG ON/OFF/STOP 195 21, 22
STRUCTURE 237 25
SUB 222 1, 25
SUBEND 241 1
SWAP 330 19-24
TEMPLATE 226' 25
TEXT 322 18
TIME 268 10
TRACE 245
TRACE ON/OFF 206 3
TRANSFORM 318 17
TRAP 182, 268 10
TRNON 268 10
TROFF 333 20—22, 24
TRON 333 20—22, 24
TRUNCATE # 290 13
TTYEV 268 10
TURN 155 17
UNPACK 307 17
USE 229 25
VERIFY
VIEWPORT
VTAB
317 17
236 25
323 18
WAIT 237, 324 12, 18—22, 24
WEOT 267 10
WHEN EXCEPTION 229 25
WEND 333 20—24
WHILE 333 20—24
WIDTH 333 20—21, 23, 24
WINDOW 155 17
WRITE 324 18, 21, 24
WRITE 114 1, 10, 13, 21, 24
WRITE 248 5
XOR 184 17
П COPY 155 17
Q LET 154 17
П MOVE 155 17
Q OPEN 152 1?
Q PACK 307 17
Q PEN 156 17
Q TRAN 308 17
Q UNPACK 307 17
? 69 20—24
1 170 18
% 103 17
• 260 8
71 20—24
УКАЗАТЕЛЬ ФУНКЦИЙ
ABORT 274 11, 16
ABS 2! 1—25
ACS 259 8, 15
А НС 296 15
AHS 296 15
АНТ 296 15
ARCCOS 302 17
ARCSIN 302 17
ARCTAN 302 17
ASC 88 1, 11, 13, 16,
18—24
ASCII 88 12
ASN 259 4, 8
ATN 21 1—25
BIN 183 11, 16
BINQ BIN$ 186 22
BIT 186
CDBL 328 19—24
CHRQ, CHR$ 88 11 — 13, 16,
18—24
CINT 328 19—24
COS 21 1—25
COT 249 4, 8
CSC 259 8
CSNG 328 19—24
CTN 250 .4
CTRLC 274 11, 16
CVD 88 19—21, 23, 24
CVI 88 19—21, 23, 24
CVS 88 19—21, 23, 24
CVTF$ 90 12
CVT$F 90 12
CVT%$ 90 12
CVT$% 90 12
DATE$ 284 12, 21
DEEK 174
DEG 259 8, 15
DET 259 8
360
EOF 115 10, 13, 19—24
EXF 172 14
EXP 21 1—25
EXT 296 15
FIX 327 12, 19—21,
23, 24
FMT 70, 105 6
FRE 172, 329 19—24
HCS 296 15
HEX 186 17
HEX$, НЕХП 88, 186 19—24
HSN 296 15
HTN 296 15
IBAND 266 10
IBCLR 266 10
IBEOR 266 10
IBNOT 266 10
I BOR 266 10
IBSET 266 10
IBSHFT 266 10
IBTST 266 10
INP 329 20—24
INPUTS 329 20—24
INSTR 80 12, 19—24
INT 21 1—25
IOE 267 10
LEFT 80, 280 12
LEFTQ, LEFT$ 80 13, 18—24
LEN 80 1, 4, 11 — 13, 16—24
LGT 259 8, 15
LIN 106
LOC 115 1, 19—21, 23, 24
LOF 332 1, 21, 24
LOG 21 1—25
LOG10 272 11, 12, 16
LPOS 332 20—24
LTW 259 8
MID 80, 280 12
MIDQ, MID$ 80 18—24
MKDQ, MKD$ 88 19—21, 23, 24
MKIQ, MKI$ 88 19—21, 23, 24
MKSQ, MKS$ 88 19—21 23, 24
NCS 259 8
NSH 259 8
NTH 259 8
NUM 302 17
NUMQ, NUM$ 90 12
361
OCT OCTQ, OCT$ 186, 273 88, 186 H, 16 x 19—24
PEEK 173 18—24
Pen 193 21
pgr 70, 254 6
PLAY 347 22
POINT 162 21, 22
POS 80, 323 1,11 —13,16—24
PRT 250 4
RAD 259 8, 15
RCTRLC 274 11, 16
RCTRLO 274 11, 16
RIGHT 80, 280 12
RIGHTQ, RIGHTS 80 13, 18—24
RND 21, 51, 53 1—25
ROTATE 234 25
ROUND 303 17
RPT 70, 254 6
SCALE 234 25
SCREEN 336 21
SCRN 324 18
SEC 259 8
SEGQ, SEG$ 80 1, 11, 13, 16
SGN 21 1—6, 8—25
SHEAR 234 25
SHIFT 234 25
SIN 21 1—25
SPA 106
SPACE Q, SPACES 80 12, 19—24
SPC 70 19—24
SQR 21 1—25
STICK 194 21, 22
STR 80 17
STRQ, STR$ 80, 88 1, 11, 13, 16, 19—24
STRIG 195 21, 22
STRINGQ, STRINGS 80 12, 19—24
SYS 274 11, 16
TAB 35, 70 1—25
TAB 70 3
TAN 21 1 — 13, 15—25
TIC 197
TIM 244 3
TIME 284 12
TIMES 284 12
TRMQ 82 11, 16
TTYSET 274
USRn 173 18—24 r?
VAL 88 1, H — 13, 16—24
VARPTR 174 19—24
XLAT-E 86 12
УКАЗАТЕЛЬ ДИРЕКТИВ
APPEND 201 11, 13, 16
AS AVE 290 13
ASSIGN 208
AUTO 200 20—24
BLOAD 173,201 21, 22
BSAVE 349 21, 22
BYE 211
CAT 207
CATALOG 207 18
CHAIN 201 18
CLEAR 177 7, 11, 13, 16, 21—24
CLEAR V 177 7
CLOAD 201 22
CLOAD ? 209 22
COMPILE 279 11, 16
CONT 49 18, 21—24
CONTINUE 49 7, 13, 17
COPY 210 17
CSAVE 209 22
DATA LOAD BA/DA/DC 316 17
DATA SAVE BA/DA/DC 316 17
DEL 201, 270 10, 11, 16
DELETE 201, 208 13, 14, 18,
21—24
DIR 210
EDIT 202 21, 24
ERASE 208 13
EXTRACT 236 25
FILES 207 21, 24
GET 200 13
363
HALT/STEP
206 17
KILL 208 10, 21, 23, 24
LENGTH 279 11, 16
LIST 203 7, 10, 11, 13,
14, 16, 17—24
LIST DS 210 17
LIST 204
LIST V 204
LIST Q 204
LIST NH 204 11, 16
LIST S 204 7, 17
LLIST 204
LOAD 200 7, 10, 18, 20—
22, 24
LOAD DC 316 17 ‘
LOAD P 257 17
MERGE 201 10
MODE 251 4
MOTOR 209 21, 22
MOVE 210 17
MOVE END 210 17
NAME 207 21, 23, 24
NEW 199 11, 13, 16, 21,
22, 24
NOTRACE 325 18
OLD 200 11» 14, 16
PLIST 204 10
PROG 175 6
QUIT 211,290 13
REN
202
RENAME RENUM 202, 208 202 11, 16, 11 21, 22, 2<
RENUMBER 202 7, 13, 17
REPLACE 207 11, 16
RESET 319 17
RESEQ 202 11, 16
REWIND 209
364
RSAVE 290 13
RUN 205 7, 10, 11, 13,
14, 16, 18, 21,
22, 24
RUNNH 205 11, 16
SAVE 207 7, 10, 11, 13,
14, 16, 18, 21,
22, 24
SAVE DC 316 17
SAVED 313 17
SCR 279 11, 16
SCRATCH DISK 210 17
SELECT 208 17
SIZE 290 13
SKIP 209
STEP 206 13
STMT NO 200 17
STOP 257
SUB 175, 202 6, 11, 16
SYSTEM 211 21—24
TRACE 206 17, 18
TRACE OFF 206 7, 17
TRACE ON 206 7
TRON 206
TROFF 206
UNSAVE 208 11, 16
XEQUTE
205 13
Кетков Юлий Лазаревич
ДИАЛОГ НА ЯЗЫКЕ БЕЙСИК
для мини. И МИКРОЭВМ
Редактор О. И. Сухова
Художественный редактор Т. Н. Кольченко
Технический редактор С. Я. Шкляр
Корректор И. Я • Кришталь
ИБ № 32647
Сдано в набор 10.08.87. Подписано к печати 30.03.88.
Т-10572. Формат 84X108/32.
Бумага тип. Хе 2. Гарнитура литературная.
Печать высокая. Усл. печ. л. 19,32. Усл. кр.-отт. 19,32.
Уч.-изд. л. 23,25. Тираж 200 000 экз.
Заказ Хе 8—184. Цена 1 р. 80 к.
Ордена Трудового Красного Знамени
издательство «Наука»
Главная редакция
физико-математической литературы
1 17071 Москва В-71, Ленинский проспект, 15
Ордена Октябрьской Революции
и ордена Трудового Красного Знамени
МПО «Первая Образцовая типография»
имени А. А. Жданова Союзполиграфпрома
при Государственном комитете СССР
по делам издательств, полиграфии
и книжной торговли.
1 13054 Москва, Валовая, 28
Отпечатано на Киевской книжной фабрике
252054 Кнев-54, Воровского, 24
СЕРИЯ «БИБЛИОТЕЧКА ПРОГРАММИСТА»
1. А. Л. Бр у д н о. Алгол.—1958.
2. Ж. Б е р т э н, М. Р и т у, Ж. Р у ж и ё. Работа ЭВМ с разде-
лением времени / Пер. с франц.; Под ред. С. С. Лаврова.—1970.
3. С. С. Лавров, Л. И. Гончарова. Автоматическая об-
работка данных (хранение информации в памяти ЭВМ).—1971.
4. А. Л. Б р у д н о. Алгол.— Изд. 2-е.—1971.
5. В. А. Васильев. Язык алгол-68. Основные понятия / Под
ред. С. С. Лаврова.—1972.
6. Ю. А. П е р в и н. Основы фортрана. —1972.
7. Ж- Б е р т э н, М. Р и т у, Ж- Р у ж и ё. Работа ЭВМ с разде-
лением времени.— Изд. 2-е. —1972.
8. И. Л. Б р а т ч и к о в. Синтаксис языков программирования /
Под ред. С. С. Лаврова. —1975.
9. Л. Дж. Коэн. Анализ и разработка операционных систем /
Пер. с англ.; Под ред. В. Ф. Тюрина. —1975.
10. Д. Уолш. Руководство по созданию документации для мате-
матического обеспечения / Пер. с англ.; Под ред. Н. И. Коз-
лова.—1975.
11. Б. М. П а в л о в, И. Н. Посохов. Математическое обеспе-
чение ЭВМ типа М-20. —1975.
12г В. Я. Карпов. Алгоритмический язык фортран. Фортран-
Дубна / Под ред. Н. Н. Говоруна.—1976.
13. А. И. С а л т ы к о в, Г. И. Макаренко. Программирова-
ние на языке фортран / Под ред. Н. Н. Говоруна. —1976.
14. В. Н. Б у с л е н к о. Автоматизация имитационного модели-
рования сложных систем / Под ред. и с послесловием
Н. П. Бусленко. —1977.
15. В. Ф. Д е м и н, Л. В. Д о б р о л ю б о в, В. А. С т е п а н о в.
Системы программирования на алголе / Под ред. Е. А. Гребе-
никова.— 1977.
16. Г. М. Адельсон-Вельский, В. Л. Арлазаров,
М. В. Д о н с к о й. Программирование игр.-^1978.
17. В. В. Кобелев. Машинная графика для системы БЭСМ-
алгол / Под ред. Г. Г. Рябова. —1978.
18. С. С. Лавров, Г. С. С и л а г а д з е. Автоматическая обра-
ботка данных. Язык лисп и его реализация. —1978.
19. Г. Д. М а з н ы й. Программирование на БЭСМ-6 в системе
«Дубна» / Под ред. Н. Н. Говоруна.—1978.
20. Г. Г. Белоногов, А. П. Новоселов. Автоматизация
процессов накопления, поиска и обобщения информации. —1979.
21. Ф.П. Брукс мл. Как проектируются и создаются програм-
мные комплексы. Мифический человеко-месяц. Очерк по систем-
ному программированию / Пер. с англ.; Под ред. А. П. Ер-
шова.—1979.
22. Н. П. Брусенцов. Миникомпьютеры / Под ред. Л. Н. Ко-
ролева.— 1979.
23. В. Ф. Жиров. Математическое обеспечение и проектирова-
ние структур ЭВМ / Под ред. Л. Н. Королева.—1979.
24. Транслятор альфа-6 в системе «Дубна» / Под ред. А. П. Ер-
шова.—1979.
25. С. А. Усов. Диалоговый монитор Димон / Под ред. В. М.
Брябрина.—1970.
26. Ю. М. Безбородов. Сравнительный курс языка PL/1 (на
основе алгола-60). —1980.
367
27. В. Р. X и с а м у т д и н о в, В. С. А в р а м е н к о, В. И. Ле-
г о н ь к о в. Автоматизированная система информационного
обеспечения разработок.—1980.
28. Н. И. К о з л о в. Организация вычислительных работ.—1981.
29. М. К р э й н, О.* Л е м у а н. Введение в регенеративный метод
анализа моделей / Пер. с англ.; Под ред. В. В. Калашникова.—
1982.
30. Ю. М. Б е з б о р о д о в. Индивидуальная отладка программ.—
1982.
31. Л. А. Осипов. Язык аналитик и его сравнение с языками
алгол и фортран.— 1982.
32. В. М. П е н т к о в с к и й. Автокод Эльбрус/ Под ред. А. П.
Ершова.—1982.
33. С. Н. Бушев, М. С. Бесфамильный. Программно-
аппаратные методы управления данными / Под ред. С. В. Емелья-
нова.— 1982.
34. К. Ж а б л о н, Ж- К. С и м о н. Применение ЭВМ для числен-
ного моделирования в физике / Пер. с франц.; Под ред.
В. В. Александрова и Ю. С.Вишнякова. —1983.
35. 3. Д. У с м а н о в, Т. И. Хаитов. Программирование сос-
тояний коллекций.— 1983.
36. Г. Г. Б е л о н о г о в., Б. А. К У з н е ц о в. Языковые средства
автоматизированных информационных систем.—1983.
37. В. Н. Пильщиков. Язык плэнер.—1983.
38. Ю. М. Безбородов. От фортрана к PL/1. —1984.
39. А. И. С а л т ы к о в, Г. И. М а к а р е н к о. Программирова-
ние на языке фортран. Изд. 2-е,—1984.
40. А. В. Гуляев, Н. В. Макаров-Землянский,
И. В. М а щ е ч к и н. Диалоговый комплекс программ Краб /
Под ред. Л. Н. Королева.—1985.
41. В. А. Евстигнеев. Применение теории графов в програм-
мировании / Под ред. А. П. Ершова.—1985.
42. В. Ф. Т ю р и н. Операционная система Диспак.—1985.
43. А. Н. А н д р и а н о в, С. П. Бычков, А. И. Хороши-
лов. Программирование на языке симула-67.—1985.
44. Ю. М. Б а я к о в"с к и й, В. А. Г а л а к т и о н о в, Т.Н. Ми-
ха й л о в а. Графор. Графическое расширение фортрана.—1985.
45. С. А. Абрамов. Элементы анализа программ.—1986.
46. В. И. 3 у е в, В. М. К р ю к о в, В. И. Л е г о н ь к о в. Управ-
ление данными в вычислительном эксперименте.—1986.
47. Е. Г. О й х м а н, Ю. В. Зюзин, Ю. В. Н о в о ж е н о в.
Графические системы для СМ ЭВМ.—1986.
48. В. И. 3 в е р е в, Ю. Л. К ет к о в, В. С. М а к с и м о в. Ал-
фавитно-цифровые дисплеи ЕС-7920 в диалоговых системах.—
1986.
49. Г. К. Б о р о в и н, М. М. К о м а р о в, В. С- Я р о ш е в-
с к и й. Ошибки — ловушки при программировании на форт-
ране.—1987.
50. В. А. У с п е н с к и й, А. Л. С е м е н о в. Теория алгоритмов:
основные открытия и приложения.—1987.
51. Г. П. Семашко, А. И. Салтыков. Программирование
на языке паскаль.—1988.
52. В. К. Власов, Л. Н. Королев, А. Н. Сотников.
Элементы информатики.—1988.
1 р. 80 к.