Текст
                    ПЕРСОНАЛЬНЫЕ ЭВМ
ЕДИНОЙ СИСТЕМЫ
БЕЙСИК
БЕЙСИК
БЕЙСИК
БЕЙСИК
БЕЙСИК
БЕЙСИК
БЕЙСИК
БЕЙСИК
БЕЙСИК
БЕЙСИК
БЕЙСИК
БЕЙСИК
БЕЙСИК


Н.А. КУЧУРА, М.В. ХОДОШ, В.И. ЦАГЕЛЬСКИЙ ПЕРСОНАЛЬНЫЕ ЭВМ ЕДИНОЙ СИСТЕМЫ БЕЙСИК МОСКВА ''ФИНАНСЫ И СТАТИСТИКА' 1988
ББК 32.973—01 К95 УДК 681.3.06 Рецензент кандидат технических наук 3. П. Вострикова ■ ' системы: Бейсик/ И, Цагельский. — задач на персональных про- . юй системы используется язык Даются> элементы языка Бейсик--(опе- $;^фуйкций), типы7данных, файлы. Приво¬ дятся примеры -программ, подробно комментируется их по- строение и выполнение1 на ПЭВМ. Раскрываются возмож¬ ности языка по управлению цветом, обработке графической информации и воспроизведению мелодий. Для широкого круга читателей, начинающих использо¬ вать персональную ЭВМ ЕС в своей профессиональной дея¬ тельности. К 2405000000—078 010(01)—88 114—88 ББК 32.973—01 ISBN 5-279-00112-0 © Издательство «Финансы и статистика», 1988
ПРЕДИСЛОВИЕ Персональные ЭВМ (ПЭВМ) — это новое быстро развиваю¬ щееся направление вычислительной техники, возникновение кото¬ рого связано с достижениями в области микроэлектроники, схемо¬ техники и технологии ПЭВМ различны по своим возможностям и назначению и находят широкое применение практически во всех сферах человеческой деятельности. Обычно выделяют три класса таких машин; бытовые, учебные и профессиональные. ПЭВМ Еди¬ ной Системы (ПЭВМ ЕС) относятся к классу профессиональных. Они предназначены для использования на рабочих местах конст¬ рукторов, технологов, ученых, экономистов, руководящих работни¬ ков, врачей и т. д. Умение программировать — не обязательное условие для ис¬ пользования ПЭВМ в практической деятельности, однако знание какого-либо языка программирования позволяет более осознанно использовать ПЭВМ и самостоятельно находить новые области их применения. Хотя на ПЭВМ может использоваться много различ¬ ных языков программирования, Бейсик занимает среди них особое место. Богатые выразительные средства, простота в изучении и использовании — все это способствует широкой популярности Бей¬ сика среди пользователей ПЭВМ. Бейсик входит в состав программного обеспечения почти всех выпускаемых в настоящее время ПЭВМ. Разработчики ПЭВМ, как правило, включают в реализуемую версию языка средства, позво¬ ляющие использовать все возможности, предоставляемые аппара¬ турой конкретной ПЭВМ. Благодаря этому для пользователя, не являющегося профессиональным программистом (а таких пользо¬ вателей ПЭВМ большинство), Бейсик выполняет роль «базового» языка подобно языку ассемблера для профессионального програм¬ миста. Бейсик, описанный в этой книге, предназначен для использова¬ ния на персональных ЭВМ Единой системы и других совместимых с ними ПЭВМ. Его реализация включает интерпретатор, который может функционировать в операционных системах М86 и Альфа- ДОС, а также компилятор для операционной системы Альфа-ДОС. В версиях языка, поддерживаемых интерпретатором и компилято¬ ром, имеются незначительные различия, которые связаны с особен¬ ностями их функционирования. В основу книги положена версия языка для интерпретатора. Это объясняется более широким распространением интерпретатора, который часто является не только инструментом программирования, но и просто средством общения с ПЭВМ. Книга является практическим изданием и прежде всего рас¬ считана на читателей, уже знакомых с основами программирования. При ее написании авторы ставили перед собой две задачи: поста¬ раться полностью охватить имеющиеся в Бейсике ПЭВМ ЕС воз¬ можности и изложить материал таким образом, чтобы книгу можно было использовать как справочник при работе на машине. Особое внимание уделено конструкциям языка, наличие которых обуслов¬ лено такими специфическими для ПЭВМ возможностями, как гра¬ фика, воспроизведение звука и т. д. Дано краткое описание тех¬ нических средств ПЭВМ, рассмотрены вопросы, связанные с рабо¬ 3
той интерпретатора: встроенный экранный редактор, использование клавиатуры. Эта книга может быть использована и начинающими програм¬ мистами, которым придется приложить немного больше усилий. Лучший способ изучить программирование на Бейсике — самостоя¬ тельно разобрать примеры программ, приведенные в книге. Изуче¬ ние окажется еще более плодотворным, если параллельно с чте¬ нием выполнять приведенные примеры на ПЭВМ. В книге содержит¬ ся информация, касающаяся специальных вопросов функциониро¬ вания ПЭВМ, такие места при первоначальном чтении могут быть опущены. Материал книги разбит на четыре части. Часть 1 можно рассматривать ’ как введение, содержащее на¬ чальные сведения, необходимые для работы с Бейсиком на ПЭВМ ЕС. Здесь важное значение для дальнейшего чтения имеет глава 3, в которой описан интерпретатор Бейсика, являющийся основным средством разработки программ. Части 2 и 3 содержат описание «классического» ядра Бейсика. В части 2 рассматриваются константы, объявления переменных, выражения, операторы присваивания и управления. Часть 3 пол¬ ностью посвящена вводу-выводу. Надеемся, читатель с пониманием отнесется к тому факту, что материал части 2 мало иллюстриро¬ ван примерами. Во-первых, для подготовленного читателя (а имен¬ но ему в первую очередь адресована книга) этот материал будет понятен и без обилия примеров. Во-вторых, описанные здесь эле¬ менты языка широко используются в примерах, приведенных в по¬ следующих главах; в то же время, взятые отдельно сами по себе, они недостаточны для построения логически законченных при¬ меров. В части 4 рассматриваются средства языка, расширяющие тра¬ диционные возможности Бейсика при его использовании на ПЭВМ, а также средства, предназначенные для разработки программ. Ос¬ новное внимание здесь уделено работе с графикой и встроенным динамиком. В приложениях дана справочная информация: список зарезер¬ вированных слов, таблица кодов ПЭВМ, перечень всех операторов, команд и функций Бейсика в алфавитном порядке. Некоторые особенности языка Бейсик, не влияющие на общее понимание, не нашли отражения в этой книге, так как полное опи¬ сание всех подробностей увеличило бы объем и затруднило ее чтение. Более подробные сведения о языке Бейсик читатель может найти в технической документации.
ЧАСТЬ 1 ВВЕДЕНИЕ В СИСТЕМУ ПРОГРАММИРОВАНИЯ БЕЙСИК ГЛАВА 1. ОБЩИЕ СВЕДЕНИЯ Состав системы программирования Под системой программирования обычно понимает¬ ся совокупность языка и программных средств, обес¬ печивающих его использование на конкретной ЭВМ, Основным назначением системы программирования яв¬ ляется разработка и выполнение программ, написан¬ ных на языке этой системы. Бейсик ПЭВМ ЕС — язык программирования высо¬ кого уровня. Он включает все, что традиционно вклю¬ чает любая реализация языка Бейсик, а также имеет ряд дополнений, обусловленных возможностями аппа¬ ратуры ПЭВМ ЕС и позволяющих значительно расши¬ рить класс решаемых задач. В Бейсике ПЭВМ ЕС реа¬ лизованы следующие основные возможности: • четыре типа данных: целые (от —32768 до + 32767), вещественные с простой точностью (7 деся¬ тичных цифр), вещественные с двойной точностью '(16 десятичных цифр), строки символов (до 255 сим¬ волов) ; • многомерные массивы; • последовательные файлы и файлы с произвольным доступом; • воспроизведение звука; • работа с графикой; • работа с таймером; • форматный вывод; • прямое обращение к основной памяти и портам; • использование подпрограмм на машинном языке; • обработка ошибочных ситуаций и некоторых дру¬ гих событий; • средства отладки; • широкий набор встроенных функций. Существуют два основных способа реализации язы¬ ка программирования: интерпретация и компиляция.
Соответственно этому имеются два типа программ, которые могут входить в состав систем программиро¬ вания: интерпретаторы и компиляторы. Система прог¬ раммирования Бейсик ПЭВМ ЕС включает интерпре¬ татор и компилятор. Такое решение во многих отно¬ шениях оптимально. Интерпретатор чрезвычайно эф¬ фективен в процессе разработки и отладки программ и в первую очередь используется именно для этих це¬ лей. Для многих пользователей он вообще* оказывается основным средством использования ПЭВМ. Для некоторых применений, однако, быстродействие интерпретатора при выполнении программы может ока¬ заться недостаточным. В этих случаях целесообразно использовать компилятор. Хотя компилятор сложнее в использовании, он обеспечивает более высокую скорость выполнения программ. Редактор связей и библиотека стандартных функций, необходимые для работы с ком¬ пилятором, также входят в состав системы Бейсик. Структура программы Программа на Бейсике представляет собой после¬ довательность строк. Каждая из строк содержит номер и информационную часть. Номер строки — целое число, которое может содер¬ жать от 1 до 5 цифр и принимать значения от 0 до 65529. Номера строк определяют порядок размещения строк в программе. Они также используются для ука¬ зания строк при передаче управления и редактиро¬ вании. Информационная часть состоит из одного или не¬ скольких операторов (команд), а также может вклю¬ чать комментарий. Наличие в языке операторов и команд традиционно для интерпретируемых языков. Опе¬ раторы служат для реализации алгоритма программы, а команды, как правило, предназначены для управле¬ ния работой самого интерпретатора. Если строка со¬ держит несколько операторов, то они должны разде¬ ляться двоеточиями. Комментарий размещается после всех операторов и отделяется от них апострофом. В Бейсике используются английские ключевые сло¬ ва. Значение ключевого слова, как правило, отражает назначение оператора, функции или команды. 6
Пример. 10' Небольшая иллюстрация 20D$=DATE$: R$=RIGHT$(D$, 2) ' Получить дату; выделить год 30 PRINT "Сегодня "; D$ ' Выдать дату 40 PRINT "До конца столетия меньше" (100—VAL (R$)); "лет" 50END Обозначения Для описания конструкций языка в книге приняты некоторые соглашения и обозначения. Ключевые слова при задании общего вида (формата) оператора, коман¬ ды или функции напечатаны прописными буквами. В программе они должны быть представлены в том виде, как показаны в формате. При записи ключевых слов допускается использование и прописных, и строчных букв. Курсив используется в форматах для обозначения операндов и параметров. При написании программы они должны быть заменены соответствующими значе¬ ниями. Элементы, заключенные в квадратные скобки, яв¬ ляются необязательными и могут быть использованы, или опущены по желанию программиста. Многоточие означает возможность повторения. Пред¬ шествующий ему элемент конструкции может быть не¬ однократно повторен. Все другие специальные знаки должны быть запи¬ саны в программе в строгом соответствии с требова¬ ниями формата. В качестве примера приведем формат оператора PRINT, используемого в рассмотренной выше прог¬ рамме: PRINT [выражение[,выражение\ ... ] [;] В тексте книги числа, как правило, представлены в десятичной системе счисления. В тех случаях, когда для наглядности удобнее воспользоваться двоичной, восьмеричной или шестнадцатеричной системой, исполь¬ зуется форма записи чисел, принятая в языке Бейсик. ГЛАВА 2. СОСТАВ ПЕРСОНАЛЬНОЙ ЭВМ Как и в случае «больших» ЭВМ, с точки зрения программиста, ПЭВМ удобно представлять как вычис- 7
Рис 2.1. Общий вид ПЭВМ ЕС1841 лительную систему, состоящую из процессора, памяти и периферийных устройств. В стандартный комплект периферийных устройств ПЭВМ ЕС входят клавиату¬ ра, дисплей, диски и печатающее устройство. На рис. 2.1 приведен общий вид ПЭВМ ЕС1841. Для повышения вычислительных возможностей и расширения сферы применения к ПЭВМ могут дополнительно подключать¬ ся и другие периферийные устройства. Приводимые ниже сведения об отдельных компонен¬ тах ПЭВМ необходимы для понимания рассматривае¬ мых в книге вопросов. Они не являются исчерпываю¬ щими и в большинстве случаев не дают глубокого пред¬ ставления о конструктивных особенностях и особеннос¬ тях функционирования аппаратуры ПЭВМ. Тем, кто хочет познакомиться с этим ближе, рекомендуем обра¬ титься к книге [4]. Процессор Процессор является основой ПЭВМ и управляет работой всех компонентов вычислительной системы в процессе выполнения программы. Он состоит из нес¬ кольких функциональных узлов, центральное место сре¬ ди которых занимает микропроцессор К1810ВМ86. Это современный 16-разрядный микропроцессор, имеющий мощный набор команд и достаточно высокую скорость их выполнения. 8
Управление работой других компонентов (функцио¬ нальных узлов) ПЭВМ выполняется с использованием специальных регистров, называемых портами. Через порт может передаваться управляющая информация (команды для соответствующих устройств или узлов) и данные. Каждый порт идентифицируется собственным адресом и связан с конкретным устройством или функ¬ циональным узлом. Среди функциональных узлов процессора отметим таймер, который представляет собой набор специальных счетчиков. Счетчики запрограммированы на определен¬ ный промежуток времени, по истечении которого они вырабатывают сигнал-прерывание. Эти сигналы могут восприниматься программами, в частности операцион¬ ной системой, как сигналы отсчета времени. Память В ПЭВМ ЕС можно выделить три уровня памяти: постоянную память, основную (или оперативную) па¬ мять и внешнюю память. Постоянная память содержит так называемую ба¬ зовую систему ввода-вывода и доступна только для чтения информации. Она предназначена для исполь¬ зования процессором, и проблемные программы, как правило, доступа к ней не имеют. Основная (оперативная) память предназначена для кратковременного хранения информации, служит для размещения выполняемых программ и обрабатываемых ими данных. Процессор может выполнить программу только в том случае, если она находится в основной памяти, поэтому для выполнения программы ее пред¬ варительно нужно туда поместить. Основным структурным элементом памяти является байт—минимально адресуемая ячейка памяти. Он спо¬ собен хранить восемь двоичных разрядов (битов) ин¬ формации, которые в зависимости от контекста могут представлять символ, число, логическую величину и т. д. Любые два смежных байта образуют 16-битное слово, которое также может использоваться как единица об¬ мена данными при работе с памятью. Емкость памяти принято, измерять в килобайтах. Один килобайт (1 Кбайт) включает 1024 байта. ПЭВМ ЕС стандарт¬ 9
но имеют объем основной памяти 512 Кбайт, который может быть увеличен до 640 Кбайт. 16-разрядная архитектура микропроцессора ограни¬ чивает адресное пространство памяти объемом 64 Кбай¬ та. Для его увеличения используется специальный ме¬ ханизм сегментации памяти, который позволяет исполь¬ зовать 20-разрядный адрес памяти и, таким образом, адресовать память объемом до одного мегабайта (1 Мбайт равен 1024 Кбайта). Дополнительную инфор¬ мацию об организации работы с сегментированной па¬ мятью можно найти в гл. 16. Внешняя память предназначена для длительного хранения информации и чаще всего входит в состав ЭВМ как периферийное устройство. В качестве внеш¬ ней! памяти в ПЭВМ ЕС стандартно используются маг¬ нитные диски, описание которых приводится дальше в этой главе. Клавиатура Клавиатура — стандартное устройство ввода инфор¬ мации, основное средство взаимодействия пользователя с ПЭВ/М. При нажатии любой клавиши на клавиатуре процессору передается код, который является порядко¬ вым номерОхМ нажатой клавиши. Этот номер однознач¬ но идентифицирует клавишу и может использоваться программами для определения, какая клавиша была нажата. Для тех клавиш, на которых изображены сим¬ волы, имеющиеся в таблице кодов ПЭВМ (буквы, циф¬ ры и т. д.), базовая система ввода-вывода позволяет вместо номера клавиши получать код соответствующе¬ го символа, что часто является более удобным для об¬ рабатывающей программы. Таблица кодов и соответ¬ ствующих им символов (если таковые имеются) при¬ ведена в приложении 2. На рис. 2.2 показана схема расположения клавиш ПЭВМ ЕС1841. В левом нижнем углу прямоугольни¬ ка, изображающего клавишу, приведен ее номер. На клавиатуре ПЭВМ выделены три поля клавиш: * поле клавиш основного набора, расположенное в средней части клавиатуры, используется для ввода букв, цифр и специальных символов; * поле функциональных клавиш Ф1 — Ф10 располо¬ жено слева от клавиш основного набора. Функциональ- 10
о □J £ 2Q СТ) co 1 * ОТА ш 'а го О* ..£ + V . уо [со ш м . 3* S,, <г 1, _ s 1 °яй I - "х а •Г II а 11 — о № * СО в» *9 Г~- ® < ш X 1Л <г л & го О СМ "7*? [П |ё t I0’ я -О X Я Q. СП 2 о Э s •—« =L_£ >• 3Z £ »— Ш S ОС ? LU m с 3 ,=f F, CS s © 1L 4 g? ~ * • • * я ±Js Г1 СП ® L-J * S ■$ а Г7 О Я X &_SI о CZ 8 и. < я о СО Я w j?fe f < В н §Lg 8«1 ф=: Й А д V R U-I « е г« Ш й £ -О Я 2 Ь- д 00 3Z Я. — > к t о о Н X □" а гм се а ф==. % § «з я! Q-, H S oi с4 о S см <r i в И со €> $ со В S? о Лв го е 8 кЛ j=Lfe) г- е. от В 9 И
ньте клавиши обычно используются для ввода строк символов. Кроме того, с их помощью можно органи¬ зовать управление выполнением программы посредст¬ вом внешних прерываний (см. гл. 11); • поле клавиш цифрового набора расположено спра¬ ва от клавиши основного набора. Оно может исполь¬ зоваться для ввода числовых данных, однако чаще ис¬ пользуется для управления движением курсора на эк¬ ране дисплея. Для ввода букв русского и латинского алфавитов используются одни и те же клавиши. Выбор алфавита осуществляется с помощью клавиш ЛАТ, РУС и Р/Л; выбор строчных или прописных букв осуществляется с помощью клавиш ft и ФПБ. Об окончании набора информации на клавиатуре и необходимости ее передачи в обработку обычно со¬ общается нажатием клавиши ВВОД. Эта клавиша со¬ ответствует символу «возврат каретки» в таблице сим¬ волов ПЭВМ. Клавиша ПЕЧ вызывает вывод «твердой копии» эк¬ рана на печатающее устройство. Клавиатура ПЭВМ допускает использование . не только отдельных клавиш, но и их комбинаций, т. е. нескольких клавиш, нажатых одновременно. Комбина¬ ции клавиш используются, как правило, для выполне¬ ния специальных функций. Комбинация клавиш УПР-ЦИФ переводит ПЭВМ в режим паузы. Эта возможность может понадобиться, например, для приостановки вывода на экран или пе¬ чатающее устройство. Пауза заканчивается при нажа¬ тии любой клавиши. Комбинация клавиш УПР-ПЕЧ устанавливает ре¬ жим протоколирования работы с экраном. В этом ре¬ жиме любой текст, посылаемый на экран, будет одно¬ временно выводиться и на печатающее устройство. Режим отменяется при повторном нажатии этих кла¬ виш. Посредством клавиши ДОП можно ввести любой из имеющихся в таблице ПЭВМ символов, задавая его код в виде десятичного числа от 0 до 255. Для этого необходимо ввести код требуемого символа при нажа¬ той клавише ДОП. Код должен набираться с помощью клавиш, расположенных в поле клавиш цифрового на¬ бора. 12
Дисплей Дисплей является основным средством оперативно¬ го вывода информации. ПЭВМ могут оснащаться ал¬ фавитно-цифровыми или графическими дисплеями. Ал¬ фавитно-цифровые дисплеи являются монохромными (од¬ ноцветными). Они могут отображать на экране тексто¬ вую информацию и набор так называемых псевдогра¬ фических символов, из которых удобно формировать рисунки (таблицы, рамки и т. д.). Полный набор сим¬ волов, используемых в персональных электронных вы¬ числительных машинах, приведен в приложении 2. Эк¬ ран алфавитно-цифрового дисплея менее утомителен для глаз, чем экран графического дисплея, и поэтому для некоторых применений его использование предпоч¬ тительнее. Изобразительные возможности графических диспле¬ ев значительно шире: наряду с текстовой информацией на экран могут выводиться сложные рисунки, которые представляют собой мозаичную картину — элементами мозаики являются светящиеся точки. Графический ди¬ сплей позволяет программно управлять цветом све¬ чения каждой отдельной точки. Графические дисплеи могут быть цветными или мо¬ нохромными. В отличие от цветного точки экрана моно¬ хромного дисплея могут окрашиваться только в один из двух цветов, обычно называемых белым и черным, хотя реальные цвета могут быть иными. Монохромные дисплеи часто имитируют цвет, используя различ¬ ные степени яркости для передачи цвета точек. По¬ скольку при программировании такие дисплеи идентич¬ ны цветным, в дальнейшем будем рассматривать толь¬ ко цветные дисплеи. Графический дисплей может работать в одном из двух режимов: текстовом или графическом. В текстовом режиме возможен вывод на экран толь¬ ко текстовой информации подобно алфавитно-цифрово¬ му дисплею. В графическом режиме возможен вывод графи¬ ческой и текстовой информации. В текстовом режиме для окраски символов могут использоваться 16 различ¬ ных цветов; в графическом режиме на экране одновре¬ менно могут находиться точки четырех различных цветов. 13
Диски Магнитные диски используются в качестве внешней памяти и служат для долговременного хранения ин¬ формации— программ, архивных данных и т. д. Диски бывают двух типов: гибкие сменные и жесткие несъем¬ ные. Соответственно этому в состав ПЭВМ могут вхо¬ дить два типа периферийных устройств: накопители на гибких магнитных дисках (НГМД) и накопители на жестких магнитных дисках (НМД). Гибкий магнитный диск (дискета) представляет со¬ бой круглую пластину, покрытую магнитным слоем и заключенную в пластмассовый конверт. Максимальная полезная емкость отдельной дискеты при работе в опе¬ рационной системе Альфа-ДОС равна 360 Кбайт, а при работе в операционной системе М86 — 320 Кбайт. Дискета является сменным носителем информации. Ис¬ пользуя библиотеки дискет, можно создавать значи¬ тельные по объему архивы данных. Для жестких магнитных дисков, называемых также «винчестерскими дисками», характерны большая ем¬ кость и высокая скорость работы. Жесткие магнитные диски непосредственно встроены в накопитель и вместе с ним заключены в герметизированный корпус. Емкость дисков этого типа не меньше 10 Мбайт. Программиро¬ вание ввода-вывода в Бейсике для гибких и жестких магнитных дисков идентично. Поэтому в дальнейшем мы будем, как правило, использовать обобщенный тер¬ мин «диски», понимая под этим диски обоих типов. Печатающее устройство На устройство печати можно выводить различную текстовую информацию — отчеты, таблицы, деловые письма и т. д. Печать может осуществляться на непре¬ рывную бумажную ленту или на отдельные листы (в частности, могут использоваться стандартные бланки для различных документов). Напечатаны могут быть практически все символы из набора символов ПЭВМ. Исключение составляют символы, коды которых исполь¬ зуются для управления устройством печати (для выбо¬ ра шрифтов, установки режимов работы и т. д.). Пе¬ чатающее устройство имеет программно-загружаемый знакогенератор и благодаря этому может работать с разными кодовыми наборами. 14
ГЛАВА 3. РАБОТА С БЕЙСИКОМ НА ПЭВМ Как уже говорилось ранее, система Бейсик включа¬ ет интерпретатор и компилятор с общим входным язы¬ ком. Они органично дополняют друг друга, и у поль¬ зователя имеется возможность выбрать тот из них, ис¬ пользование которого в данный момент предпочтитель¬ нее. В частности, для разработки и отладки программ, как правило, используется интерпретатор, имеющий встроенный экранный редактор текстов. В данной гла¬ ве приводятся начальные сведения о работе с интер¬ претатором. Они могут оказаться полезными, если в процессе чтения книги имеется возможность опробовать приводимые в ней примеры непосредственно на ПЭВМ. Дополнительные сведения об особенностях работы с интерпретатором и компилятором приведены в прило¬ жении 3. Вызов интерпретатора Бейсик функционирует под управлением операцион¬ ной системы. Это значит, что к моменту запуска Бей¬ сика операционная система должна быть загружена и подготовлена к работе. О готовности операционной сис¬ темы к работе свидетельствует появление на экране системной подсказки (иногда ее называют приглаше¬ нием к работе). Системная подсказка представляет со¬ бой логический номер текущего накопителя на магнит¬ ных дисках, за которым следует знак >. Логический номер представляется десятичной цифрой 1, 2, 3, ... (вместо цифр могут использоваться буквы латинского алфавита, соответственно А, В, С ...). Вызов интерпретатора осуществляется по команде BASICM86. На рис. 3.1 показана последовательность экранов, отражающая процедуру вызова. На послед¬ нем экране изображена начальная заставка Бейсика. В верхней части заставки располагается идентифици¬ рующая интерпретатор информация. Нижняя строка экрана также является информационной — в ней ото¬ бражаются стандартные значения функциональных кла¬ виш Ф1 — Ф10. При запуске интерпретатора с этими клавишами связываются наиболее часто используемые команды Бейсика. Значения функциональных клавиш могут быть изменены в процессе работы с помощью оператора KEY (см. гл. 11). 15
1 > BASICM86 Л ПО ПЭВМ ЕС БЕЙСИК М86 ИЗДАНИЕ 02 МОДИФИКАЦИЯ 02.00 60290 БАЙТ ДОСТУПНО БЕЙСИК: 1LIST 2RUN 3LOAD 4SAVE 5CONT 6.LPT1 7TRON 8TR0FF 9KEY 0SCREEN Рис 3.1. Вызов интерпретатора Работа с интерпретатором происходит в режиме диалога. Активной стороной в этом диалоге является пользователь. Он вводит с клавиатуры отдельные ко¬ манды или операторы для их непосредственной интер¬ претации либо может создать из них программу, ко¬ торая позже будет выполняться целиком. Уровень команд Признаком того, что интерпретатор готов к вводу и выполнению очередной команды или оператора, явля¬ ется сообщение БЕЙСИК:, которое выводится на экран дисплея. Это сообщение мы будем называть подсказ¬ кой Бейсика, или приглашением Бейсика к работе. По¬ явление подсказки означает, что интерпретатор нахо¬ дится в состоянии, которое определяется как уровень команд. В этом состоянии интерпретатор может либо непосредственно выполнять команды и операторы Бей¬ сика сразу после их ввода (режим прямой интерпрета¬ ции), либо включать их в программу. Поведение ин¬ терпретатора здесь будет зависеть от того, в какой форме вводятся команды и операторы, точнее от того, представлены ли они в форме строки программы (см. раздел «Структура программы» в гл. 1). Если введенная строка начинается с номера строки, интерпретатор считает, что она является частью прог¬ 16
раммы. Такие строки сохраняются в памяти, образуя программу, которая впоследствии может быть выпол¬ нена или сохранена на диске. Для выполнения прог¬ раммы нужно ввести команду RUN, для сохранения — команду SAVE. Необходимо отметить, что интерпрета¬ тор может работать только с программами, размещен¬ ными в основной памяти. Поэтому для выполнения лю¬ бой обработки программы, которая ранее была запи¬ сана на диск, эту программу предварительно нужно прочитать в основную память (например, с помощью команды LOAD). Если номер во введенной строке отсутствует, интер¬ претатор выполняет содержащиеся в ней команды и операторы в режиме прямой интерпретации, т. е. сразу после ввода строки. Такая работа напоминает работу с калькулятором. Режим прямой интерпретации инте¬ ресен тем, что позволяет непосредственно наблюдать результат выполнения команды или оператора. Интерпретатор находится на уровне команд с мо¬ мента выдачи подсказки и до ввода команды RUN. Г" ч БЕЙСИК: 10 а=1 20 Ь=2 30 print a+b+1 run 6 БЕЙСИК: Л г БЕЙСИК: a=1;b=2; print a+b+1 6 БЕЙСИК: б) Рис 3.2. Пример работы с интерпретатором: а) ввод и выполнение программ; б) вычисление в режиме прямой интерпре- тации 2 Заказ 2G34 17
На рис. 3.2 показаны примеры выполнения одних и тех же вычислений в режиме прямой интерпретации и с помощью программы. Встроенный редактор текстов Редактор текстов, входящий в состав интерпретато¬ ра, является его неотъемлемой частью. Любой ввод, осуществляемый интерпретатором в процессе взаимо¬ действия с пользователем, выполняется посредством редактора текстов. Редактор Бейсика относится к экранным редакто¬ рам. Типичный экранный редактор позволяет отобра¬ зить на экране нужный фрагмент редактируемого текста и по мере его корректировки на экране вносит соот¬ ветствующие изменения в сам текст. Процесс работы с таким редактором сводится в основном к выполне¬ нию различных операций над фрагментом текста, отоб¬ раженного на экране в текущий момент. Внешне созда¬ ется впечатление, что редактор считывает информацию с экрана дисплея. Хотя на самом деле ничего подоб¬ ного не происходит, такой взгляд на работу редактора очень удобен для описания работы с ним, и поэтому мы иногда будем становиться на эту (не совсем правиль¬ ную) точку зрения, говоря о чтении строки с экрана. Редактор Бейсика позволяет работать с текстом по всему полю экрана дисплея, за исключением нижней строки, которая используется как информационная (см. рис. 3.1). Текущая позиция, в которой в данный момент будет выполняться редактирование, определяется кур¬ сором. Программа на Бейсике представляется для редак¬ тора в виде последовательности строк текста. Такие строки мы будем называть логическими, в отличие от физических строк экрана дисплея. Логическая строка может на экране располагаться в нескольких физичес¬ ких строках. Логическая строка является единицей обработки для редактора Бейсика. Хотя редактор позволяет коррек¬ тировать текст в любом месте экрана, фактическая кор¬ ректировка программы (не на экране, а в основной памяти) будет выполняться только в момент считыва¬ ния редактором соответствующей логической строки. Считывание выполняется при нажатии клавиши ВВОД, 18
причем редактор читает только одну логическую стро¬ ку— ту, на которую в текущий момент указывает кур¬ сор. Таким образом, любая выполненная на экране кор¬ ректировка будет отражена в программе только в том случае, если клавиша ВВОД была нажата в момент нахождения курсора в соответствующей строке. Значительная часть действий по редактированию текста осуществляется с помощью специальных клавиш или их комбинаций. Эти клавиши (комбинации кла¬ виш) перечисляются ниже вместе с описанием соответ¬ ствующих им действий редактора. 1\ УПР — |\ t , I УПР— УПР — кон УПР - кон вст удл ключ УПР — стоп Переместить курсор в верхний левый угол экрана. Очистить экран и переместить курсор в верхний левый угол экрана. Переместить курсор на одну строку соответственно вверх или вниз. Переместить курсор на одну позицию соответствен¬ но влево или вправо. Переместить курсор вправо к началу следующего слова (к ближайшей справа букве или цифре, ко¬ торой предшествует пробел или специальный сим¬ вол). Переместить курсор влево к началу предыдущего слова (к ближайшей слева букве или цифре, ко¬ торой предшествует пробел или специальный сим¬ вол). Переместить курсор в конец строки. Стереть информацию в строке, начиная с позиции курсора и до конца строки. Установить или отменить режим вставки. Если ре¬ жим установлен, очередной введенный символ бу¬ дет помещен в позицию курсора. Символ, который размещался в этой' позиции, и все символы справа от него сдвигаются на одну позицию вправо. Для отмены режима вставки необходимо повторно на¬ жать эту клавишу. Режим вставки отменяется так¬ же и при нажатии любой клавиши управления курсором или клавиши ввода. Удалить символ в позиции курсора. Все символы строки справа от курсора передвигаются на одну позицию влево. Удалить последний введенный символ, т. е. сим¬ вол, находящийся слева от курсора. Все символы строки справа от курсора передвигаются на одну позицию влево. Стереть всю информацию в текущей строке. Прекратить редактирование и перейти на уровень команд. Изменения, сделанные в текущей строке, в программу не вносятся. Переместить курсор к следующей позиции табуля¬ ции. Редактор устанавливает позиции табуляции, начиная с первой, с шагом 8. Если эта клавиша используется в режиме вставки, то в пропускае- 2* 19
мне позиции вставляются пробелы. Если режим вставки не установлен, пропускаемые позиции ос¬ таются без изменения. УПР— ВВОД Переместить курсор в начало следующей (физи¬ ческой) строки экрана. ВВОД Выполнить ввод и обработку строки, на которую указывает курсор. Кроме того, интерпретатор позволяет использовать сокращения некоторых ключевых слов и упрощает та¬ ким образом процесс ввода, программы. В качестве сокращений используются начальные буквы ключевых слов в сочетании с клавишей ДОП. Допускается ис¬ пользование следующих сокращений: А — AUTO В — BSAVE С — COLOR D — DELETE е—-Else f —for G — GOTO H — HEX$ I — INPUT K —KEY L — LOCATE N — NEXT O—OPEN P —PRINT R — RUN S — SCREEN T—THEN U —USING V — VAL W —WIDTH X — XOR Редактирование строки Для того чтобы ввести любую строку, отображен¬ ную на экране, нужно переместить курсор на эту стро¬ ку и нажать клавишу ВВОД. При необходимости перед вводом текст строки может быть скорректирован. Об¬ работка логической строки начинается только после нажатия клавиши ВВОД, при этом редактор считывает целую логическую строку. Логическая строка может быть до 255 символов дли¬ ной и может занимать несколько физических строк. При наборе логической строки переход на новую физичес¬ кую строку можно осуществить одним из следующих способов: • при достижении конца текущей физической строки продолжать набор текста; • в любом месте текущей строки ввести символ «пе¬ ревод строки» (комбинация клавиш УПР — ВВОД). В результате любого из этих действий курсор пе¬ реместится на следующую строку экрана, и ввод логи¬ ческой строки можно продолжать. Заметим, что сам символ «перевод строки» в текст не попадает. При его вводе редактор дополняет текущую физическую строку до конца пробелами, которые включаются в состав логической строки. 20
При наборе и редактировании строки можно ис¬ пользовать все возможности клавиатуры, описанные в предыдущем разделе. Замена символа. Если в строке обнаружен ошибоч¬ ный символ, для его замены необходимо переместить курсор в позицию,, содержащую ошибочный символ, и ввести правильный символ. Удаление символа. Если в строке обнаружен лиш¬ ний символ, для его удаления необходимо переместить курсор в позицию, содержащую этот символ, и нажать клавишу УДЛ. Вставка символа. Если обнаружено, что в строке пропущен символ, для его вставки необходимо пере¬ местить курсор в позицию, куда символ должен быть вставлен, и нажать клавишу ВСТ для перехода в «ре¬ жим вставки». После этого можно вводить нужный символ. Усечение строки. Под усечением строки здесь по¬ нимается удаление из нее группы конечных символов. Усечение строки можно выполнить с помощью комби¬ нации УПР — КОН. Эта комбинация вызывает удале¬ ние части строки, начиная с позиции курсора, и до конца строки. Стирание строки. Нажатие клавиши КЛЮЧ вызы¬ вает удаление всей логической строки, на которую в текущий момент указывает курсор. Клавиша КОН позволяет в любой момент перемес¬ тить курсор в конец текущей логической строки. Вве¬ денные после этого символы будут добавлены в конец строки. Редактирование программы Программа на Бейсике рассматривается редактором как последовательность логических строк, каждая из которых начинается с номера строки. Любая введен¬ ная строка текста, если она начинается с числа, трак¬ туется редактором как строка программы. Строка прог¬ раммы может содержать до 255 символов. Если вво¬ димая строка окажется длиннее, она будет усекаться при нажатии клавиши ВВОД. При этом лишние сим¬ волы остаются на экране, однако в программу не вклю¬ чаются. Для работы с программами предназначено боль¬ шинство команд Бейсика. Эти команды оперируют прог¬ 21
раммами целиком и подробно рассматриваются в гл. 15 «Разработка программ». Здесь приводится описание действий, выполняемых над строками программы. Добавление строки. Для добавления в программу новой строки необходимо ввести строку текста, кото¬ рая начинается с номера (в пределах от 0 до 65529). Введенная строка будет сохранена в памяти как часть программы на Бейсике. Проверка синтаксической пра¬ вильности строки при ее вводе не выполняется. Такая проверка осуществляется, только во время выполнения программы. Если номер добавляемой строки совпадает с номе¬ ром уже существующей в программе, то старая строка заменяется новой. Удаление строки. Для удаления строки из програм¬ мы достаточно ввести номер этой строки текста. Уда¬ ление группы строк осуществляется командой DELETE. Для удаления всей расположенной в памяти программы необходимо ввести команду NEW. Эта ко¬ манда используется для очистки памяти перед вводом новой программы. Корректировка строки. Интерпретатор позволяет ре¬ дактировать и вводить строку, расположенную в любом месте экрана. Для этого необходимо подвести курсор к нужной строке, затем, используя технику удаления, замены и добавления символов, изменить строку и нажать клавишу ввода. Если нужной строки нет на экране, эту строку или группу строк можно отобразить на экран с помощью команды LIST. При вводе скорректированной строки нет необхо¬ димости перед нажатием клавиши ВВОД перемещать курсор в конец строки. Редактор сам определяет конец логической строки и обрабатывает целую строку не¬ зависимо от местоположения курсора в момент нажа¬ тия клавиши ВВОД. Необходимо помнить, что измене¬ ния, внесенные в процессе редактирования, затраги¬ вают только программу, размещенную в основной па¬ мяти. Для сохранения программы на диске необходимо выполнить команду SAVE. Если во время выполнения программы интерпрета¬ тор обнаруживает в ней синтаксическую ошибку, вы¬ полнение прекращается и ошибочная строка отобража¬ ется на экране. Эта строка может быть скорректиро¬ вана, однако продолжить выполнение программы после 22
ее корректировки невозможно. Это объясняется тем, что любое изменение программы средствами редактора приводит к потере значений всех переменных и закры¬ тию всех файлов, которые к этому моменту были от¬ крыты. Пример работы с интерпретатором Чтобы проиллюстрировать работу с интерпретато¬ ром, рассмотрим процесс создания и выполнения' не¬ большой программы. Пусть, например, требуется раз¬ работать программу, которая должна вычислять раз¬ мер вклада в сберегательной кассе по истечении неко¬ торого периода времени. Необходимые для работы программы данные должны вводиться с клавиатуры в процессе ее выполнения. После того как продуман алгоритм, необходимо вы¬ звать интерпретатор и с помощью редактора ввести текст программы. Задача может быть решена, напри¬ мер, с помощью программы, изображенной в верхней части рис. 3.3. Для тех, кто работает с Бейсиком впер¬ вые, поясним каждую строку программы: 10 — комментарий. Назначение программы; 20 — ввод с клавиатуры размера вклада; ПО ПЭВМ ЕС БЕЙСИК М86 ИЗДАНИЕ 02 МОДИФИКАЦИЯ 02.00 60290 БАЙТ ДОСТУПНО Л БЕЙСИК: 10 rem Вычисление размера вклада 20 input "Размер вклада"; sum 30 input "Срок хранения"; п 40 for i=1 to n 50 sum = sum + sum / 100 * 3 60 next i 70 print "Размер вклада равен"; sum run Размер вклада? 1000 Срок хранения? 30 Размер вклада равен 2427.263 БЕЙСИК: save "2: вклад" БЕЙСИК: \1LIST 2RUN 3LOAD 4SAVE 5CONT 6,LPT1 7TR0N 8TR0FF 9KEY OSCREEN Рис 3.3. Ввод, выполнение и сохранение программы 23
30 —ввод с клавиатуры срока хранения вклада; 40 — начало цикла. Переменная цикла I, шаг цикла равен 1, верхняя граница цикла — срок хранения вклада; 50 — вычисление размера вклада по истечении одного года (3% годовых); 60 — конец цикла; 70 — вывод результата на экран. После ввода программы она находится в основной памяти, и любые ее фрагменты могут отображаться на экране с помощью команды LIST. Программа, находящаяся в памяти, может быть вы¬ полнена с помощью команды RUN. Команду RUN мож¬ но ввести либо непосредственно, набрав ее на кла¬ виатуре, а затем, нажав клавишу ВВОД, либо восполь¬ зовавшись функциональной клавишей Ф2. Результат выполнения нашей программы тоже приведен на рис. 3.3. Там же показано использование команды SAVE для сохранения созданной программы на диске (команда SAVE "2: вклад"). Записанная на диск программа может быть снова загружена в основную память для корректировки и (или) выполнения. Предположим, нашу программу нуж¬ но ПЭВМ ЕС БЕЙСИК М86 ИЗДАНИЕ 02 МОДИФИКАЦИЯ 02.00 60290 БАЙТ ДОСТУПНО БЕЙСИК: load "2:вклад" БЕЙСИК: list 10 REM Вычисление размера вклада 20 INPUT "Размер вклада"; SUM 30 INPUT "Срок хранения"; N 40 FOR 1=1 to N 50 SUM = SUM + SUM / 100 * 2 60 NEXT I 70 J’RINT "Размер вклада равен"; SUM БЕЙСИК: run Размер вклада? 1000 Срок хранения? 30 Размер вклада равен 1811.362 БЕЙСИК: 1 LIST 2RUN 3LOAD 4SAVE 5CONT 6.LPT1 7TR0N 8TR0FF 9KEY OSCREEN Рис 3.4. Корректировка и выполнение программы 24
но скорректировать для вычисления размера вклада из расчета 2% годовых. Для этого необходимо выпол¬ нить следующее: • вызвать интерпретатор (команда BASICM86); • загрузить программу в память (команда LOAD "2:вклад"); • отобразить программу на экране (команда LIST); • скорректировать программу и затем ее выполнить (команда RUN). Результат выполнения этих действий показан на рис. 3.4.
ЧАСТЬ 2 ОСНОВНЫЕ СРЕДСТВА ЯЗЫКА БЕЙСИК ГЛАВА 4. ОСНОВНЫЕ ЭЛЕМЕНТЫ ЯЗЫКА Алфавит языка При программировании на языке Бейсик использу¬ ется следующий набор символов: прописные и строч¬ ные буквы латинского алфавита; цифры от 0 до 9; спе¬ циальные знаки. Специальные знаки Бейсика Знак Наименование и использование Разделители , Точка, или десятичная точка , Запятая ; Точка с запятой ’ Апостроф, или разделитель комментариев ? Вопросительный знак > Кавычки ( Круглая скобка левая ) Круглая скобка правая Пробел Знаки операций 4- Плюс, или знак сцепления строк — Минус * Звездочка, или знак умножения / Дробная черта, или знак деления \ Дробная черта с наклоном влево, или знак деления нацело ~ Возведение в степень Знаки операций отношения < Меньше > Больше = Равно, или знак присвоения Знаки, используемые для объявления типа переменных, $ Знак денежной единицы, пли знак объявления строковых пе¬ ременных 86
! Восклицательный знак, или знак объявления переменной с обычной точностью % Процент, или знак объявления целочисленных переменных и массивов Ф= Номер, или знак объявления переменных с двойной точ¬ ностью Вспомогательные знаки & Коммерческое «И» — Подчеркивание Специальные знаки, кроме общепринятого значе¬ ния, имеют также дополнительное использование. На¬ пример, знак % используется для обозначения процен¬ тов— это его основное назначение. Кроме того, знак % в обозначении имени переменной или массива относит это имя к целочисленным величинам. Знак «пробел» не имеет специального графического изображения. Команды, ключевые слова операторов, функции обозначаются латинскими буквами (в некоторых слу¬ чаях с использованием специальных знаков). Имена переменных и массивов образуются из латинских букв, цифр и точки. Комментарий Для записи комментариев и строк символов могут быть использованы все символы из набора символов ПЭВМ. Для этой цели широко используются буквы русского алфавита. Комментарий может быть задан либо с помощью апострофа либо с помощью оператора REM (REMark— комментарий) •: REM комментарий Комментарий — любая последовательность симво¬ лов. Если комментарий задается с помощью апострофа, то знак апострофа ставится перед комментарием. Если в строке записывается несколько операторов, то комментарий должен быть последним. И если в этом случае используется апостроф, то знак :, разделяющий отдельные операторы в строке, перед комментарием не записывается. 27
Примеры записи комментария: 10 REM вычисление суммы 20 SUA/1 = A + B/A и В — слагаемые 30 'SUM содержит сумму Если комментарию передается управление, то вы¬ полнение программы продолжается с первого выполняе¬ мого оператора, следующего за комментарием. Данные В Бейсике используются константы, переменные и массивы. Они представляют данные двух типов: число¬ вые и строковые. Константы Константа — это такой объект программы, который сохраняет в ней постоянное значение. Тип и значение константы определяются ее записью. Числовые константы. Допускаются два типа число¬ вых констант: целочисленные и вещественные. Констан¬ ты целочисленные могут быть представлены в десятич¬ ной, восьмеричной и шестнадцатеричной системах счис¬ ления, Для вещественных констант возможны два способа задания: с обычной и двойной точностью. Целочисленные константы представляют собой це¬ лое число в диапазоне от —32768 до 32767. Такое чис¬ ло может быть записано в десятичной, восьмеричной или шестнадцатеричной системах счисления. Целые числа имеют в машине точное представление. Примеры записи целых чисел в десятичной сис¬ теме счисления: — 10838 23 +171 0 7 Для записи чисел в восьмеричной системе счисле¬ ния перед числом необходимо записать знак & или знак & и букву О. Для отрицательных чисел знак — (минус) записывается перед знаком &. Примеры записи чисел в восьмеричной системе счисления: &177 -&3333 &O647 28
Диапазон целых чисел, выраженный в восьмеричной системе счисления: от &100000 до &77777. Число в восьмеричной системе должно содержать не более 6 цифр. Для записи чисел в шестнадцатеричной системе счи¬ сления перед числом необходимо записать знак & и букву Н. Для отрицательных чисел знак — записывает¬ ся перед знаком &. Примеры записи чисел в шестнадцатеричной сис¬ теме счисления: &H7FF -&Н1111 &НА37 Диапазон целых чисел, выраженный в шестнадцате¬ ричной системе счисления: от &Н8000 до &H7FFF. Если целое число в десятичной системе счисления выходит за допустимый диапазон, то оно рассматри¬ вается как вещественное. Вещественные константы в машине могут быть пред¬ ставлены с различной точностью. Они имеют два спо¬ соба представления: с обычной и двойной точностью. Для констант с обычной точностью предусматривается точность 6 знаков, а для двойной точности— 16 знаков. Константы с обычной точностью могут быть запи¬ саны в виде: • числа, содержащего целую и дробную части, ко¬ торые разделяются десятичной точкой; • числа в экспоненциальной форме; • целого числа, которое выходит за допустимый диа¬ пазон для целых чисел; • числа, запись которого завершается знаком ! В экспоненциальной форме вещественное число со¬ держит мантиссу и порядок. Мантисса — целое или дробное число, порядок — целое однозначное или дву¬ значное число. Для задания порядка употребляется буква Е. Если запись числа (или его мантиссы) содер¬ жит более 7 цифр, то число считается числом с двой¬ ной точностью. Число, завершающееся знаком !, независимо от ко¬ личества цифр будет отнесено к числам с обычной точ¬ ностью. Примеры записи вещественных констант с обыч¬ ной точностью: — 23.1985 1.38Е-2 0.884 + 5.49 46.2Е2 -33.4E3 7654321 288! 29
Диапазон значений констант с обычной точностью от —1.701412Е + 38 до 4-1.701412Е + 38. Наименьшее от¬ личное от нуля значение —0.5877471Е—38. Константы с двойной точностью имеют те же спо¬ собы записи, что и с обычной точностью, только вместо буквы Е для указания порядка употребляется буква D, а для завершающего знака вместо ! используется • Запись числа может содержать сколько угодно цифр, но, как уже отмечалось, вычисления выполняются с точностью 16 знаков. Примеры записи вещественных констант с двой¬ ной точностью: 0.238D—2 -0.123456789987 254.4# Диапазон значений констант с двойной точностью от —1.701411733192644D + 38 до +1.701411733192644D 4- 38. Представление чисел в памяти ЭВМ. Целые числа представляются в ПЭВМ в виде двоичных целых чи¬ сел. Каждое целое число занимает 2 байта памяти. Вещественные числа представляются в форме с плавающей точкой. Числа с обычной точностью зани¬ мают 4 байта памяти, а числа с двойной точностью — 8 байт. Операции над целыми числами выполняются с боль¬ шей скоростью, чем над числами с плавающей точкой. Строковая константа — это заключенная в кавычки последовательность символов. Строковые константы обычно используются для представления текстовой ин¬ формации. В строковых константах можно использо¬ вать любые символы, имеющиеся в ПЭВМ, и в них не должно содержаться более 255 символов. Примеры записи строковых констант: «Эта запись — пример текстовой константы», «102%», «Температура выше 20 градусов», «39.5». Переменные Переменная — это такой объект программы, кото¬ рый в процессе выполнения программы может иметь различные значения. Для обозначения переменных ис¬ пользуются уникальные имена. Имена образуются из букв, цифр и точек. Первым символом имени должна быть буква, последним необязательным символом мо¬ жет быть один из знаков объявления типа переменной 3G
r^o/Oi $). Имена переменных могут содержать про¬ извольное количество символов, однако различаются только первыми 40 символами. Кроме того, имя не должно совпадать с каким-нибудь из зарезервирован¬ ных слов Бейсика (см. приложение 1). Зарезервирован¬ ные слова могут стать частью имени переменной (на¬ пример, DATA55). Числовые переменные, как и константы, могут быть целыми, вещественными с обычной и двойной . точ¬ ностью. Тип переменной может быть задан либо явно, либо с помощью оператора DEF... (DEFine— опреде¬ лить), либо по умолчанию. Явное задание типа пере¬ менной определяется последним символом имени пере¬ менной: знак % определяет переменную целого типа, знак ! — переменную с обычной точностью, знак 4г — переменную с двойной точностью, знак $ — строковую переменную. Имена, отличающиеся друг от друга лишь последним знаком, воспринимаются как различные пе¬ ременные. Например, Z%, Z!, Z* и Z$ — имена раз¬ личных переменных. Оператор DEF... указывает, что тип переменной бу¬ дет определяться по первой букве имени переменной. Явное задание типа имени переменной оператор DEF... не отменяет. Общий вид оператора DEF...: DEFINT буква DEFSNG буква DEFDBL буква DEFSTR буква '.-буква ’.-буква -буква .-буква' ' .буква .буква .буква .буква -буква -буква -буква -буква Здесь буква — любая буква латинского алфавита, форма буква — буква задает диапазон букв, на кото¬ рые распространяется действие оператора. Тип пере¬ менной определяется следующим образом: DEFINT (INTeger— целый) —целые переменные; DEFSNG (SiNGle — одиночный)—переменные с обычной точ¬ ностью; DEFDBL (DouBLe — двойной)—переменные с двойной точ¬ ностью; DEFSTR (STRing— строковый)—строковые переменные. Пример. DEFSTR С, О —R, Z По этому оператору все переменные, начинающиеся С букв С, О, Р, Q, R, Z, относятся к строковым пере¬ менным. Оператор DEF... должен предшествовать использо¬ ванию переменных, тип которых зависит от результата 31
его выполнения. Если тип переменной не задан, то она считается переменной с обычной точностью. Начальные значения числовым переменным уста¬ навливаются равными нулю, а строковым перемен¬ ным — пустой строке. Массивы Массив представляет собой последовательность пе¬ ременных. Отдельные члены этой последовательности называются элементами массива. Каждый массив име¬ ет имя и размерность. Имена массивов и их тип опре¬ деляются аналогично простым переменным. Все эле¬ менты массива должны иметь один и тот же тип. До¬ пускается совпадение имен массива и простой пере¬ менной. В Бейсике могут использоваться одномерные и мно¬ гомерные массивы до 255 измерений. Отдельный элемент массива обозначается именем массива и списком индексов. Список индексов должен содержать столько индексов, сколько измерений имеет соответствующий массив. В Бейсике приняты определенные правила располо¬ жения массивов в памяти. Элементы одномерного мас¬ сива располагаются один за другим в последовательно расположенных байтах памяти. Двумерный массив рас¬ полагается построчно. Элементы многомерных масси¬ вов расположены так, что вначале изменяется самый правый индекс. Массив может быть задан либо неявно, либо явно. Если при написании программы использован элемент массива без предварительного объявления этого мас¬ сива, то такой массив задается неявно как одномерный массив, содержащий 10 элементов. Для явного объявления (задания) массива исполь¬ зуется оператор DIM (DIMension — измерение): DIM имя-массива (размерность) [,имя-массива (размерность)].., Имя-массива— это любое имя, присваиваемое мас¬ сиву. Размерность — это числовое выражение, значение которого должно быть положительным числом, целая часть которого определяет максимальное значение со¬ ответствующего измерения. 32
Пр и мер объявления массивов: 20 DIM А23$(5), В1% (3,2) По этому оператору будет создан одномерный мас¬ сив А23$ с данными строкового типа и двумерный мас¬ сив В1% целого типа. При объявлении массива начальные значения для всех элементов числовых массивов устанавливаются равными нулю, а строковых — пустой строке. Минимальным значением измерения может быть ли¬ бо 0, либо 1. По умолчанию устанавливается значе¬ ние 0, для установки значения 1 необходимо выполнить оператор OPTION BASE (option base — базовый режим индексирования): OPTION BASE n n может быть равно 0 или 1 и определяет мини¬ мальное значение измерения массивов во всех опера¬ торах DIM. Оператор OPTION BASE должен выпол¬ няться до операторов DEF... и DIM. В процессе выполнения программы можно повтор¬ но объявить массив, изменяя любые его характерис¬ тики. Для этого необходимо вначале удалить массив с помощью оператора ERASE (erase — стереть), а за¬ тем повторно определить. Общий вид оператора ERASE: ERASE имя-массива [,имя-массива]... Имя-массива— имя удаляемого массива. В резуль¬ тате выполнения этого оператора все перечисленные в нем массивы удаляются, освобождая память, которую они занимали. Пример повторного объявления массивов: 10 DIM А(60), В(60) 20 ERASE А, В 30 DIM А(4,40), В (80) ГЛАВА 5. ВЫРАЖЕНИЯ. ФУНКЦИИ Выражения Выражения в Бейсике аналогичны математическим формулам. Они строятся из констант, переменных, эле¬ ментов массивов, обращений к функциям, знаков опе¬ раций, скобок. В частности, выражением будет и от¬ 3 Заказ 2634 33
дельная константа или переменная. Допустимы выра¬ жения числовые и строковые. Числовые выражения. Числовыми будем называть выражения, в результате вычисления которых получа¬ ется числовое значение. При записи числовых выра¬ жений могут быть использованы арифметические и логические операции, а также операции сравнения. Операндами числовых выражений могут быть числовые константы, числовые переменные, элементы числовых массивов, функции с числовым значением, числовые выражения в скобках. . Операндами операций отноше¬ ния в числовых выражениях могут быть строковые вы¬ ражения. Примеры числовых выражений: Т Sl + 15.2 A AND В А$>В$ AND 52+Т% Строковые выражения. В строковых выражениях используется только одна строковая операция — опе¬ рация сцепления ( + ). Сцепление означает объедине¬ ние операндов, при котором последний символ первого операнда непосредственно предшествует первому сим¬ волу второго операнда. Пример. S1$ ="Персональная ЭВМ ” S2$ = "EC1840" S3$="EC1841" S4$=S1$+S2$ S5$=S1$+S3$ После выполнения операции сцепления переменные 84$ и S5$ получат соответственно значения: «Персо¬ нальная ЭВМ ЕС1840» и «Персональная ЭВМ ЕС1841». Арифметические операции. Могут быть выполнены следующие арифметические операции в порядке их приоритета: возведение в степень (Д), изменение зна¬ ка (—), умножение (>]<) и деление (/), деление наце¬ ло (\), определение остатка (MOD), сложение ( + ) и вычитание (—). При делении нацело дробная часть результата отбрасывается. Операция вычисления ос¬ татка (деления по модулю) определяет остаток от де¬ ления одного целого числа на другое. Операции сравнения. Операндами операций сравне¬ ния могут быть числовые и строковые выражения, од¬ нако оба операнда, участвующие в сравнении, должны иметь один и тот же тип. Используются следующие операции сравнения (все они имеют одинаковый приоритет): равно ( = ), не рав- 34
но (<> или ><), меньше (<), больше (>), мень¬ ше или равно (<= или =<), больше или равно (>= или = >). Результатом выполнения операции сравнения явля¬ ется «истина», если отношение имеет место, или «ложь» — в противном случае. «Истина» представляет¬ ся значением —1 (минус 1), «ложь» — значением О (нуль). Сравнение строк выполняется посимвольно слева направо. Сравнение прекращается, если найдена пара несовпадающих символов или достигнут конец одной из строк. Если все пары совпали, строки считаются равными. При несовпадении большей считается стро¬ ка, содержащая символ с большим значением кода символа в таблице кодов ПЭВМ. Более короткая стро¬ ка считается меньшей. Логические операции. Операндами логических опе¬ раций могут быть значения операций сравнения («ис¬ тина» или «ложь») или целочисленные значения. Если задан числовой операнд, не являющийся целым чис¬ лом, то он преобразуется к целому типу. Можно использовать следующие логические опера¬ ции, которые перечислены в порядке их приоритета: отрицание (NOT), конъюнкция (AND), дизъюнкция (OR), исключающая дизъюнкция (XOR), эквивалент¬ ность (EQV), импликация (IMP). Результаты выпол¬ нения логических операций приведены в табл. 5.1. Таблица 5.1 Результаты выполнения логических операций А в NOT А NOT В | 1 A AND в! Л OR в A XOR В A EQV В A IMP В И И л Л И И л И И И л Л И л и и Л Л л и И л л и И л И л л 1 и и л л Л и И В таблице в первом столбце — значения операнда А» во втором — операнда В, в остальных столбцах — ре¬ зультаты выполнения логических операций. В таблице И обозначает «истина», Л — «ложь». При выполнении логических операций над целочис¬ ленными значениями операнды преобразуются к двоич- 3* 35
ному представлению, и логическая операция выполни* ется побитно, т. е. бит результата равен результату операции над соответствующими битами операндов. Двоичное значение 1 в некотором бите рассматрива¬ ется как «истина», а 0 — как «ложь». После побитного выполнения операции полученный результат дает чис¬ ловое значение, которое может трактоваться как «ложь» (результат равен нулю) или «истина» (резуль¬ тат не равен нулю). Например, при выполнении опе¬ рации А = 23 AND 62 получим А = Й2, так как 010111 AND 111110 дает значение 010110(22). Этот результат можно также трактовать как «истина» (например, если выражение использовалось в операторе IF). Вычисление выражений. Эта операция выполняется в соответствии с приоритетом операций. С учетом вы¬ числения значения функций этот порядок такой: • вычисление значений функций; • арифметические операции в соответствии с их приоритетом; • операция сцепления; • операции сравнения; • логические операции в соответствии с их приори¬ тетом. Строковая операция сцепления имеет одинаковый приоритет с операциями сложения и вычитания. Выражения, стоящие в скобках, вычисляются в пер¬ вую очередь, операции одного приоритета выполня¬ ются слева направо. Если два числовых операнда раз¬ личаются по типу, то перед вычислением значения выражения они приводятся к одному типу, с большей точностью. Функции При работе с Бейсиком обеспечивается выполне¬ ние часто используемых функций. Такие функции на¬ зываются встроенными и являются частью системы Бейсик. Кроме встроенных функций, пользователь может определить свои собственные функции. Такие функции используются только в рамках одной программы. Появление имени функции и соответствующих ей аргументов вызывает выполнение этой функции и на¬ зывается обращением к функции или вызовом функ¬ 36
ции. Полученное в результате выполнения функции зна¬ чение функции используется в дальнейших вычисле¬ ниях. Фактические аргументы должны соответствовать формальным по количеству, типу и порядку следо¬ вания. Встроенные функции. Каждая встроенная функция имеет определенное имя. Аргументы функции записы¬ ваются в скобках вслед за именем функции и разде¬ ляются запятыми. В качестве фактических аргументов функций можно использовать выражения. Основные встроенные функции можно разделить на такие группы: • преобразование типов данных; • обработка строковых данных; • арифметические; • математические; • функции для работы с файлами (гл. 12); • функции для работы с экраном дисплея (гл. 9); • обработка ошибок (гл. 16); • времени и даты. При описании встроенных функций х обозначает любое числовое выражение, х$ и у$ — любые строко¬ вые выражения, а п и т— выражения целого типа. Функции преобразования типов данных CINT(x) (Convert to INTeger— преобразовать к целым) Преобразование числа к целому виду (с округлением). CSNG(x) (Convert to SiNGle —преобразовать к обычной точности) Преобразование числа к представлению с обычной точностью. CDBL(x) (Convert to DouBLe — преобразовать к двойной точности) Преобразование числа к представлению с двойной точностью. CHR$(п) (CHRacter — символ) Получение символа, соответствующего заданному коду. STR$ (х) (STRing — строка) Преобразование числа в строковое представление (строку символов). Для положительных чисел в строковом пред¬ ставлении содержится ведущий пробел. VAL(х$) (VALue — значение) Преобразование числа из строкового представления в чис¬ ловое. При преобразовании по функции VAL в строковом представлении допустимы впереди стоящие пробелы, знаки + и — (перед цифрами), цифры, десятичная точка, знаки для экспоненциального представления числа (Е, D). Дру¬ гие нецифровые знаки считаются ошибкой (кроме "!"). Если нецифровой знак — первый, то значение функции рав¬ но 0. Если нецифровым знаком является "1", то значение будет представлено числом с обычной точностью. Однако знаки # и % используются. 37
ОСТ$(х) Преобразование числа в восьмеричную систему счисления. НЕХ$(х) Преобразование числа в шестнадцатеричную систему счи< сления. Функции обработки строковых данных INSTR([/г],х$, у$) (INspect STRing— просмотреть строку) Поиск первого вхождения строки у$ в строку х$, начиная с, символа п строки х$.- Если п не задано, поиск выполня¬ ется с первого символа. Значение функции: целое число — номер позиции начала вхождения; 0 — если строка не най¬ дена; п — если //$ — пустая строка. LEFT$ (х$, п) (left — левый) Выделение п левых крайних символов строки х$. RIGHT$ (х$, п) (right — правый) Выделение п правых крайних символов строки х$. MID$ (х$, n[,/n]) (MIDdle— середина) Выделение подстроки в т символов из строки х$, начиная с символа п. Если т опущено или количество символов в строке справа от символа п меньше чем /и, то выделяются символы, начиная с символа п до конца строки. Если зна« чение т равно 0 или значение п превышает длину строки, то результатом выполнения функции будет пустая строка. STRING$(n, т) STRING$(n, х$) (string — строка) Формирование строки из п одинаковых символов. Они ли¬ бо равны символу с кодом, равным /п, либо первому сим¬ волу строки х$. SPACE(n) (space — пробел) Формирование строки из п пробелов. LEN(x$) (LENgth— длина) Определение длины (количества символов) в строке х$. ASC(x$) Числовое значение первого символа строкового выражения х$ в соответствии с таблицей кодов ПЭВМ. Функции представления числового значения в виде строкового (MKI$, MKS$, MKD$) и строкового в виде числового (CVI$, CVS$, CVD$) описаны в гл. 12. Арифметические и математические функции, функции времени и даты ABS(x) Абсолютное значение х. Е1Х(х) Отбрасывание дробной части числа х. INT(x) Наибольшее целое, не превосходящее х. SGN(x) SGN(x) = l для х>0, SGN(x)=0 для х=0, SGN(x) = — 1 для х<0. SQR(x) Корень квадратный из х, SIN(x) Вычисление синуса угла х (х в радианах). COS(x) Вычисление косинуса угла х (х в радианах). lAN(x) Вычисление тангенса угла х (х в радианах). ATN(x) Вычисление арктангенса числового выражения х. ЕХР(х) Вычисление функции ех (х — числовое выражение). LOG(x) Вычисление натурального логарифма. 38
RND[(x)] Генерация случайного числа между 0 и 1. х<0 исполь¬ зуется для установки базы генерации случайных чисел х=0 вызывает повторение последнего случайного числа. DATE$ (date —дата) Определение текущей даты. Дата выдается в виде: мм-дд-гггг где мм — месяц; ДД — день месяца; гггг — год. TIMES (time —время) Определение текущего времени суток. Время выдается в виде: чч : мм : сс где чч — часы; мм — минуты; сс — секунды. TIMER (timer — таймер) Определение текущего времени суток в секундах. Функции пользователя. Функция пользователя опре¬ деляется внутри программы, которая использует эту функцию. Функция пользователя описывается одним оператором, в котором задается выражением, опреде¬ ляющим функцию. Общий вид оператора определения функции поль¬ зователя (DEFiniton FuNction — определение функции): DEF FNwaw [(параметр[,параметр]...)]-выражение Имя вместе с префиксом FN определяет имя функ¬ ции. Имя задается аналогично имени переменной и ис¬ пользуется для обращения к функции. Параметр, ко¬ торый используется в определении функции, не связан с переменными программы, имеющими те же имена. Значения аргументов, заданных в обращении к функ¬ ции, присваиваются соответствующихМ параметрам и используются при вычислении выражения. Выражение задает выражение, которое определяет функцию. Тип выражения должен соответствовать типу имени функции. В выражении, определяющем функцию, можно использовать переменные, не являющиеся пара¬ метрами. Числовые значения функции преобразуются к точности, заданной именем функции. Определение функции должно предшествовать ее использованию. Допускается использование рекурсив- ности при задании функции. Пример. 10 Х=3 20 DEF FNF(X)=XA2 + SQR(X) 30 INPUT Y 40 O=FNF(Y)+6*X Здесь в строке 20 описана функция пользователя FNF, а в строке 40 выполняется обращение к этой 39
функции для вычисления Y2H-]/Y. В строке 20 X явля¬ ется формальным параметром, и действие оператора 10 на него не распространяется. ГЛАВА 6. ПРИСВАИВАНИЕ ЗНАЧЕНИЙ В начале выполнения программы используемым в ней переменным устанавливаются начальные значения. Числовым переменным присваиваются нулевые значе¬ ния, а строковым — пустые строки. В программе на Бейсике присваивание значений может быть выполнено операторами LET (let — пусть); READ (read — читать), который используется вместе с оператором DATA (data — данные), а также в резуль¬ тате выполнения операторов ввода. К операторам присваивания отнесены также опе¬ ратор SWAP (swap — обмен) для обмена значениями, оператор MID$ (MIDdle — середина) для замены под¬ строки и оператор RANDOiMIZE (random — произволь¬ ный) для переустановки базы генерации случайных чисел. Оператор LET С помощью оператора LET можно присвоить зна¬ чение выражения переменной или элементу массива: [LET] переменная^ выражение Переменная — это любая переменная или элемент массива. Название оператора LET можно опустить. Пе¬ ременная и выражение должны иметь один и тот же тип. Пример. 10 LET Х = 23.8 20 А = В + С 30 8$ = ”АВГУСТ” Значение числового выражения преобразуется к ти¬ пу переменной. Преобразование выполняется с округ¬ лением, если переменная имеет меньшую точность, чем выражение. В противном случае значение выражения дополняется нулями. 40
Использование списка значений При написании программы с помощью оператора DATA можно описать список постоянных значений, ис¬ пользуемых в этой программе. По оператору READ эти значения из списка присваиваются переменным и элементам массивов. Общий вид оператора DATA: DATA ко нет ант а\,ко нет анта]... Константа — любая константа. Строковые констан¬ ты можно не заключать в кавычки, за исключением случаев, когда они начинаются или завершаются зна¬ чащими пробелами. Операторы DATA задаются в лю¬ бом месте программы независимо от места задания оператора READ. Если в программе содержится не¬ сколько операторов DATA, то их можно рассматривать как объединенный оператор DATA, а все константы объединенными в один список. При выполнении опе¬ ратора READ константы последовательно выбираются из этого списка и присваиваются переменным и эле¬ ментам массивов, указанным в операторе READ. Общий вид оператора READ: READ переменная[,переменная]... Переменная — это имя переменной или элемента массива. Тип константы в списке DATA должен соот¬ ветствовать типу переменных в операторе READ, ко¬ торым присваиваются значения. Очередной оператор READ выбирает константы не с начала списка, а с места в списке, на котором остановился предыдущий оператор READ. Неиспользованные константы из списка DATA игно¬ рируются, а случай, когда списка констант недостаточ¬ но для всех переменных оператора READ, является ошибкой. Пример. 100 DATA 10,20,30,"АВС" 150 READ А°/о,В°/о,С°/о 180 READ D$,E°/o,F%,Z (8,8) 350 DATA 40,50,0.5 В результате выполнения первого оператора READ переменным А°/о, В%, С°/о будут присвоены соответ¬ ственно значения 10, 20, 30. В результате выполнения второго оператора READ строковая переменная D$ 41
получит значение АВС, числовые переменные Е%, F%—значение 40 и 50, а элемент массива Z(8,8)— значение 0.5. Оператор RESTORE (restore — восстановить) позво- ляет повторно использовать список констант, создан¬ ный по оператору DATA. Оператор RESTORE имеет формат: RESTORE [но мер-ст роки] Если в операторе задан номер-строки, то по оче¬ редному оператору READ выборка из списка значений начнется с первого элемента списка того оператора DATA, которому соответствует заданный номер. Если номер-строки не задан, то выборка выполня¬ ется с начала списка. Пример. 10 READ А,В,С 20 DATA 1,2,3,4,5,6 30 RESTORE 40 READ K,L,M Переменным А и К будут присвоены значения 1, В и L — 2, С и М — 3. Если оператор RESTORE опустить, то переменные A,B,C,K,L,M получат соответственно зна¬ чения 1,2,3,4,5,6. Обмен значениями Обмен значениями выполняется с помощью опера¬ тора SWAP: SWAP переменная-1,переменная-2 П временная-1, переменная-2 — имена переменных или элементов массива. Они должны иметь один и тот же тип. После выполнения оператора переменная-1 по¬ лучит значение переменной-2, и наоборот. Пример. 10 А= 100 : В = 200 20 SWAP А,В До выполнения оператора SWAP А имело значе¬ ние 100, В — 200, после выполнения А = 200, В =100. 42
Замена подстроки Замена подстроки выполняется с помощью операто¬ ра MID$: MID$ (строковая-переменная,п [,m]) = строковое-выражение Строковая-переменная— это переменная или элемент массива строкового типа; п — номер позиции символа в строке, начиная с ко¬ торого выполняется замена (замещение); пг— количество заменяемых символов; строковое-выражение— любое строковое выражение. При выполнении оператора MID$ длина строковой переменной не изменяется ни при каких значениях /пип. Если m опущено, то используется величина, рав¬ ная длине значения операнда строковое-выражение. Ес¬ ли значение m меньше количества символов ст роков о- го-выражения, то берутся первые m символов. Если значение п больше количества символов в строковой-переменной, то замена не выполняется. Пример. 20 А$ = ”МАТЧ 'ДИНАМО'—'СПАРТАК'” 30 MID$ (А$, 16)= ’’ТОРПЕДО” Строковая переменная А$ после выполнения опе¬ ратора 30 получит значение МАТЧ 'ДИНАМО' —'ТОРПЕДО'. Генерация случайных чисел Для управления генерацией случайных чисел ис¬ пользуется оператор RANDOMIZE. Он позволяет уста¬ навливать базу для генерации: RANDOMIZE [база] База — выражение целого типа, значение которого будет использовано в качестве базы генерации и долж¬ но находиться в диапазоне от —32768 до +32767. Сис¬ тема Бейсик содержит генератор случайных чисел, по¬ следовательность которых можно получить, используя функцию RND. Полученные числа являются псевдослу¬ чайными, и их последовательность генерируется с ис¬ пользованием некоторого числа (базы генерации). Эта последовательность будет одной и той же при различ¬ ных выполнениях программы, если база генерации ос¬ тается неизменной. 43
Оператор RANDOMIZE позволяет переустановить базу генерации и тем самым изменить последователь¬ ность генерируемых чисел. Если база не задана, вы¬ полнение программы приостанавливаётся, и на экран дисплея выдается запрос: RANDOMIZE: задайте базу генерации (от —32768 до +32767)? Введенное число будет использоваться в качестве базы генерации. ГЛАВА 7. ОПЕРАТОРЫ УПРАВЛЕНИЯ. ПОДПРОГРАММЫ Обычно операторы выполняются один за другим в порядке присвоенных им номеров. Для изменения это¬ го порядка используются операторы управления. К ним относятся: операторы безусловного перехода GO ТО (go to — перейти к) и ON GO ТО (on... go to — при ... перейти к); оператор условного перехода IF-THEN-ELSE (if-then-else — если-то-иначе); операто¬ ры организации цикла FOR (for — для)/NEXT (next — следующий) и WHILE (while — noKa)/WEND (While END — конец цикла WHILE); операторы прекращения выполнения программы STOP (stop — останов) и за¬ вершения программы END (end — конец). Операторы безусловного перехода Эти операторы позволяют передавать управление любой строке программы. Для этих целей могут ис¬ пользоваться два вида операторов: GO ТО для безус¬ ловного перехода и ON GO ТО для перехода по вы¬ числяемому значению. Общий вид оператора GO ТО: GO ТО номер-строка Номер-строки— это номер строки, первому опера¬ тору которой будет передано управление после выпол¬ нения оператора GO ТО. Общий вид оператора ON GO ТО: ON выражение GO ТО номер-строки[>номер-строки\... Выражение — любое числовое выражение. Выполнение оператора ON GO ТО вызывает пере¬ дачу управления одной из строк, номер которой задан 44
в списке. Выбор номера строки зависит от значения выражения, заданного в операторе после ключевого слова ON. Целая часть значения выражения опреде¬ ляет порядковый номер в списке. Если значение вы¬ ражения меньше единицы или больше количества но¬ меров в списке, то управление передается оператору, следующему за оператором ON GO ТО. Пример. 80 ON А*3—4 GO ТО 25,40,90,15,900 85 ... Если целая часть значения выражения равна 2 (на¬ пример, А = 2.2), то управление будет передано стро¬ ке 40. Если же значение выражения будет меньше 1 или больше 5, то следующим будет выполняться опе¬ ратор с номером 85. Оператор условного перехода IF Для передачи управления в зависимости от усло¬ вия используется оператор IF, который может быть представлен в одном из двух видов: IF выражение THEN группа-операторов [ELSE группа-операторов] IF выражение GO ТО номер-строки [ELSE группа-операторов] Выражение — любое числовое выражение, а группа- операторов—это оператор или последовательность опе¬ раторов, разделенных двоеточием, или номер строки, первому оператору которой должно быть передано уп¬ равление. Часть оператора, начиная с ключевого слова ELSE, может быть опущена. Если условие, заданное операндом выражение, при¬ нимает значение «истина» (не равно нулю), то выпол¬ няется группа операторов, следующая за THEN или GO ТО. Когда значение выражения ложно (равно ну¬ лю), то выполняется группа операторов из ELSE (опе¬ раторы из THEN в этом случае не выполняются). Если в операторе опущена часть ELSE, то при не¬ выполнении условия управление передается оператору, следующему за оператором IF. Примеры операторов IF: 120 IF К>о THEN 240 150 IF A$ = "N" THEN A%=40 ELSE A%=60 200 IF A AND В GO TO 15 45
Операторы IF могут быть вложенными. При этом каждый ELSE соответствует ближайшему предыдуще¬ му THEN. Пример. 30 IF А>В THEN PRINT "БОЛЬШЕ" ELSE IF В<А THEN PRINT "МЕНЬШЕ" ELSE PRINT "РАВНО" В этом примере сравниваются два числа и резуль¬ тат сравнения выдается на экран. Операторы организации цикла Повторное выполнение фрагментов программы мо¬ жет быть организовано с помощью уже описанных опе¬ раторов LET, IF. П р и м е р. 10 LET А% = 1 20 PRINT А% 30 А%=А%+1 40 IF А°/о <Ю1 THEN 20 Операторы 20, 30, 40 будут циклически повторять-; ся, пока значение А%^100. Последовательность операторов, выполнение кото¬ рых повторяется циклически, образует цикл. Для за¬ писи циклов используются специальные операторы. В Бейсике имеются две группы таких операторов: опе¬ раторы для организации итеративных циклов с изме¬ нением управляющей переменной по принципу арифме¬ тической прогрессии (операторы FOR и NEXT), а так¬ же операторы для организации итеративных циклов по условию (операторы WHILE и WEND). Циклы с изменением управляющей переменной. Оператором FOR цикл начинается, а оператором NEXT завершается. Общий вид оператора FOR: FOR переменная = начальное-значение ТО конечное-значение [STEP приращение] Переменная — это управляющая переменная цикла. Начальное-значение, конечное-значение и прираще¬ ние— числовые выражения, определяющие начальное и конечное значения управляющей переменной, а так¬ же шаг приращения управляющей переменной цикла при повторении цикла. Операнд приращение вместе с ключевым словом STEP может не задаваться, в этом случае по умолчанию значение приращения равно +1. 46
Примеры записи операторов FOR: 10 FOR К=1 ТО 100 40 FOR N = 2*M + 1 ТО 230 STEP Н 50 FOR N=100 ТО В STEP —1 Значения выражений, определяющих начальное и конечное значения, а также приращение вычисляются один раз и не изменяются в процессе выполнения • цик¬ ла. Изменение величин, входящих в выражения, во время выполнения цикла не влияет на количество пов¬ торений цикла. Каждому оператору FOR должен соответствовать оператор NEXT: NEXT [переменная] ^переменная]... Переменная — это та же управляющая переменная цикла, что и в соответствующем операторе FOR. Пе¬ ременная может быть опущена, в этом случае опера¬ тор NEXT соответствует ближайшему предшествующе¬ му оператору FOR. По оператору FOR вычисляются значения выраже¬ ний, определяющих начальное и конечное значения управляющей переменной, а также приращения. Уп¬ равляющей переменной цикла присваивается началь¬ ное значение. Если при. выполнении оператора FOR обнаружено, что условие завершения цикла выполнено, то управление передается оператору, следующему за оператором NEXT. Это происходит, например, тогда, когда начальное значение управляющей переменной больше конечного, а приращение имеет положительное значение. В общем случае после выполнения оператора FOR начинают выполняться строки, следующие за ним, до тех пор, пока не будет встречен оператор NEXT. По оператору NEXT текущее значение управляю¬ щей переменной увеличивается на значение прираще¬ ния. Если новое значение управляющей переменной оказывается большим, чем конечное значение, то цикл заканчивается, и выполнение программы продолжается с оператора, следующего за оператором NEXT. Если же новое значение управляющей переменной не пре¬ восходит конечного значения управляющей перемен¬ ной, то управление передается оператору, следующему за оператором FOR, т. е. на повторное выполнение цикла. Если приращение задано отрицательным числом, то текущее значение управляющей переменной уменьша¬ 47
ется при. каждом выполнении цикла, а цикл выполня¬ ется до тех пор, пока значение управляющей перемен¬ ной не станет меньше, чем конечное значение. Если значение приращения равно 0, то цикл будет повторяться бесконечно. После завершения цикла управляющая переменная равна последнему значению, увеличенному на шаг при¬ ращения. Управляющая переменная цикла может использо¬ ваться внутри цикла точно так же, как любая другая числовая переменная. Однако менять ее значение не¬ целесообразно, так как в этом случае может изменить¬ ся количество повторений цикла. Пример. Вычисление суммы 140 элементов мас¬ сива А: НО SUM = 0 120 FOR к=1 то 140 130 SUM=SUM+A(K) 140 xNEXT К Циклы по условию. Эти циклы организуются с помощью операторов WHILE и WEND, первым из них цикл начинается, а второй служит для завершения. Цикл выполняется до тех пор, пока условие повторе¬ ния выполняется. Общий вид оператора WHILE: WHILE числовое-выражение Числовое-выражение — любое числовое выражение. Оператор WEND задается без операндов. Порядок выполнения такого цикла: вычисляется зна¬ чение выражения в операторе WHILE. Если это зна¬ чение—«истина» (значение не равно нулю), то начи¬ нается выполнение цикла, т. е. выполняются операторы, следующие за оператором WHILE, до тех пор, пока не будет встречен оператор WEND. После этого вы¬ полнение цикла повторяется, т. е. после оператора WEND управление передается оператору WHILE. Работа цикла будет завершена тогда, когда логи¬ ческое выражение в операторе WHILE будет «ложь». В этом случае после оператора WHILE управление бу¬ дет передано оператору, следующему за оператором WEND. Пример. Найти сумму членов ряда S = 1 + 1/2 + + 1/4+1/8+ ... +1/2". 48
Сумма вычисляется, пока очередной член ряда не станет меньше 10_6. 10 S= 1: N=1 20 WHILE O.5AN>1E —6 30 S = S + 0.5AN 40 N-N+l 50 WEND Циклы могут быть вложенными друг в друга. Та¬ кими циклами могут быть циклы FOR/NEXT и циклы WHILE/WEND в любом сочетании. Внутренние циклы должны целиком помещаться во внешних. Если вложены друг в друга два цикла FOR/NTEXT, то они должны иметь различные управляющие пере¬ менные. Несколько подряд идущих операторов NEXT могут быть заменены одним оператором NEXT, кото¬ рый должен в этом случае содержать управляющие переменные всех вложенных циклов, заканчивающихся в этом месте. Они разделяются между собой запятыми. Завершение программы Для завершения выполнения программы использу¬ ется оператор END, который не имеет операндов. По оператору END закрываются все файлы, и интерпрета¬ тор переходит на уровень команд. Наличие оператора END в конце программы не обязательно (программа мо¬ жет быть завершена по любому выполняемому операто¬ ру с максимальным номером строки в этой программе). Обычно оператор END соответствует нормальному за¬ вершению программы. Для прекращения выполнения программы исполь¬ зуется оператор STOP, который не содержит операн¬ дов. По оператору STOP выполнение программы прекра¬ щается, и на экран дисплея выдается сообщение ОСТАНОВ В СТРОКЕ ппппп где ппппп — номер строки с оператором STOP, который вызвал прекращение работы программы. Оператор STOP в отличие от оператора END не вызывает закрытия используемых в программе фай¬ лов. Оператор STOP рекомендуется использовать при отладке программы для задания точек останова, в ко¬ торых можно проверить правильность выполнения прог¬ 4 Заказ 2634 49
раммы (например, проверить или изменить значение переменных). Выполнение программы можно продол¬ жать с помощью команды CONT. Подпрограммы Часто при выполнении программы в разных ее мес¬ тах должен выполняться один и тот же алгоритм, ко¬ торый записывается группой операторов. Эту группу целесообразно оформить отдельно и передавать ей уп¬ равление по мере необходимости. Такую группу опе¬ раторов называют подпрограммой. Для выполнения подпрограммы необходимо пере¬ дать ей управление, а после выполнения продолжить работу основной программы. Передачу управления к подпрограмме выполняют операторы GOSUB (GO to SUBroutine— перейти к подпрограмме) и ON GOSUB (ON... GO to SUBroutine — при ... перейти к подпрог¬ рамме), возврат к продолжению программы выполня¬ ется по оператору RETURN (return — возврат). В одной программе может быть несколько подпрог: рамм. Подпрограмма может обращаться к другой под¬ программе. Допускается рекурсивное обращение к под¬ программе. Для защиты от ошибочного входа в подпрограмму (без операторов GOSUB или ON GOSUB) перед под¬ программой целесообразно поставить оператор STOP или GO ТО. Общий вид оператора GOSUB: GOSUB номер-строки Номер-строки— номер строки, содержащей первый оператор подпрограммы. По оператору GOSUB управление передается под¬ программе и запоминается номер оператора, следующе¬ го в программе за оператором GOSUB. Этому опера¬ тору передается управление после выполнения опера¬ тора RETURN, завершающего подпрограмму. Оператор ON GOSUB имеет вид: ON выражение GOSUB номер-строки номер-строки] Выражение — любое числовое выражение. Выполнение оператора ON GOSUB вызывает пере¬ дачу управления одной из подпрограмм, номер первой строки которой задан в списке номеров строк. Выбор 50
номера строки из списка осуществляется в зависимос¬ ти от значения выражения, заданного в операторе пос¬ ле ключевого слова ON. Целая часть значения выра¬ жения определяет порядковый номер в списке. Если значение выражения меньше единицы или больше ко¬ личества номеров в списке, то управление передается оператору, следующему за оператором ON GOSUB. Для возврата из подпрограммы используется опера¬ тор RETURN: RETURN [номер-строки] Номер-строки — номер строки, первому оператору которой передается управление после выполнения опе¬ ратора RETURN. Если операнд номер-строки не задан, управление передается оператору, следующему за оператором GOSUB или ON GOSUB, выполнявшему передачу этой подпрограмме. В одной подпрограмме может быть не¬ сколько операторов RETURN. Пример. Разделение листов при выводе на уст¬ ройство печати можно осуществить выводом черточек (знаков «—»). Это можно выполнить с помощью под¬ программы, обращения к которой выполняются в тре¬ буемых местах основной программы. 200 GOSUB 1000 1000 FOR I % = 1 ТО 80 1010 PRINT 1020 NEXT 1% 1030 RETURN
ЧАСТЬ 3 ОРГАНИЗАЦИЯ ВВОДА-ВЫВОДА ГЛАВА 8. ОСНОВНЫЕ ПОНЯТИЯ ВВОДА-ВЫВОДА В общем случае процесс выполнения программы схематически можно разбить на три этапа: ввод ис¬ ходных данных, их обработка и вывод результатов. Под операцией ввода понимается считывание данных с внешнего устройства и присваивание их переменным, после чего они становятся доступными для использо¬ вания в программе. Независимо от способа представ¬ ления на внешнем устройстве данные во время ввода преобразуются к форме представления переменной. Во время операции вывода данные выбираются из пере¬ менных и передаются на внешнее устройство, где пред¬ ставляются в форме, характерной для данного устрой¬ ства (текст на экране, напечатанный текст и т. д.). Бейсик включает большой набор операторов и функ¬ ций, предназначенных для программирования операций ввода и вывода. Они позволяют выполнять такие опе¬ рации: • ввод данных с клавиатуры; • вывод данных на экран дисплея; • вывод данных на устройство печати; • ввод и вывод данных на магнитные диски. В данной главе рассматриваются общие понятия, связанные с вводом и выводом данных. Программиро¬ вание ввода-вывода для конкретных устройств рассмат¬ ривается в следующих главах. Файлы Файл — это набор логически связанных данных, ко¬ торый располагается на периферийном устройстве. Программа на Бейсике, записанная на диск, образует дисковый файл. Примером файла является поток дан¬ 52
ных, вводимых с клавиатуры. Так, если программа вво¬ дит список имен сотрудников, то она «знает», что поток данных разделяется на фамилии сотрудников, т. е. дан¬ ные, представленные на внешнем устройстве и обра¬ батываемые программой, рассматриваются программой как файл. Программе должна быть известна структура этих данных. В зависимости от способа организации данных раз¬ личают файлы двух типов: файлы с последовательным доступом и файлы с произвольным доступом. В файлах с последовательным доступом данные размещаются в порядке их поступления в файл. При чтении такого файла данные становятся доступными в том порядке, в котором они были записаны. В файле с произволь¬ ным доступом данные организуются таким образом, что доступ к ним может быть осуществлен в любом поряд¬ ке независимо от того, в какой последовательности данные помещаются в файл. В этом случае нет необхо¬ димости при поиске нужных данных просматривать файл от начала до конца, как это делается для файлов с последовательным доступом. Файлы на дисках и на устройстве печати могут быть определены как файлы с последовательным или про¬ извольным доступом. Для всех остальных устройств могут быть определены только последовательные фай¬ лы. Понятие файла с произвольным доступом для уст¬ ройства печати не совсем традиционно, но Бейсик поз¬ воляет использовать для вывода на устройство печати файлы обоих типов. В использовании этих файлов прак¬ тически нет различий, только файл с произвольным доступом позволяет осуществлять повторную печать в одной и той же строке. Например, вначале можно вы¬ вести строку текста, а затем, выводя в той же строке знаки подчеркивания, подчеркнуть нужные слова. Возможность использования файла для ввода дан¬ ных (вводной файл) или для вывода (выводной файл) зависит, главным образом, от типа периферийного устройства. Так, для клавиатуры могут быть опреде¬ лены только вводные файлы, для дисплея и печати — только выводные. Для магнитных дисков могут осу¬ ществляться ввод и вывод данных. С понятием файла тесно связаны такие понятия как спецификация файла, имя файла, номер файла и имя устройства. 53
Спецификация файла Это строковое выражение, которое использовано в операторе Бейсика для указания, где располагается й как идентифицируется файл. Строковое выражение, ис¬ пользуемое в качестве спецификации файла, имеет формат: имя-устройства: имя-файла. Имя-устройства: указывает устройство, на котором размещается файл. Задание имени устройства не обя¬ зательно. Когда оно опущено, то предполагается уст¬ ройство, выбираемое системой по умолчанию. Двоето¬ чие считается частью имени устройства и присутствует или опускается вместе с именем устройства. Имя-файла используется только в спецификациях файла, задающих файл на дисках. Имя устройства (или имя логического устройства). Это символическое наименование периферийного устрой¬ ства. В программе на Бейсике в качестве имен уст¬ ройств могут использоваться следующие значения: Имена логических устройств Имя устройства KYBD: Тип периферийного устройства Клавиатура SCRN: Экран дисплея LPT1: А: , В: , С: (1: , 2: , 3: ,...) Устройство печати Накопитель на магнитных дисках Имя файла. Имя файла используется только в спе¬ цификациях, задающих файл на дисках. Оно иденти¬ фицирует файл и состоит из двух частей: собственно имени и типа файла, разделенных точкой. Длина име¬ ни может быть от 1 до 8 символов, а типа — от 1 до 3 символов. Указание типа обычно используется для классификации файлов. Для этого именам родствен¬ ных файлов присваивается один и тот же тип. Напри¬ мер, файлы, содержащие программы на Бейсике, име¬ ют тип BAS. Могут использоваться имена, не содер¬ жащие типа файла. Для задания имени и типа файла могут использоваться любые символы. Ниже следуют примеры имен файлов: PROG.BAS ЦЕНА ABCD Номер файла — это целое число, которое присваи¬ вается файлу во время открытия и используется для обращений к нему в операторах ввода-вывода. 54
Обработка файла сводится к выполнению четырех основных операций: открытию файла, чтению данных из файла, записи данных в файл и закрытию файла. Операция открытия предназначена для подготовки фай¬ ла к обработке, а закрытия —для завершения обра¬ ботки. Открытие файла Обработка любого файла должна начинаться опе¬ рацией открытия. Открытие осуществляется с помощью оператора OPEN (open — открыть), который выполня¬ ет следующие действия: • связывает с файлом номер, который используется в операторах ввода-вывода для задания обрабатывае¬ мого файла; • определяет организацию данных в файле и режи¬ мы его обработки; • резервирует память для буфера ввода-вывода. Выводные файлы на дисках могут обрабатываться как создаваемые или как расширяемые. При открытии расширяемого файла выполняется поиск файла с за¬ данным именем, и, если такой файл существует, он будет открыт так, что информация будет записываться после последней записи. При этом вся информация, со¬ держащаяся в старом файле, будет сохранена. Создаваемые файлы всегда формируются заново. При этом если на диске существовал файл с заданным именем, то он будет удален, и вся информация, храня¬ щаяся в файле, будет уничтожена. Расширяемые фай¬ лы предоставляют удобную возможность для накопле¬ ния информации. Вывод информации в расширяемые и создаваемые файлы осуществляется одними и теми же операторами Бейсика. Оператор OPEN имеет формат: OPEN спецификация-файла [FOR тип-обработки] AS[=fl=] номер-файла [LEN = длина-записи] Спецификация-файла задается строковым выраже¬ нием и определяет имя файла и устройство, на кото¬ ром он расположен. Оператор OPEN — единственный из операторов ввода-вывода, в котором осуществляется ссылка на конкретный файл. В остальных операторах Для обращения к файлу используется логический номер файла. 55
Номер-файла задается целочисленным выражением^ которое может принимать значение в диапазоне от 1 до максимально доступного числа файлов (см. прило¬ жение 3). Заданный номер должен использоваться при всех последующих обращениях к файлу в операторах ввода-вывода. Тип-обработки определяет организацию данных в файле и указывает направление передачи данных (ввод или вывод). Этот операнд может принимать следую¬ щие значения: INPUT — последовательный вводной файл; OUTPUT — последовательный выводной файл; APPEND — последовательный расширяемый файл (ис¬ пользуется только для вывода). Если тип-обработки не указан, предполагается файл с произвольным досту¬ пом. Файлы этого типа могут быть как вводными, так и выводными. Длина-записи задается целочисленным выражением. Операнд используется только при открытии файлов с произвольным доступом. Назначение операнда более подробно описано в гл. 12. Для обеспечения совместимости с другими реали¬ зациями Бейсика допускается использование оператора OPEN в несколько видоизмененном формате: OPEN тип-обработки, [#] номер-файла, спецификация-файла [,длина-записи] В этом варианте тип-обработки задается строковым выражением и может принимать следующие значения: I — последовательный вводной файл; О — последовательный выводной файл; R — файл произвольного доступа. Заметим, что второй вариант оператора OPEN не позволяет обрабатывать последовательные расширяе¬ мые файлы. Ниже приводится пример оператора, который откры¬ вает последовательный выводной файл на диске В. Имя файла — TEST.ООО. OPEN "В: TEST.ООО" FOR OUTPUT AS #2. В качестве номера файла выбрано значение 2, оно должно задаваться в операторах вывода, обращающих¬ ся к этому файлу. Этот оператор можно также записать в другой форме: OPEN "О", #2, "В: TEST.000" 56
Для открытия файла на устройстве печати можно использовать следующую форму оператора OPEN: OPEN "LPTl:" FOR OUTPUT AS #1 Оператор OPEN "SCRN:" FOR OUTPUT AS #1 открывает файл для вывода па экран. Стандартные файлы. В Бейсике стандартно опреде¬ лены три файла, посредством которых можно осущест¬ влять ввод данных с клавиатуры, вывод на экран дис¬ плея и вывод на устройство печати. Эти файлы авто¬ матически открываются при запуске Бейсика, закры¬ ваются при завершении его работы, и поэтому не тре¬ буется выполнения ни операции открытия, ни операции закрытия. Работа с этими файлами и предназначенные для этой цели операторы описаны в следующих главах вместе с описанием ввода-вывода для соответствующих периферийных устройств. Закрытие файла После завершения обработки файла необходимо осуществить стандартные действия, которые связаны с освобождением ресурсов, используемых файлом (номер файла, имя файла и т. д.), и выполнением операции по завершению передачи данных. Например, так как вывод данных осуществляется блоками фиксированной длины, то в памяти может храниться незаполненный блок, который необходимо вывести по завершении об¬ работки. Выполнение этих действий называется закры¬ тием файла. Для этих целей в Бейсике используется оператор CLOSE (close — закрыть), который выполня¬ ет следующее: • освобождает номер файла для использования в операторах открытия файла (попытка использовать номер закрытого файла в операторах ввода-вывода бу¬ дет вызывать сообщение об ошибке); • освобождает память, зарезервированную для бу¬ фера ввода-вывода. При этом для выводного и расши¬ ряемого файлов находящиеся в буфере данные пере¬ даются в файл; • для выводного файла записывается признак кон¬ ца файла (символ с кодом &Н1А). При чтении после¬ довательного файла по этому символу обнаруживается конец вводимой информации. 57
После закрытия файл может быть повторно открыт для последующей обработки. Оператор CLOSE имеет формат: GLOSE [ [#] номер-файла [, [=Ц=] номер-файла]. ♦.] В результате выполнения оператора закрываются все перечисленные в операторе файлы. Если ни один операнд не указан, будут закрываться все открытые к этому моменту файлы. После закрытия файла его но¬ мер может использоваться при открытии других фай¬ лов. Файлы, не закрытые оператором CLOSE, закрыва¬ ются в результате выполнения оператора END и команд NEW, RESET, SYSTEM или RUN (без режи¬ ма R). При работе с интерпретатором закрытие всех файлов выполняется при любой корректировке прог¬ раммы. Пример. Ниже приведен фрагмент программы, в которой вначале файл открывается как выводной, а затем — как вводной. 10 OPEN "BiTEST.OOO" FOR OUTPUT AS #1 20 'Создание файла 30 CLOSE 1 40 OPEN "BiTEST.OOO" FOR INPUT AS #1 50 'Обработка файла 60 CLOSE 1 ГЛАВА 9. ВЫВОД ДАННЫХ НА ЭКРАН ДИСПЛЕЯ Вывод данных на экран дисплея может осуществ¬ ляться с помощью операторов обработки стандартного файла: PRINT (print — напечатать), PRINT USING {using — используя), WRITE (write — писать), а также с помощью операторов вывода данных в последователь¬ ные файлы, открытые оператором OPEN: PRINT =ФП, PRINT USING, WRITE *n. Результаты выполне¬ ния и способы задания операндов у соответствующих операторов из этих групп одинаковы. Оператор PRINT обеспечивает вывод числовых и строковых данных. Числовые данные изображаются на экране в экспоненциальной форме или в форме десятич¬ ных чисел в зависимости от диапазона их значений. Строковые данные выводятся на экран без преобразо¬ 58
ваний. Выводимые данные можно размещать, начиная с фиксированных позиций в строке. Оператор PRINT USING осуществляет вывод данных по шаблону. Опе¬ ратор WRITE выводит данные в том же виде, что и опе¬ ратор PRINT, только данные располагаются последова¬ тельно друг за другом. При этом между данными вы¬ водится запятая, строковые значения заключаются в кавычки. Текстовая информация может выводиться на экран дисплея, работающего как в текстовом, так и в графи¬ ческом режиме. На экран дисплея, работающего в текс¬ товом режиме, может одновременно выводиться тексто¬ вая и графическая информация. Вид операторов выво¬ да текстовой информации не зависит от режима работы дисплея. Подробная информация о программировании выво¬ да графической информации приведена в главе 13. На экран дисплея информация выводится строками длиной 40 или 80 символов. Количество строк, разме¬ щающихся на экране, равно 25. Строки нумеруются сверху вниз от 1 до 25, а столбцы — слева направо от 1 до 80. Положение символа на экране задается номера¬ ми строки и столбца, на пересечении которых он нахо¬ дится. Очистка экрана В результате выполнения очистки экрана информа¬ ция, находящаяся на экране, стирается, курсор разме¬ щается в левом верхнем углу экрана. Очистить экран можно в любой момент во время ввода данных с кла¬ виатуры или во время выполнения программы. Очистка экрана во время выполнения программы осуществляется в результате выполнения оператора CLS (CLear Screen — очистить экран). Формат опера¬ тора: CLS Для очистки экрана во время ввода данных доста¬ точно нажать комбинацию клавиши УПР — [К - Эти два способа очистки экрана могут использоваться в тексто¬ вом и графическом режимах. 59
Установка длины строки экрана Бейсик позволяет с помощью оператора WIDTH (width — ширина) управлять длиной строки. Оператор WIDTH может задаваться в одной из трех форм: WIDTH длина-строки WIDTH "SCRN:", длина-строки WIDTH номер-файла Длина-строки— числовое выражение, которое долж¬ но задавать значение 40 или 80. . Номер-файла — числовое выражение, задающее но¬ мер файла, открытого для вывода на экран дисплея. В результате выполнения оператора WIDTH любо¬ го формата устанавливается заданная ширина строки дисплея. Изменение длины строки вызывает стирание экрана и установку черного цвета окаймления экрана. Понятие окаймления рассмотрено в гл. 13. Управление цветом символов Возможности по управлению цветом выводимого сим¬ вола зависят от режима работы дисплея. В графическом режиме цвет выводимого символа всегда совпадает с цветом переднего плана; цвет фона, окружающего сим¬ вол, совпадает с цветом фона, установленным операто¬ ром COLOR. В случае выполнения оператора COLOR, Изменяющего цвета фона и переднего плана, автомати¬ чески изменяется раскраска всех символов на экране. Символы, выводимые в дальнейшем, будут окрашены этим же цветом. Оператор COLOR для графического ре¬ жима и понятия цвет фона и переднего плана рассмот¬ рены в гл. 13. В текстовом режиме цвет символа и его фона уста¬ навливается оператором COLOR, Действие оператора распространяется на символы, которые будут выведены в дальнейшем, при этом цвет символов, уже находящих¬ ся на экране, не изменяется. В отличие от графическо¬ го режима в текстовом режиме на экране одновременно могут находиться символы различного цвета. Оператор COLOR имеет формат: COLOR [передний-план] [,[0о«] [.окаймление]] Передний-план— числовое выражение в пределах от 0 до 31, значение которого задает цвет символа. 60
Фон — числовое выражение в пределах от 0 до 7, зна¬ чение которого задает цвет фона. Окаймление — числовое выражение в пределах от О до 7, значение которого определяет цвет фона. Операнд обычно может быть использован только для графичес¬ ких дисплеев. Если какой-либо из операндов опущен, то значение, устанавливаемое этим операндом, остается без измене¬ ния. Интерпретация номеров цветов, задаваемых в опера¬ торе COLOR, зависит от типа дисплея. Для цветного дисплея номера цветов от 0 до 7 составляют основной набор цветов, а номера с 8 до 15 являются светлыми от¬ тенками этого набора. Базовыми для цветных дисплеев являются три цвета; синий, зеленый, красный. Осталь¬ ные цвета являются смесью базовых. Ниже приведены цвета и соответствующие им номера. Можно получить мерцание знаков, если в операторе COLOR в качестве цвета переднего плана задать значе¬ ние, равное номеру желаемого цвета, увеличенному на 16. Номера цветов в текстовом режиме Номер Цвет цвета Номер Цвет цвета О Черный 1 Синий 2 Зеленый 3 Голубой (сине-зеленый)* 4 Красный 5 Пурпурный (красно-си¬ ний)* 6 Коричневый (красно-зе¬ леный) * 7 Белый (сине-зелено-крас¬ ный) * 8 Серый 9 Светло-синий 10 Светло-зеленый 11 Светло-голубой 12 Розовый (светло-крас¬ ный) 13 Светло-пурпурный 14 Желтый (светло-корич¬ невый) 15 Ярко-белый * В скобках указаны базовые цвета, смесь которых образует данный цвет. Пример. Оператор COLOR 7,3 устанавливает бе¬ лый передний план и голубой фон, т. е. символы, выво¬ димые последующими операторами, изображаются бе¬ лым цветом на голубом фоне. Черно-белый дисплей взамен цветов предлагает воз¬ можность изменять способ отображения символа. Для кодирования способа отображения символа использует¬ ся тот же оператор COLOR, но операнды интерпретиру- 61
Таблица 9.1 Типы символов черно-белого дисплея Тип окраски символа Номер цвета переднего плана Номер фона белый символ на черном фоне (стандартные символы) 1 0 Стандартные символы с подчеркиванием 1 0 Обратное изображение символа 0 7 Невидимые символы 0 0 Стандартные символы Любая комбинация номеров цветов переднего плана и фона, отличающегося от пе¬ речисленных выше ются другим способом. Эффект мерцания и более высо¬ кой интенсивности свечения программируется добавле¬ нием соответственно 8 или 16 к номеру цвета переднего плана. Варьируя операнды, можно получить пять различных способов отображения символов (табл. 9.1). Пример. Чтобы осуществить вывод символов с подчеркиванием, необходимо перед их выводом выпол¬ нить оператор COLOR 1,0. Общие правила вывода данных на экран Вывод информации на экран начинается с позиции, в которой находится курсор. Данные заполняют строку слева направо; курсор при этом автоматически продви¬ гается. После того как будет достигнута последняя по¬ зиция строки, вывод будет продолжен с первой позиции следующей строки. Обычно для вывода данных доступны 24 строки экрана. Последняя 25-я строка зарезервирована для 62
отображения значений, назначенных функциональным клавишам. Если при выводе в 24-ю строку возникает ус¬ ловие, требующее перехода на следующую строку, то выполняется стандартная процедура, называемая сверт¬ кой экрана. При свертке экрана строки с 1-й по 24-ю поднимаются на одну строку вверх, тем самым первая строка уничтожается, а 24-я строка освобождается. Пос¬ ле выполнения свертки экрана вывод будет продолжен с 24-й строки. Чтобы обеспечить возможность вывода данных, на¬ чиная с любой позиции экрана, в состав Бейсика вклю¬ чен оператор LOCATE (locate — расположить) для пе¬ ремещения курсора в любое место экрана. Кроме перемещений курсора по экрану, оператор LOCATE позволяет управлять размерами курсора и его видимостью. Оператор LOCATE имеет формат: LOCATE [строка] [, [столбец] [, [курсор] [, [начало] [,конец] ] ] ] Строка — числовое выражение в пределах от 1 до 25, задающее номер строки, в которую будет перемещен курсор. Столбец — числовое выражение, задающее номер столбца, в который будет перемещен курсор. После вы¬ полнения оператора курсор будет находиться на пересе¬ чении строки и столбца, номера которых указаны в опе¬ раторе. Курсор — может быть целым значением 0 или 1. Значение 1 указывает, что во время выполнения про¬ граммы курсор должен быть виден на экране, значение О указывает, что курсор должен быть невидимым. Начало, конец — числовые выражения, задающие но¬ мера начальной и конечной линий, описываемых элект¬ ронным сканирующим лучом, генерирующим изображе¬ ние курсора. Линии в пределах области, отведенной для формирования курсора, нумеруются сверху вниз, начи¬ ная с 0. Максимальный номер линии для графического дисплея равен 7, а для алфавитно-цифрового— 13. Если какой-либо операнд опущен, то используется старое значение соответствующего операнда. Варьируя значения операндов начало и конец, можно изменять форму курсора от вытянутой линии до прямо¬ угольника, вытянутого вверх. Если операнд начало боль¬ ше операнда конец, то курсор будет изображаться дву¬ мя прямоугольниками. На рис. 9.1 изображена форма курсора, которую он примет после выполнения опера- 63
тора LOCATE, ,,2,4 в случае использования графичес¬ кого дисплея. Основное назначение оператора LOCATE — переме¬ щение курсора в позицию, начиная с которой будет осу¬ ществляться вывод данных. Обычно 25-я строка не ис¬ пользуется для вывода, в ней отображается информация об использовании функциональных клавиш, и она не участвует в свертке экрана. С помощью оператора LOCATE можно перевести курсор в 25-ю строку и ис¬ пользовать ее для вывода данных. Для этого предвари¬ тельно необходимо очистить эту строку с помощью опе¬ ратора KEY OFF. Описание этого оператора приведено в гл. 11. Если после вывода в 25-ю строку возникает ситуация, требующая перехода на следующую строку, то выполняется свертка экрана и для вывода использу¬ ется 24-я строка. Свертка экрана может быть предот¬ вращена переводом курсора в одну из строк 1—24. Двадцать пятую строку удобно использовать для вы¬ вода информации, которая должна сохраняться на про¬ тяжении всего времени выполнения программы. Пример. Чтобы начать вывод с 20-й колонки 10-й строки, необходимо выполнить оператор LOCATE 10, 20. 64
Определение положения курсора Для получения номера столбца и строки, в которых в текущий момент на-ходится курсор, можно использо¬ вать функции POS (POSition — местоположение) и CSRLIN (CurSoR LINe — строка курсора). Результатом выполнения функции POS является число, указываю¬ щее номер столбца, в котором находится курсор. Фор¬ мат функции: POS(O) Аргументом может быть любое значение, оно не влияет на результат выполнения функции POS. Функция CSRLIN возвращает, номер строки, в кото¬ рой в данный момент находится курсор. При задании этой функции не используются аргументы. Формат функции: CSRLIN Установка текстового режима работы дисплея В текстовом режиме может работать как графичес¬ кий, так и алфавитно-цифровой дисплей. Информация о символах, отображаемых на экране, содержится в буфе¬ ре дисплея. Каждый символ представлен двумя байта¬ ми: первый из них — байт-атрибут — содержит инфор¬ мацию о цвете символа, а второй — код отображаемого символа. Ниже приведена структура байта-атрибута- Содержимое байта-атрибута Бит Использование X Бит мерцания символа. Символ мерцает, если бит ра¬ вен 1 .XXX .... Номер цвета фона .... ХХХХ Номер цвета переднего плана. Старший биг этого поля иногда рассматривают как бит интенсивности свечения В зависимости от установленной в программе шири¬ ны строки экрана (40 или 80 символов) для представ¬ ления данных, находящихся на экране, требуется буфер размером 2 или 4 Кбайта. Так как графический дисплей содержит буфер размером 16 Кбайт, то он может быть разделен на 4 или 8 буферов текстового режима в зави¬ симости от ширины строки. Эти буферы принято назы¬ 5 Заказ 2634 65
вать страницами. Они нумеруются от 0 до 7 при шири¬ не строки 40, и от 0 до 3 при ширине строки 80. Наличие нескольких буферов расширяет возможнос¬ ти по отображению информации. Во-первых, переключая отображаемый буфер, можно произвести мгновенную смену информации, находящейся на экране. Во-вторых, во время отображения какой-либо страницы можно на¬ капливать информацию в другой странице, а после ее заполнения произвести смену «картинки» на экране. В Бейсике приняты следующие соглашения: буфер, который отображается на экран в текущий момент, на¬ зывается отображаемой страницей, а буфер, в который заносится информация в результате выполнения опера¬ торов вывода, называется активной страницей. Обычно активная и отображаемая страницы совпадают и имеют номер 0. Выполнение любого оператора вывода на экран состоит в пересылке данных в активную страни¬ цу. Если активная страница совпадает с отображаемой, данные сразу появляются на экране дисплея. В против¬ ном случае, только сделав активную страницу отобра¬ жаемой, можно увидеть на экране выведенную инфор¬ мацию. С помощью оператора SCREEN (screen — экран) можно устанавливать текстовый режим работы дисплея и номер активной и отображаемой страниц (для графи¬ ческих дисплеев). Полная форма оператора SCREEN приведена в гл. 13. Для установки текстового режима используется следующая форма оператора SCREEN: SCREEN 0[,,[активная-страница] [.отображаемая-страница}] Первый операнд 0 указывает, что устанавливается текстовый режим, другие варианты этого операнда опи¬ саны в гл. 13. Активная-страница может быть числом от 0 до 7, ко¬ торое задает номер активной страницы. Отображаемсся-страница может быть числом от 0 до 7, которое задает номер отображаемой страницы. При смене активных страниц следует учитывать, что позиция курсора при переходе от страницы к странице сохраняется. Для того чтобы сохранять положение кур¬ сора на каждой странице, можно перед переключением отображаемой страницы сохранить информацию о пози¬ ции курсора. Для получения координат текущей позиции курсора можно использовать встроенные функции CSRLIN и POS. Затем, используя оператор LOCATE, можно восстановить старое положение курсора. 66
Для установки текстового режима нужно выполнить оператор SCREEN 0. Оператор SCREEN 0, ,1,0 устанавливает номер активной страницы 1, а отображаемой — 0. После выпол¬ нения этого оператора выводимая информация будет на¬ капливаться в первой странице без отображения на эк¬ ране дисплея. Чтобы отобразить эту информацию на экра¬ не, необходимо выполнить оператор SCREEN 0,, 1, Е Символы управления дисплеем Некоторые символы воспринимаются дисплеем как управляющие. С их помощью можно передвигать кур¬ сор на одну позицию в любую сторону и стирать экран. При передаче на дисплей управляющего символа вы¬ полняется соответствующее действие. При этом сам символ на экране не отображается. Обычно в програм¬ ме на Бейсике для задания управляющих символов ис¬ пользуется встроенная функция CHR$. Ниже приведе¬ ны управляющие символы дисплея. Управляющие символы дисплея Символы CHR$ (12) CHR$ (28) CHR$ (29) CHR$ (30) CHR$ (31) Выполняемое действие Очистка экрана Перемещение курсора вправо Перемещение курсора влево Перемещение курсора вверх Перемещение курсора вниз Чтение атрибута и кода символа В некоторых случаях возникает необходимость про¬ читать код символа, находящегося на экране, и его ат¬ рибуты. Для этого может использоваться встроенная функция SCREEN: SCREEN (строка, столбец[,режим]) Строка, столбец — числовые выражения, которые за¬ дают координаты позиции экрана, Режим — числовое выражение, которое интерпрети¬ руется «истина» (не равно 0) или «ложь» (равно 0). Операнд режим определяет, что будет возвращено в ка¬ честве значения функции SCREEN. Если операнд режим имеет значение «ложь», результатом выполнения функ¬ ции будет код символа, находящегося в заданной по- 5* 67
Зинии экрана. Если операнд режим имеет значение «ис¬ тина», то функция возвращает бант-атрибут указанной позиции экрана. Содержимое байта-атрибута приведено на с. 65. Оператор PRINT Оператор PRINT предназначен для вывода на экран значений, перечисленных в списке выражений: PRINT [выражение[,выражениё\\...[;] Вместо ключевого слова PRINT можно использовать знак «?». Выражение — любое числовое или строковое выра¬ жение. Для разделения выражений необходимо исполь¬ зовать запятую, точку с запятой или пробел. Точка с запятой, указанная в конце оператора, от¬ меняет переход на следующую строку после завершения вывода данных. В результате выполнения оператора PRINT значения выражений, указанных в списке выра¬ жений, выводятся на экран. Если список выражений опущен, выводится пустая строка. Строки символов выводятся без изменений, а число¬ вые значения — с предшествующим знаком и последую¬ щим пробелом. Вместо знака « + » выводится пробел. Позиция первого выводимого данного определяется положением курсора, а последующих — знаком пунктуа¬ ции, заданным перед соответствующим выражением. Выводная строка разбита на зоны по 14 позиций каж¬ дая. Запятая вызывает размещение очередного элемен¬ та в первой позиции следующей зоны. Если элементу предшествует точка с запятой или пробел, то он разме¬ щается сразу после предыдущего. Если очередное зна¬ чение не помещается в текущей строке, оно будет про¬ должено с начала следующей строки. Пример. Приведенная ниже программа иллюстри¬ рует влияние разделителей на способ вывода данных. 10 PRINT "ПЛЮС”, "МИНУС" 20 PRINT "ПЛЮС"; "МИНУС" run ПЛЮС МИНУС ПЛЮСМИНУС Для установки позиции при выводе данных могут использоваться встроенные функции TAB (TABulation— 68
табуляция) и SPC (SPaCe— пробел). Эти функции за¬ даются в списке выражений. Функция SPC имеет формат: SPC(n) где п — целое число в диапазоне от 0 до 255. Появление функции SPC в списке выражений озна¬ чает, что будет выведено п пробелов. Выводя пробелы, можно выравнивать данные на нужную границу. Формат функции TAB: ТАВ(п) где п — целое число в диапазоне от 1 до 255. Если среди списка выражений встречается функция TAB, то осуществляется переход к «n-й» позиции стро¬ ки. Крайняя левая позиция строки имеет номер 1. Ес¬ ли п меньше номера текущей позиции строки, то осу¬ ществляется переход к позиции п на следующей строке. Функцию SPC удобно использовать, если требуется разделить выводные элементы несколькими пробелами, а функцию TAB — когда требуется выравнять данные на определенную границу. Пример. Ниже приведена программа, выводящая на экран названия городов и их индексы. 10 PRINT "Город"; TAB (20); "Индекс" 20 READ A$ 30 IF A$=" " THEN END 40 READ B$ 50 PRINT A$; TAB (20); B$ 60 GOTO 20 70 DATA Минск, 220000, Воронеж, 394000, " run Город Индекс Минск 220000 Воронеж 394000 Программа считывает данные в цикле. Признаком конца данных является пустая строка, поэтому в строке 30 выполняется проверка, является ли введенная стро¬ ка пустой. Следующая программа выводит на экран значения тригонометрических функций синус и косинус. Аргумент изменяется от 0 до 1.5 с шагом 0.1. 10 PRINTSPC(2); "X"; TAB (19); "Sin"; TAB (34); "Cos" 20 PRINT 30 FOR X=1 TO 1.5 STEP .1 40 PRINT X; TAB (15); SIN (X); TAB (30); COS (X) 50 NEXTX 69
Далее приведен пример программы, которая выво¬ дит на экран дисплея прямоугольники всевозможных цветов. В этой программе демонстрируется использова¬ ние оператора LOCATE для управления положением курсора. Управление цветом выводимых символов осу¬ ществляется с помощью оператора COLOR. 10 SCREEN O:CLS:KEY OFF 20 A$=STRING$ (18, CHR$ (&HAB)) 30 N=0 'Тестовый режим. Очистка экрана. 'Формирование строки символов, 40 FOR LN=1 ТО 20 50 FOR CLMN=2TO 60 READ B$ 70 COLOR N, 0 80 N=N+1 90 GOSUB 180 100 NEXT CLMN 110 NEXT LN STEP 5 ''Номер строки. 80 STEP 20 'Номер столбца. 'Считывание названия цвета. 'Установка номера цвета переднего плана. 'Следующий номер цвета. 'Вызов подпрограммы для вывода прямоугольника. 120 DATA Черный, Синий, Зеленый, Голубой 130 DATA Красный, Пурпурный. Коричневый, Белый 140 DATA Серый, Светло-синий, Светло-зеленый, Светло-голубой 150 DATA Розовый, Светло-пурпурный, Желтый, Ярко-белый 160 END 170 REM Подпоограмма вывода прямоугольника. 180 FOR 1=0 ТО 2 190 LOCATE LN+I, CLMN . 'Установка начала выводимой строки. 200 PRINT А$ 'Вывод строки, формирующей прямоугольник. 210 NEXT I 220 LOCATE LN+I, CLMN 230 COLOR 7,0 240 PRINT B$ 250 RETURN 'Установка положения начала названия цвета. 'Установка номера названия цвета. 'Вывод названия цвета. Строки программы 40—110 повторяются в цикле 16 раз. При каждом проходе устанавливаются новый цвет переднего плана и координаты верхнего левого угла прямоугольника. Затем для вывода прямоугольника вы¬ зывается подпрограмма, находящаяся в строках 170— 250. Построение прямоугольника на экране осуществля¬ ется выводом строки символов, состоящей из 18 симво¬ лов CHR$(&HAB), в трех последовательных строках экрана. Изображение символа CHR$(&HAB) приведено в приложении 2. Оператор PRINT USING Оператор PRINT USING осуществляет вывод дан¬ ных по шаблону и отличается от оператора PRINT тем, что позволяет управлять формой представления выводи¬ мых данных. Во всем остальном эти операторы полно¬ стью идентичны. 70
Форма представления данных, выводимых операто¬ ром PRINT, определяется значением самого данного. Числовые данные преобразуются к десятичному числу или числу с фиксированной точкой, или к числу, пред¬ ставленному в экспоненциальной форме в зависимости от их значений. Длина поля, занимаемого данным, так¬ же определяется его значением. Каждый символ строко¬ вого данного представляется одной позицией на экране. При использовании оператора PRINT USING форма представления данного определяется шаблоном, задава¬ емым в этом операторе, и не зависит от значения дан¬ ного. Выбрав подходящий шаблон, можно получить представление данных, удовлетворяющее потребностям конкретного применения. Оператор PRINT USING име¬ ет формат: PRINT USING шаблон; виражение[,виражение\...[;] Шаблон — строковая константа или переменная, оп¬ ределяющая форму вывода значений. Выражение — любое числовое или строковое выра¬ жение. Для разделения выражений можно использовать только запятую. В списке выражений нельзя использо¬ вать встроенные функции TAB и SPC. Выравнивание на требуемую границу должно осуществляться выводом пробелов. Символ «;» в конце оператора отменяет переход на следующую строку после завершения вывода данных. Вывод строк символов. Оператор PRINT USING мо¬ жет вывести либо все строковое значение, либо задан¬ ное количество символов, отсчитываемых слева направо. Шаблон для вывода строк символов задается одним из следующих трех способов: ! —задает вывод только первого символа строки; & — задает вывод всей строки; \п пробелов X — задает вывод 24-п первых симво¬ лов строки. Шаблон может быть задан в виде в этом случае выводятся два первых символа строки. Пример. В следующем примере с помощью раз¬ личных шаблонов выводится одна и та же строка "123456789". Если длина строкового значения меньше длины поля, задаваемого форматом типа "\\", то оставшееся сво¬ бодное место заполняется пробелами. 71
10 А$="123456789" 20 В$="Шаблон:" 30 PRINT USING А$; : PRINT TAB (15); В$+" ! " 40 PRINT USING A$; : PRINT TAB (15) ; B$+"\\" 50 PRINT USING "\ \"; A$; : PRINT TAB (15); B$+"\ \" 60 PRINT USING A$; : PRINT TAB (15); B$+"&" run 1 12 1234 ■ 123456789 Шаблон:! Шаблон:\\ Шаблон:\ \ Шаблон:& Вывод числовых значений. Шаблон для числовых значений задает поле вывода фиксированной длины. Длина этого поля определяется общим количеством символов в шаблоне. Выводимое значение преобразуется к десятичному виду или к представлению в экспонен¬ циальной форме в зависимости от значения шаблона, а затем переносится в поле вывода. Что будет занесено в позицию поля вывода, задается символом, определяю¬ щим эту позицию. Ниже приведены символы, которые могут использоваться в шаблонах для вывода числовых значений. Символы числового шаблона 4г Цифровая позиция поля вывода всегда присутствует в выво¬ димой строке и может содержать цифру, знак числа или пробел. В крайних левых позициях выводятся пробелы, если в выводимом числе меньше цифр, чем определено шаблоном. Задает местоположение десятичной точки. Слева располага¬ ется целая часть числа, а справа — дробная. + Задает позицию знака числа и может быть первым или по¬ следним символом шаблона. В эту позицию выводится знак числа + или —. — Задает знаковую позицию числа и может быть только послед¬ ним символом в шаблоне. При выводе отрицательного числа в эту позицию будет помещен знак —, а при выводе положи¬ тельного числа — пробел. ** Описывают две цифровых позиции поля вывода и могут быть только первыми символами шаблона. Если эти позиции ока¬ зываются незанятыми значащими цифрами, то заполняются знаком *. $$ Описывают одну цифровую позицию поля вывода и могут быть только первыми символами шаблона. Они вызывают вставку знака денежной единицы слева от первой значащей цифры. + *$ Описывают две цифровые позиции поля вывода и могут быть только первыми символами шаблона. Если эти позиции не заняты значащими цифрами, то они заполняются знаком *; перед первой значащей цифрой выводится знак денежной еди¬ ницы. 72
, Задается в целой части числа и вызывает вставку запятой после каждой третьей цифры, считая справа налево. ~ ~ ~ ~ Определяют экспоненциальную форму представления числа при выводе и могут быть указаны после цифровых позиций. В этих позициях выводится экспонента числа. — (подчеркивание) Указывает, что знак, следующий за ним в шаблоне, должен быть помещен в поле вывода без изменений. Любой символ Любой символ, не являющийся символом описания числово¬ го или строкового шаблона, выводится в поле вывода без изменений. Если выводимое число не вмещается в поле, опреде¬ ленное шаблоном, перед числом будет выведен знак %. Поле вывода числа не должно содержать более 24 циф¬ ровых позиций. Заметим, что с помощью одного шаблона можно за¬ давать несколько полей вывода. Для разделения шабло¬ нов можно использовать любой символ, не являющий¬ ся символом описания числового или строкового шабло¬ на. Символ описания строкового шаблона (z/\z/) сам является разделителем. Если количество выводимых значений больше, чем число полей, определенных в шаблоне, то после исполь¬ зования последнего поля шаблон начинает просматри¬ ваться с начала. Выбирая соответствующий шаблон, можно выполнить следующие основные виды редактирования числовых данных: • числа, выводимые столбиком, могут выравниваться по десятичной точке и правой границе, что улучшает их восприятие; • разбиение целой части числа на группы по три цифры: • вывод знака в конце числа и отказ от замены зна¬ ка + на пробел; • замена ведущих нулей символом *; • вставка перед числом знака $ с заменой ведущих нулей на пробелы или символ *; • вывод чисел в экспоненциальной форме; • вывод вместе с числом символьной константы. Примеры. Далее приводятся примеры, иллюстри¬ рующие различные способы редактирования числовых данных. 73
• Выравнивание целых чисел по правому краю. Про¬ грамма выводит степени числа 16, после каждой третьей цифры выводится запятая. 10 FOR 1 = 1 ГО 4 20 PRINT USING "* #*,««***"; I, 16ЛГ 30 NEXT I run- 1 16 2 256 3 4,096 4 65,536 Пример программы, которая выводит натуральный логарифм чисел, являющихся степенями десяти, с точ¬ ностью до трех знаков. 10 PRINT SPC (3); "X", "LOG (X) " 20 FOR 1=1 ТО 4 30 PRINT USING "##### \ \10%LOG (10Л I) 40 NEXT I run X LOG(X) 10 2.303 100 4.6C5 1000 6.908 10000 9.210 В этом примере для выравнивания на требуемую границу вторым операндом выводится пустая строка, для которой отводится поле длиной 6 символов. • Управление выводом знака числа иллюстрируется программой, которая выводит одно и то же число с шаб¬ лонами, задающими позицию знака различными спосо¬ бами. Для наглядности данные на экран выводятся столбцами, в первой строке столбца находится шаблон, использованный для вывода этого столбца. По этомуже принципу построен пример, демонстрирующий замену ве¬ дущих нулей звездочками и вставку знака денежной единицы. 10 PRINT"#### "+### "###- " 20 А$= "####+######—###+" 30 PRINT USING А$; 1, 1, 1, 1 40 PRINT USING А$; -1, -1, -1, -1 50 PRINT USING А$; 123, 123, 123, 123 run ##*+ 1 +1 1 1 + -1 -1 1- 1- 123 +123 123 123+ 74
• Замена незначащих ведущих нулей звездочкой и вставка знака $. 10 PRINT"####"; "**##"; "**$+" 20 А$= "#«#♦* **«« $$** **$#" 30 PRINT USING А$; 1, 1, 1, 1 40 PRINT USING А$; -1,-1, -1,-1 50 PRINT USING А$; 123, 123, 123, 123 60 PRINT USING A$; 1234, 1234, 1234, 1234 run #### $$## **$+ 1 *** 1 $1 **$1 -1 #*—1 $1 *-$1 123 *123 $123 $123 1234 1234 %$1234 %$ Заметим, что в последней строке перед двумя послед¬ ними числами выведен знак %, так как значения не мо¬ гут разместиться в отведенных полях. • Вывод чисел в экспоненциальной форме. 10 PRINT лллл" 20 А$= " 30 PRINT USING А$; 12 40 PRINT USING А$; -12 50 PRINT USING А$; 1234.12 60 PRINT USING A$; 2.5 4 8 run 1.2000Е+01 -1.2000Е+01 1.2341 D+03 1.5259Е+03 • Вставка в поле вывода символьной константы. 10 SUM=123.45 20 PRINT USING "Сумма **#####.#*"; SUM run Сумма ****123.45 Оператор WRITE Оператор WRITE предоставляет еще один способ вы¬ вода информации на экран, который характеризуется высокой плотностью размещения данных на экране. Данные, выводимые этим оператором, размещаются на экране последовательно друг за другом, начиная с по¬ зиции курсора. При выводе соблюдаются следующие правила: • данные разделяются запятыми; • строки символов заключаются в кавычки; 75
• перед положительным числом не вставляется про¬ бел; • после числа не вставляется пробел. Оператор WRITE имеет формат: WRITE [выражение] [.выражение]... Выражение — любое числовое или строковое выра¬ жение. Оператор WRITE выводит значения выражений, за¬ данных в списке выражений, на экран дисплея. В конце всех выводимых данных автоматически вставляются сим¬ волы «перевод строки» и «возврат каретки», что вызы¬ вает переход на следующую строку. В результате выпол¬ нения оператора без списка выражений выводится пус¬ тая строка. Пример. 10 WRITE "Весна",10,20, — 5, "Осень" run "Весна", 10,20, —5, "Осень" Открытие файла для вывода на экран Операторы вывода на экран, рассмотренные выше, при выполнении используют стандартный файл вывода на экран. Вывод на экран дисплея может осуществляться не только с помощью операторов, использующих стандарт¬ ный файл вывода на экран, но и с помощью операторов вывода данных в последовательный файл. Нет различий между выводом информации с помощью операторов вы¬ вода в стандартный файл и операторами вывода в по¬ следовательный файл. В программах, которые должны одну и ту же информацию выводить на несколько уст¬ ройств либо на устройство, тип которого определяется в процессе выполнения программы в зависимости от ус¬ ловий, удобнее использовать операторы вывода в после¬ довательный файл. Для того чтобы изменить устройство вывода, достаточно выполнить оператор OPEN с другой спецификацией файла, для задания которой можно ис¬ пользовать строковую переменную. Для открытия файла вывода информации на экран дисплея используется следующая форма оператора OPEN: OPEN "SCRN:" FOR OUTPUT AS #n где n— номер файла. 76
Если в качестве спецификации файла необходимо за¬ дать переменную, то можно выполнить следующие опе¬ раторы: 10 F$ = "SCRN:" 20 OPEN F$ FOR OUTPUT AS#1 Номер файла равен 1. Операторы вывода данных в последовательной файл имеют формат: PRINT ^номер-файла,выражение[,выражение]... PRINT=f|=«O4iep-^au^a,USING шаблон,выражение^,выражение]... WRITE ^номер-файла,выражение[,выралсение]... Номер-файла — номер, присвоенный файлу во время его открытия. С помощью номера-файла осуществляется связь между оператором открытия файла OPEN и опе¬ ратором вывода. Все эти операторы аналогичны операторам вывода на экран дисплея PRINT, PRINT USING и WRITE. От¬ личие состоит в том, что эти операторы могут использо¬ ваться не только для вывода на экран дисплея, а в лю¬ бой файл, открытый с помощью оператора OPEN. Пример. 10 OPEN "SCRN:" FOR OUTPUT AS *1 20 PRINT #1, "Текст/'; 12.3 30 PRINT USING "& "Tskct." 12.3 40 WRITE *1, "Текст.", 12.3 run Текст. 12.3 Текст. 12.30 "Текст.", 12.3 ГЛАВА 10. ВЫВОД ДАННЫХ НА ПЕЧАТЬ При программировании на Бейсике можно исполь¬ зовать два способа вывода информации на печать: во- первых, данные могут выводиться на печать в резуль¬ тате выполнения операторов Бейсика; во-вторых, устрой¬ ство печати может использоваться для получения копии информации, отображенной на экране дисплея. Чтобы вывести на устройство печати текстовые данные, доста¬ точно нажать клавишу ПЕЧ. Все строки, изображаемые в данный момент на экране дисплея, будут скопирова¬ ны на устройство печати. Нажатие комбинации клавиш УПР — ПЕЧ переводит интерпретатор Бейсика в такой режим работы, когда все данные, выводимые на экран дисплея, параллельно 77
посылаются на устройство печати. Повторное нажатие этих клавиш отменяет режим печати текста, посылаемо¬ го на экран. Клавиша ПЕЧ и комбинация клавиш УПР — ПЕЧ могут быть нажаты в любой момент, ког¬ да клавиатура доступна для ввода. Несмотря на внешние различия устройства вывода на печать и дисплея, процесс вывода информации на эти устройства практически одинаков: данные преобразуют¬ ся к символьному виду и размещаются в строках фикси¬ рованной длины, начиная с текущей позиции. При запол¬ нении текущей строки осуществляется переход на сле¬ дующую строку, и вывод продолжается. Вывод данных на устройство печати может осуще¬ ствляться с помощью операторов, использующих стан¬ дартные и явно открытые файлы. Ниже приведены опе¬ раторы и функции вывода данных на печать с исполь¬ зованием стандартного файла; для сравнения даны их аналоги, используемые для работы с дисплеем. Если в программе, подготовленной для вывода информации на экран дисплея, ключевое слово PRINT заменить на клю¬ чевое слово LPRINT, программа будет выполнена пра¬ вильно, и вся информация, предназначенная для вывода на экран дисплея, будет передана на устройство печати. Соответствие между операторами вывода на печать и дисплей Вывод на печать Вывод на дисплей LPRINT PRINT LPRINT USING PRINT USING LPOS POS TAB TAB SPC SPC Для вывода данных на устройство печати использу¬ ются два оператора LPRINT и USING: LPRINT \список-выражении\ [;] LPRINT USING шаблон; список-выражений [;] В результате выполнения этих операторов данные по¬ символьно посылаются на устройство печати; фактичес¬ ки печать строки осуществляется при поступлении сим¬ вола «возврат каретки». Если на устройство печати пе¬ редано количество символов, равное фактической длине строки, и среди них нет символа «возврат каретки», то автоматически выполняется печать строки и переход на следующую строку. 78
Встроенные функции TAB и SPC могут использо¬ ваться в операторе LPRINT для выравнивания к требу¬ емой позиции в строке, правила использования этих функций аналогичны оператору PRINT. Встроенная функция LPOS (Line POSition — позиция строки) ис¬ пользуется для определения текущей строки, формиру¬ емой в буфере устройства печати. Она имеет формат: LPOS (п) п задает номер устройства печати. С помощью этой встроенной функции можно опреде¬ лить, начиная с какой позиции будет отпечатано следу¬ ющее данное. Пример вывода на печать строковых данных. 10 LPRINT "Еще в полях белеет снег," 20 LPRINT "А воды уж весной шумят —" 30 LPRINT "Бегут и будят сонный брег," 40 LPRINT "Бегут и блещут и гласят. . 50 LPRINT SPC (15) ; "(Ф. Тютчев)" Следующий оператор выводит на печать текстовую и числовую информацию: LPRINT «Сумма чисел от 1 до 100 равна»; 5050 Далее приведена программа, которая выводит на пе¬ чать коды от 32 до 255 и соответствующие им символы. 10 FORI=32TO 255 'I — номер кода 20 IF (I MOD 16) =0 THEN LPRINT 'Конец строки после 16 символов 30 LPRINT НЕХ$ (I); 'Вывод кода в 16-м виде 40 LPRINT SPC (1); CHR$(I); SPC(1) 'Вывод символа 50 NEXTI Оператор LPRINT в 20-й строке без точки с запятой в конце строки используется для перехода на следую¬ щую строку после вывода 16 символов. Управление длиной строки печати Стандартно длина строки устройства печати равна 80 символам. Устройства печати, позволяющие использо¬ вать плотный шрифт, могут печатать 132 символа в од¬ ной строке. С помощью оператора Бейсика WIDTH мож¬ но изменить длину строки и установить ее равной любо¬ му числу от 1 до 255. При попытке напечатать строку длиннее установленного размера Бейсик автоматически в нужный момент вставляет символ «возврат каретки» — в результате осуществляется переход на новую строку. Заметим, что если установить длину строки больше фи¬ 79
зической длины строки на устройстве печати, го символ «возврат каретки» будет вставляться в выводимую строку дважды: при достижении физической и логичес¬ кой длины строки. Для установки длины строки устройства печати мож¬ но использовать одну из следующих форм оператора WIDTH: WIDTH «LPT1:», длина-строки WIDTH#«, длина-строки Длина-строки — числовое выражение, которое может принимать значение от 1 до 255. п — номер файла. В результате выполнения оператора WIDTH уста¬ навливается длина строки устройства печати, равная значению операнда длина-строки\ вторая форма опера¬ тора используется в случае явно открываемого файла. Длина строки, установленная оператором WIDTH пер¬ вой формы, учитывается как операторами вывода дан¬ ных на устройство печати с использованием стандартных файлов, так и операторами, использующими явно от¬ крытые файлы. Управляющие символы Устройства печати ПЭВМ могут выполнять специ¬ альные операции по управлению продвижением бумаги и выбору типа шрифта. Выполнение требуемой опера¬ ции задается выводом управляющих символов, для это¬ го можно использовать обычный оператор LPRINT. Да¬ лее приводятся управляющие символы, используемые для управления позицией печати. Переход на следую¬ щую строку осуществляется в результате выполнения оператора LPRINT CHR$(&HOD). Для прогона бума¬ ги перед началом новой страницы можно выполнить оператор LPRINT CHR$(&HOA). Символы управления позицией печати Выполняемая операция Возврат каретки Перевод строки Возврат на одну позицию Переход на следующую страницу Подача звукового сигнала Управляющий символ CHR$(&HOD)* CHR$(&HOA)* CHR$(&HO8) CHR$(&HOC) CHR$(&HO7) * Символы CHRS(&HOD) и CHRS(&HOA) обычно вызывают одинако¬ вые действия — переход на следующею строку. 80
Устройства печати могут выводить данные с исполь¬ зованием различных шрифтов, выбор которых осуще¬ ствляется посылкой одного или нескольких управляю¬ щих символов. Возврат к стандартному шрифту также осуществляется посылкой управляющих символов. В табл. 10.1 приведены управляющие символы, исполь¬ зуемые для установки и отмены специальных шрифтов. Таблица 10.1 Управляющие символы для выбора шрифта Гип шрифта Установка шрифта Отмена шрифта Расширенный Узкий Выделенный Двойной удар Курсив Подчеркивание CHR$ (&HOF) CHR$ (&HOF) CHR$ (&Н1В) + + "Е" CHR$ (&Н1В) + +"G" CHR$ (&Н1В) + + "4" CHR$ (&Н1В) + CHR$ (&НО1) Конец строки, CHR$(20) Конец строки, CHR$(18) CHR$(&H1B)+"F" CHR$(&H1B)+"H" CHR$ (&Н1В)+"5" CHR$(&H1B)+"—"+ CHR$(&HOO) Ниже приведен пример программы, которая выводит слово «курсив» с использованием курсива. 10 LPRINT "стандартный” 20 LPRINT CHR$ (&Н1 В)+”4” 'Установка курсива 30 LPRINT "курсив” 40 LPRINT CHR$ (&Н1 В) +"5" 'Отмена курсива 50 LPRINT "стандартный" run стандартный курсив стандартный Открытие файла печати Вывод данных на устройство печати может осуще¬ ствляться с помощью операторов передачи данных в по¬ следовательный файл. Этот способ вывода целесообраз¬ но использовать, например, в программах, которые 6 Заказ 2634 81
должны выбирать устройство для вывода информации во время выполнения программы. Устройство, куда бу¬ дет передана информация, задается в операторе OPEN, форма операторов обработки файла не зависит от типа устройства. Для того чтобы изменить устройство выво¬ да, достаточно в операторе OPEN указать новую специ¬ фикацию файла, которая может задаваться с помощью строковой переменной. Открытие файла для вывода на печать осуществля¬ ется оператором OPEN в одной из двух форм: OPEN "LPT1:" FOR OUTPUT AS #n OPEN "LPT1:" AS #n Ключевое слово LPT1: в спецификации файла зада¬ ет устройство печати, п — номер файла. Ниже приводится фрагмент программы, в которой выбор устройства вывода (экран дисплея или устройст¬ во печати) осуществляется в процессе выполнения на основании информации, введенной с клавиатуры. 10 INPUT "Вывод на устройство печати или экран дисплея? (П/Э) ", R$ 20 IF R$O'T1" AND R$O"9"THEN GOTO 10 30 IF R$=:"n"THEN F$="LPT1: "ELSE F$="SCRN:" 40 OPEN F$ FOR OUTPUT AS #1 50 PRINT «1, "Данные" В строке 10 для ввода данных с клавиатуры исполь¬ зуется оператор INPUT. В зависимости от введенного значения (символ «П» или «Э») в строке 40 будет от¬ крыт файл, соответственно для вывода на печать или экран дисплея, а оператор PRINT в строке 50 выполня¬ ет вывод на соответствующее устройство. Если для открытия файла для вывода на печать ис¬ пользован оператор OPEN "LPT1:" AS 4J=n, то откры¬ вается файл произвольного доступа, который позволяет осуществлять повторную печать в только что выведен¬ ной строке. При работе с этими файлами переход на следующую строку не осуществляется, если длина стро¬ ки равна 255. Следовательно, чтобы выполнить повтор¬ ную печать, необходимо установить длину строки, рав¬ ной 255. Пока длина строки не будет изменена, печать будет выполняться без продвижения бумаги. Ниже приведен фрагмент программы, которая сна¬ чала выводит строку из 10 символов «5», а затем на этом месте выводит строку из 10 символов «—» и про¬ должает печать со стандартным продвижением бумаги. 82
10 OPEN "LPT1 : " AS *1 20 WIDTH *1,255 'Отмена продвижения бумаги 30 PRINT #1, STRINGS (10, "5") 40 WIDTH *1,80 'Установка продвижения бумаги 50 PRINT #1, STRING$ (10, 60 PRINT *1, "Обычная печать" После выполнения оператора PRINT в строке 30 продвижение бумаги не выполняется, так как длина строки равна 255; оператор PRINT в строке 50 выпол¬ няет повторную печать с последующим продвижением бумаги. ГЛАВА 11. ВВОД ДАННЫХ С КЛАВИАТУРЫ Клавиатура является основным устройством связи пользователя с ПЭВМ. При работе со встроенным ре¬ дактором интерпретатора Бэйсика клавиатура исполь¬ зуется для ввода исходной программы или ее корректи¬ ровки. Во время выполнения программы клавиатура мо¬ жет использоваться для ввода обрабатываемых данных и управления ходом выполнения программы. Обычно символ, вводимый с клавиатуры, програм¬ мно отображается на экране в текущей позиции курсора, и при начальном знакомстве с ПЭВМ может создаться впечатление, что клавиатура и экран составляют единое комплексное устройство. Хотя на самом деле ввод ин¬ формации с клавиатуры осуществляется независимо от дисплея, а параллельное отображение символа на экра¬ не реализуется программными средствами. При нажатии клавиши, на которой изображен сим¬ вол, в программу передается соответствующий однобай¬ товый код, а при нажатии комбинации клавиш или кла¬ виши, которой не соответствует символ, генерируется двухбайтовый расширенный код. Первый байт всегда равен нулю и является признаком расширенного кода, второй байт содержит значение, идентифицирующее на¬ жатую клавишу или комбинацию клавиш. Например, при нажатии функциональной клавиши или клавиши управления курсором генерируется расширенный код. В приложении 2 приведены коды ПЭВМ и расширенные коды. Операторы и функции Бейсика, предназначенные для работы с клавиатурой, с точки зрения их использования могут быть разделены на две группы: ввод данных с клавиатуры и управление ходом выполнения вычисли¬ 6* 83
тельного процесса. Это деление довольно условное. На¬ пример, встроенная функция INI<EY$ может использо¬ ваться для управления и для ввода данных. Для ввода данных могут использоваться следующие операторы и функции: оператор INPUT (input — ввод) — ввод значений и присвоение их переменным; оператор LINE INPUT (lineinput — вводстроки)—ввод строки символов и присвоение ее строковой переменной; функция INPUT$ — ввод с клавиатуры заданного числа символов; функция INKEY$ (INspect KEYboard — опрос клавиатуры) — ввод кода или расширенного кода на¬ жатой клавиши или комбинации клавиш. Следующие три оператора предназначены для уп¬ равления ходом выполнения программы: KEY (key — клавиша)—управление использованием функциональных клавиш и определение комбинаций клавиш: ON KEY — определение подпрограммы, которой передается управ¬ ление при нажатии определенной клавиши; KEY(n) — активизация подпрограммы обработки нажатия клави¬ ши. Ввод данных с клавиатуры может осуществляться с помощью операторов ввода из последовательного файла: INPUT# и LINE INPUT#, по форме записи и выпол¬ нению аналогичных операторам INPUT и LINE INPUT, Оператор INPUT С помощью оператора INPUT выполняется ввод с клавиатуры данных любого типа и присвоение их зна¬ чений переменным, объявленным в программе. Вводи¬ мые данные могут быть представлены в форме кон¬ стант, допустимых правилами Бейсика. Если необходи¬ мо, константы преобразуются к форме представления данных, которую имеет переменная, при этом исполь¬ зуются те же правила преобразования, что и в операто¬ рах присваивания. В результате выполнения этого оператора на экран выводится «подсказка», что означает готовность про¬ граммы для ввода данных с клавиатуры. Программа пе¬ реходит в состояние ожидания, и клавиатура становит¬ ся доступной для ввода данных. Ввод заканчивается на¬ жатием клавиши ВВОД: INPUT[;] [”подсказка”\]переменная[,переменная]. .. 34
Подсказка — строковая константа, которая будет вы¬ ведена на экран с вопросительным знаком в конце для пояснения, какие данные требуется, ввести. Для отмены вывода вопросительного знака необходимо вместо точки с запятой после подсказки задать запятую. В случае от¬ сутствия операнда подсказка на экран выводится во¬ просительный знак. Переменная — переменная иля элемент массива, ко¬ торым будет присвоено введенное значение. Символ «;», заданный после ключевого слова INPUT; отменяет перевод курсора на следующую строку после завершения ввода данных, последующий вывод на экран будет располагаться в той же строке. Например, если для ввода данных используются 24 строки экрана и необходимо отменить свертку экрана, следует исполь¬ зовать эту форму оператора INPUT. Данные, вводимые с клавиатуры, последовательно присваиваются переменным и элементам массивов, ко¬ торые заданы в операторе INPUT. Количество данных должно совпадать с количеством переменных в списке, их типы должны совпадать с типами переменных, ко¬ торым присваиваются вводимые значения. При задании строк символов можно опускать кавычки, если они не содержат запятых, начальных и конечных пробелов. На¬ жатие клавиши без ввода данных приведет к присваи¬ ванию значения нуль числовой переменной и значения «пустая строка» строковой переменной. П р и мер. Фрагмент программы вводит данные, а за¬ тем отображает их на экране. Для наглядности строки, выводимые оператором PRINT, отмечены звездочками. 10 INPUT "НАЗВАНИЕ ТОВАРА, ЦЕНА"; А$, В 20 PRINT "***»*"; А$; В 30 INPUT "ВВЕДИТЕ ТРИ ЧИСЛА ",А, В, С 40 PRINT "*****"; "Введены числа: "; А; В; С run НАЗВАНИЕ ТОВАРА, ЦЕНА? стол, 95 *****стол 95 ВВЕДИТЕ ТРИ ЧИСЛА &hfO, 12. 5, &о34 ***** Введены числа: 240 12.5 28 Следующий фрагмент программы вводит число и ото¬ бражает его в шестнадцатеричной форме. 10 INPUT "ВВЕДИТЕ ЧИСЛО"; А 20 PRINT "Шестнадцатеричное представление: "; НЕХ$ (А) run ВВЕДИТЕ ЧИСЛО? 123 Шестнадцатеричное представление: 7В 85
Оператор LINE INPUT Этот оператор предназначен для ввода строк длиной до 254 символов. В результате выполнения оператора любые символы, вводимые с клавиатуры, объединяются в одну строку и присваиваются указанной строковой переменной. Отличие от ввода с помощью оператора INPUT заключается только в том, что не отбрасывают¬ ся начальные и конечные пробелы вводимой строки. В остальном оператор LINE INPUT можно рассматри¬ вать как частный случай оператора INPUT, но его ис¬ пользование иногда предпочтительней, так как програм¬ ма становится более наглядной и в некоторых случаях упрощается ввод строковых значений. Формат операто¬ ра LINE INPUT: LINE INPUT[;] ["подсказка"}} ст роковая-пе ременная Этот оператор по использованию операндов и выпол¬ нению аналогичен варианту оператора INPUT [;] ["подсказка"}] , строковая-переменная Пример, Рассмотрим фрагмент программы, демон¬ стрирующий выполнение оператора LINE INPUT. Для сравнения также показано выполнение оператора INPUT. 10 LINE INPUT "Вводите текст, А$ 20 PRINT А$ 30 INPUT "Вводите текст. А$ 40 PRINT А$ run Вводите текст. слово слово Вводите текст.? слово слово Функция INPUTS Назначение функции INPUT$ — чтение заданного количества символов с клавиатуры. В результате вы¬ полнения функции INPUTS выполнение программ при¬ останавливается до тех пор, пока не будет введено за¬ данное количество символов. Отображение символов, соответствующих нажимаемым клавишам, на экране не осуществляется, что составляет существенное отличие от ввода по операторам INPUT и LINE INPUT. Вве¬ денные символы объединяются в строку символов, ко¬ 86
торая является результатом выполнения функции. Фор¬ мат функции INPUTS: I NPUT$ (количество-символов) Количество-символов — числовое- выражение, значе¬ ние которого определяет количество вводимых симво¬ лов. В результате выполнения функции INPUTS все сим¬ волы, включая управляющие, передаются в программу;, если нажата клавиша, которой соответствует расширен¬ ный код, то вводится нулевой байт. Комбинация клавиш УПР и СТОП может использоваться для прекращения выполнения функции INPUT$. Нажатие клавиши ввода не приводит, к завершению выполнения функции INPUTS. Ввод заканчивается после набора заданного количества символов. Для ввода данных с клавиатуры используется частный случай функции INPUTS. Полная форма, используемая для ввода из последовательного файла, рассмотрена в гл. 12. Пример. Одно из возможных применений функции INPUTS — ввод «пароля», если требуется осуществить защиту от несанкционированного доступа к программе. Для сохранения тайны «пароля» при вводе необходимо отменить отображение вводимых символов на экране дисплея, что обеспечивается использованием функции INPUTS. Далее приведен фрагмент программы, который запрашивает ввод «пароля» и в зависимости от ответа принимает решение о возможности дальнейшего выпол¬ нения программы. 10 CLS 'Очистка экрана. 20 PRINT "Введите пароль?" 30 A$=INPUT$ (6) 40 IF А$<> "Бейсик" THEN STOP о0 PRINT "Выполнение программы продолжается" Ввод «пароля» осуществляется в строке 30, затем в строке 40 проверяется, правильно ли введен «пароль», и в случае ошибки выполнение программы прекраща¬ ется. Иногда необходимо организовать приостановку вы¬ полнения программы с последующим продолжением по желанию пользователя. В качестве сигнала, вызываю¬ щего продолжение выполнения, часто используют на¬ жатие какой-либо клавиши. Паузы, например, полезны перед сменой информации на экране дисплея, что дает 87
возможность пользователю внимательно ознакомиться с информацией, находящейся на нем. Ниже следует фрагмент программы, организующий паузу. 10 PRINT "Для продолжения выполнения нажмите любую клавишу" 20 A$=INPUT$(1) 30 PRINT "Клавиша нажата" Функция INKEY$ При написании программ в некоторых случаях необ¬ ходимо определить, какая клавиша была только что на¬ жата. Это можно сделать с помощью функции INKEY$, значение которой может быть одним из следующих: • пустая строка — никакие клавиши не нажимались; • строка длиной в один символ, которая содержит введенный символ; • строка длиной два символа, если нажата клавиша или комбинация клавиш, которым соответствует рас¬ ширенный код. Первый байт равен нулю, а второй — расширенному коду. Коды ПЭВМ и расширенные коды приведены в приложении 2. Функция INKEY$ используется без аргументов. Как и в случае функции INPUT$, вводимые с кла¬ виатуры символы на экране не отображаются, а только передаются в программу. Исключение составляют сле¬ дующие клавиши или комбинации клавиш: УПР — СТОП (прерывает выполнение программы); УПР — ЦИФ (переводит машину в режим паузы); ПЕЧ (вызы¬ вает печать содержимого экрана). С помощью функции INKEY$ также нельзя зафик¬ сировать нажатие клавиш, переключающих режим рабо¬ ты клавиатуры, таких, как ДОП, УПР и т. д. Информа¬ ция о нажатии и отпускании этих клавиш находится в двух байтах, используемых для описания состояния клавиатуры. Эти байты находятся в постоянно распре¬ деленной системной области памяти по шестнадцатерич¬ ным адресам 417 и 418. Ниже дана структура байта 417, который содержит информацию о состоянии клавиа¬ туры. Байт состояния клавиатуры (&Н417) Биты X... . .X.. . Значение Режим вставки; 1 — активен Функция прописных букв; 1 — активна 88
П родо. гжение ..X . .X .... ... X... ... .X.. X. X Цифровой набор; 1 — активен ФСД СТОП; 1 — активна 1 — нажата клавиша ДОП 1 — нажата клавиша УПР 1 — нажата левая клавиша 1 — нажата правая клавиша Байт 418 содержит информацию о нажатии и отпус¬ кании клавиш. Байт состояния клавиатуры (&Н418) Биты Значение X 1 — нажата клавиша ВСТ .X 1 — нажата клавиша ФПБ .. X 1 — нажата клавиша ЦИФ .. .X .... 1 — нажата клавиша ФСД СТОП .... X... 1 — режим паузы ПЭВМ X.. 1 — нажата клавиша Р/Л XX Управляют выбором русского или латинского алфави¬ та: 00 — русский алфавит; 11—латинский алфавит; 01—русский алфавит, при отпускании клавиши Р/Л установить латинский алфавит; 10 — латинский алфа¬ вит, при отпускании клавиши Р/Л установить русский алфавит Чтобы прочитать содержимое этих байтов, можно ис¬ пользовать встроенную функцию РЕЕК, которая описа¬ на в гл. 16. Далее приведен фрагмент, который отобра¬ жает содержимое этих байтов на экране дисплея. 10 DEF SEG = 0 20 PRINT НЕХ$ (РЕЕК(&Н417)) 30 PRINT НЕХ$ РЕЕК(&Н418)) Пример. Ниже приведена бесконечно выполняю¬ щаяся программа, которая отображает в шестнадцате¬ ричном виде код ПЭВМ или расширенный код нажатой клавиши (комбинации клавиш). Выполнение прекра¬ щается при нажатии клавиши ВВОД. Результат выпол¬ нения соответствует случаю, когда нажаты клавиши: КЛЮЧ, а, ДОП-В, кон, ВСТ, 1. 10 CLS 'Очистка экрана. 20 A$=INKEY$ 'Ввод кода нажатой клавиши. 30 IF А$=" " THEN 20 'Переход, если клавиша не нажата. 40 IF LEN (А$) =1 THEN PRINT НЕХ$ (ASC (А$)) ELSE PRINT "00" + HEX$ (ASC (RIGHTS (А$, 1))) 50 GO TO 20 'Переход к вводу кода следующей клавиши. run 1В КЛЮЧ 61 а 0030 ДОП-В 004F КОН 0052 ВСТ 31 1 89
В каждой строке после кода указано название соот¬ ветствующей клавиши, которое не было выведено в ре¬ зультате выполнения программы, а приведено для на¬ глядности. Операторы в строках 20—30 выполняются в цикле до тех пор, пока не будет нажата любая клавиша. Слегка модифицировав строки 20—30, можно обеспечить при¬ остановку выполнения программы до нажатия заданной клавиши, например 1. 10 PRINT "Для продолжения выполнения нажмите клавишу 1" 20 A$=INKEY$ 30 IF А$<>"1" THEN 20 40 'Продолжение выполнения программы. Во многих прикладные программах ввод информа¬ ции удобно организовать по принципу «меню»: на эк¬ ран отображаются значения, которые могут быть введе¬ ны, пользователь с помощью управляющих клавиш вы¬ бирает необходимое значение и вводит его нажатием какой-либо клавиши. Такой способ ввода уменьшает ко¬ личество необходимых нажатий клавиш. Ниже приведен упрощенный пример программы, иллюстрирующий тех-; нику «меню». На экран выводится пять слов: один, два, три, четыре и стоп, которые расположены столбцом, Одно из них является текущим и изображается нега¬ тивными мерцающими символами. Для выполнения вво¬ да слова необходимо нажать клавишу ВВОД. Введенное слово отображается в 24-й строке; если для ввода вы¬ брано слово СТОП, то выполнение программы прекра¬ щается. В результате нажатия клавиши перевода курсо¬ ра вверх или вниз соответственно передвигается теку¬ щее слово. Лучший способ получить наглядное представление об этой программе — выполнить ее. Строки 150—220 со¬ ставляют цикл, который выполняется до тех пор, пока пользователь не нажмет любую клавишу. Если нажата клавиша ВВОД, вызывается программа, реализующая ввод текущего слова (строка 170). При нажатии кла¬ виши, которой соответствует расширенный код, осуще¬ ствляется выборка этого кода и присваивание перемен¬ ной А% (строки 180—190). Все другие клавиши игно¬ рируются. В строках 200—210 проверяется, была ли на¬ жата клавиша передвижения курсора вверх или вниз, и в случае нажатия одной из них вызывается соответ¬ ствующая программа передвижения текущего слова. 90
10 CLS:KEY OFF:COLOR 2,0 'Очистка экрана. Установка цвета. 20 REM Формирование массива возможных значений. 30 DIM WRD$ (5) '* В массив WRD$ заносится 40 FOR 1=1 ТО 5 '* слова, которые будут 50 READWRD$(I) '* отображаться на экране. 60 NEXTI 70 DATA "ОДИН", "ДВА", "ТРИ", "ЧЕТЫРЕ", "СТОП" 80 REM Отображение на экран возможных значений. 90 FOR 1=5 ТО 9 100 LOCATE I, 20 'Установить позиции вывода очередного слова. 110 PRINT WRD$ (I—4) 'Вывод слова. 120 NEXTI 130NMBR=1 140GOSUB 380 150 A$=INKEY$ 160 IF A$=" "THEN 150 170 IF (LEN (A$) =1) AND 180 IF LEN (A$)O2THEN 150 'Расширенный код? Если нет, переход, ж ,. ... 'Присваивание расширенного кода. 'Курсор вверх? Если да, переход. 'Курсор вниз? Если да, переход. 'Номер текущего слова. 'Вывод текущего слова мерцающим. '* Операторы выполняются в цикле '* пока не будет нажата клавиша. (ASC (А$) =13) THEN GOSUB 230 'Переход к вводу. 190 A%=ASC(RIGHT$ (А$, 1)) 200 IF А%=80 THEN 280 210 IF A%=72THEN 330 220 GOTO 150 230 REM Подпрограмма ввода слова 240 B$=WRD$ (NMBR) '* Текущее слово выбирается 250 LOCATE 24,1 :PRINT В$; SPC (3); '* из массива WRD$. Если 260 IF В$="СТОП" THEN END '* выбрано слово "СТОП", 270 RETURN 150 '* то завершение выполнения. 280 REM Подпрограмма перехода к верхнему слову 290 LOCATE NMBR+4,20:PRINT WRD$ (NMBR) '* Текущее слово выводится не 300 NMBR = NMBR+1: IF NMBR > 5 THEN NMBR=1'* мерцающим. Номер увеличивается 310 GOSUB 380 '* на 1. Новое текущее слово 320 RETURN 150 '* выводится мерцающим. 330 REM Подпрограмма перехода к нижнему слову 340 LOCATE NMBR+4,20:PRINT WRD$ (NMBR) '* Текущее слово выводится не 350 NMBR = NMBR-1: IF NMBR<1 THEN NMBR=5 '* мерцающим. Номер уменьшается 360 GOSUB 380 '* на 1. Новое текущее слово 370 RETURN 150 '* выводится мерцающим. 380 REM Подпрограмма вывода мерцающего слова ~~~ 'Установить режим вывода мерцающих символов. 'Установить позицию слова. 'Вывод слова. 'Установить режим вывода обычных символов. 390 COLOR 16, 7 400 LOCATE NMBR+4,20 410 PRINT WRD$ (NMBR) 420 COLOR 2, 0 430 RETURN 150 Функциональные клавиши При программировании на Бейсике функциональные клавиши могут использоваться либо для сокращенного ввода строк за одно.нажатие клавиши (обычно ввод ключевого слова), либо для управления выполнением программы. В программе на Бейсике может быть опре-’ делена подпрограмма, которой будет передано управле¬ ние путем нажатия заданной функциональной клавиши. При этом нормальная последовательность выполнения операторов прекращается. После выполнения подпро¬ граммы выполнение основной программы может быть 91
возобновлено с точки прерывания. Так, для ввода сло¬ ва RUN достаточно нажать клавишу Ф2. Нажатие дру¬ гих функциональных клавиш также осуществляет ввод ключевых слов. При запуске Бейсика функциональным клавишам ставятся в соответствие наиболее часто ис¬ пользуемые ключевые слова Бейсика, которые отобра¬ жаются в 25-й строке экрана. С помощью оператора Бейсика KEY можно изменять текущие назначения функциональных клавиш и управ¬ лять отображением этих значений на экране. Для этих целей используются следующие модификации оператора KEY: KEY OFF KEY ON KEY LIST KEY n, строка где n— помер функциональной клавиши; строка — строковое выражение, значение которого назначается функциональной клавишей. В результате выполнения оператора KEY п, строка функциональная клавиша получает новое значение. Ес¬ ли в новое значение необходимо включить символ «воз¬ врат каретки», можно использовать встроенную функ¬ цию CHR$(13), как это показано в следующем опера¬ торе: KEY 3, "FILES B:*.BAS" + CHR$(13) В этом случае после нажатия клавиши ФЗ нет необхо¬ димости нажимать клавишу ВВОД. Для того чтобы нажатие функциональной клавиши можно было обрабатывать с помощью оператора ON, ей в соответствие должна быть поставлена пустая строка. Оператор KEY OFF отменяет вывод в 25-й строке экрана значений функциональных клавиш, но не отме¬ няет их назначений. Оператор KEY ON производит обратное действие, включает отображение значений функциональных кла¬ виш в 25-й строке экрана. В 25-й строке отображаются только первые шесть символов текущих значений функциональных клавиш. Оператор KEY LIST выводит на экран полные теку¬ щие значения, которые присвоены функциональным кла¬ вишам. Вывод начинается с текущей позиции курсора и закапчивается вставкой символов «возврат каретки» и 92
«перевод строки», что вызывает переход на новую строку. Функциональные клавиши могут использоваться не только при редактировании программы на Бейсике, но и во время ввода данных программой. Использование клавиатуры для прерывания выполнения программы Бейсик содержит средства, позволяющие использовать функциональные клавиши, клавиши управления курсо¬ ром и комбинации клавиш для прерывания нормально¬ го хода выполнения программы и передачи управления ранее определенной подпрограмме. Комбинация кла¬ виш, используемых для прерывания выполнения прог¬ раммы, задается оператором KEY следующего формата: KEY п, строка ' п — целое значение от 15 до 20, которое является но¬ мером определяемой комбинации клавиш и используется в операторе ON для идентификации этой комбинации клавиш. Строка — строковое выражение, его значение задает комбинацию клавиш, нажатие которых может обрабаты¬ ваться с помощью оператора ON KEY. Операнд строка обычно задают в следующем виде: CHR$ (клавиша) + CM R# (номер-клавиши) Клавиша — шестнадцатеричная константа, которая определяет специальную клавишу по следующим прави¬ лам: &Н40 — клавиша ФПБ; &Н20 — клавиша ЦИФ; &НО8 — клавиша ДОП; &Н04— клавиша УПР; &НОЗ — клавиша смены регистра. Чтобы определить комбинацию этих клавиш, необ¬ ходимо задать значение, равное сумме соответствующих констант. Номер-клавиши задает номер клавиши, которая сов¬ местно с клавишами, заданными первым символом, сос¬ тавляют комбинацию клавиш. На рис. 2.2, где изображе¬ на клавиатура, в левом нижнем углу каждой клавиши задан ее номер. Пример. Оператор KEY 15, CHR$ (&Н68)-|- 4- CHR$ (&НОВ) определяет комбинацию клавиш ДОП—0 и присваивает ей номер 15. 93
Чтобы нажатие функциональной клавиши или задан¬ ной комбинации клавиш приводило к прерыванию прог¬ раммы, необходимо вначале определить подпрограмму обработки с помощью оператора ON KEY, а затем акти¬ визировать обработку клавиш или комбинации клавиш с помощью оператора KEY. Для определения подпрограммы обработки нажатия функциональной клавиши, клавиши управления курсором или комбинации клавиш используется оператор ON KEY. Этот оператор задает номер строки, которой будет пере¬ дано управление при нажатии клавиши или комбинации клавиш. Для выхода из подпрограммы обработки необ¬ ходимо использовать оператор RETURN. Оператор ON I\EYr имеет формат: ON KEY (п) GOSUB номер-строки п — целое значение в диапазоне от 1 до 20, которое задает клавишу или комбинацию клавиш по следую¬ щим правилам: 1 — 10 — номера функциональных клавиш; И —клавиша перемещения курсора вверх; 12 —клавиша перемещения курсора влево; 13 —клавиша перемещения курсора вправо; 14 —клавиша перемещения курсора вниз; 15—20 — номера комбинаций клавиш, определенные оператором KEY п. Номер-строки — номер первой строки подпрограммы обработки нажатия заданной клавиши или комбинации клавиш. Если в качестве номера строки указан 0, то об¬ работка отменяется. Оператор ON KEY только определяет подпрограмму обработки нажатия клавиши или комбинации клавиш. Обработка будет выполняться только после того, как подпрограмма будет активизирована с помощью опера¬ тора KEY (я). Пример. Оператор ON KEY (3) GOSUB 500 пере¬ дает управление строке с номером 500 при нажатии кла¬ виши ФЗ. Активизация подпрограммы обработки осуществляет¬ ся с помощью оператора KEY(zz), имеющего формат: KEY (л) ON KEY (/г) OFF KEY(n) STOP где n — номер клавиши или комбинации клавиш. 94
Для того чтобы активизировать подпрограмму обра¬ ботки, необходимо выполнить оператор KEY(n) ON. После того как подпрограмма обработки активизирова¬ на, Бейсик перед выполнением каждого оператора про¬ веряет, была ли нажата соответствующая клавиша или комбинация клавиш. В случае нажатия выполняется пе¬ реход к строке, указанной в операторе ON KEY. Оператор KEY (п) OFF делает подпрограмму обра¬ ботки неактивной. Нажатие соответствующей клавиши или комбинации клавиш игнорируется. Оператор KEY (ц) STOP также отменяет обработку нажатия клавиши, но информация об этом сохраняется, и сразу после выполнения оператора KEY (ц) ON происходит передача управления подпрограмме обра¬ ботки. Передача управления в подпрограмму обработки ав¬ томатически вызывает выполнение оператора KEY (п) STOP. Тем самым предотвращается рекурсивное обра¬ щение к подпрограмме обработки. Выполнение операто¬ ра RETURN, завершающего подпрограмму обработки, вызывает выполнение оператора KEY(/z) ON, если в подпрограмме обработки не был выполнен оператор KEY(n) OFF. Пример. Ниже приведен пример программы, кото¬ рая выполняет бесконечный цикл, а в случае нажатия клавиши управления курсором выводит на экран назва¬ ние клавиши. Выполнение программы прекращается при нажатии клавиши Ф1. 10 20 30 40 45 50 60 70 80 90 100 110 120 500 600 700 800 1000 'Очистка экрана. 14 'Активизация обработки нажатия квавиши. CLS FOR 1=11 KEY (I) NEXT I REM Определение подпрограмм обоаботки. ON KEY ‘ ON KEY ON KEY ON KEY ON KEY KEY 1," " KEY (1) ON GOTO 120 LOCATE ' LOCATE ' LOCATE ' LOCATE ' END то ON (11) (12) (13) (14) (1) 500 600 700 800 GOSUB GOSUB GOSUB GOSUB GOSUB 1000 'Отмена назначения для функциональной клавиши Ф1, ) 'Ожидание нажатия клавиши. 10, 20:PRINT 10, 20:PRINT 10, 20:PRINT 10, 20:PRINT "Курсор вверх" :RETURN "Курсор влево" :RETURN "Курсор вправо" :RETURN "Курсор вниз" :RETURN 95
Открытие файла для ввода с клавиатуры Ввод данных с клавиатуры может осуществляться с помощью операторов чтения последовательного файла. Программы, осуществляющие ввод с клавиатуры с по¬ мощью операторов чтения последовательных файлов, могут быть легко модифицированы так, чтобы ввод с клавиатуры заменить на ввод с дискового файла, что де¬ лает программу более мобильной. Открытие файла для ввода с клавиатуры осуществля¬ ется оператором OPEN следующего формата: OPEN "KYBD:" FOR INPUT AS #n Для ввода данных необходимо использовать операто¬ ры чтения последовательного файла: INPUT фп и LINE INPUT фп, а также встроенную функцию INPUT$. Не¬ обходимо учитывать, что эти операторы несколько отли¬ чаются от стандартных операторов ввода с клавиатуры, а именно: нельзя использовать подсказку, вводимые дан¬ ные не отображаются на клавиатуре. Во многих прило¬ жениях использование этих операторов затруднительно из-за этих особенностей. Эти операторы и встроенная функция рассмотрены в следующей главе. ГЛАВА 12. ФАЙЛЫ НА ДИСКАХ Обработка файла на дисках начинается с открытия файла. Затем с помощью операторов и встроенных функ¬ ций можно читать данные из файла или записывать данные в файл. Каждый файл формируется из записей. В Бейсике под записью понимают элемент данных, передаваемый в файл или из файла в результате выполнения операции ввода-вывода. Способ формирования записи существенно зависит от метода доступа. Файл на диске однозначно идентифицируется именем файла, состоящим из собственно имени и идентификато¬ ра типа. Обычно тип файла указывает вид информации, хранящейся в файле. Так, например, программы на Бей¬ сике имеют тип BAS. Информация об именах всех фай¬ лов, расположенных на диске, хранится в специально от¬ веденной для этого области диска, называемой оглавле¬ нием диска. Команда FILES позволяет отобразить на экран дисплея перечень находящихся на диске файлов. Эта команда описана в гл. 15. 95
Последовательный и произвольный доступ Программируя на Бейсике, можно использовать два метода обработки файлов на дисках, называемых после¬ довательным и произвольным доступом. В зависимости от метода доступа, с помощью которого файл был соз¬ дан, файлы соответственно называются файлами с по¬ следовательным доступом или файлами с произвольным доступом. В файлах с последовательным доступом дан¬ ные размещаются в той последовательности, в которой поступают в файл. При чтении такого файла данные ста¬ новятся доступными в том порядке, в котором они были записаны. В результате выполнения операции вывода значение строковой или числовой переменной помещает¬ ся в файл, при этом значение числовой переменной пре¬ образуется к десятичной форме представления, как и при выводе на экран. После каждого значения Бейсик вставляет либо запятую, либо пробел, либо символ «воз¬ врат каретки», которые служат разделителями и во вре¬ мя ввода определяют начало и конец значения. В файлах с произвольным доступом данные органи¬ зуются таким образом, что доступ к ним может быть осуществлен в любом порядке независимо от того, в ка¬ кой последовательности данные помещались в файл. В этом случае обмен информацией с файлом осуществляет¬ ся записями. Запись представляет собой некоторый на¬ бор данных, собранных вместе. С каждой записью свя¬ зывается произвольный номер, который задает место записи в файле при выводе. При выполнении операции ввода запись ищется в файле по ее номеру. Зная номер записи, в результате выполнения одной операции ввода можно прочитать данные, хранящиеся в этой записи. В качестве номера записи обычно выбирают число, кото¬ рое логически связано с данными, собранными в запись, тогда это число естественным образом идентифицирует запись. Если номера записей не последовательны, то для не¬ существующих записей в файле резервируется место. При чтении несуществующей записи в программу пере¬ дается случайная информация. Иногда при создании файла на месте несуществующих записей создают запи¬ си с фиктивными данными, например всю запись запол¬ няют одним и тем же символом. В этом случае во вре¬ мя чтения несуществующие записи легко обнаружить. 7 Заказ 2634 97
Способ задания номера записи зависит от данных, составляющих запись, и решаемой задачи. Например, ес¬ ли в файле хранится информация о книгах личной биб¬ лиотеки (автор, название книги и т. д.), то в качестве номера записи можно использовать шифр книги. В этом случае, зная шифр книги, можно прочитать запись, со¬ держащую данные об этой книге. В одну запись могут объединяться числовые и стро¬ ковые данные. Размер записи зависит от количества дан¬ ных, включенных в запись, и может изменяться от 1 до 32767, Длина записи не связана с размером сектора на диске. Бейсик использует весь объем сектора, выполняя в зависимости от длины записи блокирование записей в границах сектора или разбиение записи на части, кото¬ рые будут размещаться в смежных секторах. Все прост¬ ранство, отведенное для файла на диске, логически де¬ лится на участки равной длины, которые нумеруются, начиная с 1. Участок файла с номером п используется для размещения п-\\ записи. Длина записи устанавливается во время открытия файла и может варьироваться, меняя тем самым разбиение файла на записи. Так, если один и тот же файл открывать с длиной записи 10 и 20, то две десятисимвольные записи в первом случае будут состав¬ лять одну двадцатисимвольную во втором. Если устано¬ вить длину записи равной 1, то запись будет состоять из одного символа. Выбор метода доступа в основном диктуется характе¬ ром решаемой задачи. Каждый способ имеет свои не¬ достатки и достоинства. Последовательный доступ более прост, в этом случае дисковая память используется более экономно, но для поиска записи нужно просматривать весь файл от начала до требуемой записи. Обновление последовательных файлов можно осуществлять, только переписывая файл. Файлы с произвольным доступом обычно требуют больше места на диске, но позволяют выполнить чтение или обновление любой записи за одну операцию ввода-вывода. Для обработки записей файла используется специаль¬ ная область памяти, которая называется буфером фай¬ ла. Для файла с произвольным доступом выводимая запись формируется в буфере, а при выполнении опера¬ ции ввода данные записи читаются в буфер. Для файлов с последовательным доступом выводимые данные накап¬ ливаются в буфере файла, и только при заполнении бу- 98
фера выполняется их вывод па диск. При чтении файла данные помещаются сначала в буфер, а затем выбира¬ ются из него по мере выполнения операторов ввода. Создание файла с последовательным доступом На Бейсике можно разрабатывать программы, кото¬ рые способны создавать новые файлы и записывать в них данные, а также расширять старые файлы, т. е. до¬ писывать информацию в конец файла. Созданный од¬ нажды файл может быть только расширен: в Бейсике не существует операторов, позволяющих поместить в файл с последовательным доступом новую запись на место ста¬ рой записи. Запись информации в дисковый файл осуществляется с помощью операторов PRINT*, WRITE*, PRINT* USING, которые рассмотрены в гл. 9. Если эти операто¬ ры используются для вывода данных на диск, они вы¬ полняются совершенно аналогично тому, как в случае вывода данных на экран дисплея. Строки символов, ко¬ торые появились бы на экране дисплея, записываются в файл на диске без всяких изменений, одна за другой. Следует учитывать, что если запись информации в файл выполняется с помощью операторов PRINT* и PRINT* USING, то все пробелы, используемые для разделения выводимых данных, будут записаны в файл, увеличивая тем самым объем требуемой дисковой памяти. Две строки символов, записанные в файл одним оператором PRINT, будут рассматриваться при чтении как одна целая стро¬ ка, так как признаком конца строки является запятая или символ «возврат каретки». Например, в результате выполнения оператора PRINT #1, "Один", "Два" в файл будет записана строка Один Два При выполнении операции чтения все эти символы будут восприниматься как одна строка символов. Для числовых данных проблемы разделения двух со¬ седних чисел не существует, так как пробелы при вводе числовых данных воспринимаются как разделители. За¬ метим, что если в операторе PRINT указана одна стро¬ ка символов, и он не заканчивается точкой с запятой («;»), то после строки будут выведены символы «воз- 7* 99
врат каретки» и «перевод строки». Тем самым проблема разделения соседних строк символов будет решена. Во многих случаях для записи данных в дисковый файл удобнее использовать оператор WRITE*, так как он после каждого данного выводит запятую, а строки символов заключает в кавычки. Данные, записанные этим оператором, будут читаться точно в таком виде, как они были записаны. Оператор PRINT, например, целесообразно использовать в тех случаях, когда на диск записываются данные, которые впоследствии будут вы¬ водиться на экран дисплея или устройство печати. Если такой файл без всяких изменений будет направлен на экран дисплея или устройство печати, то форма пред¬ ставления данных на этих устройствах останется без изменений. Для создания файла с последовательным доступом в программе должны быть выполнены следующие дейст¬ вия: • открытие файла для последовательного вывода (оператор OPEN); • запись данных в файл (операторы PRINT*, WRITE* или PRINT* USING); • закрытие файла (оператор CLOSE). Для открытия файла может быть использован опера¬ тор OPEN в одном из следующих форматов: OPEN спецификация-файла FOR OUTPUT AS #номер-файла OPEN спецификация-файла FOR APPEND AS ^номер-файла OPEN «О», [#] номер файла, спецификация-файла Полный формат оператора OPEN и понятие «спе¬ цификация файла» рассмотрены в гл. 8. Оператор OPEN с режимом OUTPUT всегда создает файл заново. Если на диске существовал файл с указанным именем, то он удаляется и создается новый пустой файл с этим име¬ нем. Режим APPEND указывает, что файл должен быть открыт как расширяемый. Это значит, что если файл с указанным именем существует, то он будет открыт так, что данные будут дописываться в конец файла. При открытии нового файла эти два оператора OPEN выполняются совершенно одинаково. Режимы OUTPUT и APPEND определяют только способ открытия файла, ио не оказывают влияния на последующую обработку. С форматом операторов записи данных в дисковый файл можно ознакомиться в гл. 9. Оператор CLOSE рас¬ смотрен в гл. 8. Во время закрытия в файл записывает¬ ся символ с кодом &Н1А, который при чтении файла 100
воспринимается как признак конца информации. Поэто¬ му этот символ не должен встречаться среди данных. Пр и мер. Ниже рассмотрен пример программы, ко¬ торая записывает в дисковый файл следующую инфор¬ мацию о клиентах ателье: фамилия, адрес и заказ. Если в качестве фамилии клиента вводится пустая строка, то выполнение программы прекращается. 10 REM Создание файла с последовательным доступом 20 OPEN "КЛИЕНТ" FOR OUTPUT АЗ *2 'Открытие файла 30 INPUT "Фамилия"; NM$ 40 IF NM$= " " THEN CLOSE 2: END 50 INPUT "Улица"; STRT$ 60 INPUT "Номер дома"; HM$ 70 INPUT "Квартира"; FLT$ 80 INPUT "Заказ клиента"; A$ 90 WRITE #2, NM$, STRT$, HM$, FLT$, A$ 'Запись данных в файл 100 GOTO 30 run Фамилия? Иванов И.И. Улица? Советская Номер дома? 34 Квартира? 126 Заказ клиента? Ремонт квартиры Фамилия? Повторное выполнение программы приведет к удале¬ нию файла «КЛИЕНТ» и созданию нового файла с тем же именем. Если необходимо накапливать информацию, то следует режим OUTPUT в операторе OPEN заме¬ нить на режихм APPEND. Чтение файла с последовательным доступом Типичная программа чтения файла с последователь¬ ным доступом включает следующие шаги: • открытие файла для последовательного ввода (опе¬ ратор OPEN); • чтение данных из файла (операторы INPUT*, LINE INPUT* и встроенная функция INPUT$); • закрытие файла (оператор CLOSE). Во время открытия осуществляется поиск файла на диске. Если файл не находится, то выдается сообщение об ошибке. Для открытия файла используется оператор OPEN следующего формата: OPEN спсцификация-файла EOF? INPUT AS ^номер-файла OPEN «I» [#] номер-файла, спецификация-файла, длина-записи Режим INPUT указывает, что файл будет использо¬ ван для ввода данных с диска в память. Для того чтобы 10)
осуществить чтение файла с именем «КЛИЕНТ», необ¬ ходимо выполнить оператор OPEN «КЛИЕНТ» FOR INPUT AS #2 В качестве имени создаваемого файла можно исполь¬ зовать любое имя, оно будет в дальнейшем идентифици¬ ровать этот файл. В качестве имени вводного файла сле¬ дует указывать имя, использованное во время создания файла. Чтение данных из дискового файла осуществляется с помощью операторов INPUT*, LINE INPUT* и встро¬ енной функции INPUT$. Правила их выполнения анало¬ гичны соответствующим операторам и функциям, исполь¬ зуемым для ввода данных с клавиатуры. В некотором смысле ввод данных с дисков аналогичен вводу данных с клавиатуры. Данные дискового файла могут быть рас¬ смотрены как непрерывная строка символов, которая подобна непрерывному потоку данных, вводимому с кла¬ виатуры. В обоих случаях при выполнении оператора ввода осуществляются выбор очередного элемента дан¬ ных из потока и его интерпретация. Ниже приведен формат операторов и функций по¬ следовательного чтения файлов: INPUT ^номер-файла [.переменная} [.переменная}... LINE INPUT ^номер-файла, переменная INPUT$ (п[,[^] номер-файла]) При выполнении операторов INPUT и LINE INPUT символы последовательно выбираются из файла и интер¬ претируются как строковое или числовое значение в за¬ висимости от типа переменной, которой будет присвоено значение. Выборка продолжается до тех пор, пока не бу¬ дет встречен разделитель. Оператор LINE INPUT вводит только строки сим¬ волов. Признаком конца строки является символ «воз¬ врат каретки», все остальные символы воспринимаются как данные. Оператор INPUT может вводить числовые и строко¬ вые значения. Ввод числового значения заканчивается появлением символа, отличного от цифры. Ввод строко¬ вого значения заканчивается появлением кавычки, если строка символов начата кавычкой, в противном случае — появлением одного из символов «,» или «возврат ка¬ ретки». Функция INPUT$ возвращает строку, содержащую заданное количество символов, прочитанных из файла. 102
Все символы, включая разделители, передаются в прог¬ рамму, за исключением символа с кодом &Н1А, который воспринимается как признак конца файла и прекращает выполнение функции. Функция INPUT$ предоставляет возможность последовательно выбирать символы из фай¬ ла независимо от разделителей. При чтении дискового файла необходимо предусмот¬ реть проверку конца файла. Такая проверка выполняет¬ ся с помощью функции EOF. Попытка прочесть данные после возникновения ситуации «конец файла» приведет к выдаче сообщения об ошибке. Формат функции EOF: EOF (номер-файла) Функция EOF возвращает значение —1 (истина), ес¬ ли достигнут конец файла, и 0 —в противном случае. Значение функции EOF может быть использовано в опе¬ раторе IF для принятия решения о дальнейшем ходе вы¬ полнения программы. Проверку конца файла следует осуществлять перед выполнением оператора или функ¬ ции ввода. Если ситуация «конец файла» возникнет при чтении файла, то будет выдано сообщение об ошибке, и выполнение программы будет прекращено. Пример. Чтобы проиллюстрировать работу опера¬ торов INPUT, LINE INPUT и функции INPUT$, далее рассматриваются три варианта программы, выполняю¬ щей чтение файла «КЛИЕНТ», созданного программой, приведенной в предыдущем разделе. Чтение файла «КЛИЕНТ» с помощью оператора INPUT#: 10 REM Чтение последовательного файла. Оператор INPUT» 20 OPEN "КЛИЕНТ"FOR INPUT AS«1 30 INPUT #1,A$ 40 PRINT A$ 50 IF EOF (1) THEN CLOSE 1; END 'Останоз по концу файла 60 GO TO 30 run Иванов И.И. Советская 34 126 Ремонт квартиры Количество прочитанных данных совпадает с коли¬ чеством записанных, так как оператор INPUT# воспри¬ нимает разделители, построенные оператором WRITE. Чтение того же файла с помощью оператора LINE INPUT#: 103
10 REM Чтение файла Оператоо LINE ?NPUT. '0 OPEN "КЛИЕНТ” FOR INPUT AS *1 30 LINE INPUT *1, A$ 40 PRINT A$ 50 IF EOF (1) THEN CLOSE 1: END 'Останов по концу файла 60 GO TO 30 run "Иванов И.И.", "Советская", "34", "126", "Ремонт квартиры" Так как оператор LINE INPUT* в качестве разде¬ лителя воспринимает только символ «возврат каретки», то все данные, записанные одним оператором’WRITE, воспринимаются как одна строка символов. Оператор WRITE вставляет символ «возврат каретки» после вы¬ веденных данных. Использование функции INPUTS для чтения файла «КЛИЕНТ»: 10 НЕМ Чтение последовательного файла. Функция INPUT$. 20 OPEN "КЛИЕНТ" FOR INPUT AS #1 30 A$=INPUT$ (10, #1) 40 PRINT A$ 50 IF EOF (1) THEN CLOSE 1: END 60 GO TO 30 run "Иванов И. И.", "Совет ская", "34" , "126", "Ре монт кварт КОНЕЦ ФАЙЛА В СТРОКЕ 30 Заметим, что все данные файла не прочитаны, так как при выполнении функции INPUT$ достигнут конец файла, о чем свидетельствует сообщение об ошибке "КОНЕЦ ФАЙЛА В СТРОКЕ 30". Функция INPUTS читает порцию данных фиксированной длины, и, если среди этих данных встречается символ «конец файла», то выдается сообщение об ошибке. Ситуация «конец фай¬ ла» будет обработана правильно с помощью встроенной функции EOF только в том случае, если символ-признак «конец файла» расположен сразу после прочитанной информации. Файлы с произвольным доступом Файлы с произвольным доступом состоят из записей, доступ к которым может осуществляться в любом поряд¬ ке. С каждой записью связывается уникальный номер, который используется в операторах обработки файла 104
для указания этой записи. Нумерация записей выполня¬ ется последовательно, начиная с единицы. В запись объ¬ единяются логически связанные между собой данные, и номер записи обычно связывается с этими данными ес¬ тественным образом. Например, если записи содержат информацию о сотрудниках учреждения, то в качестве номеров записей можно использовать табельные номера сотрудников. Во время выполнения операции вывода для размещения записи будет выбрано место, определяемое ее номером. При выполнении операции ввода по номеру отыскивается запись и передается в память. Для файлов с произвольным доступом одновременно без повторного открытия могут выполняться операции ввода и вывода. Запись может быть вначале прочитана, а затем после корректировки записана на старое место. Тем самым будет выполнена операция обновления запи¬ си файла. Чтение требуемой записи осуществляется с помощью оператора GET (get — получить), а вывод за¬ писи в файл — с помощью оператора PUT (put — помес¬ тить) . Для обмена данными между программой и файлом с произвольным доступом используется буфер, который связывается с файлом во время выполнения операции открытия. При выполнении операции чтения запись из файла помещается в буфер, а при выполнении операции вывода, наоборот, содержимое буфера переносится в файл, в область, отведенную для записи с указанным но¬ мером. После выполнения операции чтения данные не¬ обходимо выбирать из буфера файла, а перед выполпе- ниехМ операции вывода данные должны быть помещены в буфер файла. Обработка файлов с произвольным доступом сво¬ дится к выполнению четырех операций: • открытию файла с произвольным доступом (опера¬ тор OPEN); • чтению записи из файла; • выводу записи в файл; • закрытию файла. Открытие файла с произвольным доступом Во время открытия файла с произвольным доступом ему присваивается номер, устанавливается длина записи и выделяется память для буфера файла, который будет 105
использоваться при обмене записями между файлом и программой. Так как для файла с произвольным досту¬ пом могут выполняться операции чтения и операции вы¬ вода, то в операторе OPEN нет необходимости задавать режим обработки. Отсутствие в операторе OPEN режи¬ ма обработки является признаком того, что открытие выполняется для файла с произвольным доступом. В этом случае оператор OPEN может иметь один из сле¬ дующих форматов: OPEN спецификация-файла AS [*] номер-файла [LEN = длина-записи] OPEN "R"> [#] номер-файла, спецификация-файла, [длина-записи] Все записи файла с произвольным доступом имеют одинаковую длину, которая задается (в символах) опе¬ рандом длина-записи. Значение этого операнда опреде¬ ляет способ разбиения отведенного для файла диско¬ вого пространства на записи. Например, если длина за¬ писи равна 50, то 6-я запись будет располагаться со смещением 300 (50x6) от начала файла. Если длина- записи не задана, то по умолчанию принимается значе¬ ние 128. Длина записи может изменяться от 1 до 32767. Неправильное задание длины записи может привести к искажению содержимого записи. Для вычисления дли¬ ны записи следует просуммировать длины всех входя¬ щих в нее полей. Следует учитывать, что целые числа занимают поле длиной два символа, числа с обычной точностью — четыре символа, числа с двойной точ¬ ностью— восемь символов. Для строковых переменных должно быть отведено такое поле, в котором можно раз¬ местить максимальное по длине из всех возможных зна¬ чений. При открытии файла с произвольным доступом осу¬ ществляется поиск в оглавлении диска файла с указан¬ ным именем. Если файл найден, то он открывается и подготавливается к обработке. В случае его отсутствия создается новый файл с указанным именем и выполня¬ ется его подготовка к обработке. Объявление переменных в буфере файла Как отмечалось ранее, обмен данными между фай¬ лом с произвольным доступом и программой осуществля¬ ется через буфер. Операторы Бейсика могут оперировать 106
только с переменными и константами, по не с такими объектами, как буфер файла. Чтобы обеспечить доступ к данным, находящимся в буфере, в Бейсике предусмот¬ рена возможность объявлять переменные, размещаемые в буфере файла. Это реализуется с помощью оператора FIELD (field — поле): FIELD [#] номер-файла, длина-поля AS имя-переменной [,длина-поля AS имя-переменной]... В результате выполнения оператора FIELD всем пе¬ речисленным переменным последовательно отводятся смежные участки памяти в буфере файла, определенно¬ го номером-файла. Размер участка памяти для каждой переменной задается значением соответствующего опе¬ ранда длина-поля. Имя-переменной должно быть именем строковой переменной или элемента строкового массива. Если использован элемент массива, то память в буфере файла отводится не для всего массива, а только для од¬ ного элемента массива. В программе может быть выполнено несколько опе¬ раторов FIELD, для каждого оператора память распре¬ деляется заново. Общая длина всех переменных, объяв¬ ленных в операторе FIELD, не должна превышать дли¬ ны записи файла. Одна и та же переменная может быть объявлена несколько раз, но использоваться будет ее последнее объявление. В качестве примера рассмотрим файл с произволь¬ ным доступом, содержащий информацию о личной биб¬ лиотеке. Каждая запись содержит следующую инфор¬ мацию: • номер книги (2 символа); • фамилию автора книги (15 символов); • название книги (30 символов); • признак наличия книги (1 символ); • информацию о читателе, взявшем книгу '(22 сим¬ вола) ; • дату выдачи книги (10 символов). Для открытия этого файла и описания структуры за¬ писи можно использовать следующие операторы: 10 OPEN "БИБЛТЕКА" AS #1 LEN=80 20 FIELD #1,2 AS NUMBER$, 15 AS AUTHOR$, 30 AS BOOK$, 1 AS CODE$, 22 AS READER^, 10 AS DT$ Ниже приведен фрагмент программы, распределяю¬ щий память в буфере файла для элементов массива. 107
Каждому элементу массива отводится участок памяти длиной один символ. 10 OPEN "SAMPLE.000" AS *1 LEN 100 20 DIM С$ (100) : J=0 30 FOR 1-1 TO 100 40 FIELD *1, J AS DUMMY$, 1 AS C$ (I) 50 J=J+1:NEXTI В этом примере память для переменной DUMMY$ отводится только для того, чтобы пропустить участок па¬ мяти, размер которого каждый раз определяется значе¬ нием переменной J. Использование переменных, объявленных в операторе FIELD. Эти переменные используются для выбора зна¬ чений из записи, прочитанной в буфер, или для форми¬ рования записи в буфере перед ее выводом. Для выбора значений достаточно использовать переменную в любом выражении или операторе Бейсика. Занесение значений в буфер реализуется двумя специальными операторами присваивания LSET (Left SET — поместить слева) и RSET (Right SET — поместить справа): LSET переменная=строковое-выражение RSET переменная = строковое-выражение В результате выполнения этих операторов значение строкового-выражения помещается в поле, заданное пе¬ ременной. Если длина присваиваемого значения превы¬ шает длину переменной, то оно усекается в соответствии с размером переменной. При этом будут потеряны край¬ ние правые символы значения. Если длина присваивае¬ мого значения меньше, чем длина переменной, то в слу¬ чае оператора LSET данные прижимаются к левому краю поля, а в случае оператора RSET — к правому. Осталь¬ ные позиции поля переменной заполняются пробелами. Переменную, объявленную в операторе FIELD, нель¬ зя использовать в операторах ввода или присваивать ей значение с помощью оператора присваивания. В случае нарушения любого из этих ограничений память для пе¬ ременной будет распределена обычным образом, что при¬ ведет к утрате связи между этой переменной и буфером файла. Так как переменным, распределенным в буфере фай¬ ла, можно присваивать только строковые значения, для занесения в буфер числовых значений в Бейсик включе¬ ны специальные функции MKI$, MKS$ и MKD$ (Ма- Ке — делать, Integer — целый, Single — одиночный, Do¬ uble— двойной). Эти функции интерпретируют память, 108
занимаемую числовой переменной, как строку символов, содержащую соответственно два, четыре или восемь сим¬ волов в зависимости от типа переменной. Функция МК1$ используется для целочисленных значений, MKS$ — для значений с обычной точностью, MKD$ — для значений с двойной точностью. Обращение к функциям выглядит следующим обра¬ зом: МК1$ (целочисленное выражение) MI\S$ (выражение с обычной точностью) MKD$ (выражение с двойной точностью) Заметим, что. эти функции не выполняют преобразо¬ вания числового значения к цифровому представлению, а только изменяют способ интерпретации этого значения. Если возвращаемое функцией значение вывести на эк¬ ран дисплея, то выведенные символы не будут выра¬ жать числового значения. Функции MI<I$, MKS$ и MKD$ предоставляют бо¬ ле экономный способ представления числовых данных в буфере файла, чем их представление в виде строки символов. Для выполнения обратного действия, т. е. выборки числовых значений из буфера, используются функции CVI, CVS и CVD (ConVert — переделать, Integer — це¬ лый, Single — одиночный, Double — двойной), которые возвращают соответственно целочисленное значение, зна¬ чение с обычной точностью и значение с двойной точ¬ ностью. Далее следует пример программы, заносящей в бу¬ фер массив из 64 целочисленных значений: 10 OPEN "ПРИМЕР" AS **1 LEN = 128 20 J=C: DIM А% (64), В$ (64) 30 FOR 1 = 1 TO 64 40 FIELD #1, J AS DUMMY$, 2 AS B$ (I) 50 NEXT I 60 FOR 1=1 TO 64 70 LSETBS(I)=MKI$(A%(I)) 80 NEXT I Вывод этих значений на печать осуществляет сле¬ дующий фрагмент программы: 100 FOR 1 = 1 ТО 64 НО C%=CVI (В$ (I)): PRINT С% 120 NEXT I Ниже приведен фрагмент программы, в котором фор¬ мируется запись файла, содержащего информацию о 109
личной библиотеке. В буфер заносится информация о романе Л Н, Толстого «Война и мир». Структура запи¬ си была рассмотрена ранее. 10 20 зо 40 50 60 70 80 OPEN "БИБЛТЕКА" AS «1 LEN=80 FIELD #1, 2 AS NUMBERS, 15 AS AUTHO:3$, 30 AS BOOK$, 1 AS CODES, 22 AS READERS, 10 AS DT$ LSET NUMBER$=MKI$ (1000) 'ШисЬр книг LSET AUTHOR$="H.H. Толстой" LSE l ВООК$="Война и мир" LSET CODE$="X" 'X — книга хранится LSET READER$=" " LSET DT$=DATE$ Вывод записи в файл Для вывода записи из буфера файла на диск исполь¬ зуется оператор PUT: PUT [4г] номер-файла[,номер-записи] Номер-файла определяет файл, в который будет вы¬ водиться запись, сформированная в буфере этого фай¬ ла. Номер-записи указывает номер, под которым запись будет помещена в файл и впоследствии может быть из¬ влечена из него. Если номер-записи опущен, использу¬ ется номер записи из предыдущего оператора PUT, уве¬ личенный на единицу. Если задан номер записи, выхо¬ дящий за пределы файла, то в результате выполнения оператора PUT файл будет расширен. Перед выполне¬ нием оператора PUT в буфере файла необходимо сфор¬ мировать текст записи. Для занесения данных в буфер произвольного файла могут использоваться также операторы последователь¬ ного вывода (PRINT#, PRINT# USING, WRITE#). Если в операторе последовательного вывода указан файл с произвольным доступом, то оператор вместо вывода на диск осуществляет пересылку данных в буфер файла. Операторы PRINT# и PRINT# USING последователь¬ но помещают информацию в буфер файла до тех пор, пока буфер не будет заполнен. Оператор WRITE# пос¬ ле помещения данных в буфер заполняет остаток буфера пробелами и в конце вставляет символ «возврат карет¬ ки», так что последующий вывод в этот буфер невозмо¬ жен. Буфер освобождается после выполнения операто¬ ра PUT, ио
Далее следует пример программы, которая заносит в буфер файла числа от 1 до 10 и создает (или обновля¬ ет) в файле запись с номером 10. 10 OPEN "ПРИМЕР" AS *1 20 FOR 1 = 1 ТО 10 30 PRINT «1, I; '* Занесение чисел в буфер 40 NEXT I 50 PUT #1, 10 Чтение записи из файла В результате выполнения оператора GET запись с указанным номером считывается в буфер файла: GET [#]номер-файла,номер-записи Операнды но мер-файла и номер-записи аналогичны соответствующим операндам в операторе PUT. Если за¬ дан номер несуществующей записи, то в буфер читается случайная информация. При попытке прочесть запись, находящуюся за пределами файла, в буфер файла зано¬ сятся нули. Для обработки записи, прочитанной в буфер файла, могут использоваться переменные, объявленные в опера¬ торе FIELD, или операторы и функции последовательного ввода (INPUT#, LINE INPUT, INPUTS). Если операто¬ ры последовательного ввода или функция INPLJT$ ис¬ пользуются для обработки файла с произвольным досту¬ пом, то вводимые данные последовательно выбираются из буфера файла. При достижении конца буфера выдается сообщение об ошибке. Пр и мер. Программа, приведенная ниже, читает за¬ пись, создание которой рассматривалось в предыдущем примере (10-я запись файла), и выводит содержимое записи на экран дисплея. 10 OPEN "ПРИМЕР" 20 GET *1, 10 30 FOR 1 = 1 TO 10 40 INPUT *1, A 50 PRINT A; 60 NEXT I AS *1 'Чтение записи в буфер 'Выбор из буфера числа 'Вывод числа на экран run 123456789 10 111
Получение информации о файле При обработке файлов на дисках иногда возникает необходимость в получении информации о состоянии файла. Для этого могут использоваться следующие встроенные функции: EOF (End Off File — конец файла)—получение ин¬ формации о достижении конца файла. Эта функция рас¬ сматривалась в разделе «Чтение последовательных фай¬ лов»; LOF (Length Of File — длина файла)—получение информации о длине файла; LOC (LOCation — определение позиции) —получение информации о текущей позиции файла. Обращение к функциям имеет следующий вид: LOF (номер-файла) LOC (ио?лср-файла) Функция LOF возвращает целое число, равное раз¬ меру файла в байтах. Функция LOC возвращает номер последней записан¬ ной или прочитанной записи. Для файлов с последова¬ тельным доступом под номером записи понимается номер последнего записанного или прочитанного 128-байтного блока. Примеры обработки файлов с произвольным доступом В этом разделе приводятся примеры программ обра¬ ботки файла, содержащего информацию о личной биб¬ лиотеке. Структура записи файла была приведена ранее в разделе «Объявление переменных в буфере файла». Поле CODE$ содержит информацию о наличии книги, возможны значения: X — книга хранится, В — книга вы¬ дана. Создание файла с произвольным доступом иллюст¬ рируется с помощью программы регистрации поступив¬ ших книг. Информация о поступивших книгах вводится с клавиатуры. Номером записи является шифр книги. Если шифры следуют не по порядку, в файле будут су¬ ществовать пустые записи. Во время выполнения прог¬ раммы такие записи заполняются символом CHR$ (255). 112
В программе обработки это значение будет использо¬ ваться, чтобы определить, есть ли информация о книге с заданным шифром. 10 REM Программа регистрации поступивших книг. 20 DEFINTA-Z 30 OPEN "БИБЛТЕКА" AS #1 LEN=80 40 FIELD #1,2 AS NUMBERS, 15 AS AUTHORS, 30 AS BOOKS, 1 AS CGOE$, 22 AS READERS, 10 AS DT$ 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 *1, 80 AS DUMMY$ 'Максимальный шифр зарегистрированной книги. FIELD MAX=LOF (1)/80 ~ INPUT "Введите шифр книги "; NM IF NM=0 THEN PRINT "Регистрация завершена" : CLOSE 1 : END IF NM > MAX THEN GOSUB 200 'Вывод фиктивных записей. . LSET NUMBER$=MKI$(NM) INPUT "Введите имя автора книги"; WRK$ LSET AUTHORS=WRKS INPUT "Введите название книги"; WRKS LSET BOOK$=WRK$ LSET CODE$="X" LSET READER$=" LSET DT$=DATE$ PUT#1, NM GOTO 70 LSET DUMMY$=STRING$ (80, CHR$ (255) ) FOR l=MAX+1 TO NM—1 PUT #1, 1 NEXT I MAX=NM RETURN '* Ввод данных об '* авторе книги '* и ее названии '* и занесение в '* буфер файла. 'Признак, что книга хранится. 'Очистить поле информации о читателе. 'Занесение даты регистрации. 'Вывод записи в файл. ;од фиктивных записей. '* Подпрограмма вывода '* фиктивных записей. В строках 30—50 выполняется открытие файла и распределение переменных в буфере файла. Переменная DUMMY$ занимает весь буфер файла и будет использо¬ ваться для очистки буфера. В строке 60 вычисляется максимальный номер записи, существующей в файле. За¬ тем в строке 90 проверяется, является ли шифр введен¬ ной книги больше максимального номера записи. Если это так, то вызывается подпрограмма, которая выводит фиктивные записи. В строках 100—170 в буфер файла заносится инфор¬ мация о книге, а затем в строке 180 осуществляется вы¬ вод записи. Программа завершает работу после ввода шифра книги, равного нулю. Подпрограмма, осуществля¬ ющая вывод фиктивных записей, находится в строках 200—250. Обновление файла с произвольным доступом иллюст¬ рируется программой, которая регистрирует выдачу книг. В случае выдачи книги в поле CODE$ заносится символ «В», а в поле READERS — информация о чита¬ теле. 8 Заказ 2634 113
ю 20 30 40 50 60 70 80 90 100 110 120 130 140 157 160 170 REM Программа регистрации выдачи книг. DEFINT A-Z OPEN "БИБЛТЕКА" AS #1 LEN=80 FIELD *1, 2 AS NUMBERS. 15 AS AUTHORS, 30 AS BOOKS, 1 AS CODES, 22 AS READERS, 10 AS DT$ MAX=LOF (1) /80 'Максимальный шифр зарегистрированной книги. INPUT "Введите шифр книги"; NM IF NM=0 THEN PRINT "Программа завершена." :CLOSE 1 :END IF NM > MAX THEN PRINT "Шифр ошибочен" :GOTO 60 GET *1, NM 'Чтение записи. IF CODE$=CHR$ (255) THEN PRINT "Шифр ошибочен. ":GOTO 60 IFCODE$="B" i HEN PRINT "Шифр ошибочен." :GOTO 60 INPUT "Введите данные о читателе"; WRK$ LSET READER$=WRK$ LSET CODES ="B" LSET DT$=DATE$ PUT *1, NM GOTO 60 '♦Корректировка '♦записи, описы- '♦вающей выданную '♦книгу. 'Признак, что книга отдана. 'Дата выдачи книги. 'Обновление записи. Последовательное чтение файла с произвольным до¬ ступом. При разработке программ может возникнуть не¬ обходимость в последовательном чтении файла с про¬ извольным доступом. Например, один из способов полу¬ чения информации о данных, хранящихся в файле,— это последовательное чтение записей файла. Хотя в Бей¬ сике нет операторов последовательного чтения файлов с произвольным доступом, такая обработка может быть смоделирована. Для этого необходимо последовательно выдавать оператор GET, изменяя номер записи от 1 до максимального номера существующей записи. При этом будут читаться как фиктивные, так и реальные записи, поэтому программа должна иметь возможность разли¬ чать такие записи. Далее приведен пример программы, выводящей на экран список книг, информация о которых хранится в файле БИБЛТЕКА. Программа создания этого файла заполняла фиктивные записи символом CHR$ (255). Для того чтобы отличить фиктивную запись от реальной, осуществляется проверка на наличие символа CHR$ (255) в поле CODE$ (строка 80). 10 REM Программа вывода списка хранящихся кни . 20 DEFINT A-Z 30 OPEN "БИБЛТЕКА" AS #1 LEN=80 40 FIELD #1, 2 AS NUMBERS, 15 AS AUTHORS, 30 AS BOOKS, 1 AS CODES, 22 AS READERS, 10 AS DT$ 50 MAX=LOF (1) /80 'Максимальный шифр зарегистрированной книги. 60 FOR 1=1 ТО MAX 70 GET #1, I 'Чтение записи. 80 IF CODE$=CHR$ (255) THEN GOTO 100 'Фиктивная запись пропускается. 90 PRINT CVI (NUMBERS); TAB (10); AUTHORS, TAB (30), BOOKS 100 NEXT I 110 CLOSE 1 H4
ЧАСТЬ 4 РАСШИРЕННЫЕ ВОЗМОЖНОСТИ СИСТЕМЫ ПРОГРАММИРОВАНИЯ БЕЙСИК ГЛАВА 13. ГРАФИКА В состав Бейсика входят операторы и функции, по¬ зволяющие писать программы построения изображений на экране графического дисплея. Экран такого дисплея рассматривается программистом как прямоугольная таб¬ лица, где элементы изображения (светящиеся точки) об¬ разуют строки и столбцы этой таблицы. Изобразительные возможности дисплея зависят от размера точек и расстояний между ними, а также набо¬ ра цветов, в которые они могут окрашиваться. Графиче¬ ские дисплеи, используемые для ПЭВМ ЕС, могут рабо¬ тать в двух режимах: высокой и средней разрешающей способности. Режимы работы дисплея переключаются программно с помощью оператора SCREEN. При средней разрешающей способности на экране ди¬ сплея располагаются 200 строк и 320 столбцов. Каждая точка может окрашиваться в один из четырех цветов, которые нумеруются от 0 до 3. Дисплеи ПЭВМ ЕС ис¬ пользуют две палитры цветов, обозначаемые 0 и 1. В конкретной палитре каждому номеру соответствует оп¬ ределенный цвет. При смене палитры окраска дисплея изменяется. При высокой разрешающей способности на экране дисплея размещаются 200 строк и 640 столбцов. Изо¬ бражение в этом случае монохромное, точки могут быть белыми или черными. Черному цвету соответствует но¬ мер 0, а белому — номер 1. Графический дисплей имеет специальную встроен¬ ную область памяти, содержимое которой описывает воспроизводимое изображение. В дальнейшем эта па¬ мять будет называться буфером экрана. Размер буфера экрана равен 16 Кбайт. Каждой точке экрана поставле¬ ны в соответствие биты буферной памяти, которые за¬ дают номер цвета этой точки. При средней разрешаю¬ 8* 115
щей способности точке соответствуют 2 бита, а при вы¬ сокой разрешающей способности—1 бит. Сегментный адрес буфера экрана графического дисплея равен &НВ800, а алфавитно-цифрового — &HB000. С помощью функции РЕЕК можно читать содержимое буфера экра¬ на, а с помощью оператора РОКЕ можно заносить в бу¬ фер экрана данные. Функция РЕЕК и оператор РОКЕ описаны в гл. 16. При средней разрешающей способнос¬ ти первая точка нулевой строки описывается двумя стар¬ шими битами первого байта буфера экрана. Вторая точ¬ ка описывается следующими двумя битами и т. д. Один байт содержит информацию о четырех точках, а для опи¬ сания строки используются 80 байт. Следующие 80 байт описывают очередную строку с четным номером, т. е. строку с номером 2, а не с номером 1. Для описания строк с нечетными номерами используется вторая поло¬ вина буфера экрана, начинающаяся со смещением &Н2000. Такое разделение вызвано техническими при¬ чинами. При высокой разрешающей способности номер цвета точки задается аналогичным образом, только каждой точке соответствует 1 бит. Например, семнадцатая точ¬ ка первой строки описывается старшим битом третьего байта. С помощью операторов Бейсика можно изменять цвет отдельной точки экрана или строить простые фигуры. Комбинируя эти элементы, можно создать сложные изо¬ бражения. Для построения графических объектов в Бейсике можно использовать следующие операторы и функции: CIRCLE (circle — окружность) —построить окруж¬ ность; COLOR (color — цвет)—управление цветом изобра¬ жения; DRAW (draw — чертить)—начертить фигуру, опре¬ деленную на языке графического вывода; GET (get — получить) —прочитать изображение с эк¬ рана; LINE (line — линия) — начертить прямую линию; PAINT (paint — раскрасить) —раскрасить область экрана; РМАР (Point МАР — отобразить точку)—преобра¬ зовать координаты точки; POINT (point — точка)—получить информацию о точке экрана; 116
PRESET (Point RESET — восстановить точку)—на¬ чертить точку (по умолчанию цвет фона); PSET (Point SET — установить точку)—начертить точку (по умолчанию цвет переднего плана); PUT (put — поместить)—вывести изображение на экран; SCREEN (screen — экран) —установить режим ра¬ боты дисплея; VIEW (view — поле зрения) — определить окно; WINDOW (window — окно) —переопределить коор¬ динаты экрана. Фон, передний план и окаймление При описании процесса построения изображения на экране дисплея используются три понятия: фон, перед¬ ний план и окаймление. Под термином фон понимают совокупность точек, сос¬ тавляющих фон изображения в собственном смысле это¬ го слова. Передний план — совокупность точек, форми¬ рующих само изображение. Например, если на экране изображена буква А, то передний план — это точки, сос¬ тавляющие букву А, а фон.— точки, окружающие бук¬ ву А. Как правило, изображение формируется наложе¬ нием точек переднего плана на фон. Фоновый цвет — это цвет, в который окрашиваются точки экрана, если номер цвета равен нулю. Он не фик¬ сирован и может быть любым из цветов, поддерживае¬ мых дисплеем. После включения питания ПЭВМ и после переключения режимов работы дисплея все точки окра¬ шиваются в фоновый цвет. Под термином цвет переднего плана понимают номер цвета 3 при средней разрешающей способности и 1 при высокой разрешающей способности. Обычно, если в опе¬ раторе вывода графической информации опущен опе¬ ранд, задающий номер цвета, то по умолчанию исполь¬ зуется цвет переднего плана. Окаймление — область, расположенная за пределами рабочей области экрана, в которой формируется изобра¬ жение. Как правило, она окрашена в тот же цвет, что и фон, и поэтому неотличима от фона. Эта область не уча¬ ствует в формировании изображения; ее назначение — повышение качества изображения за счет развертки за пределами рабочей области экрана. 117
Координаты точек экрана графического дисплея Для того чтобы в операторах, строящих изображения, можно было обращаться к заданным точкам экрана, не¬ обходимо иметь возможность однозначно их идентифици¬ ровать. Любая точка однозначно определяется номером столбца и номером строки, на пересечении которых она находится. Эти номера называются координатами точки. Для задания координат используется форма записи (х, у), где х— номер столбца, у — номер строки, т. е. по¬ рядок задания координат, как в декартовой системе ко¬ ординат. Столбцы нумеруются, начиная с крайнего левого, ко¬ торый имеет номер 0. При средней разрешающей способ¬ ности крайний правый столбец имеет номер 319, а при высокой разрешающей способности — 639. В обоих слу¬ чаях строки нумеруются сверху вниз, номер первой стро¬ ки равен нулю. При средней разрешающей способности координаты точки в левом верхнем углу экрана равны (0, 0), в правом верхнем— (319, 0), в левом нижнем — (0, 199) и в правом нижнем— (319, 199). Такую форму задания координат принято называть абсолютной. Дополнительно Бейсик позволяет использовать отно¬ сительную форму задания координат. В этом случае ко¬ ординаты задаются относительно последней выведенной точки, координаты которой запоминаются после выпол¬ нения любого оператора, обрабатывающего графическую информацию. Относительная форма координат задается операндом STEP: STEP (х, у) причем х и у могут быть отрицательными числами. Если координаты последней выведенной точки равны (50, 50), то операнд STEP (10, —10) определяет точку (60, 40). Во всех ойераторах графической обработки можно в равной мере использовать относительную и абсолютную форму задания координат. Относительная форма дает удобный способ продолжить построения, начатые в пре¬ дыдущем операторе. Переключение режимов работы графического дисплея Графический дисплей может работать в двух режи¬ мах: графическом и текстовом. В графическом режиме 118
возможен вывод на экран графической и текстовой ин¬ формации, а в текстовом — только текстовой информа¬ ции. При выводе текстовой информации размер экрана равен 25x80 при высокой разрешающей способности и 25x40 при средней разрешающей способности. Переключение режимов работы дисплея осуществля¬ ется программно с помощью оператора SCREEN, кото¬ рый имеет формат: SCREEN [режим] [,[цвет][,[активная-стрсшица] [,отобра¬ жаемая-страница] ] ] Режим задает конкретный режим работы экрана и может принимать значения 0, 1 и 2: 0 — текстовый ре¬ жим, 1—графический режим со средней разрешающей способностью (320x200), 2 — графический режим с вы¬ сокой разрешающей способностью. Цвет включает или отключает цветное изображение и может принимать два значения: «истина» (не равно 0) или «ложь» (равно 0). Значение «истина» в текстовом режиме отменяет поддержку цветного изображения, а в графическом режиме поддержку цветного изображе¬ ния отменяет значение «ложь». Отключение цветного изображения состоит в том, что цвета передаются оттен¬ ками серого или другого цвета в зависимости от конкрет¬ ного дисплея. Операнд цвет используется, если на цвет¬ ном дисплее необходимо выполнить программу, подго¬ товленную специально для монохромного дисплея. Активная-страница и отображаемая-страница дейст¬ вуют только в текстовом режиме, их назначение описа¬ но в гл. 9. Для всех опущенных операндов, кроме операнда отображаемая-страница, соответствующие значения не изменяются. Если опущен номер отображаемой страни¬ цы, то он устанавливается равным номеру активной стра¬ ницы. При смене режимов работы экрана происходит очистка экрана. Управление цветом в графическом режиме Управление цветом изображения осуществляется с помощью оператора COLOR. Действие данного опера¬ тора зависит от режима работы экрана (текстовый или графический). В этом разделе рассматриваются только вопросы управления цветом в графическом режиме. 119
Управление цветом изображения в текстовом режиме описано в гл. 9. В графическом режиме можно получать цветные картинки только при средней разрешающей способно¬ сти. В этом случае оператор COLOR позволяет уста¬ навливать цвет фона и палитру и имеет формат: COLOR [фон] [,палитра] Значение операнда фон должно быть числом, кото¬ рое задает номер цвета фона. Допустимые значения от О до 15. Номера цветов приведены в гл. 9. Номер цве¬ та фона всегда равен нулю, но цвет, соответствующий этому номеру, устанавливается оператором COLOR. Палитра указывает номер палитры цветов, которая будет использоваться в дальнейшем. Если значение вы¬ ражения четное, то используется палитра 0, а если оно нечетное, то используется палитра 1. Если какой-либо операнд опущен, то соответствующее значение не из¬ меняется. В каждой палитре номерам цветов соответ¬ ствуют конкретные цвета. Смена палитры приводит к смене раскраски всего экрана. Цвета, составляющие палитру 0 и палитру 1, приведены в табл. 13.1. Заметим, что независимо от выбранной палитры цвет с номером 0 совпадает с цве¬ том фона. Таблица 13.1 Цвета палитры Номер цвета Палитра 0 Палитра 1 0 Фоновый цвет Фоновый цвет 1 Зеленый Голубой 2 Красный Пурпурный 3 Коричневый Белый При высокой разрешающей способности изображе¬ ние всегда монохромное. Цвет фона черный (номер 0), а цвет переднего плана белый (номер 1). Хотя Бейсик не имеет средств для управления цветом переднего плана при высокой разрешающей способности, однако адаптер дисплея позволяет окрашивать точки перед¬ него плана в любой из шестнадцати цветов. Для того чтобы изменить цвет переднего плана, необходимо за¬ 120
слать в порт &H3D9 номер цвета. Это можно сделать с помощью оператора OUT &H3D9,n где число п задает номер цвета переднего плана. Опе¬ ратор OUT описан в гл. 16. Пример. Следующие операторы устанавливают графический режим работы экрана со средней разре¬ шающей способностью, зеленый фон и палитру 0: 10 SCREEN 1 20 COLOR 2, 0 Операнд оператора SCREEN 1 определяет графи¬ ческий режим со средней разрешающей способностью. Первое числовое значение оператора COLOR задает цвет фона (зеленый), а второе — нулевую палитру. Отображение точки Простейшими операторами вывода графической ин¬ формации являются операторы отображения точки; они позволяют в графическом режиме с любой разре¬ шающей способностью окрасить заданную точку в лю¬ бой цвет. Для окраски точки используются операторы PSET и PRESET: PSET (х,у) [,цвет] PRESET (х,у) [,цвет] Операнд (х, у) задает координаты точки, которая должна быть окрашена. Цвет указывает номер цвета, в который будет окра¬ шена точка, и может быть числом в диапазоне от 0 до 3. В графическом режиме с высокой разрешающей способностью значение 2 трактуется как 0, а значе¬ ние 3 — как 1. В результате выполнения этих операторов указан¬ ная точка экрана будет окрашена в заданный цвет. Гак, при средней разрешающей способности оператор PSET (100,100), 1 окрасит точку на пересечении сотой строки и сотого столбца в зеленый или голубой цвет в зависимости от текущей палитры. Отличие операторов PSET и PRESET состоит в том, что, если операнд цвет опущен, в операторе PSET пред¬ полагается цвет переднего плана (цвет 3), а в опера¬ 121
торе PRESET — цвет фона (цвет 0). Если после опера¬ тора PSET выполнить оператор PRESET без операн¬ да цвет, то заданная точка окрасится в цвет фона (про¬ изойдет стирание изображения). Пример. Использование операторов PSET и PRE¬ SET демонстрируется на примере программы, которая строит график линейной функции у=;Ах + В. Значения параметров А и В вводятся с клавиатуры. Значение аргумента х может изменяться с шагом- 0.1 от —32 до 32, а значение у — от —19 до 19. 10 REM Построение графика линейной функции. 20 INPUT "Введите значения параметров А и В А, В 30 SCREEN 2 'Установка высокой разрешающей способности. 40 KEY OFF: CLS 'Очистка экрана. 50 FOR 1=0 ТО 199: PSET (319, I), 1 :NEXT I 'Ось Y. 60 F'ORIO TO 639: PSET (I, 99), 1 :NEXT I 'Ось/. 70 FOR l=4 TO 199 STEP 5 80 FOR J=-3 TO 3 '* Построение 90 PSET (319+J, I), 1 'Единичные отрезки на оси Y. '-осей 100 NEXT J:NEXT I '* системы 110 FOR I =9 TO 639 STEP 10 '* координат. 120 FOR J =—2 TO 2 130 PSET (I, 99+J), 1 'Единичные отрезки на оси X. '* 140 NEXT J: NEXT I 150 LOCATE 1,39: PRINT 19 '* Вывод максимальных 160 LOCATE 13,1: PRINT -32: LOCATE 13,77: PRINT 32 '♦ значений, изобража¬ ло LOCATE 25,39: PRINT-19; :LOCATE 20,1 '* емых на осях. 180 REM Построение графика. 190 FOR Х=—32 ТО 32 STEP .1 200 Y=A*X+B 'Вычисление значения функции. 210 Х1=Х*10+319 'Преобразование в координаты экрана. 220 Y1=198— (Y*5+99) 230 PSET (X1,Y1),1 Построение точки прямой, 240 NEXT X Результат выполнения программы при А и В, рав¬ ных 1, изображен на рис. 13.1. В начальной части программы (строки с 10-й по 40-ю) устанавливается графический режим работы эк¬ рана с высокой разрешающей способностью и очища¬ ется экран. В строках с 50-й по 140-ю выполняется построение осей системы координат. Для построения осей и еди¬ ничных отрезков оператор PSET выполняется в цикле. Так, в строке 50, чтобы построить ось F, оператор PSET выполняют 200 раз. При этом изменяется номер строки от 0 до 199. Для вывода значений крайних то¬ чек осей координат в строках 150—170 используется оператор текстового вывода PRINT. После построения осей координат строится требуе¬ мая прямая линия (строки со 190-й по 240-ю). В стро¬ ке 210 организуется цикл с шагом 0.1, так как в вы- 122
19 / / / -19 Рис. 13.1. График линейной функции бранной системе координат единичный отрезок состо¬ ит из 10 точек. В строках 210 и 220 координаты точки в декартовой системе координат преобразуются в абсо¬ лютные координаты точки экрана. Построение отрезка прямой В отличие от операторов PSET и PRESET, которые отображают одну точку, остальные операторы графи¬ ческого вывода обрабатывают область экрана, которая является геометрической фигурой или некоторой сово¬ купностью точек. Одним из таких операторов является оператор LINE, который позволяет начертить на экра¬ не отрезок прямой или прямоугольник, который в свою очередь может быть окрашен. Оператор имеет формат: LINE [(xl,r/l)]—(%2,z/2) [,[г(вет] [,[В [F]] [,маска] ]] Операнд (xl, yl)— (х2, у2) задает координаты на¬ чальной и конечной точек экрана. Если координаты на¬ чальной точки (xl, у!) не заданы, то по умолчанию используется координата последней выведенной точки. 123
Цвет задает номер цвета, в который будет окраше¬ на линия, и может быть числом в диапазоне от 0 до 3. В графическом режиме с высокой разрешающей спо¬ собностью значение 2 трактуется как 0, а значение 3 — как 1. По умолчанию используется цвет переднего плана. Используя операнд маска, можно чертить преры¬ вистые линии. В качестве значения операнда можно за¬ давать любое целое число. Точкам линии ставятся в соответствие биты двоичного представления значения операнда маска. Когда достигается последний бит мас¬ ки, снова используется первый бит. Если бит маски ра¬ вен 1, то соответствующая точка вычерчивается, а если бит маски равен 0, то не вычерчивается. При маске, равной &НАААА, будет вычерчиваться каждая вторая точка. Этот операнд не может использоваться вместе с операндом BF. Если в операторе LINE заданы операнды В или BF, то вместо отрезка прямой строится прямоугольник с вершинами в точках (xl, у\) и (х2, у2). В результате выполнения оператора LINE заданные точки соединяются отрезком прямой, если еще заданы операнды В или BF, то строится прямоугольник с вер¬ шинами в этих точках. В случае задания операнда BF прямоугольник дополнительно окрашивается в задан¬ ный цвет. После выполнения оператора LINE точка (х2, у2) считается последней выведенной. Например, при выполнении оператора LINE (0,199) —(639,0) на экране будет проведена диагональ, соединяющая ле¬ вый нижний угол экрана с правым верхним, при этом предполагается, что экран работает с высокой разре¬ шающей способностью. Выполнение оператора LINE (10,10) —(100,50)„В приведет к построению прямоугольника, который мо¬ жет быть построен в результате выполнения следую¬ щих операторов: 10 PSET (10, 10) 20 LINE —(100,10) 'Верхняя сторона 30 LINE —(100,50) 'Правая сторона 40 LINE -(10,50) 'Нижняя сторона 50 LINE -(10,10) 'Левая сторона 124
Оператор LINE (10, 10) —(100, 50) ,,, &НСССС со¬ единит вершины прямоугольника диагональю, изобра¬ жаемой пунктирной линией. Ниже приведен пример программы, которая строит стороны прямоугольников случайных размеров и окра¬ шенных в случайные цвета. ю 20 зо 40 CLS: SCREEN 1: KEY OFF FOR 1 = 1 TO 100 LINE (RND*319, RND*199) - (RND*319, RND*199), RND*4, BF NEXT I Использование оператора LINE иллюстрируется про¬ граммой построения гистограммы (рис. 13.2), отражаю¬ щей изменения некоторой величины, значения которой вводятся с клавиатуры. Общее количество значений, Программа выполняет построение гистограммы, отражающей изменение данных, которые ззодится с клавиатуры. Программа может обработать не более 10 значений. Отрицательное число является признаком конца ввода. Введите значение? 3 Введите значение? 6 Введите значение? 4 Введите значение? 8 Введите значение? 10 Введите значение? 14 Введите значение? —1 Рис 13.2. Гистограмма изменения величины 125
которые могут быть обработаны программой, не долж* но превышать 10. 10 REM Программа построения гистограммы. 20 DIM VL (10) 'Определение массива для хранения значений. 30 МАХ=0 'Начальное значение. 40 CLS: WIDTH 80 'Очистка экрана. Установка длины строки. 50 PRINT "Программа выполняет построение гистограммы, отражающей" 60 PRINT ''изменение данных, которые вводятся с клавиатуры". 70 PRINT "Программа может обработать не более 10 значений." 80 PRINT "Отрицательное число является признаком конца ввода". 90 REM Ввод значений и определение максимума. 100 FOR 1%=1 ТО 10 110 INPUT "Введите значение"; VL (1%) 120 IF VL (l%) <0THEN GOTO 150 'Конец ввода ? 130 IF VL (l%) >МАХ THEN MAX=VL (1%)'Определение максимума. 140 NEXT l% 150 NMB%=I%-1 'Количество данных. 160 SCREEN 1 :CLS:KEY OFF.COLOR 7,0 170 REM Вывод осей гистограммы и шкалы вертикальной оси. 180 LiNE (10, 10) - (10, 165) 'Вертикальная ось. >90 LINE (10, 165) - (310, 165) 'Горизонтальная ось. 200 FOR 1%=165 ТО 10 STEP -10 210 LINE (7, l%) — (13, l%) 'Вывод шкалы на вертикальной оси, 220 NEXT 1% а 230 REM Масштабирование значений. 240 IF МАХ>15 THEN NRM=15/MAX ELSE NRM = 1:GOTO 280 250 FOR l%=1 TO NMB% 260 VL (l%) bVL (I%) *NRM 'Масштабирование значений. 270 NEXT l% 280 REM noci роение диаграммы. 290 FOR l%=1 TO NMB% 300 X1 =l%*30 'Координата X левого нижнего столбца гистограммы. 310 Y1 =VL (l%) *10 'Высота столбца гистограммы в точках. 320 LINE (XI, 165) — (Х1+20, 165—Y1), 2, BF 'Построение столбца гистограммы. 230 NEXT l% 310 LOCATE 22, 5 3t0 PRINT "Цена деления шкалы"; 1/NRM 360 END В строке 20 определяется числовой массив с обыч¬ ной точностью, используемый для хранения значений, для которых будет построена гистограмма; присваива¬ ется значение 0 переменной МАХ, используемой в даль¬ нейшем для хранения максимального значения; уста¬ навливается равной 80 длина строки экрана, и экран очищается. Параллельно с вводом данных, который выполня¬ ется в цикле (строки 100—140), в программе определя¬ ется максимальное значение, которое потребуется в дальнейшем для определения цены деления шкалы. По выходу из цикла определяется количество введенных данных (строка 150). В строках 160—190 устанавливается графический режим работы экрана со средней разрешающей способ¬ ностью, с помощью оператора LINE строятся оси ги¬ 126
стограммы. В строках 200—220 на вертикальную ось наносится шкала. Для одного деления шкалы отведе¬ но Ю точек, всего на оси размещается 15 делении. Если значения данных больше 15, то все данные пропорцио¬ нально уменьшаются так, чтобы максимальное значе¬ ние было не больше 15 (строки 240—270). Значение данного, умноженное на 10, будет определять высоту столбца гистограммы, выраженную в точках. В строках 290—330 выполняется построение столб¬ цов гистограммы, которые окрашиваются в красный цвет, так как в нулевой палитре (строка 140) номеру цвета 1 соответствует красный цвет. Программа за¬ вершается выводом значения «цены» деления шкалы. Построение окружности При построении графических объектов иногда воз¬ никает необходимость в построении таких линий, как окружность и ее дуги. Бейсик содержит специальный оператор CIRCLE, который позволяет легко строить эти линии. Окружность задается координатами центра и радиусом. Дополнительно в операторе можно зада¬ вать цвет окружности, начало и конец дуги окружно¬ сти, а также коэффициент сжатия (отношение разме¬ ров окружности по вертикали к размерам по горизон¬ тали). Реально по оператору CIRCLE строится сжатая ок¬ ружность (эллипс), которая определяется большим и малым радиусами, направленными по осям координат. Соотношение между большим и малым радиусами ха¬ рактеризуется коэффициентом сжатия. При значении коэффициента, принимаемом по умолчанию, строится окружность, близкая к правильной форме. CIRCLE (х,у),радиус[. [цвет] [.[начало] [, [конец] [.сжатие]]]] Операнд (х, у) задает координаты центра окруж¬ ности. После выполнения оператора CIRCLE эта точка считается последней выведенной. Радиус должен быть числом, которое задает боль¬ ший радиус окружности, который в зависимости от зна¬ чения операнда сжатие может быть направлен по оси X или оси У. Если значение операнда сжатие меньше 1, то радиус, параллельный оси X, принимается равным операнду радиус. В противном случае операнд радиус будет равен радиусу, параллельному оси У. 127
Операнды начало и конец задают в радианной мере углы, соответствующие начальной и конечной точкам дуги окружности, которую нужно начертить. Углы из¬ меряются по правилам, принятым в математике, и мо¬ гут принимать значение от —2л по 2л. Если значения углов отрицательны, то крайние точки дуги соединя¬ ются с центром, а значения углов рассматриваются как положительные числа. Угол начальной, точки может быть больше угла конечной точки. Если операнды на¬ чало и конец опущены, то строится полная окружность. Если операнды начало и конец равны, то дуга окруж¬ ности будет представлена точкой, которая в случае от¬ рицательного значения будет соединена с центром. Сжатие позволяет управлять формой окружности. Оно задает отношение радиуса, параллельного оси Y, к радиусу, параллельному оси X. Если операнд сжатие опущен, по умолчанию предполагаются такие значения, которые вызывают построение окружности, близкой к правильной. По умолчанию при средней разрешающей способности используется значение 5/6, а при высо¬ кой—5/12. Пример. Следующие операторы будут строить концентрические окружности: 10 SCREEN 1: KEY OFF 20 FORR-20TO120 30 CIRCLE (160, 100), R, 1 40 NEXT R В этом примере максимальное значение радиуса равно 120, хотя расстояние от центра окружности до верхнего или нижнего края экрана равно 100 точкам. Так как по умолчанию используется характеристиче¬ ское отношение 5/6, то по вертикали будет отклады¬ ваться радиус, равный 120*5/6, что равно 100. Для построения второй четверти окружности мож¬ но использовать следующие операторы: 10 PI = 3.14: SCREEN 1 'Pl содержит значение константы 3.14 20 CIRCLE (160,100), 50, 1, PI/2, PI Если в операторе CIRCLE в качестве операндов начало и конец использовать значения —л/2 и —л, так¬ же будет построена вторая четверть окружности, но концы дуги будут соединены с центром. Для построения семейства эллипсов, отличающихся характеристическим отношением, можно выполнять один и тот же оператор CIRCLE, изменяя значение 128
операнда сжатие. Для построения пяти эллипсов с оди¬ наковым центром и радиусом можно использовать сле¬ дующие операторы: 10 SCREEN 1: CLS 20 FOR l=.2 ТО 1 STEP .2 30 CIRCLE (160, ICO), 50, 1,, , I 40 NEXT I Оператор CIRCLE позволяет строить только радиу¬ сы окружности, для этого операнды начало и конец должны быть равными и отрицательными. Ниже при¬ веден пример программы, которая с интервалом 0.2 радиана строит радиусы окружности. 10 SCREEN 1: CLS 15 CIRCLE (160, 100), 50, 2 20 FOR 1=0 ТО 6.23 STEP .2 30 CIRCLE (160, 100), 50, 1,-I,-I 40 NEXT I Раскраска областей экрана Оператор PAINT (paint — раскрасить) позволяет раскрашивать заданную область экрана любым допу¬ стимым цветом или их комбинацией. Область опреде¬ ляется замкнутой кривой заданного цвета, охватываю¬ щей точку, с которой начинается раскраска. При вы¬ полнении этого оператора экран раскрашивается, на¬ чиная с указанной точки, затем раскраска распростра¬ няется по всем направлениям. Способом раскраски можно управлять с помощью специального операнда. Процесс раскраски прекращается, если каждая раскра¬ шенная точка окружена точками, которые уже раскра¬ шены или имеют цвет замкнутой кривой, ограничиваю¬ щей область. Оператор PAINT имеет формат: PAINT (х,у) [, [трафарет] [, [контур] ] [,фо«] ] Операнд (х, у) задает координаты точки области, с которой начинается раскраска. Эта точка может быть любой внутренней точкой области. Трафарет может быть числовым или строковым вы¬ ражением. Если трафарет задан числовым выражением, то он определяет цвет, в который окрашивается область экрана. При средней разрешающей способности воз¬ можны значения 0, 1, 2 и 3; 0 определяет цвет фона, а 9 Заказ 2634 129
значения 1, 2 и 3 — цвет из текущей палитры. По умол¬ чанию предполагается значение 3. При высокой раз¬ решающей способности возможны два значения 0 и 1. Значение 0 указывает черный цвет, а значение 1 — бе¬ лый. По умолчанию предполагается значение 1. Если трафарет задан строковым выражением, то тем самым определяется раскраска в «крапинку» (неоднородная раскраска). Подробнее об этой раскраске будет ска¬ зано ниже. Контур задает цвет замкнутой кривой, которая ог¬ раничивает раскрашиваемую область. Цвет задается числовым выражением по тем же правилам, что и для операнда трафарет. По умолчанию принимается значе¬ ние, заданное операндом трафарет. Фон может использоваться только в случае раскрас¬ ки в «крапинку». Он задается строковым выражением, значение которого должно быть длиной в один символ. Результатом выполнения данного оператора являет¬ ся раскраска заданной области в указанный цвет. Границы области должны быть предварительно начер¬ чены с использованием любых графических средств Бейсика, и ее цвет должен совпадать со значением операнда контур. Область составляют все точки, к ко¬ торым можно пройти, двигаясь только по вертикали и горизонтали в любых направлениях п не пересекая то¬ чек, цвет которых совпадает с цветом границы области. Один из простейших примеров использования опе¬ ратора PAINT — раскраска всего экрана в цвет, от¬ личный от фона, а затем как бы вырезание «окна», ок¬ рашенного в цвет фона. 10 SCREEN 1 'Средняя разрешающая способность. 20 COLOR 7,0:CLS 'Установка палитры, фона и очистка экрана. 30 KEY OFF 'Отмена отображения функциональных клавиш. 40 PAINT (100; 160), 1 'Раскрашивание экрана в зеленый цвет. 50 LINE (100, 120) - (200, 80), 0, В 'Вычерчивание границы. 60 PAINT (150, 100), 0 'Вырезание окна. Оператор PAINT обычно используется вместе с дру¬ гими операторами, которые вычерчивают границу об¬ ласти. Ниже приведен пример программы, которая с помощью операторов CIRCLE и PAINT строит в цент¬ ре экрана объект, напоминающий изображение солнца (рис. 13.3), встречающееся на детских рисунках. Оператор CIRCLE в строке 40 используется для по¬ строения границы солнца, которое в строке 50 раскра¬ шивается в красный цвет. В строке 70 с помощью опе- 130
ратора CIRCLE строятся радиусы окружности, так как операнды начало (—I) и конец (—I) отрицательны и равны друг другу. Переменная цикла I задает угол от¬ клонения луча. С помощью радиусов изображаются лучи солнца. ю 20 зо 40 50 60 70 80 SCREEN 1 COLOR 7,0:CLS KEY OFF 'Средняя разрешающая способность. 'Установка палитры, фона и очистка экрана. 'Отмена отображения функциональных клавиш. CIRCLE (160,100),15,2 'Граница солнца. PAiNT (160,100,2 'Раскрашивание солнца в красный цвет. FOR 1=0 ТО 6. 1 STEP .4 CIRCLE (160,100,40,2,-1,—! '* Построение лучей солнца. NEXT I Раскраска в «крапинку». В этом случае трафарет задается строковым выражением, значение которого не должно быть длиной больше 64 байт. Каждой точке экрана при высокой разрешающей способности ставит¬ ся в соответствие один бит, а при средней разрешаю¬ щей способности — два бита, комбинация которых задает цвет этой точки при раскраске оператора PAINT. Эти биты выбираются из операнда трафарет. При высокой разрешающей способности точка окра¬ шивается в цвет переднего плана, если соответствую¬ 9* 131
щий бит равен 1. При средней разрешающей способ¬ ности 0 определяет цвет фона, а значения 1, 2, и 3 — цвета из текущей палитры. Биты, которые будут связаны с точкой, определя¬ ются по следующим правилам: • каждой строке экрана последовательно ставится в соответствие один байт из значения трафарета. Пер¬ вой строке ставится в соответствие первый байт, вто¬ рой строке — второй байт и т. д. Когда же весь трафа¬ рет исчерпывается, то осуществляется переход опять к первому байту, и весь процесс повторяется; • байт, назначенный строке, циклически повторяет¬ ся для всех точек строки, начиная с первой точки стро¬ ки и первых битов байта. При этом с каждой точкой связывается один бит при высокой разрешающей спо¬ собности и два бита при средней разрешающей спо¬ собности. Раскраска в «крапинку» отличается от обычной только способом определения цвета точки. При обыч¬ ной раскраске цвет всех точек одинаков, а при рас¬ краске в «крапинку» может изменяться. Пример. Программа, приведенная ниже, раскра¬ шивает прямоугольную область полосами красного и зеленого цвета. Ширина полос равна четырем строкам. 10 SCREEN 1 'Средняя разрешающая способность. 20 COLOR 7,0:CLS:KEY OFF 'Установка палитры, фона и очистка экрана. 30 A$=CHR$ (&НАА) +CHR$ (&НАА) +CHR$ (&НАА) +CHR$ (&HAA) + CHR$ (&H55) +CHR$> (&H55) +CHR$ (&H55) +CHR$ (&H55) 'Трафарет. 40 LINE (100, 120) - (200, 80), 2, В 'Вычерчивание прямоугольника. 50 PAINT (150, 100), A$, 2 'Раскрашивание прямоугольника 'в крапинку. Способ раскраски фактически задается в строке 30. Длина трафарета — 8 байт, причем первые и последние четыре байта одинаковы. Следовательно, первым че¬ тырем строкам экрана будет поставлено в соответствие значение &НАА, а четырем последующим — &Н55, и процесс будет циклически повторен. Двоичное пред¬ ставление значения &НАА—10101010, поэтому всем точкам соответствующей строки ставится в соответст¬ вие значение 2 (красный цвет в нулевой палитре). Ана¬ логично можно видеть, что &Н55 определяет однород¬ ную линию зеленого цвета. Заметим, что если в качестве трафарета использо¬ вать строку, первые четыре байта которой равны &НА5, то программа, приведенная выше, раскрасит прямо¬ 132
угольную область в клеточки красного и зеленого цвета. Условием прекращения выполнения оператора PAINT является возникновение такой ситуации, когда невозможно перейти к точке, цвет которой отличается от цвета, в который она должна быть окрашена. Бей¬ сик не различает точки, раскрашенные при выполнении текущего оператора PAINT, от ранее окрашенных то¬ чек. При повторной раскраске может преждевременно возникнуть условие прекращения выполнения операто¬ ра PAINT. Операнд фон задает цвет точек, которые необходи¬ мо считать фоновыми и раскрашивать в любом случае. Цвет задается по тем же правилам, что и для операнда трафарет. Программа, приведенная ниже, дает пример преж¬ девременного прекращения раскраски. '* '* Установка режимов. 'Трафарет для раскраски. 'Границы области. 'Раскраска зеленым цветом. ю 20 зо 40 50 60 SCREEN 1 COLOR 7,0:CLS:KEY OFF A$=CHR$ (&H55) +CHR$ (&HAA) LINE (100, 120)-(200, 80), 2, B PAINT (150, 100), 1, 2 PAINT (150, 100), A$, 2 'Раскраска вертикальными полосами 'красного и зеленого цвета. При выполнении оператора в строке 60 раскраска прекратится после проведения двух красных строк, так как в дальнейшем необходимо раскрашивать точки только в зеленый цвет, который совпадает с цветом объекта. Если к оператору PAINT в строке 60 доба¬ вить операнд фон, равный CHR$(&H55), то процесс раскраски изображение будет доведен до конца. Опе¬ ранд CHR$(&H55) указывает, что все точки зеленого цвета необходимо считать фоновыми. Использование в качестве операнда трафарет строки символов значительно расширяет возможности в рас¬ крашивании областей экрана. Ниже приводится при¬ мер программы, которая делит окружность на 6 рав¬ ных частей и каждую часть раскрашивает следующим образом: 1 —однородный зеленый цвет; 2 — однородный красный цвет; 3 — красно-зеленые клеточки; 4 — красно-зеленые горизонтальные полосы; 5 — однородный коричневый цвет; 6 — красно-зеленые вертикальные полосы. 133
10 20 SCREEN 1 COLOR 7,0 : CLS : KEY OFF 25 30 40 50 55 60 70 80 CIRCLE (160, 100), 50, 2 FOR 1=0 ТО 6 STEP 6.28/6 CIRCLE (160, 100), 50, 2, -I,-I NEXT I REM Раскрашивание каждой части окружности. PAINT ------ PAINT PAINT 'Средняя разрешающая способность. 'Установка палитры, фона и очистка экрана. ' Построение окружности. '* '* Деление окружности на '* 6 частей. (170, 98), 1,2 (160, 90), 2, 2 (150, 98), CHRi (&H5A) +CHR$ (&HA5), 2 90 PAINT (150, 102) , CHR$ (&HAA) +CHR$ (&H55), 2 100 PAINT 110 PAINT (160, 110),3,2 (170, 102), CHR$(&H5A), 2 'Зеленый цвет. 'Красный цвет. 'Красно-зеленые клеточки. '* Красно-зеленые горизонтальные полосы. 'Коричневый цвет. 'Красно-зеленые вертикальные полосы. Часто для того чтобы показать, как распределена некоторая величина по частям, используют окружность, разделенную на сектора, пропорциональные составным частям. Окружность изображает весь объем, а секто¬ ра— составляющие части. Если в программе, приве¬ денной выше, переменную I заменить выражением В (I) =A(I)/S*6,28 где S — сумма составляющих частей, а переменная из¬ меняется от 1 до п, то будет получена программа, ко¬ торая делит окружность на пропорциональные части. Язык графического вывода В состав Бейсика входит оператор DRAW, который позволяет окрасить различные изображения по методу «черепашьей графики». Концепция построения состоит в том, что оператор DRAW задает последовательность команд, которые называют языком графического вы¬ вода. Команды условно можно разделить на две груп¬ пы: движения и управления. В результате выполнения команды движения осу¬ ществляется вычерчивание отрезка прямой линии из последней выведенной точки по заданному направле¬ нию на указанное расстояние, выраженное в точках. В дальнейшем последней выведенной точкой считает¬ ся точка, в которой закончено вычерчивание линии. Команды управления влияют на способ вычерчивания линии. Они позволяют управлять цветом, осуществлять поворот иа заданный угол, выполнять сжатие или ра¬ стяжение вычерчиваемой линии и т. д. 134
Комбинируя необходимую последовательность команд, можно выполнять построение сложных объектов. По¬ строение с помощью оператора DRAW чем-то напоми¬ нает процесс создания рисунка черепахой, движущейся по песку, поэтому этот метод построения иногда назы¬ вают «черепашьей графикой». Оператор DRAW (draw — начертить) имеет формат: DRAW строка-символов Строка-символов может быть любым строковым вы- • ражением, значение которого должно состоять из команд графического вывода. Пробелы внутри строки игнорируются. Выполнение оператора состоит в выпол¬ нении этих команд. Ниже приведены команды движения. Команды движения Команда Uzz Dn Ln Rn Еп Еп Gn Ым Мх, у Действие Движение вверх Движение вниз Движение влево Движение вправо Движение по диагонали вверх и вправо Движение по диагонали вниз и вправо Движение по диагонали вниз и влево Движение по диагонали вверх и влево Движение к заданной точке В каждой из приведенных команд п указывает про¬ ходимое расстояние, выраженное в точках. Количество проходимых точек равно значению п, умноженному на масштаб, устанавливаемый командой S (см. команды управления). Параметры х и у задают координаты точки, в на¬ правлении которой будет выполнено движение. Если перед х находится знак 4- или —, то координаты точ¬ ки заданы в относительной форме; в противном случае координаты заданы в абсолютной форме. Во всех этих командах параметры п, х и у могут быть числовыми константами или именами переменных. Перед именем переменной должен указываться знак =, а после имени — знак ;. После констант задание точки с запятой необязательно. Дополнительно для задания переменных можно ис¬ пользовать встроенную функцию VARPTR$. Результат выполнения этой функции должен включаться в строку- символов как подстрока. Для этого можно использо¬ 135
вать операцию сцепления строк. При выполнении опе¬ ратора DRAW обращение к функции заменяется зна¬ чением соответствующей переменной. В этом случае знаки = и ; не требуются. Например, следующий оператор DRAW вызовет дви¬ жение на 5 точек вверх: DRAW "U5" Это же действие может быть задано следующей по¬ следовательностью операторов: А % = 5 DRAW "U=A°/0;" Если использовать функцию VARPTR$, то после¬ довательность операторов примет следующий вид: DRAW5 "U"+VARPTR$ (А%) Замечание. Если программа на Бейсике впоследствии бу¬ дет обрабатываться компилятором, то в операторе DRAW перемен¬ ные должны задаваться только с помощью встроенной функции VARPTR$. При построении объектов необходимо учитывать-, что расстояние между точками по горизонтали и вер¬ тикали не одинаково. Обычно горизонтальная ось эк¬ рана в 4/3 раза длиннее вертикальной оси. Например, легко подсчитать, что при высокой разрешающей спо¬ собности 48 точек по горизонтали дают такой же раз¬ мер, как 20 вертикальных точек. Команде движения может предшествовать префикс, который модифицирует команду. Префикс может быть одним из следующих: В — двигаться, но не чертить точек; N — двигаться, а в конце возвратиться к начальной точке. Кроме команд движения, в операторе DRAW мож¬ но использовать команды управления, которые приве¬ дены ниже. Команды управления Команда Действие Ап ТАп Установить угол поворота, кратный 90 градусам Установить угол поворота, выраженный в гра¬ Сп Sn дусах Управление цветом Установить масштабный коэффициент 136
Ху$ Выполнить команды, содержащиеся в строке т Выполнить раскраску Ап Устанавливает угол поворота, равный и, где п может прини¬ мать целые значения от 0 до 3. Значение 0 задает 0°, 1—90°, 2—180°, 3—270°. После выполнения этой команды все строя¬ щиеся линии будут поворачиваться на заданный угол. Фигу¬ ры, повернутые на 90° или 270°, масштабируются таким обра¬ зом, чтобы они имели тот же размер, что и без такого пово¬ рота. ТАн Устанавливает угол поворота равный и, где п может прини¬ мать значение от —360° до +360°. Если п положительно, то поворот осуществляется против часовой стрелки, а в против¬ ном случае — по часовой стрелке. Команды А и ТА выпол¬ няют аналогичные действия и отличаются только- способом задания угла поворота. Си Устанавливает цвет, в который окрашиваются вычерчиваемые линии. Операнд п может принимать значения от 0 до 3 при средней разрешающей способности и 0 или 1 при высокой раз¬ решающей способности. При средней разрешающей способ¬ ности п указывает номер цвета в текущей палитре, а при вы¬ сокой разрешающей способности 0 определяет черный цвет, а 1 — белый. Если команда С не выполнялась, то использу¬ ется цвет переднего плана. S/г Устанавливает масштабный коэффициент, равный лг/4, где п может изменяться от 1 до 255. Значение, заданное в коман¬ дах движения U, D, L, R, Е, F, G и Н, умножается на мас¬ штабный коэффициент. По умолчанию принимается значение, равное 4. Хстроковая-переменная; Вызывает выполнение команд, заданных значением указанной строковой-переменной. Рп,т Выполняет раскраску фигуры в цвет с номером п. Границей фигуры считается замкнутая линия, номер цвета которой ра¬ вен т. Правила раскраски аналогичны тем, которые исполь¬ зуются в случае оператора PAINT. Раскраска начинается с последней выведенной точки. Параметры в командах управления задаются по тем же правилам, что и в описанных выше командах движения. Пример. Для построения квадрата в центре эк¬ рана при средней разрешающей способности, необходи¬ мо выполнить следующие команды: 10 SCREEN 1 : CLS 20 DRAW "ВМ112,137 U75 R96 D75 L96" Ниже приведен пример программы, которая иллюст¬ рирует использование оператора DRAW. Программа в ответ на нажатие клавиши управления курсором вы¬ черчивает отрезок прямой длиной в три точки. Нажа¬ тие клавиши 5 (клавиша в поле цифрового набора) вызывает смену цвета вычерчиваемой линии. 137
'Но умолчанию переменные — целые. 'Средняя разрешающая способность. 'Установка палитры, фона. 'Очистка экрана. 'Номер цвета. 'Длина отрезка прямой. A$-INKEY$: IF LEN (А$) < > 2 THEN GOTO 60 IF MID$ (A$, 2, 1) =CHR$ (&H48) IF MID$ (A$, 2, 1) -CHR$ (&H4D) IF MID$ (A$, 2, 1) -CHR$ (&H50) DEFINT A—Z SCREEN 1 COLOR 7,0 CLS :KEY OFF CLR = 1 LNG-3 10 20 30 35 40 50 60 70 80 90 100 IF MID$ (A$, 2, 1) -CHR$ (&H4B) 110 IF MID$ (A$, 2, 1)-CHR$ (&H4C) 120 GO TO 60 THEN THEN THEN THEN THEN 'Ввод кода клавиши. "C=CLR; "C=CLR; "C=CLR; "C=CLR; DRAW DRAW DRAW DRAW CLR=CLR+1 : CLR = CLR MOD 4 U=LNG; R=LNG, D=LNG, L=LNG, GO TO 60 GO TO 60 GO TO 60 GO TO 60 Операторы в строке 60 выполняются в цикле, пока не будет нажата клавиша, которой соответствует двух¬ байтный расширенный код. В строках 70—100 проверяется, была ли нажата клавиша управления курсором. Для этого с помощью встроенной функции MID$ извлекается номер нажатой клавиши, а затем сравнивается с номерами клавиш уп¬ равления курсором. В случае совпадения с помощью оператора DRAW строится соответствующая линия за¬ данного цвета. Смена цвета осуществляется в строке 110 по нажа- ; тию клавиши 5, находящейся среди клавиш управле¬ ния курсором. Значение переменной CLR, содержащей помер цвета, изменяется на единицу. Нажатие любых других клавиш игнорируется. Операторы GET и PUT Оператор GET позволяет прочитать информацию о цветах всех точек заданной прямоугольной области эк¬ рана и поместить ее в числовой массив; оператор PUT выполняет обратное действие, он воспроизводит на эк¬ ране изображение, которое хранится в форме массива чисел. Выполнение этих операторов фактически состоит в пересылке некоторой области из буфера экрана в чис¬ ловой массив, и наоборот. Оператор PUT реализует наиболее быстрый способ воспроизведения картинок на экране дисплея. Оператор GET. Этот оператор имеет формат: GET (xl, у\)—(х2, у2), имя-массива Операнд (xl, у\) — (х2, у2) определяет прямоуголь¬ ную область, задавая координаты вершин прямоуголь¬ ника. 138
Имя-массива определяет массив, в который будет помещаться информация, получаемая по оператору GET. Массив может быть числовым массивом любой размерности. Информация запоминается в массиве по¬ следовательно, без учета его размерности. Необходи¬ мо, чтобы объем памяти в байтах, отведенной для мас¬ сива, был не меньше, чем размер области в буфере эк¬ рана, содержащей точки заданного прямоугольника. Это значение может быть вычислено по формуле 44-INT ((/п*А+7)/8*п где и, т— длины соответственно горизонтальной и вертикальной сторон прямоугольника, выраженные в точках; А — должно быть равно: 2 — при средней разрешающей спо¬ собности или 1 — при высокой разрешающей! способнос¬ ти. Эта формула учитывает тот факт, что данные каж¬ дой строки выравниваются на границу байта. Информация в массиве имеет следующую структуру: • два байта, содержащие размер х (в битах); • два байта, содержащие размер у (в битах); • данные. Оператор PUT. Этот оператор позволяет воспроиз¬ вести в любом месте экрана изображение, сохраненное с помощью оператора GET. Оператор PUT имеет фор¬ мат: PUT (х, у), имя-массива [, режим] Операнд (х, у) задает координаты верхнего левого угла прямоугольной области, в которой будет воспро¬ изведено изображение. Размер области определяется содержимым массива, заданного именем-массива. Имя-массива определяет числовой массив, содержа¬ щий данные, полученные с помощью оператора GET. Способ воспроизведения изображения на экране за¬ дается операндом режим, который может принимать следующие значения: PSET, PRESET, XOR, AND, OR. Если режим не задан, по умолчанию предполагается режим XOR. При выполнении оператора PUT с режимом PSET в заданной области экрана независимо от текущего изображения каждая точка окрашивается в тот цвет, в который она была окрашена при выполнении опера¬ тора GET, — тем самым выполняется восстановление изображения, сохраненного в операторе GET. 139
При использовании режима PRESET текущая ок¬ раска точек экрана также игнорируется, но цвета всех точек воспроизводимого изображения изменяются на противоположные. Противоположным считается цвет, номер которого равен разности между номером цвета переднего плана (3 или 1 в зависимости от используе¬ мой разрешающей способности) и номером цвета точ¬ ки. Так, при средней разрешающей способности значе¬ нию 3 соответствует номер цвета 0, и наоборот, а зна¬ чению 2 — номер цвета 1, и наоборот. Последователь¬ ное выполнение оператора GET и оператора PUT с ре¬ жимом PRESET позволяет получить «негативное» изо¬ бражение. При использовании режимов AND, OR и XOR вы¬ полняется слияние выводимого изображения с сущест¬ вующим на экране. Слияние выполняется по следую¬ щим правилам: над номерами цветов соответствующих точек выполняется логическая операция соответствен¬ но AND, OR или XOR. Результирующее значение цве¬ та, получаемого при использовании режимов AND, OR и XOR, приведено в табл. 13.2. Таблица 13.2 Правила вычисления результирующего цвета Значение цвета в элементе массива Значение цвета в точке экрана Режим AND Режим OR Режим XOR 0 12 3 0 12 3 0 12 3 0 0 0 0 0 0 12 3 0 12 3 1 0 10 1 113 3 10 3 2 2 0 0 2 2 2 3 2 3 2 3 0 1 3 0 12 3 3 3 3 3 3 2 10 Если с помощью оператора PUT с режимом XOR выводится изображение, совпадающее с текущим, то это изображение удаляется с экрана (восстанавлива¬ ется цвет фона). Если некоторое изображение дважды накладывается с использованием режима XOR на лю¬ бое другое изображение, то прежнее изображение вос¬ станавливается без всяких изменений. С помощью оператора PUT, изменяя координаты (к, у), можно перемещать изображение в любое место экрана. Это позволяет имитировать на экране движе¬ 140
ние объектов. Для имитации движения необходимо вы¬ полнить следующие действия: • поместить изображение объекта на экран с по¬ мощью оператора PUT; • зафиксировать изображение (задержка перед сти¬ ранием) ; • стереть изображение объекта повторным его вы¬ водом с режимом XOR; • вывести изображение объекта в новом месте. Если эти действия повторять, то будет создаваться иллюзия движения; чем быстрее осуществляется смена изображений и чем меньше расстояние между двумя кадрами, тем эта иллюзия полнее. Если осуществлять смену кадров с достаточно высокой скоростью, то мож¬ но добиться исчезновения эффекта мигания изобра¬ жения; скорость смены кадров ограничена производи¬ тельностью ПЭВМ. Пример. При описании оператора PAINT приве¬ ден пример программы, которая создает на экране ри¬ сунок солнца. Если в эту программу добавить опера¬ торы, которые прочтут это изображение, а затем будут воспроизводить его с одним и тем же смещением, то будет проимитировано движение. Ниже приведен мо¬ дифицированный вариант этой программы. 10 CLS:SCREEN 1:KEY0FF 20 COLOR 7,0 30 CIRCLE (40, 100), 15, 2 40 PAINT (40, 100), 2 50 FOR l=0 TO 6.1 STEP .2 60 CIRCLE (40, 100), 40, 2,-I,-I 70 NEXT I 80 DIM A% (705) 90 GET (0, 133)-(80, 67), A% 100 FOR l=0 TO 235 STEP 4 110 PUT (I, 67), A%, XOR 120 PUT (1+4, 67),A%, XOR 130 FOR J=1 TO 300: NEXT J 140 NEXT I '* Получение изображения солнца. 'Считывание изображения солнца. 'Шаг движения 4 точки. 'Стирание старого изображения. 'Воспроизведение нового. 'Задержка. При выполнении этой программы можно заметить, что. эффект мигания довольно значителен. Один из способов его уменьшения состоит в том, что удаляется и воспроизводится на экране не весь объект, а его от¬ дельные части. Ниже приведен пример программы, передвигающей прямоугольник зеленого цвета с изображенными на нем красными кругами. Эффект движения создается за счет того, что прямоугольник вначале укорачивает¬ ся на 10 столбцов, а затем на столько же удлиняется. 141
Быстрое выполнение этого процесса создает иллюзию движения. 10 REM Программа имитирует движение объекта. 20 DIM А% (6), В% (6) 30 DIMC%(24) 40 SCREEN 1 'Установка средней разрешающей способности. 50 CLS :KEY OFF 'Очистка экрана. 60 COLOR ,0 'Установка палитры, цвет фона не меняется. 70 CIRCLE (10, 100), 2, 2 80 PAINT (10, 100), 2 '* Сохранение окружности. 90 GET (8, 98) — (12, 102), А% '* зеленого цвета. 100 CIRCLE (10, 100), 2, 1 110 PAIN I (10, 100), 1 '* Сохранение окружности. 120 GET (8, 98) - (12, 102), В% '* красного цвета. 130 LINE (0,93) — (89, 107), 1, BF 'Вывод прямоугольника зеленого цвета. 140 REM Размещение на прямоугольнике окружностей красного цвета. 150 FOR l%=3 ТО 90 STEP 10 160 PUT ( I %, 98), В% 'Окраска области окружности в цвет фона. 170 PUT (l%, 98), А% 'Вывод окружности красного цвета. 180 NEXT l% 190 GET (0,93) - (9,107), С% 'Сохранение рисунка который построен. 200 FOR |%=0 ТО 229 STEP 10 210 PUT (l%, 93), С% 220 PUT (l%+90,93), С% 230 FOR J=1 ТО 100, NEXT J 240 NEXT l% '* Имитация '* движения. 'Задержка. Используя операторы PUT и DATA, можно воспро¬ изводить изображения, которые закодированы в фор¬ ме последовательности чисел. Значение числового мас¬ сива, хранящего изображение, может быть выведено на экран или печать, а затем вставлено в другую про¬ грамму в форме операторов DATA. Если эти значения с помощью оператора READ присвоить числовому мас¬ сиву, а затем выполнить оператор PUT, указав в нем этот массив, то тем самым будет воспроизведено изо¬ бражение закодированного объекта. В приведенной выше программе в массив С% зано¬ сится образ перемещаемого фрагмента (строка 190). Если массив С% вывести на печать, то можно увидеть, что его элементы имеют следующие значения: 20 15 21845 21840 20565 21845 21840 20565 21845 21840 20619 —21930 22096 20650 —21930 21840 20649 21845 21840 20565 21845 21840 20565 21845 80 Используя эти данные, можно подготовить програм¬ му, которая выводит на экран изображение этого пе¬ ремещаемого фрагмента (текст такой программы при¬ веден на с. 143). Этот метод может быть использован для кодирования более сложных рисунков; наиболее тру¬ 142
доемкая часть — подготовка операторов DATA — может быть осуществлена с помощью ПЭВМ. 10 CLSzSCREEN 1 :KEY OFF 20 СО LOR,О 30 DIMC%(24) 40 DATA 20, 15, 21845, 21840, 20565, 21845, 21840, 20565 50 DATA 21845, 21840, 20649, -21930, 22096, 20650, -21930, 21840 60 DATA 20649, 21845, 21840, 20565, 21845, 21840, 20565, 21845, 80 70 FORI%=0TO24 80 READC%(I%) 'Присвоение значений массиву. 90 NEXT l% 100 PUT (150, 100), C% 'Вывод изображения. Определение «окон» В программах, имеющих дело с графическими объ¬ ектами, иногда необходимо выполнять построение не по всему полю экрана, а в пределах некоторой ограни¬ ченной области. Для решения такой задачи предна¬ значен оператор VIEW, который определяет прямо¬ угольную область на экране. Эта область при выпол¬ нении следующих операторов графической обработки воспринимается как экран, .и все построения выпол¬ няются только в пределах этой области, не изменяя изображения, находящегося за его пределами. Такую область экрана будем называть «окном». Используя технику «окон», довольно легко выпол¬ нить построение одного и того же объекта в разных областях экрана. Для этого достаточно, определяя «окно» в разных местах экрана, каждый раз выполнять одни и те же операторы, реализующие построение нуж¬ ного объекта. В результате каждый раз объект будет строиться в текущем «окне». Оператор VIEW, позво¬ ляющий определять «окна», имеет формат: VIEW [[SCREEN] [(х1,г/1) — (x2,r/2) ] [,[цвет] [,[контур] ]]]] Операнд (xl, у!) — (х2, у2) задает координаты ле¬ вого верхнего и правого нижнего углов «окна». Цвет указывает цвет, в который будет окрашено «окно». При средней разрешающей способности значе¬ ние 0 задает фоновый цвет, а значения 1, 2 и 3 — цве¬ та из текущей палитры. При высокой разрешающей способности 0 задает черный цвет, а 1 — белый. Если этот операнд опущен, то окраска «окна» не выполня¬ ется. 143
Контур определяет цвет, в который будет окраше¬ на граница «окна». Цвет задается так же, как и в пре-> дыдущем операнде. Если операнд SCREEN не указан, то во всех по¬ следующих графических операторах координаты точек будут считаться заданными относительно левого верх¬ него угла «окна». Это значит, что если в операторе использована точка с координатами (х, у), то перед выполнением построения к. ней будут добавлены коор¬ динаты левого верхнего угла «окна». Например, если выполнен оператор VIEW (20, 20) —(100, 100) то последующий оператор PSET (30, 30) будет стро¬ ить точку с абсолютными координатами (50, 50). Тем самым объект будет построен в пределах «окна». Если точка попадает за пределы «окна», то она не строится. Если операнд SCREEN задан, то координаты то¬ чек, используемые в графических операторах, рассмат¬ риваются как абсолютные. На экране, однако, будут появляться только те точки, которые находятся в пре¬ делах «окна». Оператор VIEW без операндов определяет «окно»; которое занимает весь экран. В программе можно использовать несколько опе¬ раторов VIEW, но активным будет являться то «окно», которое определено последним выполненным операто¬ ром VIEW. Команда RUN и оператор SCREEN отме¬ няют действие оператора VIEW. Очень часто вместе с оператором VIEW использу¬ ется оператор WINDOW, который позволяет задать свой способ нумерации точек, отвечающих потребности кон¬ кретной программы. Более подробно об операторе WINDOW говорится в следующем разделе. Пример. Следующая программа с помощью од¬ ного и того же оператора CIRCLE (строка 110) стро¬ ит окружность в каждом углу экрана. 10 CLSiSCREEN 1 : KEY OFF 20 LOCATE 2,6 : PRINT "ОКНО—1" 30 LOCATE 2, 26 : PRINT "ОКНО—2" '* Вывод текста в преде- '* лах каждого окна '* Определение окна и вы- '* зоб подпрограммы, '* которая строит окруж- '* ность в этом окне 40 LOCATE 16, 6 : PRINT "ОКНО—3" 50 LOCATE 16, 26 : PRINT "ОКНО-4" 60 VIEW (1, 1) — (150, 90),, 2.GOSUB 110 70 VIEW (170, 1) — (310, 90),, 1 :GOSUB 110 80 VIEW (1, 110) — (150, 195), , 1:GOSUB 110 90 VIEW (170, 110) — (310, 195), . 2:GOSUB 110 100 END 110 CIRCLE (70, 50), 30, 3;RETURN 'Подпрограмма построения 'окружности 144
Заметим, что центр окружности, которая строится в первом «окне», будет иметь абсолютные координа¬ ты (71, 51), во втором— (240, 51) и т. д. Переопределение координат точек экрана Для задания абсолютных координат точек экрана используются целые числа. В программах, реализую¬ щих построение конкретных объектов, иногда возника¬ ет необходимость в преобразовании системы коорди¬ нат, в которой задан объект, в систему координат, ус¬ тановленную для точек экрана. Так, для построения графика функции SIN(x) необходимо выполнить пре¬ образование координат точек синусоиды в абсолютные координаты точек экрана и тем самым ввести новый способ адресации точек экрана. Если бы координаты точек экрана изменялись по горизонтали от 0 до 6.28, а по вертикали от —1 до 1 (имеются в виду вещест¬ венные значения), то для построения синусоиды до¬ статочно было бы в цикле выполнить оператор PSET (х, SIN(x)) для всех точек графика. Оператор WINDOW предоставляет возможность за¬ дать другую систему координат для точек экрана в пре¬ делах «окна», а если «окно» не определено, то в пре¬ делах всего экрана. Формат оператора: WINDOW [[SCREEN] (х 1, г/1) — (х2, f/2)] Операнд (xl, yV) — (х2, у2) задает диапазон изме¬ нения координат для точек «окна» в новой системе координат. Независимо от того, в каком порядке были записаны в операторе значения х и у, они восприни¬ маются таким образом, что их меньшие значения всег¬ да определяют точки окна с наименьшими координа¬ тами. Так, оператор WINDOW (1, 100) — (100, 1) эк¬ вивалентен оператору WINDOW (1, 1) — (100, 100). Координаты всех остальных точек «окна» будут соот¬ ветственно перерассчитаны таким образом, чтобы для всего «окна» была определена правильная прямоуголь¬ ная система координат. Для задания координат точек могут использоваться числа простой точности. Если «окно» не определено с помощью оператора VIEW, то «окном» считается весь экран. В результате выполнения оператора WINDOW все точки текущего «окна» получают новые координаты. Во всех после- Ю Заказ 2634 145
Л°., 3.14, 1 6.28,1 N 3.14,0 0,-1 3.14, -1 6.28, -1 < у Рис 13.4. Нумерация точек экрана дующих графических операторах координаты точек за¬ даются в новой системе координат. Операнд SCREEN определяет направление возра¬ стания координаты Если он задан, то точка с наи¬ меньшими координатами располагается в левом верх¬ нем углу окна (так же как и в абсолютной системе координат экрана). Если операнд SCREEN не задан, то точка с наименьшими координатами располагается в левом нижнем углу окна. Координаты, которые будут иметь точки окна пос¬ ле выполнения оператора WINDOW (0, —1) — (6.28, 1), показаны на рис. 13.4. В результате выполнения приведенных ниже опе¬ раторов будет построена точка с абсолютными коорди¬ натами (320, 100): 10 SCREEN 2 20 WINDOW (0, 0) —(10, 10) 30 PSET (5, 5) При выполнении оператора WINDOW соблюдаются следующие правила: • точки, которые находятся за пределами диапазо¬ на координат, определенных оператором WINDOW, иг¬ норируются и на экране не отображаются; • операторы RUN, SCREEN и WINDOW без опе¬ 146
рандов отменяют систему координат, установленную оператором WINDOW. Оператор WINDOW предоставляет способ управле¬ ния размерами объекта, выводимого на экран. Изменяя диапазон координат, определяемых оператором WIN¬ DOW, можно уменьшить или увеличить размеры объ¬ екта. Если диапазон координат увеличивается, то объ¬ ект уменьшается, если диапазон координат уменьша¬ ется, то объект увеличивается. Пример, Ниже приведен пример программы, ко¬ торая строит график функции y = sin (х) в правой верх¬ ней части экрана. 10 SCREEN 2: KEY OFF 20 VIEW (320, 1) - (638, 99) 'Определение окна 30 WINDOW (-3.14,-1)-(3.14, 1) 'Определение координат 40 FOR X—3.14 ТО 3.14 STEP 0.05 50 PSET (X, SIN (X)) '* Построение графика 60 NEXTX Функции графической обработки При написании программ иногда требуется полу¬ чить информацию о цвете точки и ее координатах. В Бейсике для этой цели могут использоваться встро¬ енные функции РМАР и POINT. Функция РМАР выполняет преобразование коорди¬ нат точки из абсолютной системы координат точек эк¬ рана в систему координат, определенную оператором WINDOW, и наоборот. Обращение к функции имеет формат: Р/МАР (координата, режим) Заданная координата преобразуется в соответствии с указанным режимом. Режим определяет способ пре¬ образования и может принимать следующие значения: 0 — преобразование координаты х из системы ко¬ ординат, определенной оператором WINDOW, в абсо¬ лютную систему координат на экране; 1 — преобразование координаты у из системы коор¬ динат, определенной оператором WINDOW, в абсолют¬ ную систему координат на экране; 2 — преобразование координаты х из абсолютной системы координат на экране в систему координат, оп¬ ределенную оператором WINDOW; 10* 147
3 — преобразование координаты у из абсолютной системы координат на экране в систему координат, оп¬ ределенную оператором WINDOW. Функция POINT позволяет определить цвет точки или координаты последней выведенной на экран точки. Обращение к функции имеет формат: POINT (х, у) POINT (п) х и у задают координаты точки экрана. В этом слу¬ чае функция возвращает номер цвета указанной точки. п может принимать значения 0, 1, 2 и 3. В этой форме функция POINT возвращает одну из координат последней выведенной точки. Вид координаты определяется значением п по сле¬ дующим правилам: О — абсолютная координата х; 1 — абсолютная координата у; 2 — координата х в системе координат, определен¬ ной оператором WINDOW; 3 — координата у в системе координат, определен¬ ной оператором WINDOW. ГЛАВА 14. ВОСПРОИЗВЕДЕНИЕ ЗВУКА Для генерации звука в ПЭВМ используется встро¬ енный динамик, который позволяет создавать различ¬ ные звуковые эффекты от простых звуковых сигналов до фрагментов музыкальных произведений. Управле¬ ние динамиком осуществляется с помощью программи¬ руемого таймера, посредством которого задаются ча¬ стота и длительность звучания. Диапазон представи¬ мых частот: 16—32767 Гц, хотя реально человеческое ухо «воспринимает» частоты в пределах от 20 до 20000 Гц. Минимальной единицей измерений длитель¬ ности звучания является так называемый внутренний квант времени. Величина внутреннего кванта обуслов¬ лена аппаратурой и приблизительно равна 0,55 с (в се¬ кунде 18,2 внутреннего кванта). Динамик не имеет средств для управления громкостью звучания и вос¬ производит все звуки с одинаковой громкостью. Для работы с динамиком в Бейсике служат операторы ВЕЕР, SOUND, PLAY и функция PLAY. 148
Управление динамиком Оператор SOUND (sound — звук). Этот оператор является основным средством для работы с динамиком и имеет формат: SOUND частота, длительность Частота задается в герцах и может принимать зна¬ чения в диапазоне от 37 до 32767. Длительность зада¬ ется во внутренних квантах времени и может прини¬ мать значения в диапазоне от 0 до 65535 (последнее число примерно соответствует одному часу). Пример. SOUND 440.0,18.2:1.5 В этом примере оператор SOUND подает звуковой сигнал с частотой 440.0 Гц, который должен звучать в течение полутора секунд. Частота 440.0 Гц соответст¬ вует ноте «ля» первой октавы, которая обычно исполь¬ зуется для настройки музыкальных инструментов («на¬ строечное «ля»). В табл. 14.1 приведены частоты зву¬ чания нот малой, первой, второй и третьей октав зву¬ коряда. Знак альтерации * (диез) указывает повы¬ шение звука на полтона. Таблица 14.1 Частота звучания нот Нота Частота звучания Малая октава Первая октава Вторая октава Третья октава ДО 130.810 261.630 523.250 1046.500 ДО# 138.590 277.180 554.370 1108.730 ре 146.830 293.660 587.330 1174.700 ре# 155.560 311.130 622.260 1244.510 ми 164.810 329.630 659.260 1318.500 фа 174.610 349.230 698.460 1396.900 фа# 185.000 369.990 739.990 1479.980 соль 196.000 392.000 783.990 1568.000 соль# 207.650 415.300 830.610 1661.220 ля 220.000 440.000 880.000 1760.000 ля# 233.080 466.160 932.330 1864.660 СИ 246.940 493.880 987.770 1975.000 Для октав, не вошедших в табл. 14.1, частоты зву¬ чания нот могут быть приближенно вычислены по сле¬ дующему правилу: при переходе к следующей более высокой октаве частоты соответствующих нот удваива¬ 149
ются, а при переходе к предшествующей октаве де¬ лятся на два. Частота 32767 Гц задает паузу, продолжительность которой определяется операндом длительность. На практике любая частота свыше 20000 Гц будет вызы¬ вать такой же эффект. Во время подачи звукового сигнала продолжается выполнение следующих за SOUND операторов про¬ граммы, пока не будет встречен новый оператор SO¬ UND. Если в новом операторе указана нулевая дли¬ тельность, выполнение программы приостанавливается до завершения пр дыдущего оператора SOUND. При¬ остановки выполнения программы можно избежать, если использовать «буферизацию звуков», которая ус¬ танавливается с помощью команды МВ оператора PLAY, описанного дальше в этой главе. Если в новом операторе SOUND указана нулевая длительность, вы¬ полнение предыдущего оператора SOUND прекраща¬ ется. Пример. В приведенной здесь программе испол¬ няются восходящая и нисходящая гаммы для первой 100 REM Исполнение гамм 110 CLS: COLOR 7,0: LCH$ = CHR$ (164) 120 FOR I = 4 TO 12 STEP 2: LOCATE I, 1 '♦Построение 130 FOR J = 1 TO 80: PRINT LCH$; : NEXT J '♦нотного 140 NEXT I '♦стана. 150 COLOR 0,7: LOCATE 10,1: PRINT "G": COLOR 7,0 160 DIM N (8) '♦Формирование масси- 170 FOR I = 0TO 7: READ N (!) : NEXT I '*ва с частотами нот. 180 DATA 261.61, 293.66, 329.63, 349.63 190 DATA 392.00, 440.00, 493.88, 523.25 200 К = 18.2: P = 9: Q = 14 210 FOR J = 0 TO 7 '* 220 ' SOUND 40,0 230 SOUND N (J), К '♦Восходящая 240 LOCATE Q, P: PRINT CHR$ (2) '* гамма. 250 P = P + 4: Q = Q - 1 '* 260 NEXT J 270 SOUND 32767, K:Q = Q + 1 280 FOR J = 7 TOO STEP-1 '* 290 ' SOUND 40,0 ' * 300 SOUND N (J), К '♦Нисходящая 310 LOCATE Q, P: PRINT CHR$ (2) '* гамма. 320 P = P + 4:Q = Q + 1 '* 330 NEXT J октавы звукоряда. Одновременно с воспроизведением очередной ноты она записывается (в скрипичном клю¬ че) на нотном стане, нарисованном на экране дисплея. Каждое выполнение оператора SOUND будет вызы¬ вать приостановку выполнения программы, поскольку 150
указанная длительность звучания ноты (1 с) превос¬ ходит время, необходимое для выполнения остальной части цикла. Чтобы исключить приостановки и син¬ хронизировать звук с изображением, можно восполь¬ зоваться оператором SOUND с нулевой длительностью. Такие операторы вставлены в программу как коммен¬ тарии (строки 220 и 290). Оператор SOUND удобен для воспроизведения хо¬ рошо алгоритмизируемых последовательностей звуков и может использоваться для создания различных зву¬ ковых эффектов. Примеры такого использования опе¬ ратора SOUND показаны в следующей программе: 100 ' Глиссандо (скольжение) вверх и вниз — 110 FOR I = 440 ТО 1000 STEP 5 120 SOUND I, .5 130 NEXT 140 FOR I = 1000 TO 440 STEP -5 150 SOUND I, .5 160 NEXT 170 ' - — : - — Сирена — 180 FORI = 1 TO 3 190 FOR J 1 TO 3 200 SOUND 587,9 210 SOUND 880,9 220 NEXT J 230 SOUND 32767,18.2 240 NEXT I 250 ' Пауза 260 SOUND 32767,5 Оператор BEEP (beep — сигнал). Этот оператор можно рассматривать как частный случай оператора SOUND. Он не имеет параметров и вызывает подачу звукового сигнала частотой 800 Гц в течение четверти секунды. П р и м е р. 50 INPUT "Укажите день недели (1—7): ", N 60 IF N<1 OR N>7 THEN ВЕЕР: GOTO 50 Музыка. Оператор SOUND Хотя оператор SOUND не очень удобен для испол¬ нения музыкальных произведений, в некоторых случаях его использование оказывается более эффективным, чем использование оператора PLAY. Такая ситуация мо¬ жет возникнуть, когда параллельно с воспроизведени¬ ем мелодии необходимо выполнять какие-либо другие действия, например, отображать на экране звучащую ноту, как это делалось нами при исполнении гамм. Для 151
упрощения процесса программирования обычно форми¬ руется массив, содержащий частоты всех нот звукоря¬ да (включая полутона), а затем для воспроизведения нужной ноты по ее порядковому номеру выбирается соответствующий элемент массива. Пример. Приводимая здесь программа воспроиз¬ водит мелодию русской народной песни «Степь да степь кругом». Программа носит достаточно ' общий харак¬ тер. Для исполнения другой мелодии необходимо из¬ менить только операторы DATA. При этом каждая нота задается парой чисел, первое из которых указывает номер ноты (индекс элемента массива), а второе — длительность ззучания этой ноты. REM Воспроизведение мелодий с пумощью оператора SOUND REM (с изображением нот на нотном стане) CLS: COLOR 7,0: LCH$ = CHR$ (164) : N = 1 132 FOR I =N+3 ТО N+11 STEP 2 '* Построение 140 LOCATE I, 1: FOR J = 1 ТО 80: PRINT LCH$; : NEXT J ’ '» нотного 150 NEXT I - '* стана. 160 COLOR 0,7: LOCATE 10,1: PRINT "G": COLOR 7,0 170 DIM N (48) '* Формирование 180 FOR I =0 TO 11; READ N (I): NEXT I '« массива с 190 FOR I =0 TO 2: FOR J = OTO 11 '* частотами 200 N (J+ (1 + 1)*12) = N (J+l»12)*2 '» нот 210 NEXT J: NEXT I '*4-х октав. 220 N(0) =32767 230 DATA 130.81, 138.59, 146.83, 155.56, 164.81, 174.61 240 DATA 185.00, 196.00, 207.65, 220.00, 233.08, 246.94 250 DIM К (48) '* Формирование 260 K(12) = 1: K(13)=-1: К (14)= 2: К(15)=-2: К(16)=3 '* массива с 270 К (17)= 4: К (18)=-4: K(19)« 5: К (20)=—5; К (21) =6 '* координатами 280 К (22)= -6: К (23) =7: К (24)= 8; К (25)= -8: К (26) =9 '* нот 1 -й 290 К (27)= -9: К (28) =10: К (29)= 11: К (30) =-11: К (31) =12 '« и 2-й октав на 300 К (32) =-12: К (33) =13: К (34) =-13 : К (35)= 14 '* нотном стане. 310 Р=3 320 READ J, L ‘ Чтение ноты, IF J=-1 T-.EN LOCATE 23,1; END IF J>35 OR J<12 THEN 430 Q - К (J): ALT$=" SUF$=" RST$=" " iF (Q MOD 2) <>0 THEN ALT$=LCH$: SUF$=LCH$: RST$=LCH$ IF Q<0 THEN ALT$="*"; 0.=-O: Q=—(Q—15) IF Q=2 OR Q--T-: THEN RST$=" ” IF P>77 THEN r’=1 P=P+2 LOCATE Q, P: PRINT ALTi CHR$ (2) SUF$; SOUND N (J), L SOUND N (0), 1 IF J >35 OR J <12 GOTO 320 LOCATE Q, P: PRINT RSf$ RST$ RST$; GOTO 320 330 340 350 360 370 380 390 400 410 420 430 440 450 460 470 ' Конец мелодии? '* Если нота '« из 1 -й или '« 2-й октав, '♦ подготовить '» изображение. '» Если конец нотного '* стана, начать с начала ' Нарисовать ' Воспроизвести ' Пауза ' » Степень '* изображение 480 DATA 12, 8, 12, 4, 14, 8, 12, 4, 21, 32, 21, 8. 21, 4, 22, 8, 21, 4, 14, 28, 0, 4 490 DATA 1< 8, 16, 4, 19, 4, 17, 4, 14, 4, 12, 32, 12, 4,16, 4, 19, 4, 22, 8, 16, 4, 17, 28, 0, 4 500 «DATA 14, 8, 16, 4, 19, 4, 17, 4, 14, 4, 12, 32, 12, 4, 16, 4, 19, 4, 22, 8, 16, 4, 17, 28, 0, 4 510 DATA —1,-1 Выбирая ту или иную длительность ноты, можно- варьировать темп исполнения музыкального произве¬ дения. Временные характеристики общепринятых в му¬ зыке темпов исполнения приведены в табл. 14.2. Дли¬ тельность одного такта вычисляется делением числа 1092 (количество внутренних квантов времени в ми¬ нуте) на количество тактов в минуту. 152
Таблица 14.2 Временные характеристики темпов исполнения Темп Количество тактов в минуту Количество внутренних квантов времени в такте LARGO (очень медлен¬ 40—66 27.30—16.55 но) ADAGIO (медленно) 66—76 16.55—14.37 ANDANTE (умеренно) 76—108 14.37—10.11 MODERATO (умеренно) 108—120 10.11—9.10 ' ALLEGRO (быстро) 120—168 9.10—6.50 PRESTO (стремительно) 168—208 6.50—5.25 Музыка. Оператор PLAY Оператор PLAY (play — играть) специально пред¬ назначен для исполнения музыкальных произведений. В отличие от оператора SOUND он позволяет при про¬ граммировании мелодий пользоваться музыкальной тер¬ минологией, понятной любому знакомому с музыкаль¬ ной грамотой человеку. Оператор PLAY позволяет записывать и воспроиз¬ водить различные мелодии и предполагает использова¬ ние для этой цели специального языка описания мело¬ дий. Оператор имеет формат: PLAY мелодия Мелодия задается в виде строкового выражения, значение которого указывает последовательность команд языка описания мелодий (музыкальных команд). Ниже приводится полный перечень музыкальных команд. С, D, Е, F, G, А, В Воспроизвести соответственно ноты: до, ре, ми, фа, соль, ля-, си текущей октавы (мнемоника команд соответствует бук¬ венной нотации музыкальных звуков). Каждая из команд мо¬ жет сопровождаться знаками #, + или —, которые задают альтерацию. Знаки # и + означают диез, а знак "—" бе¬ моль. Диез допустим с нотами до, ре, фа, соль и ля, а бе¬ моль — с нотами си, ля, соль, ми и ре. О номер-октавы, Установить октаву. Номер-октавы может принимать значе¬ ния от 0 до 6, что соответствует следующим октавам звуко¬ ряда (снизу вверх): большая, малая, первая, вторая, третья, 153
четвертая и пятая. По умолчанию устанавливается октава с номером 4 (третья октава). > Перейти на октаву выше (не действует для четвертой окта¬ вы). < Перейти на октаву ниже (не действует для контроктавы). N номер-ноты Воспроизвести ноту с указанным номером. Номер-ноты мо¬ жет изменяться от 1 до 84 и соответствует порядковому но¬ меру звука в последовательности, полученной сквозной ну¬ мерацией звуков в семи октавах с интервалом в полутон (12 полутонов в каждой октаве). Нулевой номер обозначает паузу. L длительность Установить длительность звучания последующих нот. Дли¬ тельность может принимать значения от 1 до 64 и опреде¬ ляет длительность относительно длительности звучания це¬ лой ноты. Таким образом, длительность целой ноты задается значением 1, половинной — 2, четвертной — 4 и т. д. Дли¬ тельность звучания отдельной ноты можно задать и без ис¬ пользования команды L, указывая ее непосредственно за со¬ ответствующей нотой. Например, запись С16 эквивалентна записи L16C. Р длительность Выдержать паузу указанной длительности. Длительность за¬ дается аналогично длительности звучания нот. • (точка) Удлинить предшествующую ноту или паузу в полтора раза. Удлинение может указываться более чем одной точкой, что соответствующим образом увеличивает длительность зву¬ чания. Т темп Установить темп исполнения. Темп задает количество чет¬ вертных нот, исполняемых в минуту, и может принимать значение от 32 до 255. В табл. 14.2 приводился перечень общеизвестных обозначений темпа с указанием соответст¬ вующего каждому из них количества тактов в минуту. MF Музыка переднего плана. Мелодия, воспроизводимая с по¬ мощью операторов SOUND и PLAY, будет исполняться на переднем плане. Это значит, что выполнение программы приостанавливается до тех пор, пока не закончится мело¬ дия, заданная оператором PLAY (или не отзвучит опера¬ тор SOUND). Прекратить звучание можно с помощью ком¬ бинации клавиш УПР—СТОП. Такое исполнение устанавли¬ вается по умолчанию. МВ Фоновая музыка (см. раздел «Фоновая музыка» дальше в этой главе). MN Обычное исполнение (так называемое нон легато). Длитель¬ ность звучания каждой ноты равна 7/8 длительности, за¬ 154
данной в команде L. Такое исполнение устанавливается по умолчанию. ML Исполнение легато. Длительность звучания каждой ноты в точности равна длительности, заданной в команде L. MS Исполнение стаккато. Длительность звучания каждой поты равна 3/4 длительности, заданной в команде L. Хстроковая-переменная; Исполнить фрагмент мелодии, заданный значением указан¬ ной строковой-переменной. Использование этой команды по¬ зволяет хранить некоторую общую часть мелодии в виде, значения строковой переменной и, обращаясь к ней из дру¬ гой строки, исполнять этот фрагмент, например повторно или в разном темпе, или в различных октавах и т. д. Во всех перечисленных выше командах параметр также может, быть задан переменной. В этом случае он представляется в следующей форме: = переменная; Для удобства чтения и отладки программ рекомен¬ дуется в строках, описывающих мелодии, использовать пробелы для разделения команд или логически закон¬ ченных частей мелодии, например тактов. Во время исполнения любые пробелы в строках, описывающих мелодию, игнорируются. Пр им ер. Ниже приводятся фрагменты различных музыкальных произведений, записанные с помощью оператора PLAY. . пЕМ Л. Бетховен "Элизе" — • рн1$ = "оЗ е d* е d# е <b> d с < аЗ р32" РН2$ " " РНЗ$ PH4S РН5$ PLAY PLAY PLAY 100 REM 110 120 130 140 150 160 170 180 190 195 200 = "о2 с е а ЬЗ р32 ед* Ь> сЗ р32" = "о2 с е а ЬЗ р32 е оЗ с о2 b аЗ" «= "о2 b>c d еЗ р32 <д> f е d3 р32 <f > е d сЗ р32 < е> d с < ЬЗ рЗ? = "о2 ее64 > ее61 <ее58> ее55 ее52 >ее20< d#d*52 ее54 d#d*56" "T115L8ML" "Xph1$; Xph2$; о2 е Xph1$; Xph3$; р32" г lm т ”Xph4$; Xph5$; " ir PLAY "Xph1$; Xph2$; o2 e Xph1$; Xph3$; o2 a SOUND 32767,36 1 Пауза межАУ мелодиями. REM ' В. Моцарт "Турецкий марш" д* а > с4 d с <Ь> с е4" d# ’a. b а д* а b а д» а > с4 " , > с < b a д* а е f d с4 < Ь4 а4 > с*4 < а b > с* < b а д* f * g# а b д* о" >с#4 < а b > с* < b а д* f* b д* е а. р16 " >с#4 < а b > с* < b n д* f* д* а b д* е " >с*4 < а b > с* < b а д* f* Ь д* е а4 " ' Пауза между мелодиями, 210 PLAY "T120ML" 220 PLAY "L16 o2 b a 230 PLAY o3 f e 240 PLAY "L8 . o3 a b 250 PLAY o3 a b 260 PLAY o3 a b 270 PLAY o3 a b 280 PLAY o3 a b ’295 SOUND 32767,36 300 REM - - П. I 310 DAY$ = "L8 d c c4. 320 WHY$ = "L4 a b >c< 330 PLAY "ML T110 o3' 340 PLAY Xday$; < 350 PLAY "L8 p4p8 a c 360 PLAY "L8 p8 p8 e 370 PLAY "L8 p8 p4 a 380 pl Ay Xwhy$; 390 PLAY Xwhy$; Маккартни "Yesterday" — р4р8" С Ь8 а8 Ь. а8" е f# g* а Ь >с< Ь4. а а4. р8 " g f е d f4. ё L4 е d с е d<a>c L8 ее. р4р8. Xday$;. . ft g# а b>c< Ь4. а а4. р8 " g f е d f4. е8 L4 е d с е d <а> с с8е8. р4р8. с2е2' g а е1 е2 е2" g b>c<g f е Xday$; " 155
Фоновая музыка Музыка (или звук), воспроизводимые с помощью операторов PLAY и SOUND, могут звучать одновре¬ менно с выполнением остальной части программы, соз¬ давая для нее музыкальный фон. Такое исполнение устанавливается командой МВ оператора PLAY и воз¬ можно благодаря наличию «буфера нот». При фоновом исполнении заданные в операторе PLAY или SOUND ноты предварительно помещаются в буфер и затем по¬ даются на динамик параллельно с выполнением осталь¬ ной части программы. Буфер вмещает не более 32 нот (пауз), и поэтому, если музыка должна звучать не¬ прерывно, его необходимо своевременно пополнять (вы¬ полнять новый оператор PLAY или SOUND). Для того чтобы правильно организовать работу с буфером, мож¬ но: воспользоваться функцией PLAY или оператором ON PLAY. Функция PLAY. Функция позволяет определить сте¬ пень заполненности буфера нот. Возвращаемое ею зна¬ чение равно количеству нот, находящихся в буфере в данный момент. Обращение к функции имеет формат: PLAY (х) х является фиктивным аргументом и может прини¬ мать любое значение. Так как в буфере может находиться не более 32 нот, максимальное значение функции — 32. Если мелодия исполняется на переднем плане, значение функции всегда 0. Пример. 40 '«**. Выполнить PLAY, если необходимо пополнить буфер *** 50 IF PLAY (0) >2 GOTO 70 60 PLAY "MB T120 оЗ 18 c < aa gg f f4 e d e f g c4. p8" 70 ... Оператор ON PLAY. Оператор определяет подпро¬ грамму обработки для буфера нот и задает условие, при котором эта подпрограмма должна выполняться. Оператор имеет формат: ON PLAY (количество-нот) GOSUB номер-строки Оператор ON PLAY специально предназначен для управления фоновой музыкой в процессе выполнения программы. Он обеспечивает передачу управления ука¬ занной подпрограмме (ее начало задается номером- 156
строки), как только в буфере остается нот меньше, чем определено количеством-нот. Оператор ON PLAY только определяет подпрограм¬ му обработки. Для того чтобы активизировать эту под¬ программу, необходимо выполнить оператор PLAY ON. Оператор PLAY ON устанавливает такой режим вы¬ полнения программы, при котором перед выполнени¬ ем каждого оператора проверяется количество находя¬ щихся в буфере нот. Если оно меньше, чем заданное количество-нот, то выполняется оператор GOSUB, ука¬ занный в операторе ON PLAY. Выполнение подпрограммы обработки для буфера нот можно отложить с помощью оператора PLAY STOP. После выполнения оператора PLAY STOP воз¬ никновение ситуации, когда количество нот, находя¬ щихся в буфере, становится меньше заданного значе¬ ния, не вызывает передачи управления в программу обработки. Однако это событие запоминается таким образом, что сразу после выполнения оператора PLAY ON происходит передача управления подпрограмме об¬ работки. Оператор PLAY OFF делает подпрограмму обра¬ ботки для буфера нот неактивной. После выполнения оператора PLAY OFF, даже если количество нот, нахо¬ дящихся в буфере, становится меньше заданного зна¬ чения, это событие не запоминается. Передача управления в подпрограмму обработки для буфера нот автоматически вызывает выполнение оператора PLAY STOP и предотвращает таким обра¬ зом рекурсивное обращение к подпрограмме обработ¬ ки. Завершающий подпрограмму обработки оператор RETURN автоматически вызывает выполнение опера¬ тора PLAY ON, если только в подпрограмме не был выполнен оператор PLAY OFF. Во время выполнения подпрограммы обработки ошибок подпрограмма обра¬ ботки буфера нот не активизируется. Пример. В этом примере показано, как можно обеспечить постоянное звучание ноты в течение всего времени выполнения программы. 10 С$="СССССССССС" 20 PLAY f'L1MBXC$; " 'Воспроизвести 10 раз ноту до 30 ON PLAY (3) GOSUB 1000 40 PLAY ON 1000 PLAY "MBXC$" 'Воспроизвести 10 раз ноту до 1010 RETURN 157
ГЛАВА 15. РАЗРАБОТКА ПРОГРАММ Основное назначение любой системы программиро¬ вания— это разработка программ. Наличие в СП Бей¬ сик интерпретатора со встроенным редактором текстов делает ее очень мощным инструментом разработки. С помощью интерпретатора могут быть выполнены ввод и корректировка программы, проверка ее синтаксиче¬ ской правильности, тестирование и отладка. Интерпре¬ татор во многих случаях может использоваться и для непосредственного исполнения программ. Встроенный текстовый редактор служит основным средством разработки программ. Он достаточно полно описан в гл. 3 и здесь рассматриваться не будет. Кроме встроенного редактора, интерпретатор также включает набор команд, предназначенных для выполнения раз¬ личных действий над программами в процессе разра¬ ботки. Некоторые из этих команд могут использоваться в текстах программ наряду с операторами и функция¬ ми, однако основное их назначение—разработка прог¬ рамм, а основной режИхМ использования — режим пря¬ мой интерпретации. В приведенном ниже описании команды разбиты на следующие группы: • редактирование и распечатка программ; • запись программ на диск; • загрузка и выполнение программ; • отладка программ; • работа с дисковыми файлами. Такое разбиение в определенной степени условно и сделано в целях удобства изложения. В этой главе описаны также операторы COMMON и CHAIN, которые предназначены для построения прог¬ рамм с оверлейной структурой. Они рассматриваются здесь, поскольку выбор такой структуры программы непосредственно влияет на процесс ее разработки. Редактирование и распечатка программ Команды, относящиеся к этой группе (LIST, DELETE, AUTO, RENUM, EDIT и NEW), дополняют возможнос¬ ти встроенного редактора текстов. Команда LIST (list — вывести список). Команда предназначена для вывода строк программы на задан¬ ное устройство. Здесь рассматривается ее использова¬ 158
ние только для вывода на экран дисплея. В такой фор¬ ме команда часто применяется в процессе редактирова¬ ния программы, когда необходимо отобразить на экран ее фрагмент для последующей обработки средствами редактора. Команда имеет формат: LIST [номер-первой-строки} [—[номер-последней-строки}} По этой команде все строки размещенной в памяти программы, номера которых находятся в указанном диапазоне, будут выведены на экран дисплея. Если номер-первой-строки не указан, начальной границей диапазона будет считаться первая строка программы. Если не указан номер-последней-строки, то конечной границей диапазона будет считаться последняя строка программы. П р и м е р. БЕЙСИК: list 50 REM Использование команды LIST 100 PRINT" Единицы измерения физических величин" 150 PRINT" 200 PRINT" Величина ! Единица измерения 250 PRINT" • 300 PRINT "Сила 350 PRINT " Мощность 400 PRINT " Количество теплоты 450 PRINT " Сила тока 500 PRINT " Электрическое напряжение * 550 PRINT " Электрическое сопротивление 600 PRINT" БЕЙСИК: list 400-500 400 PRINT " Количество теплоты I 450 PRINT "Сила тока ! 500 PRINT ” Электрическое напряжение ! БЕЙСИК: 1 НЬЮТОН (1 Н) " 1 ватт (1 Вт) 1 джоуль (1 Дж) !Г 1 ампер (1 А) 1 вольт (1 В) !Г 1 ом (1 Ом) if 1 джоуль (1 Дж) 1 амрер (1 А) 1 вольт (1 В) Команда DELETE (delete — удалить). Команда пред¬ назначена для удаления одной или нескольких строк программы. DELETE [номер-первой-строки} [—[номер-последней-строки} ] По команде DELETE все строки, находящиеся в указанном диапазоне, удаляются из программы. Если номер-первой-строки не указан, то первой удаленной строкой считается начальная строка программы. Если не указан номер-последней-строки, то удаляется только одна строка. Пример. Здесь предполагается, что в основной па¬ мяти находится программа, которая рассматривалась в предыдущем примере. 159
delete 50—450 БЕЙСИК: list 500 PRINT "Электрическое напряжение ! 1 вольт (1 В)" 550 PRINT "Электрическое сопротивление J 1 ом (1Ом)" 600 PRINT" БЕЙСИК: Команда AUTO (AUTOmatic — автоматический), Команда устанавливает, режим автоматической генера¬ ции номеров строк и используется обычно при вводе программы. AUTO [начальный-номер] [приращение]] Первой строке, введенной после установки этого режима, будет присвоен начальный-номер, а номер каждой последующей строки получается увеличением номера предыдущей на приращение. Если в режиме автоматической генерации создается уже существующий в программе номер, то после номера строки интерпре¬ татор выводит звездочку (*), которая предупреждает, что вводимая строка заменит существующую. Этого можно избежать, если после появления предупреждения нажать клавишу ввода. В этом случае существующая строка будет сохранена в программе, а интерпретатор сгенерирует следующий номер в соответствии с пара¬ метрами команды AUTO. В режиме автоматической генерации любые коррек¬ тировки можно проводить только в текущей логической строке. Если необходимо скорректировать другую стро¬ ку на экране, режим автоматической генерации должен быть отменен. Для отмены режима автоматической генерации но¬ меров строк используется комбинация клавиш УПР — СТОП. Команда RENUM (RENUMber — перенумеровать). Команда используется для перенумерации строк прог¬ раммы и имеет формат: RENUM [новый-номер-строки] [,[старый-номер-строки] [, приращение] ] Старый-номер-строки определяет начало перенуме¬ ровываемого участка программы. Первой строке участ¬ ка будет присвоен новый-номер-строки, а номер каждой последующей строки будет получаться увеличением номера предыдущей на приращение. Если старый-но¬ мер-строки не указан, перенумерация начинается с на- 160
чала программы. Для остальных параметров команды, если они опущены, по умолчанию предполагается зна¬ чение 10. Вместе с перенумерацией программы соответ¬ ствующим образом изменяются и операторы GOTO, GOSUB, IF, ON, RESTORE, RESUME и ERL, содержа- щие номера строк в качестве операндов При м е р. list 110 111 INDEX# = " " 112 PRINT "Введите почтовый индекс: (6 цифр) 113 PRINT STRINGS (16, CHR$ (29)); ' курсор <— на 18 позиций 115 FOR N•= 1 TO 6 ' цикл на 6 цифр 122 D$ = INKEY$: IF D$ = " " GOTO 122 ' ввод с клавиатуры 126 IF (D$>="0" AND D$<="9") GOTO 130 ' если не цифра, 127 BEEP: GOTO 122 выдать сигнал 130 PRINT D$; ’ вывести цифру 140 INDEX$ = INDEX$ + D$ ' формирование результата 155 NEXT 165 PRINT SPC (10) БЕЙСИК: renum 100, 110, 50 БЕЙСИК; list 100 REM Использование команды RENUM - 150 INDEX$ = " " 200 PRINT "Введите почтовый индекс: (6 цифр)"; 250 PRINT STRINGS (16, CHR$ (29)); ' курсор <— на 16 позиций ' цикл на 6 цифр 300 FOR N = 1 ТО 6 350 D$ = INKEY$: IF D$ = " " GOTO 350 ' ввод с клавиатуры 400 IF (DS>="0" AND DS<="9") GOTO 500 ' если не цифра, 450 BEEP: GOTO 350 ' выдать сигнал 500 PRINT D$; ' ввести цифру 550 INDEX$ = INDEX$ + D$ 'формирование результата 600 NEXT 650 PRINT SPC (10) БЕЙСИК: Команда EDIT (edit — редактировать). Команда предназначена для вывода нужной строки программы на экран с целью последующего редактирования. Команда имеет формат: EDIT номер-строки В результате выполнения команды указанная строка выводится на экран, и курсор помещается в первую позицию выведенной строки. В дальнейшем строка мо¬ жет быть изменена и включена в программу. Пример. БЕЙСИК: edit 450 450 ВЕЕР: GOTO 350 Команда NEW (new — новый). Команда, как пра¬ вило, выполняется перед созданием новой программы. Она не имеет параметров и вызывает удаление разме¬ щенной в основной памяти программы, а также закры¬ тие всех связанных с ней файлов. 11 Згказ 2634 161
Команда LLI$T. Команда позволяет вывести на пе¬ чатающее устройство текст находящейся в основной памяти программы. Она выполняется аналогично коман¬ де LIST для вывода на экран и имеет такой же формат: LLIST [номер-первой-строки] [—[номер-последней-строки]] Единственным отличием команды LLIST от команды LIST является то, что вывод всегда направляется на печатающее устройство. Запись программ на диск Нет необходимости вводить текст программы с кла¬ виатуры каждый раз, когда ее необходимо выполнить. Вместо этого можно записать созданную программу на диск и считывать ее перед выполнением в основную память. Для записи программ или их фрагментов на диск предназначены команды SAVE (save — сохранить) и LIST. Команда SAVE. Команда позволяет записать на диск программу, находящуюся в текущий момент в ос¬ новной памяти. Команда имеет формат: SAVE спецификация-файла [.формат] Программа записывается на диск в виде файла с указанным именем. Если тип файла не указан, предпо¬ лагается тип BAS. Если на диске уже существует файл с таким именем, он будет удален. Параметр формат определяет способ представления программы в файле. Он может принимать значения А, Р или может быть просто опущен. В последнем случае программа будет записана во внутреннем формате интерпретатора, т. е. в том же виде, в котором интерпре¬ татор хранит ее в основной памяти. Это самый «быст¬ рый» (по скорости записи на диск и считывания с диска) способ представления. Формат А (символьный формат) определяет обычное текстовое представление программы, полностью иден¬ тичное, например ее представлению на экране дисплея. Программы в символьном формате занимают больший; чем в других форматах, объем дисковой памяти. Формат Р (кодированный формат) обеспечивает за¬ щиту программ. Программа, записанная на диск в ко¬ дированном формате, становится недоступной для визу¬ ального отображения. Она может быть выполнена, однако любые попытки воспользоваться командами 162
LIST, LLIST или EDIT будут вызывать сообщение об ошибке. Не существует способа снятия защиты для таких программ. Команда LIST. Эта команда уже рассматривалась нами как средство для вывода строк программы на экран дисплея. Она позволяет осуществлять подобный вывод и на другие устройства, в частности, на диск. В этом случае команда имеет формат: LIST [номер-первой-строки] [—[номер-пос лед ней-ст роки]] ,спецификация-файла По этой команде все строки размещенной в памяти программы, номера которых находятся в указанном диапазоне, будут выведены на заданное устройство. Если вывод осуществляется на диск, то строки програм¬ мы будут иметь символьный формат. В остальном пра¬ вила использования команды те же, что и при выводе на экран (см. гл. 15 «Редактирование и распечатка программ»). Если в команде LIST не указаны оба номера строк, то при записи на диск она действует аналогично команде SAVE с параметром А. 100 REM Использование команд SAVE и LIST 150 READ PARM1$, PARM2$ 200 PRINT" Гаврилиада " 250 PRINT" Служил Гаврила PARM1$; " 300 PRINT" Гаврила "; PARM2$; 350 END 400 DATA " " 450 DATA " " БЕЙСИК: save "Гавр", P БЕЙСИК: 400 DATA "почтальоном" 500 DATA "письма разносил" list 400-500, "ВАРИАНТ.-!" БЕЙСИК: 400 DATA "за прилавком" 500 DATA "флейтой торговал" list 400-500, "ВАРИАНТ.2" БЕЙСИК: 400 DATA "хлебопеком" 500 DATA "булку испекал" list 400-500, "ВАРИАНТ.З" БЕЙСИК: Пример1. Команды SAVE и LIST используются для записи программы и отдельных ее строк в дисковые файлы. Программа записывается в кодированном фор¬ 1 В примере используется фрагмент из романа И. Ильфа и Е. Петрова «Двенадцать стульев». И* 163
мате. Записанные отдельными файлами варианты строк 400 и 500 будут использоваться в последующих приме¬ рах. Загрузка и выполнение программ Мы уже говорили, что, для того чтобы интерпретатор мог выполнить некоторую программу, она должна на¬ ходиться в основной памяти. Если программа была предварительно записана на диск, ее можно прочитать в память с помощью команд LOAD, RUN или MERGE, а также с помощью оператора CHAIN. Команды LOAD и RUN осуществляют также выполнение программ. Команда LOAD (load — загрузить). Команда пред¬ назначена, главным образом, для загрузки программ в память. Команда имеет формат: LOAD спецификация-файла [,R] По команде LOAD программа, находящаяся в ука¬ занном файле, считывается в основную память и заме¬ щает размещенную там программу. Дальнейшие дейст¬ вия зависят от того, был ли в команде указан пара¬ метр R. Если этот параметр опущен, выполняется за¬ крытие всех открытых предыдущей программой файлов, и интерпретатор переходит на уровень команд. Если же параметр R задан, загруженная программа начинает выполняться. При этом файлы, открытые предыдущей программой, не закрываются и остаются доступными загруженной программе. Команда RUN (run — прогон). Команда обеспечи¬ вает выполнение программы. Она имеет два формата: RUN [номе р-ст роки] RUN спецификация-файла [,R] Первый формат служит для выполнения программы, уже находящейся в основной памяти. Если в команде задан номер-строки, то выполнение будет начинаться с указанной строки программы. В противном случае программа будет выполняться, начиная с первой строки. Во втором формате команда RUN действует во мно¬ гом аналогично команде LOAD: программа из указан¬ ного файла загружается в память, замещая находящу¬ юся там программу, а затем начинает выполняться. Если при этом задан режим R, то файлы данных, от¬ 164
крытые предыдущей программой, не закрываются и остаются доступными выполняемой программе. Пример. Здесь команды LOAD и RUN использу¬ ются для загрузки и выполнения программы TABP.BAS, которая рассматривалась на с. 163. Сообщение об ошибке при вводе команды LIST объясняется тем, что программа была записана на диск в кодированном формате. load 'ТАВР. BAS" БЕЙСИК: list НЕДОПУСТИМОЕ ЗНАЧЕНИЕ ПАРАМЕТРА БЕЙСИК: run Гаврилиада Служил Гаврила . Гаврила ........ БЕЙСИК: Команда MERGE (merge — объединить). Команда позволяет включить в программу, находящуюся в ос¬ новной памяти, строки, записанные в дисковый файл. Команда имеет формат: MERGE спецификация'файла По команде MERGE строки программы из указанного файла включаются в соответствии с их номерами в программу, размещенную в памяти. Если строки в фай¬ ле и в памяти имеют одинаковые номера, то строка из файла замещает соответствующую строку в памяти. Полученная в результате объединения строк программа остается в основной памяти. Указанный в команде файл должен быть представ¬ лен в символьном формате. Такой формат обеспечива¬ ется командой LIST и командой SAVE с параметром А. Пример. В этом примере команда MERGE исполь¬ зуется для включения в программу TABP.BAS строк, записанных в файл ВАРИАНТ.1 командой LIST. load "ГАВР. BAS" БЕЙСИК: merge "ВАРИАНТ. 1" БЕЙСИК: run Гаврилиада Служил Гаврила почтальоном, Гаерила письма разносил БЕЙСИК: 165
Оператор CHAIN (chain — сцепить). Этот оператор позволяет загрузить в основную память программу и передать ей управление. CHAIN [MERGE] спецификация-файла [, [номер-строки] [, [ALL] [, DELETE диапазон-строк]]] В результате выполнения оператора CHAIN прог¬ рамма, находящаяся в указанном файле, загружается в основную память и получает управление. Способ за¬ грузки определяется операндом MERGE. Если операнд MERGE не задан, то перед загрузкой Бейсик удаляет программу, находящуюся в основной памяти (программу, выполнившую оператор CHAIN). В этом случае после выполнения оператора CHAIN в памяти будет находиться только загруженная програм¬ ма. Если операнд MERGE задан, то загрузка выполня¬ ется так же, как по команде MERGE. В этом случае можно загружать только те программы, которые запи¬ саны в символьном формате. Операнд DELETE задает номера строк, которые должны быть удалены из программы, находящейся в памяти, перед выполнением загрузки. Он действует аналогично команде DELETE. Операнд DELETE ис¬ пользуется, как правило, вместе с MERGE. Операнд ALL указывает, что все переменные теку¬ щей программы должны стать доступными загруженной программе. Если операнд ALL не задан, для передачи переменных можно воспользоваться оператором COMAAON, который будет рассмотрен ниже. Выполнение программы начинается со строки, задан¬ ной номером-строки. Если номер строки не указан, вы¬ полнение начинается с первой строки программы. При написании программ необходимо учитывать сле¬ дующие особенности выполнения оператора CHAIN: ■ все файлы остаются открытыми; • если операнд MERGE указан, сохраняется дейст¬ вие оператора OPTION BASE; • если операнд MERGE опущен, аннулируется дей¬ ствие операторов DEFINT, DEFSNG, DEFDBL, DEFSTR и DEF FN; • в программе, вызванной оператором CHAIN, нель¬ зя продолжить обработку последовательных файлов с той точки, в которой она была прекращена. Используя оператор CHAIN, можно строить оверлей¬ ные структуры программ. Это может оказаться полез¬ 166
ным в случае, когда программа настолько велика, что целиком не помещается в память. Пример. В этом примере оператор CHAIN исполь¬ зуется для включения в программу различных вариан¬ тов данных (операторы DATA), которые перекрывают друг друга в момент загрузки. В примере используется несколько модифицированная программа TABP.BAS и файлы ВАРИАНТ. 1, ВАРИАНТ.2 и ВАРИАНТ.З. list 10 REM Использование оператора CHAIN — 20 PRINT " ***** Генератор поэм ТАВР' ****♦" 30 PRINT " Гаврилиада" 40 1=1- 50 I F I >3THEN END 60 S$ = "ВАРИАНТ."+ MID$ ("123", I, 1) 70 CHAIN MERGE S$, 80, ALL 80 RESTORE 90: READ PARM1$, PARM2& 90 PRINT"" 100 PRINT " Служил Гаврила PARM1$>; 110 PRINT" Гаврила PARM2$; ". " 120 1=1+1: GOTO 50 130 END 400 DATA " " 500 DATA " " БЕЙСИК: run ***** Генератор поэм ТАВР' ***** Гаврилиада Служил Гаврила почтальоном, Гаврила письма разносил. Служил Гаврила за прилавком, Гаврила флейтой торговал. Служил Гаврила хлебопеком, Гаврила булку испекал. БЕЙСИК: Оператор COMMON (common —общий). Этот опера¬ тор позволяет передавать данные программе, загружае¬ мой с помощью оператора CHAIN. COMMON переменная [, переменная}... Оператор может быть указан в любом месте прог¬ раммы. В программе может использоваться любое число операторов COMMON, но одна и та же переменная не должна появляться более чем в одном операторе. Если передается массив, его размерность можно не определять, однако имя массива должно сопровождать¬ ся парой круглых скобок. Пример. 10 COMMON А(), В, С '♦ массив А и переменные В и С 20 CHAIN "2 : ПРОГ1" '♦ передаются программе nPOfl.BAS 167
Отладка программ Используя интерпретатор Бейсика, программист практически не нуждается в специальных средствах для отладки программ. Большая часть отладочных действий может быть выполнена обычными операторами Бейси¬ ка. Например, для того чтобы проконтролировать пра¬ вильность значений переменных в некоторой точке программы, можно вставить туда соответствующие операторы PRINT для вывода этих значений. Более универсальный способ отладки возникает в связи с возможностью прервать в некоторой точке вы¬ полнение программы и перейти на уровень команд. Для этой цели используется либо оператор STOP, который вставляется в нужное место программы, либо комбина¬ ция клавиш УПР — СТОП, с помощью которой выпол¬ нение может быть прервано в любой момент. В обоих случаях в точке останова на экран выдается сообщение с номером последней выполняемой строки. После этого можно в режиме прямого выполнения осуществлять различные отладочные действия, например, проверять или изменять значения переменных, а затем продолжить выполнение программы. Существуют команды, специально предназначенные для использования в процессе отладки, — CONT, TRON и TROFF. Команда CONT (CONTinue — продолжить). Команда позволяет продолжить выполнение программы, прерван¬ ное оператором STOP или комбинацией клавиш УПР — СТОП. Команда не имеет параметров и позволяет про¬ должить выполнение только с того места, где оно было прервано. Напомним, что выполнение программы можно продолжить только в том случае, если текст программы не подвергался корректировке. Команды TRON и TROFF. Эти команды предназна¬ чены для управления режимом трассировки программы. Трассировка операторов программы является удобным средством ее отладки и представляет собой такой режим выполнения программы, при котором на экран дисплея выводятся номера строк, содержащих выполняемые операторы программы. Режим трассировки включается с помощью команды TRON (TRace ON — трассировку включить) и выключается с помощью команды TROFF (TRace OFF — трассировку выключить). Для того чтобы номера строк можно было отличить от выводных дан- 168
них программы, они при выводе заключаются в квад¬ ратные скобки. Вывод номеров строк выполняется по правилам, установленным для оператора PRINT. Пример. list 80 REM Использование команд TRON и TROFF 90 PRINT " Трассировка цикла" 100 FOR 1 = 1 ТО 2 110М = 1* 10 120 PRINT I; М 130 NEXT: END БЕЙСИК: tron БЕЙСИК: run [80] [90] Трассировка цикла [100][110][120] 1 10 [130] [110] [120] 2 20 [130] БЕЙСИК: troff БЕЙСИК: run Трассировка цикла 1 10 2 20 БЕЙСИК: Работа с дисковыми файлами В процессе разработки программ очень часто прихо¬ дится выполнять различные операции над дисковыми файлами. Хотя операционная система включает доста¬ точно полный набор команд, предназначенных для этих целей, было бы крайне неудобным для выполнения каждой такой операции завершать работу интерпрета¬ тора, а после выполнения нужных команд операционной системы запускать интерпретатор снова и возвращаться к прерванной работе. Именно этим объясняется вклю¬ чение в Бейсик команд, позволяющих выполнять наибо¬ лее важные операции над дисковыми файлами и при этом оставаться в среде интерпретатора. Это команды FILES, KILL и NAME. Все команды, предназначенные для работы с диско¬ выми файлами, требуют указания в качестве параметра спецификации-файла. Напомним, что спецификация-фай- ла задается строковым выражением и в общем случае состоит из трех частей: имени устройства, имени файла и типа файла. В командах FILES и KILL специфика’ 169
ция-файла может определять не только отдельный файл, но и группу файлов. Для этой цели используются знаки «?» и «*». Появление знака «?» в некоторой позиции спецификации-файла означает, что любой символ в этой же позиции имени (или типа) файла будет считаться соответствующим данной спецификации. Например, спе¬ цификации Б??ЕТ.А будут соответствовать файлы БИЛЕТ.А, БАЛЕТ.А и БУКЕТ.А. Знак «*» интерпретируется как «все остальные сим¬ волы могут быть любыми». Он используется только в качестве последнего (единственного) символа имени или типа файла. Например, спецификации IIP*.BAS будут соответствовать файлы ПРОГЕВАБ, ПРОГ2.ВА8, ПРОГЗ.ВАЗ и ПРИМЕР.ВАБ. Запись IIP*.BAS экви¬ валентна n₽??????.BAS. Специфицировать все файлы на диске можно либо в форме *.*, либо в форме ???????.???. Команда FILES (files — перечислить файлы). Коман¬ да позволяет получить оглавление диска и имеет фор¬ мат: FILES [спецификация-файла] В результате выполнения команды на экране дисплея будут перечислены все находящиеся на указанном диске файлы, имена которых соответствуют заданной специ¬ фикации-файла. Если параметр опущен, выдается пол¬ ный список всех файлов на текущем диске. Команда KILL (kill — уничтожить). Команда исполь¬ зуется для удаления файлов с диска. KILL спецификация-файла Команда KILL позволяет удалять отдельные файлы или группы файлов в соответствии с указанной специфи- кацией-файла. Команда NAME (name — назвать). Команда служит для переименования дисковых файлов. NAME старое-имя AS новое-имя Старое-имя задается в полном соответствии с пра¬ вилами спецификации, файлов. Новое-имя не должно включать имя устройства, поскольку файл остается на гом же диске. Файл, заданный старым-именем, должен существовать на указанном устройстве; в то же время ча этом устройстве не должно быть файла с новым-име- Ч( М. I 70
Пример. files "* .BAS" ПРОП .BAS ПР0Г2 .BAS ПРИМЕР .BAS ПР0Г4 '.BAS ПРОГЗ .BAS TECT1234.BAS БЕЙСИК: kill "ПРОГ*.BAS БЕЙСИК: name "TECT1234.BAS" as "flEMO.BAS" БЕЙСИК: fiies "* .BAS" ПРИМЕР .BAS ДЕМО .BAS БЕЙСИК: ГЛАВА 16. ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ Работа с памятью и портами Использование описанных здесь возможностей язы¬ ка требует достаточной квалификации, так как ни опе¬ рационная система, ни Бейсик не обеспечивают защиты собственных программ и данных, а также программ и данных пользователя от «разрушения». Неправильное использование некоторых областей основной памяти или портов может привести к аварийному завершению ра¬ боты Бейсика, операционной системы или даже к необ¬ ходимости выполнить перезапуск всей вычислительной установки, начиная с включения электропитания. В об¬ щем случае для работы с памятью и портами требуют¬ ся детальные знания о распределении и структуре ин¬ формации в памяти, о назначении портов и структуре данных в них. Изложение этих сведений выходит за рамки данной книги. Мы рекомендуем читателю вос¬ пользоваться книгой [4], а также эксплуатационной документацией по ПЭВМ ЕС. Сегментация памяти. Адресное пространство объемом 1 Мбайт требует использования 20-разрядного адреса при обращении к памяти. В 16-разрядных ПЭВМ ЕС это достигается благодаря применению специального механизма сегментации памяти, который позволяет представить 20-разрядный адрес совокупностью двух 16-разрядных величин: базового (начального) адреса сегмента и смещения нужного байта или слова внутри этого сегмента относительно его начала. Сегмент — это любой участок памяти размером 64 Кбайта, начинающийся с адреса, кратного 16. Сег¬ мент задается своим начальным адресом, который на са¬ 171
мом деле является 20-разрядным. Однако, поскольку его младшие 4 разряда всегда нулевые (адрес кратен 16), их можно постоянно не хранить и учитывать только в момент обращения к памяти. Таким образом, полный адрес памяти вычисляется (аппаратурой) непосредст¬ венно в момент обращения к памяти и представляет собой сумму умноженного на 16 базового адреса сегмен¬ та и заданного смещения. В общем случае программа может работать с не¬ сколькими сегментами памяти. Базовые адреса сегмен¬ тов хранятся в специальных сегментных регистрах, а смещения указываются непосредственно в командах программы. Оператор DEF SEG. Все имеющиеся в Бейсике сред¬ ства работы с памятью действуют в пределах так назы¬ ваемого текущего сегмента. Адрес текущего сегмента устанавливается с помощью оператора DEF SEQ (DEFine SEGment — определить сегмент). DEF SEG [ = адрес] Адрес задает старшую часть базового адреса теку-; щего сегмента и может принимать значение в пределах от 0 до 65535 (напомним, что для получения реального адреса сегмента в памяти адрес будет умножаться на 16). После того как оператор DEF SEG установил адрес сегмента, операнды смещение в последующих опе¬ раторах BLOAD, BSAVE, CALL, РЕЕК, РОКЕ и USR будут определять смещение относительно именно этого адреса. Если адрес в операторе DEF SEG опущен, в каче¬ стве адреса текущего сегмента устанавливается адрес рабочей области интерпретатора (описывается ниже). Этот же адрес будет установлен сразу после запуска интерпретатора. Используя оператор DEF SEG, необходимо иметь в виду, что интерпретатор строит свою работу в предпо¬ ложении, что адрес текущего сегмента указывает на начало рабочей области интерпретатора. Поэтому, если адрес текущего сегмента был с какой-то целью изменен, его рекомендуется восстановить сразу после выполне¬ ния требуемых действий с памятью. Пример. DEF SEG—-&H1000 ' Установить адрес текущего сегмента — 10000 172
Функция РЕЕК и оператор РОКЕ. Функция РЕЕК и оператор РОКЕ позволяют осуществить соответствен¬ но чтение из памяти или запись в память одного байта данных. РЕЕК (смещение) РОКЕ смещение, данные Функция РЕЕК (реек — заглянуть) возвращает зна-т чение байта памяти (целое число в диапазоне от О хо 255), находящееся в указанном смещении от начала текущего сегмента. Оператор РОКЕ (роке — втолкнуть) помещает задан- юе операндом данные значение (целое число в диапа¬ зоне от 0 до 255) в байт памяти, находящийся в указан- 1ом смещении от начала текущего сегмента. Пример. К) В% = РЕЕК(126) ' Прочитать байт 20 В°/о=В°/о AND &Н01 ' Установить младший бит в 1 30 РОКЕ 126,В % ' Поместить в память измененное значение Команды BSAVE и BLOAD. Эти команды предназ- ачены для работы с блоками памяти и позволяют со- тветственно записать копию участка памяти в файл на иске и загрузить содержимое такого файла обратно память. BSAVE спецификация-файла, смещение, длина В LOAD спецификация-файла [, смещение] По команде BSAVE (Block SAVE — сохранить блок) анные из блока ячеек памяти, начинающегося в задан- ом смещении от начала текущего сегмента, записы- аются в указанный файл. Размер блока (в байтах) ^ределяется параметром длина. Команда BLOAD Block LOAD — загрузить блок) позволяет прочитать в амять содержимое файла, записанного по команде SAVE. Если смещение в команде не указано, блок /дет помещен в ту же область, из которой он был'вы- 1сан. Команды BLOAD и BSAVE часто используются при 1боте с буфером дисплея. С их помощью можно орга- юовать быструю смену изображения на экране. Дело том, что формирование изображения (особенно слож¬ но изображения) может оказаться довольно длитель- ш процессом. Используя команды BSAVE и BLOAD, )жно записать однажды созданное изображение на ск и выводить его на экран без повторного формиро¬ 173
вания. Скорость вывода будет особенно высока, если изображение помещается непосредственно в буфер дис- плея (см. гл. 13). Пример. 100 DEF SEG = &HB800 'Адрес сегмента в нача¬ ло буфера 120 BSAVE "КАРТИНКА", 0, &Н1000 'Сохранить буфер дис- 140 DEF SEG 300 DEF SEG = &HB800 320 BLOAD "КАРТИНКА" 340 DEF SEG плея 'Восстановить адрес сег¬ мента' 'Адрес сегмента в нача¬ ло буфера 'Вывести изображение на экран 'Восстановить адрес сег¬ мента Команды BSAVE и BLOAD могут также оказаться полезными и при использовании подпрограмм на ма¬ шинном языке (см. гл. 17). Рабочая область интерпретатора. Мы уже отмечали, что некорректная работа с памятью может привести к аварийному завершению работы программы или опера¬ ционной системы. Этого можно избежать, если исполь¬ зовать только ту память, которая была отведена для работы Бейсика при его запуске. Интерпретатор Бейсика во время работы использует две области памяти, с каждой из которых работа орга¬ низуется как с отдельным сегментом. Одна из этих областей содержит программы интерпретатора и назы¬ вается сегментом кодов. Вторая область содержит об¬ рабатываемую информацию, в частности интерпретиру¬ емую программу и ее данные, а также внутренние дан¬ ные самого интерпретатора и его стек. В то время как сегмент кодов полностью занят программами и не может служить для размещения других данных, рабочая об¬ ласть, как правило, в полном объеме не используется. В Бейсике имеется возможность запретить интепретато- ру использовать часть рабочей области и размещать требуемые данные там, не опасаясь «разрушить» систе¬ му, а также программы и данные интерпретатора. Для рабочей области интерпретатора обычно отво¬ дится 64 Кбайта памяти. При запуске интерпретатора базовый адрес текущего сегмента будет указывать на начало этой области. Этот же адрес хранится в самой рабочей области в смещении &Н350 от ее начала. Для управления рабочей областью служат функция FRE и 174
оператор CLEAR, а также режим интерпретатора /М:, который можно использовать при его запуске (см. при¬ ложение 3). Функция FRE (FREe — свободный). Функция позво¬ ляет в любой момент определить объем свободной части рабочей области. Обращение к функции имеет формат: FRE (выражение) Независимо от значения выражения результатом вы¬ полнения функции является объем (в байтах) свободной памяти в рабочей области интерпретатора. Хотя значение аргумента выражение не влияет на основной результат функции, в зависимости от его типа функция может выполнить дополнительное действие. Оно связано с наличием в Бейсике строк переменной длины, обработка которых может привести к явлению «фраг¬ ментации памяти» (внутри области данных появляются участки, содержащие неиспользуемую информацию — «мусор»). Поэтому, если в качестве аргумента функции FRE задано выражение строкового типа, перед вычис¬ лением объема свободной памяти функция выполняет «сборку мусора», т. е. удаление всех неиспользуемых данных и освобождение занимаемых ими областей. «Сборка мусора» автоматически выполняется интерпре¬ татором и в том случае, если вся свободная память оказывается исчерпанной. Оператор CLEAR (clear — очистить). Оператор ини¬ циализирует (приводит в начальное состояние) все оп¬ ределенные в программе данные, оставляя саму прог¬ рамму без изменения. С помощью оператора CLEAR можно изменить стандартный объем памяти, используе¬ мой интерпретатором в рабочей области и освободить таким образом часть рабочей области для других целей. Кроме того, оператор CLEAR позволяет изменить вели¬ чину внутреннего стека интерпретатора, который также размещается в доступной интерпретатору части рабочей области. Оператор имеет формат: CLEAR [, [память] [,.стея]. Выполнение оператора CLEAR приведет к следую¬ щим изменениям в области данных: • числовые переменные получат значение 0; • строковые переменные станут равными пустой строке; • значения элементов массива будут непредска¬ зуемы; 175
• отменятся все определения, сделанные оператора¬ ми DEF; • если задан операнд память, интерпретатору будет доступна только та часть рабочей области, объем ко¬ торой определен значением операнда; • если задан операнд стек, размер внутреннего сте¬ ка интерпретатора будет установлен в соответствии с заданным значением. Доступная интерпретатору часть рабочей области всегда размещается в ее начале. Для того чтобы вы¬ числить смещение свободной части, нужно из 64К вы¬ честь значение операнда память. Стек размещается в доступной интерпретатору час¬ ти рабочей области. Стандартный размер стека равен 512 байтам. Увеличение размера стека может понадо¬ биться, если в программе используется большое коли¬ чество операторов GOSUB, FOR и PAINT. Пример. С помощью функции FRE определяется объем неиспользуемой части рабочей области, а затем эта память делается недоступной интерпретатору с по¬ мощью оператора CLEAR. 10 N = FRE(1) 'Объем свободной памяти 20 CLEAR , 1024*64—N 'Уменьшить доступную память 30 OFS= 1024*64—FRE(l) 'Начало неиспользуемой памяти Функция INP и оператор OUT. Функция INP и опе¬ ратор OUT предназначены для работы с портами и осуществляют соответственно чтение из порта или пе¬ редачу в порт одного байта данных. В ПЭВМ ЕС име¬ ется 65536 портов, каждый из которых идентифицирует¬ ся собственным номером (номер-порта может принимать значение от 0 до 65535). INP (номер-порта) OUT номер-порта, данные Функция INP (INPut — ввести) возвращает целочис¬ ленное значение (от 0 до 255), прочитанное из указан¬ ного порта. Оператор OUT (OUTput — вывести) пере¬ сылает заданное операндом данные значение (целое число в диапазоне от 0 до 255) в указанный порт. В начале главы мы уже говорили о том, что для работы с портами требуется детальная информация о назначении портов и структуре данных в них. Изложе¬ ние этих сведений выходит за рамки книги. Отметим только, что управление компонентами (функциональны¬ ми узлами) ПЭВЛ4 посредством портов часто позволяет 176
использовать такие их возможности, которые недоступ¬ ны с помощью других средств языка. Например, в гл. 13 показано, как, управляя дисплеем через порт &H3D9, можно изменять цвет фона даже в режиме с высокой разрешающей способностью. Обработка ошибок Возникновение какой-либо ошибки в процессе вы¬ полнения программы обычно вызывает выдачу соответ¬ ствующего сообщения и прекращение выполнения прог¬ раммы. В Бейсике имеется возможность предусмотреть обработку ошибочных ситуаций. Для этой цели служит оператор ON ERROR и функции ERR и ERL. Оператор ON ERROR (on error — при ошибке). Опе¬ ратор определяет подпрограмму обработки ошибок и имеет формат: ON ERROR GOTO номер-строки После выполнения оператора ON ERROR возникно¬ вение любой ошибки вызовет передачу управления под¬ программе, начало которой указано номером-строки. Выход из подпрограммы обработки ошибок осуществ¬ ляется с помощью оператора RESUME, формат и правила выполнения которого аналогичны оператору RETURN. Чтобы отменить обработку ошибок, необходимо вы¬ полнить оператор ON ERROR GOTO 0. Если такой оператор встречается в подпрограмме обработки оши¬ бок, выдается сообщение об обрабатываемой в текущий момент ошибке, и выполнение немедленно прекращает¬ ся. При написании подпрограммы обработки ошибок рекомендуется использовать оператор ON ERROR GOTO 0 во всех случаях, когда встречаются ошибки, обработка которых в этой подпрограмме не предусмотрена. Рекурсивное выполнение подпрограммы обработки ошибок не допускается. Если во время ее работы воз¬ никает ошибка, выдается соответствующее сообщение, и выполнение прекращается. Функции ERR и ERL (ERRor — ошибка, ERror Line- ошибочная строка). Эти функции позволяют получить код последней возникшей ошибки и определить номер строки в программе, при выполнении которой эта ошиб¬ ка произошла. Они не имеют аргументов и записыва¬ ются следующим образом: ERR и ERL. 12 Заказ 2634 177
Эти функции могут использоваться в подпрограммах обработки ошибок для анализа ошибочных ситуаций. Пример. В этой программе предусмотрена обра¬ ботка часто встречающейся ситуации, когда устройство печати не включено или в него не заправлена бумага. 10 ON ERROR GOTO 100 20 LPRINT "Проверка печати" 30 END 100 IF ERR = 27 THEN PRINT "Устройство печати не готово" НО RESUME Работа с таймером Оператор TIME$ (time — время). Оператор позво¬ ляет задавать текущее время суток и имеет формат: Т1МЕ$ = переменная Переменная должна быть строкового типа и в мо¬ мент 'выполнения операнда должна содержать устанав¬ ливаемое время в одном из 'следующих форматов: чч чч : мм чч : мм : сс — устанавливаются часы (от 0 до 23). Значение ми¬ нут и секунд принимается равньпм 0; — устанавливаются часы и минуты (минуты от 0 до 59). Значение секунд принимается равным 0; — устанавливаются часы, минуты и секунды (секунды от 0 до 59). Функции Т1МЕ$ и TIMER. Эти функции позволяют получить текущее время суток. TIMES TIMER Функция Т1МЕ$ возвращает время в форме строки, имеющей формат чч : мм : сс. Значение, возвращаемое функцией TIMER, будет равно количеству секунд, про¬ шедших с начала суток до текущего момента. Пример. 10 Т1МЕ$ = "12 : 00 : 00" 'Установить время 20 PRINT " TIMES—TIMES 'Выдать время (чч : мм : сс) 30 PRINT " TIMER—"; TIMER' 'Выдать время (секунды) run TIMES—12 : 00 : 00 TIMER—43200 Оператор ON TIMER (on timer — по таймеру). Опе¬ ратор дает возможность устанавливать интервал време¬ 178
ни и по истечении этого интервала передавать управле¬ ние заданной подпрограмме. Оператор имеет формат: ON TIMER (интервал) GOSUB номер-строки Интервал может принимать значения от 1 до 86400 и задает интервал времени в секундах (от 1 с до 24 ч). По истечении установленного интервала управление пе¬ редается подпрограмме, заданной номером-строки. Оператор ON TIMER только определяет подпрограм¬ му. Для того чтобы ее активизировать, необходимо выполнить оператор TIMER ON. Оператор TIA4ER ON устанавливает такой режим выполнения программы, при котором Бейсик периодически опрашивает таймер ПЭВМ. Если истекает заданный интервал, выполняется оператор GOSUB, указанный в операторе ON TIA^ER. Выполнение подпрограммы можно отложить с по¬ мощью оператора TIMER STOP. После выполнения этого оператора истечение интервала времени не вызо¬ вет передачи управления в подпрограмму обработки, однако это событие запоминается таким образом, что сразу после выполнения оператора TIMER ON проис¬ ходит передача управления подпрограмме обработки. Оператор TIMER OFF делает подпрограмму обра¬ ботки неактивной. После выполнения оператора TIMER OFF, даже если истек; ет интервал времени, это собы¬ тие не запоминается. Если интервал истек во время выполнения подпрог¬ раммы обработки ошибок, подпрограмма, определенная оператором ON TIMER, не активизируется. Пример. В данном примере через каждые 10 с в первой строке отображается текущее время. 10 ON TIMER(IO) GOSUB 700 : TIMER ON 700 ROW = CSRLIN '* Запомните местоположе- 720 COL = POS(0) '* нис курсора 740 LOCATE 1,1: PRINT TIME$; ' Отобразить время 760 LOCATE ROW, COL f Вернуть Kvpcop на место 780 RETURN ГЛАВА 17. ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММ НА МАШИННОМ ЯЗЫКЕ Языковые средства Бейсика позволяют применять его для решения широкого круга задач. Тем не менее можно представить ситуацию, когда в программе на Бейсике необходимо использовать подпрограммы на 12* 179
машинном языке. Чаще всего такая необходимость воз¬ никает в задачах, где критичным фактором является время выполнения или где используются ресурсы, дос¬ туп к которым на Бейсике затруднителен. Например, интерпретатор Бейсика использует для размещения пе¬ ременных и программы не более 64 Кбайт памяти, хотя ПЭВМ ЕС позволяет использовать значительно боль¬ ший объем. Можно написать подпрограмму (например, на языке ассемблера), которая будет обеспечивать раз¬ мещение промежуточных результатов за пределами рабочей области Бейсика, тем самым расширяя объем используемой памяти. Такая подпрограмма приводится в качестве примера в этой главе. Здесь рассматривается подключение подпрограмм на машинном языке при использовании интерпретатора Бейсика. Подключение и вызов таких подпрограмм при использовании компилятора имеет ряд особенностей, которые в данной книге не рассматриваются. Для по¬ нимания материала главы необходимо знание языка ассемблера и принципов выполнения машинных команд. Способ подключения подпрограммы зависит от опе¬ рационной системы, под управлением которой работает интерпретатор В тексте, где это необходимо, приводятся различия в правилах подключения подпрограмм, обус¬ ловленные особенностями операционной системы. Прог¬ рамма, использующая подпрограммы на машинном языке, как правило, не может быть без изменений пере¬ несена из одной операционной системы в другую. Для подключения подпрограммы на машинном язы¬ ке необходимо выполнить следующие действия: • распределить память для подпрограммы, т. е. вы¬ брать свободную область памяти, куда будет занесена подпрограмма; • занести подпрограмму в выбранную область па¬ мяти; • передать управление подпрограмме, соблюдая при этом стандартные соглашения по передаче аргументов. Распределение памяти для подпрограмм Для размещения подпрограмм на машинном языке можно использовать или рабочую область Бейсика, или область памяти, не используемую ни Бейсиком, ни опе¬ рационной системой. Способ распределения памяти ]£0
обычно выбирают в зависимости от размера подпрограм¬ мы на машинном языке и особенностей решаемой зада¬ чи. Небольшие подпрограммы часто размещают в рабо¬ чей области, а большие—в свободной области памяти. Рабочая область в памяти располагается всегда вслед за сегментом кодов. Ее сегментный адрес нахо¬ дится в рабочей области со смещением &Н350 Это зна¬ чение может быть прочитано с помощью функции РЕЕК Команда CLEAR и режим /М: интерпретатора (см. прил. 3) позволяют запретить интерпретатору использо¬ вание части рабочей области. Эта свободная память будет находиться в конце рабочей области и может использоваться для размещения подпрограмм на ма¬ шинном языке. Например, команда CLEAR, 1024*60 блокирует использование 4 Кбайт памяти. Для получе¬ ния адреса этой области необходимо к начальному адре¬ су рабочей области добавить размер используемой памяти. Эти вычисления могут быть выполнены в прог¬ рамме на Бейсике. ю 20 25 30 40 50 60 N1=1024*60 CLEAR, N1 N1=1024*60 А1 =РЕЕК (&Н350) А2=РЕЕК (&Н351) SEG=A1*256+A2 SEG1 =SEG+N 1 /16 'Объем используемой памяти — 64К 'Восстановление значения '* Выбор сегментного адреса рабочей области 'Сегментный адрес свободной области В результате выполнения этого фрагмента перемен¬ ной SEG1 будет присвоен сегментный адрес свободной части рабочей области. Если объем памяти ПЭВМ достаточно большой, то подпрограммы на машинном языке могут быть разме¬ щены за пределами рабочей области Бейсика. При работе под управлением операционной системы М86 сегмент кодов и рабочая область Бейсика располагают¬ ся в конце памяти, а при работе под управлением опе¬ рационной системы Альфа-ДОС — вслед за ядром сис¬ темы. Таким образом, свободная память в зависимости от используемой операционной системы будет распола¬ гаться следующим образом: • для М86 между ядром системы и началом сегмен¬ та кодов интерпретатора Бейсика; • для Альфа-ДОС после рабочей области интерпре¬ татора. Доступ к этой памяти в Бейсике обычно осуществ¬ ляется с помощью оператора DEF SEG (см. гл. 16). 181
Загрузка подпрограмм в память. После того, как область памяти определена, туда необходимо поместить саму подпрограмму. Код подпрограммы обычно задает¬ ся или в форме констант, Бейсика, или в виде файла, записанного на диск. Первый способ используется для загрузки.в память сравнительно небольших подпрограмм. Для его реали¬ зации необходимо закодировать машинную программу в форме констант с помощью оператора DATA и занеси ти эти константы в выбранную область с помощью опе¬ ратора РОКЕ. Этот способ иллюстрируется следующей программой на Бейсике: 10 DEFINTA-Z 20 DEF SEG=&H3000 30 FOR l=0TO20 40 READ J 50 POKE I, J 60 NEXT i 500 DATA &H55,. . . 'Сегментный адрес свободней области 'Граница цикла равна длине подпрограммы '* Запись подпрограммы '* в память 'Код подпрограммы Для загрузки подпрограмм из файла на диске мож¬ но использовать команду Бейсика BLOAD. В этом слу¬ чае необходимо, чтобы файл с подпрограммой на ма¬ шинном языке был записан на диск с помощью коман¬ ды BSAVE. Если подпрограмма была записана на диск в другой форме, например в форме командного файла (файла с типом CQM), ее преобразование к требуемому виду может быть выполнено с помощью простой прог¬ раммы на Бейсике. Ниже приведен пример программы, которая преобразует файлы типа СОМ к виду, требуе¬ мому для использования команды BLOAD. Программа предназначена для работы под управлением операцион¬ ной системы Альфа-ДОС. 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 WEND TSO BSAVE "SUBRT", 0, LNG1 '«Открытие файла типа СОМ, '«содержащего программу '«на машинном языке. DEFINTA-Z INPUT "Programm"; F!t> F$=F$+".COM" OPEN F$ AS *1 FIELD «1, 128 AS COD$ LNG=LOF (1) : LNG1=LNG 'Определение длины программы. DEF SEG=&H3000 3=0 WHILE LNG GET 1 FOR 1=1 TO 128 POKE J, ASC (MID$ (COD$, I, 1) ) J=J+1 LNG=LNG—1 IF-LNG=0 THEN GOTO 180 NEXT I 'Смещение в рабочей области. '« Чтение '* и '* перенос '* программы '* в '« рабочую '• область. '* Чтение '* и перенос '« в рабочую '* область ч одной '« записи. 182
Аналогичная программа может быть написана и для операционной системы М.86. Вызов подпрограмм Для вызова подпрограмм на машинном языке могут использоваться функция USR (USe Routine—исполь¬ зовать подпрограмму) и оператор CALL (call — вы¬ звать). Независимо от способа вызова во время входа в подпрограмму регистры DS, ES и SS указывают адрес рабочей области Бейсика, а регистр CS содержит адрес сегмента, установленного в последнем выполненном опе¬ раторе DEF SEG. Если такой оператор не выполнялся, то регистр CS указывает адрес рабочей области Бейси¬ ка. Подпрограмме на машинном языке передается стек размером 16 байт. Возврат из подпрограммы на машинном языке не¬ обходимо осуществлять с помощью команды межсег¬ ментного возврата RETF, при этом должны быть вос¬ становлены все сегментные регистры и регистр SP (указатель стека). Оператор CALL. Оператор используется для вызова подпрограмм на машинном языке. CALL смещение [(аргумент [,аргумент] ...)] Смещение задается числовой переменной, значение которой указывает смещение подпрограммы относи¬ тельно начала сегмента, определенного оператором DEF SEG. В качестве аргументов могут использоваться име¬ на любых переменных. В результате выполнения оператора CALL управле¬ ние передается подпрограмме. При этом осуществляют¬ ся следующие действия: • адрес каждого аргумента в форме двухбайтного смещения в рабочей области заносится в стек; • в стек заносится информация, необходимая для возврата управления в точку вызова. Если аргументом является строка символов, то под¬ программе передается адрес трехбайтной области сле¬ дующего вида: байт 0 содержит длину строки и может иметь значение от 0 до 255; байты 1 и 2 содержат сме¬ щение строки в рабочей области Бейсика. Смещение аргумента в стеке относительно указате¬ ля стека вычисляется по формуле 2* (п—ш) +6 183
где п равно общему количеству аргументов, ат — номер аргумента. Если, например, подпрограмме передаются 4 аргумента, го для загрузки адреса второго аргумента в регистр SI могут использоваться следующие команд' ассемблера: PUSH ВР; Сохранить регистр ВР MOV ВР, SP; Переслать в ВР указатель стека MOV SI, [ВР] +6; Поместить адрес аргумента в SI Возврат из подпрограммы должен осуществляться с помощью команды RETF п, где п равно числу аргумен¬ тов, умноженному на два. Использование команды та¬ кого вида обеспечивает удаление аргументов из сгека. Далее приведен пример подпрограммы, записанной на ассемблере, которая может использоваться для хра¬ нения целых чисел за пределами рабочей области Бейсика. Подпрограмма имеет две точки входа: GET0 — выборка числа; PUT0 — помещение числа на хранение. Для обращения к подпрограмме следует использовать оператор: CALL смещение (значение, номер) Смещение указывает точку входа: для GET0 оно равно 3, а для PUT0 — 0. Значение — это имя перемен¬ ной, использование которой зависит от точки входа: при обращении к точке PUT0 содержимое переменной за¬ носится на хранение, а при обращении к точке GET0 переменной значение присваивается. Аргумент номер используется подобно индексу массива и задает номер сохраняемого или извлекаемого значения. Эта подпрог¬ рамма позволяет использовать 64 Кбайта дополнитель¬ ной памяти для хранения промежуточных значений. 10 DEFINT A—Z 20 DEF SEG- &H3000 '* Загрузка программы 30 BLOAD "SUBRT", 0 '* в память. 40 PUT0=&H 1 A:GET0=0 50 FOR 1 = 1 TO 100 '* Вызов подпрограммы на 60 CALL PUTOU, I) '* машинном языке для сох- 70 NEXT 1 '* ранения чисел от 0 до 100. 80 SUM=0 'Переменная для накапливания суммы. 90 FOR 1 = 1 TO 100 '* Извлечение чисел 100 CALLGETO(A, I) '* подсчет их 110 SUM=SUM+A '* суммы. 120 NEXT I '* 130 PRINT SUM 'Вывод суммы на печать. Далее приведена программа на Бейсике, которая использует эти подпрограммы для сохранения значе¬ 184
ний от 1 до 100. Затем значения извлекаются и подсчи¬ тывается сумма этих чисел. CSEG SEGMENT ASSUME CSzCSEG SUBRT PUT0: PROC FAR GET0: JMP PUT1 PUSH BP ; Сохранение BP. MOV BP, SP ; Установить базу для списка параметров. MOV DI, [BP] +8 ; Адрес первого параметра. MOV SI, [BP]+6 ; Адрес второго параметра. MOV BX, [SI] ; Выбор номера элемента ADD BX, BX ; Вычисление смещения к месту хранения. PUSH DS ; Сохранение DS. CALL LDS ; Засылка в DS адреса рабочей области. MOV AX, [BX] ; Извлечение числа из рабочей области. POP DS ; Восстановление DS. MOV [DI], AX ; Присвоение числа первому параметру. POP BP ; Восстановление ВР. PUT1: RET 4 ; Возврат в БЕЙСИК. PUSH BP ; Сохранение ВР. MOV BP, SP ; Установить базу для списка параметров. MOV DI, [BP]+8 ; Адрес первого параметра. MOV SI, [BP]+6 ; Адрес второго параметра. MOV BX, [SI] ; Выбор номера элемента. ADD BX, BX ; Вычисление смещения к месту хранения, MOV AX, [DI] ; Извлечение второго параметра. PUSH DS ; Сохранение DS. CALL LDS ; Засылка в DS адреса рабочей области. MOV [BX], AX ; Занесение числа в рабочую область. POP DS ; Восстановление DS. POP BP ; Восстановление ВР. RET 4 ; Возврат в БЕЙСИК. LDS PROC NEAR MOV CX,CS ; * Установить DS равным адресу ADD CX, 4 ; * сегмента кодов, увеличенному PUSH CX ; * на шестнадцатеричное 40. Эта POP RET DS ; * область используется для хранения. LDS ENDP SUBRT ENDP CSEG ENDS END Функция USR. Функция позволяет вызывать подпрог¬ раммы на машинном языке. Вызов реализуется как обращение к функции с передачей одного аргумента. Подпрограммы, которые будут вызываться посредством функции USR, должны быть определены с помощью оператора DEF USR (DEFined USing Routine — опреде¬ лить используемую подпрограмму), который имеет фор¬ мат: DEF USR[п] — смещение п может быть целыхм числом в диапазоне от 0 до 9. Это значение должно использоваться при вызове функ¬ 185
ции для идентификации определяемой подпрограммы. По умолчанию предполагается значение 0. Смещение является числовой переменной, которая задает смещение подпрограммы на машинном языке относительно начала сегмента, определенного в опера¬ торе DEF SEG. К подпрограмме, определенной оператором DEF USRn, обращаются с помощью функции USRn. Обра¬ щение имеет формат: USRn (аргумент) В качестве аргумента можно использовать числовое или строковое выражение. В результате выполнения функции USR/г управле¬ ние передается указанной подпрограмме. Передача па¬ раметров осуществляется в соответствии со следующи¬ ми соглашениями: • при входе в подпрограмму регистр AL указывает тип передаваемого аргумента: 2 — целое число, 3 — строка символов, 4 — число с обычной точностью, 8 — число с двойной точностью; • для строковых аргументов регистр DX указывает трехбайтный описатель строки, структура которого была приведена при рассмотрении оператора CALL; • для передачи целочисленных аргументов использу¬ ется слово со смещением &Н4АЗ в рабочей области Бейсика; • для чисел с обычной точностью экспонента, умень¬ шенная на 128, находится в байте &Н4А6. Для мантис¬ сы используются байты &Н4АЗ—&Н4А5 (младший байт &Н4АЗ). Так как экспонента задает степень двойки, то мантисса может быть нормализована так, что ее стар¬ ший бит будет равен 1. Его место в представлении ман¬ тиссы используется для задания знака числа; • для чисел с двойной точностью байты &Н4АЗ— &Н4А6 используются так же, как и для чисел с обыч* ной точностью. Четыре дополнительных байта мантиссы располагаются в смещении &H49F—&Н4А2 (младший байт &H49F). Пример обращения к функции на машинном языке. 100 DEF USR5=100 500 A=LTSR5(12) 510 PRINT А 18G
ЛИТЕРАТУРА 1. Диалоговая система программирования ДИСП / И. М. Бул- ко, Н. Н. Дорожко, И. И. Пилецкий и др. — М.: Финансы и ста¬ тистика, 1981. —240 с. 2. Кетков Ю. Л. Программирование на Бэйсике. — М.: Стати¬ стика, 1978. — 1-58 с. 3. Пул Л. Работа на персональном компьютере. — М.: Мир, 1986. —383 с. 4. Персональные компьютеры Единой системы ЭВМ/А. П. За¬ польский, В. Я. Пыхтин, В. Б. Шкляр, А. Н. Чистяков. — М.: Фи¬ нансы и статистика, 1988. — 143 с. 5. Морил Г. Бейсик для ПК ИБМ / Пер. с англ.; Под ред, С. В. Черемных. — М.: Финансы и статистика, 1987. — 208 с. •187
ПРИЛОЖЕНИЯ ПРИЛОЖЕНИЕ 1 СПИСОК ЗАРЕЗЕРВИРОВАННЫХ СЛОВ ABS AND ASC ATN AUTO ВЕЕР BLOAD BSAVE CALL CDBL CHAIN CHDIR CHR$ CINT CIRCLE CLEAR CLOSE CLS COLOR COM COMMON CONT COS CSNG CSRLIN CVD CVI CVS DATA DATES DEF DEFDBL DEFINT DEFSNC DEFSTR DELETE DIM DRAW EDIT ELSE END ENVIRON ENVIRONS EOF EQV ERASE ERDEV ERDEV$ ERL ERR ERROR EXP FIELD FILES FIX FN FOR FRE GET GOSUB GOTO HEX$ IF IMP INKEYS INP INPUT INPUT# INPUTS INSTR 1NT INTERS IOCTL IOCTLS KEY keys KILL LEFTS LEN LET LINE LIST LLIST LOAD LOC LOCATE LOF LOG LPOS LPRINT LSET MERGE MID$ MKDIR MKD$ MK1$ MKS$ MOD MOTOR NAME NEW NEXT NOT OCT$ OFF ON OPEN OPTION OR OUT PAINT PEEK PEN PLAY PMAP POINT POKE POS PRESET PRINT PRINT# PSET PUT RANDOMIZE READ REM RENUM RESET RESTORE RESUME RETURN RIGHTS RMDIR RND RSET RUN SAVE SCREEN SGN SHELL SIN SOUND SPACES SPC( SQR STEP STICK STOP STR$ STRIG STRINGS SWAP SYSTEM TAB( TAN THEN TIMES TIMER TO TROFF TRON USING USR VAL VARPTR VARPTR$ VIEW WAIT WEND WHILE WIDTH WINDOW WRITE WRITE# XOR Примечание. Зарезервированные слова не должны использо¬ ваться в качестве имен переменных. 188
ПРИЛОЖЕНИЕ 2 КОДЫ ПЭВМ Таблица кодов ПЭВМ ЕС 0123456789ABCDEF ► 0 Р P [r A р а р Е © ◄ 1 1 А Q а q _1L 1 1 Б с б с ё 0 11 2 В R b r T J| -J В т в т Z V !! 3 С S с s IL L Г У г У . \ ♦ тг $ 4 D Т d t 1 = — Д ф Д ф Z 4- § % 5 Е и е u 1 II 1 E X е X \ & 6 F V f V =1 T T Ж ц ж ц - О 1 7 G W 9 w T —JI ~ll 3 ч 3 ч - Q 1 ( 8 Н X h X IL JL _L И ш и ш t О 1 ) 9 I Y i У t= lh h Й щ й щ Q -> * J Z i z F _LL T t К ь к ъ -Г <г + К [ k { -11 I л ы л ы + ? < L \ 1 1 1 =1 ■ м ь м ь N- г м - = М ] m } LL 1 1 н э н 3 п л ▲ > N n Ih -ih 1 о ю о ю ■ * ▼ / ? О О JL _L “Г п я п я Расширенные коды. Функция INKEYS для некоторых клавиш или комбинаций клавиш, которым не соответствует какой-нибудь символ в таблице кодов ПЭВМ, возвращает расширенный код. В этом случае возвращается строка, состоящая из двух символов. Первый байт этой строки всегда равен нулю, а второй — расширен¬ ному коду. Значения расширенных кодов приведены ниже. Расширенный код Клавиша или комбинация клавиш OF 10—19 IE—26 2С—32 ЗВ—44 Табуляция ДОП — Q, W, Е, R, Т, Y, и, I, О, Р ДОП —A, S, D, F, G, Н, J, К, L ДОП —Z, X, С, V, В, N, М Функциональные клавиши от Ф1 до Ф10, если не используются как логические клавиши 47 48 Курсор в левый верхний угол Курсор вверх 189
49 4В 4D 4F 50 51 52 53 54—50 Перейти к следующей странице Курсор влево Курсор вправо кон Курсор вниз Перейти к предыдущей странице вст УДЛ Верхний регистр — функциональные клавиши от Ф1 до Ф10 • 5Е—67 68—71 72 73 74 75 76 77 78-83 84 УПР — функциональные клавиши от Ф1 до Ф10 ДОП— функциональные клавиши от Ф1 до ФЮ УПР — ПЕЧ УПР — курсор влево УПР — курсор вправо УПР-КОН УПР —перейти к предыдущей странице УПР —курсор в левый верхний угол ДОП — f, 2, 3, 4, 5, 6, 7, 8, 9, 0, —, = УПР —перейти к следующей странице ПРИЛОЖЕНИЕ 3 ЗАПУСК СИСТЕМЫ ПРОГРАММИРОВАНИЯ БЕЙСИК Запуск интерпретатора. Существуют две версии интерпретатора Бейсика, предназначенные для работы под управлением операцион¬ ных систем Альфа-ДОС и М86. Для того чтобы запустить интер¬ претатор Бейсика, необходимо загрузить операционную систему, установить дискету с интерпретатором и выполнить команду запу¬ ска интерпретатора BASICM86. Формат команды BASICM86 нс зависит от операционной системы. BASICM86 [имя-файла] [/Р:количество-файлов] ’/М: рабочая-область] " 1^\максимальный-размер-записи] I/O] Имя-файла определяет файл, содержащий программу на Бей¬ сике. Если этот операнд указан, соответствующая программа будет загружена в основную память и выполнена. Имя файла задается в виде строки символов и удовлетворяет правилам спецификации файлов. По умолчанию предполагается тип файла BAS. Если тип файла не задан, то осуществляется загрузка интерпретатора и под¬ готовка к работе. Количество-файлов задает максимально возможное количество открытых файлов на Бейсике. Для каждого файла в основной памяти строится блок управления файлом и резервируется память для буфера ввода-вывода, размер которого определяется операн¬ дом /S:. Максимальное количество файлов—15. По умолчанию ко¬ личество файлов равно 3. Рабочая-область задаст размер памяти в сегменте данных, ко¬ торая будет использоваться интерпретатором для размещения программ па Бейсике и данных. При вызове Бейсика для сегмента 190
данных отводится максимальный из доступных участков памяти в пределах 64 Кбайт. Остальная часть сегмента остается свободной и может использоваться для других целей, например для загрузки подпрограмм на машинном языке. Если операнд не задан, исполь¬ зуется вся память сегмента данных. Максимальный-размер-записи устанавливает максимально воз¬ можный размер записи при работе с файлами с произвольным дос¬ тупом. Максимально допустимое значение — 32767. По умолча¬ нию— 128. Параметр /D указывает, что математические функции Бейсика (ATN, SIN, COS, EXP, LOG, SQR, TAN) будут вычисляться с двойной точностью, если аргумент задан с двойной точностью.' Если параметр /D не задан, эти функции вычисляются с обычной точностью. Для задания числовых значений в операндах команды BASICM86 можно использовать целые числа в десятичной, восьме¬ ричной или шестнадцатеричной форме. В следующем примере команда BASICzM86 запускает интерпре¬ татор Бейсика для выполнения программы, находящейся в файле ТЕСТ на диске В. При выполнении программы будут использовать¬ ся 5 файлов. BASICM86 В : ТЕСТ /F : 5 Для завершения работы • интерпретатора служит команда Бей¬ сика SYSTEM. По этой команде закрываются файлы и управление передается операционной системе. Формат команды: SYSTEM Компиляция программы на Бейсике. Программу на Бейсике, созданную и отлаженную с помощью интерпретатора, можно обра¬ ботать компилятором, чтобы создать программу на машинном языке, готовую к выполнению. Время выполнения программы под управлением интерпретатора больше, чем время выполнения той же программы на машинном языке, построенной с помощью компиля¬ тора. Получение программы на машинном языке осуществляется в два этапа: компиляция исходной программы, а затем редактиро¬ вание результатов компиляции с помощью редактора связей. Ре¬ зультатом работы редактора связей является файл типа EXE, содержащий программу, готовую к выполнению. На этапе редактирования необходимо учитывать, с каким ре¬ жимом выполнялась компиляция. Если компиляция выполнялась с режимом /О, то на этапе редактирования требуется библиотека BASCOM20.LIB.1. Если компиляция выполнялась без режима /О, то на этапе редактирования объектного модуля требуется библио¬ тека BASRUN20.LIB В этом случае во время выполнения прог¬ раммы в память будет загружаться модуль BASRUN20.EXE, со¬ держащий библиотеку времени выполнения. При использовании режима /О редактирование выполняется быстрее, размеры загру¬ зочного модуля меньше. Далее следует пример компиляции програм¬ мы с именем DEMO, находящейся на диске В. Для вызова ком¬ пилятора используется команда BASCOM. 19!
1 > b:bascom ПО ПЭВМ ЕС БЕЙСИК—компилятор издание 01 Исходный файл Объектный файл Распечатка [.BAS]: b:demo [DEMO.OBJ]; b: [NUL.LST]: 50427 байт занято 50195 байт свободно 0 предупреждений 0 ошибок 1> Вызов редактора связей осуществляется командой LINK. Ниже приведен протокол редактирования программы DEMO (библиотека BASCOM20.LIB и объектный модуль находятся на диске В). 1 > link ПО ПЭВМ ЕС РЕДАКТОР СВЯЗЕЙ Издание 01 Объектный модуль [.OBJ]: b:demo Выполнимый файл [A:DEMO.EXE]: b: Распечатка редактирования [NUL.MAP] 2 Библиотеки [.L!Bj: b; 1>
ПРИЛОЖЕНИЕ 4 ОПЕРАТОРЫ, ФУНКЦИИ И КОМАНДЫ1 ABS(x) Вычисление абсолютной величины (с. 38). ASC (строковое-выражение) Получение кода, соответствующего заданному символу, в таблице кодов ПЭВМ (с. 38). ATN (х) Вычисление арктангенса (с. 38). AUTO [начальный-номер] [.[приращение]] Установка режима автоматической генерации номеров строк (с. 160). ВЕЕР Подача звукового сигнала (с. 151). BLOAD спецификация-файла [.смещение] Загрузка в память содержимого файла (с. 173). BSAVE спецификация-файла, смещение, длина Запись на диск- содержимого области памяти (с. 173). CALL переменная [(аргумент) [.аргумент]...)] Передача управления подпрограмме на машинном языке (с. 183). CDBL(x) Преобразование числа к двойной точности (с. 37). CHAIN [MERGE] спецификация-файла[.[номер-строки] [,[ALL] [,DELETE диапазон-строк] ] ] Загрузка программы в основную память и передача ей управле¬ ния (с. 166). 1 у, xl, х2, у\. у2— любое числовое выражение; п, р — любое числовое выражение, которое перед использованием будет преобразовано к целому типу. 13 Заказ 2634 193
CHR$(n) Получение символа, соответствующего заданному коду в таблице кодов ПЭВМ (с. 37). CINT(x) Преобразование числа к целому типу (с. 37). CIRCLE (х,у) .радиус [, [цвет[.начало] .конец [.сжатие] ] ]. Вычерчивание на экране эллипса (окружности) (с. 127), CLEAR [,[п][,р]] Инициализация области данных программы (с. 175). CLOSE [[#] номер-файла[.[^]номер-файла]...] Завершение обработки файла (с. 58). CLS Стирание экрана (с. 59). COLOR [передний-план] [, [фон] ] [.окаймление] Оператор управления цветом изображения на экране в текстовом режиме (с. 60). COLOR [фон] [,палитра] Управление цветом изображения на экране в графическом режиме (с. 120). COMMON переменная[.переменная]... Передача данных загружаемой программе (с. 167). CONT Возобновление выполнения программы после остановки (с. 168), COS(x) Вычисление косинуса (с. 38). CSNG(x) Преобразование чи.сла: к обычной точности (с. 37). CSRLIN Получение номера строки активной страницы, в которой нахо¬ дится курсор (с. 65). CVI (строка-2). CVS (строка-4). CVD (строка-Ъ) Представление строки символов величиной числового типа (с. 109), 194
DATA константа[,константа] ... Создание списка констант, читаемого оператором READ (с. 41). = переменная — оператор. Задание текущей даты переменная = DATE$ — функция. Функция получения текущей даты (с. 39). DEF Fbtofl[(параметр[,параметр] ...)]= выражение Определение функции пользователя (с. 39). DEF SEG[ = adpec] Задание адреса текущего сегмента данных (с. 172). DEFDBL буква[-буква][,буква[-буква]] ... DEFINT буква[-буква] [,буква[-буква]] ... DEFSNG буква[-буква][,буква[-буква]] ... DEFSTR буква[-буква][,буква[-буква]] ... Определение типа переменной по умолчанию (с. 31). DEF USR[n] — смещение Задание начального адреса подпрограммы на машинном языке, вызываемой как функция (с. 185). DELETE [номер-первой-строки] [номер-последней-строки] Команда удаления строк программы (с. 159). DIM имя-массива(размерность) [,имя-массива (размерность)] ... Объявление массива (с. 32). DRAW строка Вычерчивание фигур с помощью команд языка графического вывода (с. 134). EDIT номер-строки Вывод строки для дальнейшего редактирования (с. 161). END Завершение выполнения программы (с. 49). 13* 195
EOF {номер-файла} Получение признака конца файла (с. 103). ERASE имя-мае сив а[,им я-мае с ив а] Удаление массивов (с. 33). ERL Выдача номера строки, содержащей ошибку (с. 177). ERR Выдача кода ошибки (с. 177). ERROR п Моделирование ошибок Бейсика. ЕХР(х) ех (с. 38). FIELD \^]номер-файла,поле AS переменная[,поле AS переменная]... Распределение памяти для переменных в буфере файла с произ¬ вольным доступом (с. 107). FILES спецификация-файла Вывод на экран оглавления диска (с. 170). FIX(x) Преобразование числа к целому отбрасыванием дробной части числа (с. 38). FOR переменная = начальное-значение ТО конечное-значение[5ТЕР приращение] Определение начала цикла (с. 46). (выражение} Определение объема свободной памяти (с. 175). GET [#]номер-файла[,номер-записи] Чтение записи файла с произвольным доступом в буфер файла (с. 111). GET (xl,t/l) — (х2,у2) ,имя-массива Получение информации о цвете точек области экрана (в графиче¬ ском режиме) (с. 138). GOSUB номер-строки Переход к подпрограмме (с. 50). 196
GO TO номер-строки Безусловный переход (с. 44). НЕХ$(х) Преобразование числа в шестнадцатеричную систему счислении (с. 38). IF х[,] THEN группа операторов [ELSE группа операторов] IF х[,] GO ТО номер-строки[[,] [ELSE группа операторов] Условный переход (с. 45). INKEY$ Ввод символов с клавиатуры (с. 88). INP (номер-порта) Чтение байта данных из указанного порта машины (с. 176). INPUT [;] [строковая-константа]переменная[,переменная] ... Ввод данных с клавиатуры (с. 84). INPUT ^номер файла, переменная^,переменная] ... Чтение данных из последовательного файла или клавиатуры (с. 102). INPUT$(п[,[41=]номер файла]) Чтение заданного количества символов из последовательного фай¬ ла или клавиатуры (с. 102). INSTR([п,] ст рока, подстрока) Поиск подстроки в строке символов (с. 38). INT(x) Вычисление наибольшего целого, которое не превышает заданное значение (с. 38). KEY п,строка KEY OFF KEY ON KEY LIST Установка или отображение значения функциональных клавиш. Присвоение номера комбинации клавиш (с. 92). KEY (п) ON KEY (п) OFF KEY(n) STOP Активизация программы обработки функциональной клавиши, клавиши управления курсором или комбинации клавиш (с. 94). 197
KILL спецификация-файла Удаление файла с диска (с. 170). LEFT$ (строковое-выражение,п) Выделение п левых символов строки (с. 38). LEN (строковое-выражение) Определение длины строки (с. 38). [LEI] пе ре менная=выражение Присваивание переменной значения выражения (с. 40). LINE [ (х 1 ,у\) ] - (х2,у2) [, [цвет] [, [В [F] ] [,маска] ] ] Вычерчивание на экране линии или прямоугольника (с. 123). LINE INPUT [;][строковая-константа\]переменная Ввод строки символов с клавиатуры (с. 86). LINE INPUT ^номер-файла, переменная Чтение строки символов из последовательного файла (с. 102). LIST [номер-первой-строки] [,— [номер-последней-строки]] Вывод программы на заданное устройство (с. 158). LLIST [номер-первой-строки] [— [номер-последней-строки] ] Распечатка текста программы (с. 162). LOAD спецификация-файла[#] Загрузка программы в основную память (с. 164). ЕОС(номер-файла) Получение информации о текущем состоянии файла (с. 112). LOCATE [строка] [, [столбец] [,[курсор] [,[шпшло][,конег{]] ] ] Управление курсором (с. 63). LOF (номер-файла) Определение размера файла (с. 112). LOG(x) Вычисление натурального логарифма (с. 38). LPOS(n) Определение текущей позиции в буфере печатающего устройства (с. 79). 198
LPRINT [список-выражений] [;] LPRINT USING шаблон; список-выражений[;] Вывод данных на печатающее устройство (с. 78). LSET строковая-переменная = строковое-выражение Пересылка данных в буфер файла с произвольным доступом (с. 108), MERGE спецификация файла Включение программы из файла в программу в основной памяти (с. 165). МАи$(строковое-выражение,п[,р]) — функция. Выделение части строки (с. 38). MAD$ (строковая-переменная-\,п[,р]) = строковая-переменная-2 — оператор. Выделение и замена части строки (с. 43). МК1$(целочисленное-выражение) МК8$(вЬ1ражение-с-обь1чной-точностью) МК&$(выражение-с-двойной-точность1о) Представление величины числового типа строкой знаков (с. 108). NAME старое-имя AS новое-имя Переименование файла (с. 170). NEW Удаление программы из основной памяти и подготовка к созда¬ нию новой программы (с. 161). NEXT [переменная] [,переменная] .., Завершение работы цикла (с. 47). ОСТ$(л) Преобразование числа в восьмеричную систему счисления (с. 38). ON ERROR GO ТО номер-строки Определение подпрограммы обработки ошибок (с. 177). ON х GO ТО номер-строки[,номер-строки] ... 199
ON x GOSUB номер-строки[,номер-строки] ... Передача управления в зависимости от значения выражения (с. 44, 50). ON KEY (п) GOSUB номер-строки Определение подпрограммы обработки нажатия функциональной клавиши, клавиши управления курсором или комбинации клавиш (с. 94). ON PLAY (количество-нот) GOSUB номер-строки Определение подпрограммы обработки освобождения буфера нот (с. 156). ON TIMER (интервал) GOSUB номер-строки Передача управления подпрограмме по истечении интервала вре¬ мени (с. 178). OPEN спецификация-файла [FOR тип-обработки] AS [^]номер-файла [LEN = dлина-записи] OPEN тип-обработки, [#] номер-файла,спецификация-файла [,длина- записи] Подготовка выполнения операций ввода-вывода (с. 55), OPTION BASE п Задание нижней границы измерений массива (с. 33). OUT номер-порта,данные Оператор пересылки байта в указанный порт машины (с. 176). PAINT (х,у) [,■трафарет] [,контур] [,фок] Окрашивание области экрана (с. 129). РЕЕК(смещение) Выборка байта данных основной памяти (с. 173). PLAY' мелодия Воспроизведение мелодии (с. 153). PLAY (х) Определение количества нот, находящихся в буфере нот (с. 156). РМАР (координат а,режим) Преобразование абсолютных координат точки в систему коорди¬ нат, определенную оператором WINDOW, и наоборот (с. 147), 200
POINT(x у} POINT(n) Определение цвета точки экрана или определение координат пос¬ ледней выведенной точки (с. 148). РОКЕ смещение, данные Пересылка данных в основную память (с. 173). Р&$(аргумент) Определение колонки, в которой находится курсор (с. 65). PRINT [выражение['выражение] ...][;] Вывод данных на экран дисплея (с. 68). PRINT USING шаблон, выражение[,выражение] ... [;] Вывод на экран дисплея с преобразованием значений к указан¬ ному шаблону (с. 70). PRINT ^номер-файла,[USING шаблон;]выражение[,выражение] ... Вывод данных в последовательный файл или в буфер файла про¬ извольного доступа (с. 58). PSET(х,у) [,цвет] PRESET(х,у) [щвет] Вычерчивание точки в указанной позиции экрана (с. 121). PUT [#] номер-файла [,номер-записи] Запись данных из буфера в файл с произвольным доступом (с. 110). PUT (х,у) ,имя-массива [,режим] Вывод изображения на экран (с. 139) RANDOMIZE [база] Переустановка базы генерации случайных чисел (с. 43). READ переменная[,переменная] ... Присваивание переменным значений, заданных в операторах DATA (с. 41). REM комментарий Комментарий (с. 27). 201
RENUM [новь1й-номер-строки]\,[старь1й-номер-строки][,приращение]] Перенумерация строк программы (с. 160). RESET Закрытие всех файлов и освобождение буферов ввода-вывода (с. 58). RESTORE [номер-строки] Переустановка списка данных DATA для повторного чтения (с. 42). RESUME [0] RESUME NEXT RESUME номер-строки Возврат из подпрограммы обработки ошибок (с. 177)\ RETURN [номер-строки] Возврат из подпрограммы (с. 51). Щ£НТ$(строковое-выражение,п) Выделение п правых символов строки (с. 38). RND[(x)] Получение случайного числа в диапазоне от 0 до 1 (с. 39). RSЕТ строковая-переменная=строковое-выражение Пересылка данных в буфер файла с произвольным доступов (с. 108). RUN [строка] RUN спецификация-файла[Д] Выполнение программы (с. 164). SAVE спецификация-файла [,А] SAVE спецификация-файла [,Р] Запись программы на диск (с. 162). SCREEN [режим] [,[qeer] [,[активная-страница] [,отображаемая-страница]]] — оператор. Установка режима работы дисплея (для графических дисплеев) (с. 119). 202
SCREEN (строка,столбец [.режим]) — функция. Определение атрибутов в заданной позиции активной страницы буфера экрана (с. 67). SGN(x) Sign(x) (с. 38). SIN(x) Вычисление синуса (с. 38)'. SOUND частота, длительность Подача звукового сигнала (с. 149). SPACE$ (длина) Формирование строки пробелов (с. 38). SPC(n) Вставка заданного количества пробелов в выводную строку (с. 69). SQR(x) Вычисление квадратного корня (с. 38). STOP Прекращение выполнения программы (с. 49). STR$(x) Преобразование числа в его строковое представление (с. 37). STRINGS (длина, выражение) Формирование строки символов (с. 38). SWAP переменная-1, переменная-2 Обмен значениями (с. 42). SYSTEM Завершение работы интерпретатора Бейсика (с. 191). TAB (п) Переход к указанной позиции выводной строки (с. 69). TAN (х) Вычисление тангенса (с. 38). переменная^ TIMES — функция Функция получения текущего времени суток (с. 178). TIME#=переменная — оператор Задание текущего времени суток (с. 178). TIMER Определение текущего времени суток в секундах (с. 178). 203
Г ROFF Включение режима трассировки программы (с, 168). TRON Выключение режима трассировки (с. 168). USR[m] (аргумент) Вызов функции на машинном языке (с. 186). VAL (строковое-выражение) Преобразование числа из символьной формы в числовую (с, 37). VARPTR (переменная) V ARPTR VARPTR$ (переменная) Определение адреса переменной или блока управления файлом WIEW [[SCREEN] [(xl,г/1) — (х2,у2)] [,[цв?т] [,[контур]]]]] Определение «окна» (с. 143). WAIT номер-порта, п[,р] Приостановка выполнения программы с опросом состояния вход¬ ного порта машины WHILE числовое-выражение Начало цикла по условию (с. 48). WEND Конец цикла по условию (с. 48). WIDTH длина-строка ^[ОТН-номер-файла,длина-строки WID Т Н у строй ство, н ом ер-ст роки Установка длины входной строки (с. 60, 80). WINDOW [[SCREEN] (xl,r/l) - (х2,у2)] Функция переопределения координат точек экрана (с. 145). WRITE [выражение [, (выражение]...] Вывод данных на экран дисплея (с. 75). WRITE ^номер-файла,выражение],выражение]... Замена данных в файле (с. 58, 99). 204
ОГЛАВЛЕНИЕ ПРЕДИСЛОВИЕ ..... ..... 3 ЧАСТЬ 1. ВВЕДЕНИЕ В СИСТЕМУ ПРОГРАММИРОВА¬ НИЯ БЕЙСИК 5 Глава 1. Общие сведения ..... 5 Состав системы программирования 5 Структура программы .... 6 Обозначения 7 Глава 2. Состав персональной ЭВМ . 7 Процессор . 8 Память 9 Клавиатура . „ . г : . 10 Дисплей ..... . 13 Диски . 14 Печатающее устройство . . 14 Глава 3. Работа с Бейсиком на ПЭВМ 15 Вызов интерпретатора .... 15 Уровень команд ..... 16 Встроенный редактор текстов . . 18 Редактирование строки 20 Редактирование программы „ 21 Пример работы с интерпретатором 23 ЧАСТЬ 2. ОСНОВНЫЕ СРЕДСТВА ЯЗЫКА БЕЙСИК . . 26 Глава 4. Основные элементы языка . 26 Алфавит языка 26 Комментарий 27 Данные 28 Константы 28 Переменные . . . ? ; 30 Массивы 32 Глава 5. Выражения. Функции 33 Выражения 33 Функции 36 Глава 6. Присваивание значений 40 Оператор LET 40 Использование списка значений 41 Обмен значениями 42 Замена подстроки . 43 Генерация случайных чисел 43 205
Глава 7. Операторы управления. Подпрограммы . . . . Операторы безусловного перехода Оператор условного перехода IF Операторы организации цикла Завершение программы ...... Подпрограммы ЧАСТЬ 3. ОРГАНИЗАЦИЯ ВВОДА-ВЫВОДА ...... Глава 8. Основные понятия ввода-вывода . Файлы Спецификация файла . . Открытие файла Закрытие файла Глава 9. Вывод данных на экран дисплея Очистка экрана » Установка длины строки экрана Управление цветом символов Общие правила вывода данных на экран , . . Определение положения курсора . Установка текстового режима работы дисплея . , Символы управления дисплеем Чтение атрибута и кода символа Оператор PRINT Оператор PRINT USING Оператор WRITE . . Открытие файла для вывода на экран Глава 10. Вывод данных на печать Управление длиной строки печати Управляющие символы : Открытие файла печати Глава 11. Ввод данных с клавиатуры Оператор INPUT Оператор LINE INPUT Функция INPUT$ Функция INKEY$ Функциональные клавиши : : s Использование клавиатуры для прерывания выпол¬ нения программы Открытие файла для ввода с клавиатуры . . . Глаза 12. Файлы на дисках . Последовательный и произвольный доступ . . . Создание файла с последовательным доступом . Чтение файла с последовательным доступом . . Файлы с произвольным доступом ..... . Открытие файла с произвольным доступом . . Объявление переменных в буфере файла . . . Вывод записи в файл . . Чтение записи из файла Получение информации о файле Примеры обработки файлов с произвольным дос¬ тупом .. . 44 44 45 46 49 50 52 52 52 54 55 57 58 59 60 60 62 65 65 67 67 68 70 75 76 77 79 80 81 83 84 86 86 88 91 93 96 96 97 99 101 104 105 106 110 111 112 112 ЧАСТЬ 4. РАСШИРЕННЫЕ ВОЗМОЖНОСТИ СИСТЕМЫ ПРОГРАММИРОВАНИЯ БЕЙСИК 115 Глава 13. Графика 115 Фон, передний план п окаймление ...... 117 206
Координаты точек экрана графического дисплея 118 Переключение режимов работы графического дис¬ плея . . . 118 Управление цветом в графическом режиме ... 119 Отображение точки .... 121 Построение отрезка прямой .... .... 123 Построение окружности .... 127 Раскраска областей экрана .... ... 129 Язык графического вывода .... .... 134 Операторы GET и PUT .. 138 Определение «окон» . . . э 143 Переопределение координат точек . 145 Функции графической обработки . ... 147 Глава 14. Воспроизведение звука ... 148 Управление динамиком ... . . . . 149 Музыка. Оператор SOUND ... .... 151 Музыка. Оператор PLAY . .. .... 153 Фоновая музыка . .; ; ; 156 Глава 15. Разработка программ 158 Редактирование и распечатка программ .... 158 Запись программ на диск ... ..... 162 Загрузка и выполнение программ 164 Отладка программ ... 168 Работа с дисковыми файлами ........ 169 Глава 16. Дополнительные возможности 171 : Работа с памятью и портами 171 Обработка ошибок 177 Работа с таймером 178 Глава 17. Использование подпрограмм на машинном языке 179 Распределение памяти для подпрограмм .... 180 Вызов подпрограмм 183 ЛИТЕРАТУРА 187 ПРИЛОЖЕНИЯ . . : y s 188 Приложение 1. Список зарезервированных слов . . . 188 Приложение 2. Коды ПЭВМ 189 Приложение 3. Запуск системы программирования Бейсик 190 П р и л о ж е н и е 4. Операторы, функции и команды ... 193
Практическое (производственное) издание Кучура Николай Алексеевич, Ходош Михаил Викторович, Цагельский Владимир Иосифович ПЕРСОНАЛЬНЫЕ ЭВМ ЕДИНОЙ СИСТЕМЫ. БЕЙСИК Зав. редакцией И. Г. Дмитриева Редактор Л. Д. Григорьева Худож. редактор С. Л. Витте Техн, редактор Е. Д. Кузнецова Корректор Г. А. Башарина Переплет художника Л. Е. Безрученкова ИБ № 2129 Сдано в набор 25.03.88. Подписано в печать 7.06.88. А 11206. Формат 84Х108'/з2. Бум. Кн.-журн. Гарнитура «Литературная». Печать высокая. Усл. п. л. 10,92. Усл. кр.-отт. 11,13. Уч.-изд. л. 10,73. Тираж 50 000 экз. Заказ 2634. Цена 55 коп, Издательство «Финансы и статистика», 101000, Москва, ул. Чернышевского, 7. Областная типография управления издательств, полиграфии и книжной тор¬ говли Ивановского облисполкома, 153628, г. Иваново, ул. Типографская, 6.
55 коп,