BETA BASIC
Продолжение. (Начало см. на стр. 3,47,91,135)
53. SAVE <строка TO строка;> устройство;> имя
SAVE DATA <УСТРОЙСТВО;>имя
См. также DEFAULT <устройство>
В отличие от стандартного БЕЙСИКа, Бета-Бейсик позволяет выгружать не всю программу, а только ее часть, а также выгружать отдельным блоком программные переменные. Параметр <строка TO строка> указывает, начиная с какой строки производится выгрузка и по какую. Если он не указан, то выгружается вся программа целиком.
В форме SAVE DATA этот оператор служит для выгрузки только программных переменных. Если номер устройства, на которое должна происходить выгрузка, не указан, то выгрузка производится на ленту (если ранее оператором DEFAULT не было задано какое-либо иное устройство в качестве основного). Если же номер устройства задан, то выгрузка производится на соответствующий микродрайв (если командой DEFAULT в качестве устройства ввода/вывода не были назначены локальная сеть или последовательный порт RS232).
Примеры
SAVE 10 TO 200; "fragment" -часть программы, начиная с десятой строки по строку 200 включительно выгружается на ленту под именем "fragment".
SAVE 900 ТО;"Ьох" - под именем "Ьох"выгружается часть программы, начиная со СТРОКИ 900 и до конца.
SAVE DATA "vars3" - под именем "vars3" выгружаются все программные переменные.
SAVE 20 TO 70;2;"bit" - под именем "bit" на микродрайв номер 2 выгружается часть программы, начиная со строки 20 по 70-ую.
ВНИМАНИЕ!
1. Если Вы захотите загрузить ранее выгруженную часть программы или блок программных переменных, то имейте в виду, что после команды LOAD стирается имевшаяся в компьютере Бейсик-программа, включая и нулевую строку. Блок программных переменных тоже трактуется как программа, не имеющая номеров строк.
Во избежание подобных коллизий Вам целесообразно подгружать ранее отгруженные фрагменты с помощью команды MERGE.
2. Одно из важнейших назначений команды SAVE строка TO строка состоит в том, чтобы Вы могли отгружать свои процедуры по-отдельности и формировать из них на кассете библиотеки процедур для последующего использования. Узнать начальные и конечные номера строк для каждой процедуры можно с помощью ранее рассмотренной команды LIST PROC.
Может быть, вы сочтете целесообразным перед выгрузкой процедуры переместить ее в конец программы, поменяв в ней номера строк с помощью команды RENUM и впоследствии использовать с помощью команды MERGE.
3. Наиболее целесообразное применение оператора SAVE DATA для отгрузки состояния программы. Если вы написали игровую программу, имеющую большую продолжительность, то с помощью такой команды сможете дать пользователю возможность отложить игру. Впоследствии он сможет начать ее сначала или продолжить, загрузив отложенный блок программных переменных.
54. SCROLL код направления <,число> <;x,y; ширина, длина>
Клавиша: S
См. также ROLL
Команда SCROLL имеет синтаксис очень похожий на синтаксис команды ROLL (следует сначала прочитать раздел о команде ROLL). Основное отличие состоит в том, что команда SCROLL может быть использована без параметров, а команда ROLL не может. В этом случае SCROLL вызывает скроллинг экрана на одно знакоместо вверх.
Если за командой стоит код направления 5,6,7 или 8, то текущее окно (а обычно это весь экран) будет передвинуто в заданном направлении (направление смещение стандартно для "Спектрума"):
5 - влево 6 - вниз
7 - вверх 8 - вправо
Когда часть изображения выходит за пределы экрана, она безвозвратно теряется. С противоположной стороны экрана вытягивается чистое поле.
Команда может действовать не на весь экран, а только на заданное окно. В этом случае следует задать параметры.
X, Y - координаты левого верхнего угла окна (задаются в пикселах), система координат та же, что и для команд PLOT и DRAW.
Ширина - размер окна по горизонтали (задается в знакоместах).
Длина - размер окна по вертикали (задается в пикселах).
Обе команды и SCROLL и ROLL широко применяются при разработке игровых программ, а также в различных графических приложениях. Попробуйте поэкспериментировать с теми примерами, которые были приведены для команды ROLL, заменив команду на SCROLL и посмотрите на разницу их действия.
А вот пример небольшой программы, которая передвигает по экрану символьную строку.
100 LET a$="HAPPY NEW YEAR"
110 FOR с = 1 TO LEN a$
120 PRINT AT 10,31; INK 7; A$(c)
130 FOR p=1 TO 8
140 SCROLL 5; 0,95;32,8
150 NEXT p
160 NEXT c
170 FOR p=1 TO 255
160 SCROLL 5; 0,95; 32,8
190 NEXT p
Обратите внимание на то, что в строке 120 устанавливается белый цвет INK (предполагается, что исходно цвет PAPER тоже белый). В этом случае символы, печатаемые в позиции 10,31 оказываются невидимыми и только по мере смещения влево командой SCROLL проявляются на экране. Печать символов по одному выполняет цикл по "с" (строки 100...160). Смещение их влево на одно знакоместо выполняет первый цикл по "p" (строки 130...160), а второй цикл по "p" (строки 170...190) выводит текст за пределы экрана.
Эти же принципы могут быть использованы для изящной выдачи текстов на экран, например при печати информационных сообщений. 200 DATA "Данным давно в далекой" 210 DATA "галактике жили были..." 300 FOR k=1 TO 2: READ a$ 310 PRINT AT 21,0; INK 7; a$ 320 FOR P=1 TO 8: 330 SCROLL 7 340 NEXT p З5О NEXT k З6О FOR p=1 TO 176 370 SCROLL 7 380 NEXT p
55. SORT
или
SORT INVERSE строковый массив или числовой массив
или символьная строка
Клавиша: M
Команда SORT переорганизует символьные строки или символы или числа в восходящем или в нисходящем порядке. Рассмотрим для начала ее работу с символьными массивами на примере следующей программы, которая генерирует 100 десятибуквенных символьных строк. (Вы можете ускорить работу этой программы, если воспользуетесь вместо стандартной функции БЕЙСИКа RND функцией Бета-Бейсика RNDM, о которой речь пойдет ниже.)
100 DIM a$ (100, 10)
110 FOR s=1 TO 100
120 FOR p=1 TO 10
130 LET a$(s,p) = CHR$(RND*25+65)
110 NEXT p
150 NEXT s
160 GO TO 200
170 SORT a$
200 FOR s = 1 TO 100
210 PPINT a$(s)
220 NEXT s
Как только массив будет сгенерирован (а это займет определенное время), программа распечатает его в том порядке, в каком он получится.
Теперь дайте прямую команду GO TO 170 (только не RUN, а то массив будет утрачен) и Вы увидите, как тот же массив будет распечатан в алфавитном порядке.
Сортировка 100 строк займет 0.2 секунды и это время очень мало зависит от длины строк, но сильно зависит от их количества. Сортировка массива длиной 200 строк займет примерно 0.7 сек., а для массива в 400 строк - около трех секунд.
Строки сортируются в порядке возрастания кодов первых символов. Если Вы не знаете, какому символу какой код соответствует, то распечатайте себе на память эту таблицу:
100 FOR i=32 TO 127 110 PRINT i, CHR$ i 120 NEXT i
Если в строке 170 SORT a$ заменить на SORT INVERSE a$, то массив будет отсортирован и распечатан в обратном порядке.
Вы можете сортировать не весь массив, а только его часть, например:
SORT a$ (1 TO 20)
отсортирует только первые 20 элементов массива, а команда
SORT a$(30 TO)
отсортирует все элементы, начиная с тридцатого и до конца.
Можно поступить еще хитрее и отсортировать массив не по первому символу, а например по второму и всем последующим.
SORT a$ () (2 ТО)
В этом случае первый символ не будет приниматься во внимание. Как видите, нам пришлось применять скобки дважды.
Команда SORT позволит Вам создавать и эксплуатировать простые, надежные и гибкие базы данных.
Когда мы говорим о базах данных, то массив, о котором шла речь, будем считать файлом, а его символьные строки - записями. В записи можно выделить различные области для разной информации, назовем их полями. Например, первые 20 символов записи отведем для имени вашего партнера. Это будет поле "ИМЯ". Следующие 20 символов отведен для его адреса - поле "АДРЕС", и, наконец еще один символ - для записи возраста -поле "ВОЗРАСТ". Всего на запись уйдет 41 символ.
Встает вопрос, каким образом одним символом выразить двузначный возраст. Это возможно. Одного символа достаточно для выражения возраста от 0 до 255, если сделать так:
LET a$(s;41) - CHR$ n,
где s - номер записи в Вашей базе, а n- возраст партнера.
Такая форма хранения чисел достаточно проста и экономит память. Но что делать, если нам понадобится хранить более сложную информацию, например размер сберегательного счета. Вы можете воспользоваться следующий приемом: LET a$ (s,41 TO 46) = STR$ b
где b - содержимое расчетного счета. Это число будет храниться в виде строки, например: "100" или "22375".
Правда, при этом возникает один недостаток, связанный с тем, что числа будут выровнены по левому полю и сортировка сработает неправильно. Посмотрите, если у Вас есть три записи "9", "75" и "500", то после сортировки они расположатся в порядке:
500 75 9
Причина в том, что левое поле при сортировке является первич-7
Первый выход из положения прост, но неудобен. Вам всегда придется помнить об этой особенности и. вводя числа в свою базу, добавлять необходимое число ведущих нулей:
000009 000075 000500
Более грамотный выход - следующий. Прежде, чем заносить данные по полю "СЧЕТ" в массив, программа должна переформатировать их так, чтобы они были выровнены не по левому полю, а так, чтобы их десятичные знаки занимали одинаковые положения. Сотни -под сотнями, десятки - под десятками, тысячи - под тысячами и т.п. Тогда наш пример по результатам сортировки выглядел бы так:
9 75 500
Такое форматирование можно сделать с помощью функции Бета-Бейсика USING$, о которой мы расскажем чуть ниже. Пример ее использования выглядит так: LET a$(s, 41 TO 46) = USING$; ("000.00",b)
Теперь вы можете сортировать свои записи по полям "ИМЯ", "АДРЕС", "СЧЕТ". Вы можете, например, отсортировать базу по именам, а затем первые двадцать записей - по размеру счета и т.п. Вы можете сортировать их как в восходящем, так и в нисходящем порядке.
Конечно, вам следует принять меры предосторожности при заполнении базы, чтобы не нарушить ее структуру, т.е. внося имя партнера следует его всегда записывать с первой позиции и никогда не продолжать за двадцатую, иначе нарушится поле "АДРЕС". Впрочем, все меры предосторожности следует делать программно, проверяя вводимые с помощью INPUT данные и тогда ошибки можно исключить.
Мы разобрались с символьными массивами, но команда SORT может работать и со строковыми переменными: INPUT s$: SORT s$: PRINT s$
Если Вы здесь по команде INPUT введете строку "Fred Bloggs", то на печать получите " BFdegglors".
Это не выглядит очень полезным, но позволяет работать с числовыми данными в тех случаях, когда они представлены символьными строками, а мы на наших страницах уже неоднократно упоминали о том, что это весьма экономичный способ хранения чисел в памяти компьютера.
Команда SORT может работать и с числовыми массивами, как с одномерными, так и с двумерными. Синтаксис ее применения тот же, что и при работе с символьными массивами. Двумерные массивы мы можем представлять для себя в виде таблиц, в которых первая размерность - это номер ряда, а вторая - номер столбца. Так, команда
SORT b (1 TO 20) (2)
отсортирует первые двадцать рядов таблицы по второму столбцу. Обратите внимание на то, что мы всегда должны использовать хотя бы одну пару скобок при имени массива b() для того, чтобы компьютер отличал массив от простой переменной b, даже и в тех случаях, когда внутри скобок ничего не стоит.
SORT b()
Если используется и вторая пара скобок (для указания номера столбца, по которому производится сортировка), в ней должно быть не более одного числа, в отличие от сортировки символьных массивов.
Сортировка числовых массивов идет примерно в четыре раза медленнее, чем сортировка строковых массивов. Это связано с необходимостью иметь дело с интегральной (пятибайтной) формой записи чисел в "Спектруме" (см. "Программирование в машинных кодах"; М:, "ИНФОРКОМ", 1990, 1992).
В отличие от сортировки символьных массивов и строк, при числовой сортировке первыми идут более высокие числа, а затем низкие. Сделать порядок следования чисел возрастающий можно очевидно командой SORT INVERSE.
56. SPLIT (не ключевое слово).
Фактически вместо этой команды вводится символ "<>".
Клавиша SYMBOL SHIFT + W (не в графическом режиме, а в обычном).
Фактически это не оператор языка, а дополнительная возможность редактирования программы. Если Вы редактируете очень длинную строку (она находится в нижней части экрана) и хотите часть ее ввести в программу, а с оставшейся частью продолжить работу, то можете самым первый символом в любом операторе строки поставить символ "<>" и нажать ENTER. в этом случае начало строки до этого символа перейдет в программу со своим номером строки, а оставшаяся часть останется в области редактирования с тем же номером строки и курсором справа от него, чтобы вы могли первым делом изменить его так, как Вам надо.
Например, в нижней части экрана у вас было: 10 PRINT "hello": GO TO 10: <> PRINT "goodbye"
Если Вы теперь нажмете ENTER, то в листинг программы пойдет: 10 PRINT "hello": GO TO 10
а в нижней части останется: 10 (курсор) PRINT "goodbye"
Теперь Вы можете изменить номер строки и, соответственно, отправить эту строку в ту часть программы, в какую хотите, но можете передумать и "подшить" ее к десятой строке с помощью команды JOIN.
57. TRACE номер строки
или
TRACE: оператор: оператор:..
Клавиша: Т.
Эта команда относится к разряду отладочных. С ее помощью вы можете запускать БЕЙСИК-программу на выполнение с постоянной распечаткой результатов заданной строки, заданного оператора или заданной переменной. При этом Вы можете изменять (замедлять) скорость исполнения программы.
Существуют две формы оператора TRACE.
1. TRACE номер строки - вызывает переход GO SUB к этой строке перед исполнением любого оператора в Вашей программе. Это не относится к операторам самой этой строки, а то программы бы зациклилась.
2. Вторая форма: TRACE оператор, оператор: ....
В этой случае перед исполнением любого оператора вашей программы исполняется
последовательность операторов, стоящих после TRACE.
И в том и в другом случае, при использовании оператора TRACE Вам доступны две вспомогательные переменные - lino и stat.
LINO - это номер строки, которая сейчас будет выполняться. STAT - номер оператора в этой строке, который сейчас будет исполняться.
При исполнении трассирущей подпрограммы режим TRACE естественно отключается и вновь будет включен по оператору RETURN, который завершает эту подпрограмму. Содержимое подпрограммы можете избрать любое, например: 9000 PRINT INVERSE 1: lino:":"; stat: RETURN
Введите эту подпрограмму в свою программу и введите команду TRACE 9000 в ту точку программы, с которой хотите начать отладку.
Если Вы хотите воспользоваться второй формой оператора TRACE, то можете не вводить строку 9000, а вставить в ту строку, с которой хотите начать отладку, последовательность операторов:
TRACE: PRINT INVERSE 1; lino; ":"; stat: RETURN
Отключить режим трассирования, начиная с какой-то строки в Вашей программе можно вставив туда оператор TRACE 0.
Приведенная выше TRACE-подпрограмма позволит получить на экране номера строк и номера операторов, исполняемых Вашей программой в любой момент. Для того, чтобы отличать их от тех данных, которые программа должна выдавать на экран сама по себе, включен режим инверсной печати INVERSE 1.
Если Вы хотите, чтобы не только номера исполняемых строк, но их содержимое было постоянно перед глазами, Вы можете использовать команды: LIST lino TO lino
или
LIST lino-1 TO lino
Если у Вас задан интервал между строк больше, чем 1, вторая команда будет отличаться от первой тем, что при печати содержимого строк не будет изображаться позиция курсора.
Команды RUN и CLEAR также отбивают режим трассирования, как и TRACE 0.
Если Вы хотите замедлить исполнение программы, введите в подпрограмму TRACE оператор PAUSE или сделайте это иным доступным Вам способом, например через ВЕЕР.
Вы можете распечатать также и содержимое интересующих Вас переменных, задав их печать в подпрограмме, но тогда постарайтесь, чтобы эти переменные были объявлены как можно ранее в Вашей программе, иначе можете получить сообщение "Variable not found".
Чтобы отличать ту печать, которую делает оператор TRACE от той, которую ведет сама программа, Вам может быть захочется использовать оператор PRINT AT (a это может пригодиться, если программа строит некоторое графическое изображение и Вы не хотите его нарушать посторонней печатью). Но в этом случае Вам придется позаботиться о том, чтобы перед вызовом трассирующей подпрограммы запоминались координаты текущей позиции печати, а после ее исполнения они бы восстанавливались. Нижеприведенная подпрограмма позволит это сделать: 9000 LET POS = DPEEK(23688)
9010 PRINT AT 0,0; lino;":";slat; " ","a$= "; a$ 9020 DPOKE 23688, POS: RETURN
Системная переменная SPOSN, расположенная в адресах 23688 и 23689 хранит информацию о текущих координатах позиции печати. Запоминая и восстанавливая ее через переменную POS, Вы добьетесь того, чего хотели.
Поработав какое-то время с Бета-Бейсиком, Вы сами для себя выработаете наиболее удобную отладочную процедуру и тогда сможете присвоить ее с помощью команды DEF KEY какой-либо клавише и отгрузить вместе с самим Бета-Бейсиком на ленту, чтобы впоследствии вызывать одним нажатием тогда, когда надо.
58. UNTIL условие.
Клавиша: К.
Оператор позволяет исполнять циклы DO - LOOP до тех пор, пока "условие" не станет
справедливым.
Подробности см. в описании операторов DO - LOOP.
59. USING, USING$
Клавиша: U.
И USING и USING$ служат для того, чтобы задать формат, в котором Вы хотите распечатать числа. Оператор USING самостоятельно не используется, а употребляется только в качестве квалификатора оператора PRINT или LPRINT, в то время, как USING$ является функцией, имеет самостоятельное значение в виде символьной строки. Функция USING$ выдает символьную строку такой, какой она могла бы быть напечатана при использовании оператора PRINT USING. Благодаря этому появляется возможность использовать форматированные строки не только с командой PRINT, но и с любой другой, например LET, которая может работать со строками.
При использовании USING или USING$ желаемый формат задается в виде форматной строки. Это символьная строка, в которой знаком "хэш" (#) обозначены ведущие пробелы, символ "ноль" обозначает ведущие нули и любой из них может служить для указания значащих цифр после десятичной точки. 100 FOR n=1 TO 30: 110 LET X-RND*100 120 PRINT х, USING "###.##";х 130 NEXT n
Вы получите на экране два столбца. Слева - неотформатированная печать, а справа -отформатированная. Обратите внимание насколько она выглядит аккуратнее. Попробуйте в строке 120 изменять форматную строку и посмотрите, как будет меняться результат. Обратите также внимание, что при форматировании чисел с помощью USING происходит их округление до заданной в формате десятичной цифры.
А вот еще несколько примеров того, как работает форматная строка для числа 12.3456.
"##.#" 12.3
"###.#" _12.3
"####.##" _12,35
"000.00" 012.35
"00" 12 "$00.00" $12,35
"0.00" %. . 3
Предпоследний пример демонстрирует возможность использования в форматной строке произвольных символов, а не только знаков "#" и "0".
Последний пример демонстрирует случай переполнения формата. Нельзя одним знаком выразить двузначную целую часть - об этом свидетельствует символ %, выводимый на печать, как индикатор ошибки.
Функция USING$ очень похожа на оператор USING. Разницу продемонстрируем на примерах. Вместо PRINT USING a$; number
можно сделать PRINT USING$ (a$, number) или
LET b$ = USING$ (a$,number) PRINT b$
60. VERIFY <строка TO строка;> устройство;> имя
VERIFY DATA <устройство:>имя
Как и стандартная команда VERIFY, эта команда с параметрами служит для проверки правильности выгруженного на ленту или микро-драйв блока данных (программы или ее фрагмента).
Мы не будем останавливаться на синтаксисе команды - он в точности соответствует синтаксису команд SAVE и SAVE DATA, рассмотренных ранее.
61. WHILE условие.
Клавиша: J.
Оператор позволяет исполнять циклы DO - LOOP до тех пор, пока "условие" справедливо.
Подробности см. в описании операторов DO - LOOP.
62. WINDOW номер окна <,x,y,w,l>
Клавиша: 5.
См. также CLS, CSIZE.
Команда WINDOW позволяет Вам назначить часть экрана для выдачи информации при печати или листании. Если окон несколько, то каждое имеет текущую координату позиции печати, а также статусы OVER, BRIGHT, FLSH, INK, PAPER и CSIZE.
В качестве номера окна Вы можете использовать любое число от 1 до 127, причем заданное Вами число не имеет никакого специального значения - это просто опознавательный номер, присущий данному окну.
Все параметры, присвоенные каждому окну, хранятся выше адреса RAMTOP (который, если надо, понижается). Это защищает данную информацию от уничтожения командой NEW и позволяет выгрузить ее на ленту вместе с кодом самого Бета-Бейсика.
Нулевое окно - это весь экран и именно оно является "текущим окном" в момент первого запуска Бета-Бейсика. Это означает, что исходный размер символов и установка цветов - стандартные. Чтобы задать иное окно, Вы можете делать например так: WINDOW 1,0,175,128,176
Заданное окно имеет координаты левого верхнего угла 0,175. Ширина окна - 128 пикселов (пол-экрана), а высота - 176 пикселов (весь экран). Текущий установленный размер символов - стандартный (8x8), а установка цветовых атрибутов соответствует нулевому окну, хотя их можно и изменить.
Мы только что задали первое окно, но это еще не сделало его текущим. Чтобы сделать это, надо дать команду WINDOW, указав при ней только номер окна: WINDOW 1
Указанное окно стало текущим (если оно было задано). Если же вы забыли его предварительно задать, то получите сообщение об ошибке устройства ввода/вывода -"Invalid I/O device". Единственное окно, которое задается автоматически, без Вашего участия - нулевое окно.
После того, как первое окно стало текущим, весь вывод на печать по командам PRINT, LIST, PLOT, DRAW и т.п. будет производиться только в пределах области данного окна, то есть, только на левой половине экрана. Если хотите поэкспериментировать с окнами другого размера, можете изменить определение первого окна или задать любое другое. В любом случае все изменения, которые Вы произведете, будут видны на экране только после того, как Вы дадите команду WINDOW n, даже если окно с номером n перед этим и так было текущим. Только после этой команды начинают действовать параметры окна, установленные при его задании.
При выходе из окна, а точнее говоря при вызове другого окна, сохраняются все параметры, соответствовавшие данному окну CSIZE, INK, PAPER и т.п., включая и координаты текущей позиции печати. Они сохраняются в областях памяти выше уровня RAMTOP.
Когда вы вновь войдете в это окно, вызвав его командой WINDOW n, все эти параметры будут для него восстановлены. Таким образом, Вы можете менять размер печатаемых символов CSIZE и цветовые атрибуты переключением между окнами.
В нижеприведенном примере задаются два окна и поочередно в них производится печать.
10 WINDOW 1,0,175,128,176 20 WINDOW 2,128,151,128,80 30 WINDOW 1: INK 1: PAPER 6 40 WINDOW 2: INK 7: PAPER 1:CSIZE 4,8 50 WINDOW 0
60 PRINT WINDOW 1;"one";WINDOW 2; "two";:GO TO 60
Если Вам надо очистить какое-либо окно, Вы можете использовать оператор CLS n, где n - номер окна, подлежащего очистке. В самом начале программы целесообразно давать команду CLS 0, очищая весь экран и подготавливая его к работе.
Если Вам надо удалить из памяти параметры задания какого-либо окна, для этого служит оператор ERASE WINDOW n
63. XOS, XRG, YOS, YRG.
Это не ключевые слова, а своеобразные переменные, с помощью которых можно изменять масштаб экрана и начало координатной сетки, используемой операторами PLOT, DRAW, DRAW TO, CIRCLE, GET и FILL.
XOS - смешение оси X от стандартной.
YOS - смешение оси Y от стандартной.
У этих переменных есть одна особенность. В отличие от прочих, команды CLEAR и RUN их не уничтожают, а устанавливают в заранее заданное фиксированное значение.
Попробуйте дать команду CLEAR, а затеи сделать PRINT XOS или PRINT xos и вы получите "0", а не "Variable not found", как это было бы для обычных переменных.
Оба смещения имеют нулевые значения, если Вы не зададите иные с помощью команды LET.
LET XOS=128, YOS=88
Такое задание начала координат очень удобно для команды PLOT, т.к. теперь координата X изменяется не от 0 до 255, а от -128 до 127 и, соответственно, координата Y изменяется от -88 до 87.
Команда CLS, как Вы знаете, не только очищает весь экран, но еще и устанавливает текущую позицию печати в координаты 0,0. Если Вы изменили начало координат с помощью xos и YOS, то начальная позиция печати будет устанавливаться после CLS в новое начало координат.
Переменные XRG и YRG определяют масштаб, в котором исполняются команды PLOT, DRAW и пр. Исходное значение XRG = 256 (Вы можете напечатать до 255 различных точек вдоль оси X), а для YRG = 176. Изменив XRG и YRG, Вы меняете масштаб изображения.
10 GO SUB 100: REM normal 20 LET XRG = 128: GO SUB 100 30 LET YRG = 88: GO SUB 100 40 LET XRG = 256: GO SUB 100: 50 STOP
100 CLS: PLOT 0,0: DRAW 50,0 110 DRAW 0,50: DRAW -50,0 120 DRAW 0,-50: PAUSE 100 130 RETURN
По этой программе сначала рисуется нормальный квадрат, затем он вытягивается по оси X, затем по осям X и Y и, наконец, только по оси Y.
Нижеприведенная программа рисует график функции "синус", используя как смещение начала координат, так и изменение масштаба. 100 LET XRG = 2*PI: REM 360 град. 110 LET YRG = 2.2 120 LET YOS = 1.1 130 FOR n=0 TO 2*PI STEP 2*PI/256 140 PLOT n, SIN n: NEXT n
Обратите внимание на то, что величина начального смещения начала координат также подвергается масштабированию в заданном диапазоне.
При изображении дуг или окружностей есть одна особенность. Так, последняя точка дуги будет напечатана в соответствии с новой системой координат и с масштабом, но сама кривая - не подвергнется изменениям. То же относится и к окружности. Центр ее будет помещен в точку в соответствии с новой системой координат и с масштабом, но у Вас нет средств промасштабировать радиус, так что если Вы захотите подобным способом получить растянутую вдоль какой-либо оси окружность, то у Вас ничего не получится.
Есть интересная возможность использования масштабирования. Предположим, что вы подготовили программу для того, чтобы получать графическое изображение на полном экране, после этого Вам захотелось разделить экран пополам (по вертикали) и в правой половине экрана распечатывать листинг программы, а в левой половине - результат ее работы. Это сделать несложно, задав два окна. Но теперь есть проблема в том, что раз графические команды у Вас были рассчитаны на полный экран, то они не смогут работать нормально в его одной половине. В этом случае при переключении на окно Вы можете поменять и масштаб LET XRG = 128.
РАЗДЕЛ 3. ФУНКЦИИ
Бета-Бейсик версии 3.0 имеет более 20 новых функций. Эти функции определены в нулевой строке (которая при листинге не воспроизводится). Там же содержится и указание на машинный код, выполняющий непосредственные расчеты для этих функций.
В программе эти функции существуют как обычные функции, заданные пользователем, а в листинге они являются обычными ключевыми словами. Например, если строка программы содержит FN S$, в листинге это проявляется, как STRING$ и курсор проскакивает это слово за одно нажатие. Функции, заданные пользователем и не являющиеся составной частью Бета-Бейсика, действуют как обычно.
Может случиться так, что Вами ранее уже была подготовлена программа, использующая пользовательские функции, совпадающие с функциями Бета-Бейсика. В этом случае Вам придется поменять обозначения своих функций во избежание конфликта. Это легко можно сделать с помощью команды ALTER.
Ввод имен функций Бета-Бейсика может осуществляться полностью, (если Вы работаете в режимах KEYWORDS 3 или 4) или вводом FN, затем буквы, а затем символа "$" или символа "(". "FN" можно получить нажатием клавиши "Y" в графическом режиме или по буквам. Дополнительные функции Бета-Бейсика не будут работать, если в памяти отсутствует машиннокодовая часть программы Бета-Бейсик. С другой стороны, если будет отсутствовать нулевая строка, то будут потеряны определения функций и Вы получите сообщение об ошибке "FN without DEF". В этом случае остальная часть языка будет работать, но воспользоваться новыми функциями Вы не сможете.
При выгрузке написанной Вами программы нулевая строка выгружается вместе с ней и поэтому если Вы загрузите программу, написанную под Бета-Бейсиком, то нулевая строка будет присутствовать на месте, в то же время, если Вы загрузите программу, написанную ранее в стандартном Бейсике, то нулевая строка погибнет. Поэтому если Вы хотите загрузить в Бета-Бейсик программу, написанную не в нем, то сначала очистите память командой NEW - уберутся все строки, кроме нулевой, а потом подгружайте свою программу с помощью MERGE, что не затронет нулевую строку.
Если же Вы захотите специально удалить нулевую строку, то это можно сделать командой DELETE 0 TO 0.
Ниже мы приводим список новых функций Бета Бейсика.
AND |
FN A( |
BIN$ |
FN B$ |
CHAR$ |
FN C$ |
COSE |
FN C( |
DEC |
FN D( |
DPEEK |
FN P( |
EOF |
FN K( |
FILLED |
FN F( |
HEX$ |
FN H$ |
INARRAY |
FN U( |
INSTRING |
FN I( |
ITEM |
FN T( |
LENGTH |
FN L( |
MEM |
FN M( |
MEMORY$ |
FN M$ |
MOD |
FN V( |
NUMBER |
FN N(I |
OK |
FN O( |
RNDM |
FN R( |
SCRN$ |
FN K$ |
SHIFT$ |
FN Z$ |
SINE |
FN S( |
STRING$ |
FN S$ |
TIME$ |
FN T$ |
USING$ |
FN U$ |
XOR |
FN X( |
1. AND (число, число)
FN A (число, число)
По написанию эта функция похожа на обычное ключевое слово AND, но в программе их можно различить по различному синтаксису. Она выполняет побитную операцию AND для двух чисел от 0 до 65535. Если какой-то бит и в первом числе и во втором равен единице, то только в этом случае соответствующий бит результата тоже будет равен единице. Если хотя бы один из них равен нулю, то и в результате этот бит будет равен нулю.
Чтобы лучше понять, как все это происходит, мы воспользуемся функцией BIN$, о которой речь пойдет ниже. BIN$ (254) = "11111110" BIN$ (120) = "01111000" BIN$(AND(254,120)) = "01111000"
Таким образом, с помощью функции AND можно выключать (маскировать) нежелаемые биты, например:
PRINT AND(BIN 00000111, ATTR(line,column))
Эта конструкция позволит получить значение INK, установленное для знакоместа с координатами (line, column), а прочие цветовые атрибуты в байте окажутся замаскированы. Поскольку BIN 00000111 = 7, то мы могли записать эту команду и так: PRINT AND (7,ATTR(line,column))
Нижеприведенный пример напечатает на экране слово "Bang", если на клавиатуре будет нажата клавиша "F". При этом не имеет значения, какие еще клавиши будут нажаты вместе с ней. В примере клавиатура рассматривается как серия внешних портов. Если Вы не знакомы с тем, как это происходит, читайте нашу книгу ("Программирование в машинных кодах"; М:. "ИНФОРКОМ", 1990, 1992).
10 IF AND(BIN 00001000, IN 65022) = 0 THEN PRINT "Bang! "; 20 GO TO 10
2. BIN$ (число) FN B$ (число)
Функция дает двоичный эквивалент для заданного числа в виде восьмисимвольной строки, если число меньше 256 или в виде шестнадцатисимвольной строки, если число больше 255, но меньше 65535. Речь идет только о целых числах.
Эта функция очень полезна для тех, кто осваивает программирование в машинных кодах и (или) пользуется функциями Бета-Бейсика для битовых операций AND, OR, XOR.
Кроме того, эта функция может пригодиться при работе с генератором символов, с графикой пользователя UDG и при анализе цветовых атрибутов, системных переменных или при опросе клавиатуры, например: 10 PRINT AT 10, 10; BIN$(IN65022) 20 GO TO 10
Символьная строка, выдаваемая этой функцией, - это последовательность нулей и единиц. Может быть, вам захочется, чтобы это были иные символы, например, при распечатывании на экране конструкции шрифта знакогенератора очень удобно вместо единиц иметь крестики, а вместо нулей - пробелы, это тоже можно сделать, если принудительно заслать (РОКЕ) в ячейку 62865 код буквы "X", а в ячейку 62869 - код пробела "
тт
3. CHAR$ (число)
FN C$ (число)
Эта функция позволяет конвертировать целые числа до 65535 в двухсимвольные строки, что позволяет более экономно использовать память и более компактно хранить данные. Эквивалентом из обычного БЕЙСИКа будет следующая конструкция: LET а = ^^(^г^б): LET b = number - a*256 LET с$ = CHR$ a + CHR$ b
Полученная в результате строка не всегда может быть распечатана, т.к. не всегда в результате получается печатный символ. В этом случае может, например, появиться сообщение об ошибке " invalid colour", если в итоге получился символ, являющийся управляющим кодом. Перед печатью на экран желательно сделать обратную конверсию. Это может сделать функция NUMBER, которая заменит двухсимвольную строку на соответствующее ей число. Поскольку на хранение двухсимвольной строки расходуются только два байта, а не пять, как на число, то мы рекомендуем Вам очень серьезно подумать о том, чтобы использовать эти возможности, если Ваша программа обслуживает и хранит большие массивы чисел (что часто бывает в научных расчетах).
Если Вы не можете работать только с целыми числами, то попробуйте воспользоваться преобразованием их. Например, вам надо хранить число 87.643. Умножив его на 100, вы получите 8764.3. Округлите и преобразуйте 8764 в двухсимвольную строку перед сохранением этого числа в памяти. Когда же оно вновь Вам понадобится, сделайте обратное преобразование, с помощью NUMBER преобразуйте двухсимвольную строку в 8764 и поделите результат на 100. Полученное значение 87.64 имеет неплохую точность по сравнению с исходным числом, эта точность достаточна для большинства практических приложений.
Одним словом, действия над числами Вы можете выполнять как обычно, но перед закладкой числа на хранение Вы его конвертируете, а после вызова вновь восстанавливаете. Это в некоторой степени (в небольшой) снизит скорость расчетов, но очень значительно сэкономит расход памяти. Если рассматривать искусство программирования как вечный компромисс между скоростью операции и расходом памяти, то здесь вам есть поле для деятельности.
Нижеследующий пример демонстрирует последовательность манипуляций по преобразованию числового массива так, как было описано выше. 100 DIM a$ (500,2) 110 FOR i = 1 TO 500 120 LET a$(i) = CHR$ (i*10) 130 NEXT i
140 PRINT "Array is ready!"
100 PRINT "Press any key!'
160 PAUSE 0
170 FOR i=1 TO 500
180 PRINT i, NUMBER(a$(i))
190 NEXT i
Полученный в результате массив будет занимать только 1 килобайт, в то время, как при хранении чисел стандартным способом его размер был бы 2.5 килобайта.
Оператор SORT работает с конвертированными в символьные строки массивами совершенно правильно.
4. COSE (ЧИСЛО)
FN C (число)
Это функция "косинус". Она отличается от функции COS стандартного БЕЙСИКа тем, что имеет меньшую (но достаточную в большинстве практических приложений) точность, зато выполняется в шесть раз быстрее.
5. DEC (символьная строка)
FN D (символьная строка)
См. также HEX$ (число).
Эта функция преобразует символьную строку, выражающую шестнадцатиричное
число в целое десятиричное число от 0 до 65535. При этом шестнадцатиричное число должно быть выражено символьной строкой длиной от 1 до 4-х символов, а регистр символов - не имеет значения. DEC ("FF") - 255 DEC ("10") = 16 DEC ("4000") = 16384 DEC ("e") = 14
Эта функция предназначена для обеспечения ввода в программу шестнадцатиричных данных. Например:
INPUT a$: POKE address,DEC(a$)
Использование "пустой строки" или строки, содержащей символы, не являющиеся шестнадцатиричной формой записи дает сообщение об ошибке "Invalid argument".
(Окончание следует).
Михайленко В. С.