ZX-Ревю 1992 №5-6 1991 г.

Beta Basic - команды: DO, DPOKE, DRAW TO, EDIT, ELSE, END PROC, EXIT IF, FILL, GET, JOIN, KEYIN, KEYWORDS, LET, LIST.


BETA BASIC

Продолжение. Начало см. стр. 3,47

16. DO

или DO WHILE <условие>

или DO UNTIL <условие>

Клавиша D (Ключевое слово WHILE находится на клавише J, а ключевое слово UNTIL -на клавише K).

См. также LOOP, EXIT IF.

Конструкция DO - LOOP имеет ряд преимуществ по сравнению с обычным способом организации циклов FOR - NEXT стандартного БЕЙСИКа. Эти преимущества становятся еще более ощутимыми при использовании квалификаторов WHILE и UNTIL.

Без них DO и LOOP являются просто маркерами, отмечающими начало и конец цикла. После того, как программа встретит оператор LOOP, управление передается на оператор DO и т.д.

Пример: 10 DO

20 PRINT "HELLO" 30 LOOP

Эта программа будет печатать бесконечное число раз слово HELLO. Остановить ее можно будет только нажав BREAK.

Действие DO можно изменить с помощью квалификатора WHILE <условие>. Его действие таково:

Если условие стоящее после WHILE справедливо (имеет значение "истина"), то выполняются операторы стоящие после DO до тех пор, пока не встретится оператор LOOP, после чего управление вновь передается на DO и вновь проверяется справедливость условия и т.д. Если же условие "ложно", то вся часть программы, стоящая между DO и LOOP игнорируется и управление передается к оператору, стоящему за LOOP.

Таким образом, та часть программы, которая стоит между DO WHILE <условие> и LOOP выполняется раз за разом, пока <условие> справедливо.

DO UNTIL <условие> имеет прямо противоположное значение. Часть программы заключенная между DO и LOOP выполняется, пока условие "ложно" (иными словами до тех пор, пока условие не станет справедливым).

Пример: 10 LET total = 0 20 DO UNTIL total > 100 30 INPUT "Введите число ";x 40 LET total = total * x 50 PRINT total 60 LOOP

70 PRINT "Получили число больше ста"

В этом примере строку 20 можно было бы заменить такой: 20 DO WHILE total < = 100.

Пары DO-LOOP могут вкладываться точно так же, как FOR - NEXT.

Например:

DO

DO

DO

DO

LOOP DO

LOOP LOOP —

——]

LOOP LOOP -

Компьютер запоминает адрес, по которому в программе хранится оператор DO. Для запоминания служит стек, поэтому нельзя выходить из цикла (перепрыгивать через LOOP), иначе как с помощью EXIT IF или POP. Иначе может произойти "закупоривание" стека и сбой работы в программе.

Если в программе для оператора DO не найден соответствующий LOOP, выдается сообщение об ошибке:

S, "Missing LOOP".

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

REPEAT

операторы UNTIL <условие> аналогично:

DO

операторы LOOP UNTIL <условие> REPEAT

операторы UNTIL FALSE аналогично: DO

операторы LOOP

WHILE <условие>

операторы ENDWHILE (ИЛИ WEND) аналогично:

DO WHILE <условие>

операторы LOOP

17. DPOKE адрес, число

Клавиша: P

См. также DPEEK (адрес), число

DPOKE означает "двойной" РОКЕ.

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

POKE а,n-INT(n/256)*256 POKE а+1,Ш^/256)

Здесь а - адрес

n - число (0...65535)

Другими словами, младший байт засылается по указанному адресу, а старший байт -в следующий за ним адрес. Поскольку многие системные переменные "Спектрума" имеют именно такой двухбайтный формат, то их очень удобно изменять с помощью DPOKE. Аналогично функция DPEEK представляет "двойной" РЕЕК.

18. DRAW ТО x,y <,угол>

Здесь используются два ключевых слова стандартного Бейсика - DRAW и ТО.

Этот оператор вычерчивает линию от текущей графической позиции до точки, заданной координатами x,y. Часто это более удобно, чем использовать стандартный DRAW, при котором задаются не абсолютные координаты, а величина относительного "смешения" по горизонтали и вертикали.

Пример: 10 FOR n=1 ТО 100 20 DRAW TO RND*255,RND*175 30 NEXT n

Если Вы зададите и третий параметр (угол), то сможете изображать кривые.

После TO Вы можете поставить оператор цвета PAPER, INK или атрибут, например OVER и т.п.

DRAW TO 10,10 DRAW TO INK 2;20,30 DRAW TO 100,90,1

18. EDIT <номер строки>

Клавиша: 0 (в обычном, не графическом режиме).

Это не то же самое, что SHIFT + "1". EDIT - это ключевое слово. Оно предназначено для того, чтобы избежать утомительной последовательности: LIST - выбор строки - BREAK -SHIFT + "1".

Для того, чтобы быть по-настоящему полезным, EDIT должен вызываться без нажатия SHIFT-клавиши. Но все буквенные клавиши уже заняты, а цифровые клавиши нужны для ввода номеров строк. В то же время, номера строк не начинаются с нуля, поэтому эту клавишу можно использовать.

Вы закончили набор какой-либо строки. Нажали ENTER. Программа ждет ввода номера очередной строки. Вы нажимаете 0 и получаете ключевое слово EDIT (если даже оно и не появятся, все равно нуль в начале строки означает EDIT). Если после EDIT (или нуля) набрать номер нужной Вам строки и нажать ENTER, эта строка мгновенно будет помешена в нижнюю часть экрана для последующего редактирования.

Если номер строки не указан, то на редактирование поступит текущая строка. Дополнительно для упрощения редактирования введена возможность перемещать курсор по экрану "вверх"/"вниз" в рамках программной строки. Курсор не может вставать внутри ключевых слов, а занимает ближайший пробел. Если Вы попытаетесь поднять его выше, чем вершина строки или опустить ниже нижней строки экрана, он автоматически "прыгнет" в конец программной строки. Самый простой способ добавить что-то к концу строки - вызвать EDIT и затем нажать "курсор вверх".

9. EDIT строковая переменная

или EDIT ; числовая переменная

Клавиша: SHIFT + "5"

EDIT может применяться не только для удобного редактирования строк, но и для простого изменения программных переменных. Для этих целей нельзя использовать нуль в начале строки и введена возможность вызова EDIT нажатием SHIFT + "5" в графическом режиме. Можно также набрать слово EDIT по буквам в режимах KEYWORDS 3 или 4. Типичное применение - внесение изменений в строковые переменные, например для изменения фамилии, имени, отчества, адреса в массиве данных, представляющем из себя базу данных.

Такой массив мог быть заполнен, например с помощью INPUT. Если теперь надо в нем что-то изменить, то это трудоемкая задача для обычного БЕЙСИКа, а здесь с помощью EDIT а$(п) Вы получаете содержимое строки "n" в области редактирования. Рассмотрим пример:

10 LET a$ = "John Brown" 20 EDIT а$ 30 PRINT a$ 40 LET num=365.253 50 EDIT ; num 60 PRINT num

В строке 50 применен знак ";" для того, чтобы отличить режим EDIT <числовая переменная> от режима EDIT <номер строки>. Можно было бы, однако, вместо точки с запятой использовать и запятую, но в этом случае редактируемая переменная была бы изображена, начиная с 16-ой позиции экрана.

EDIT имеет синтаксис, очень похожий на INPUT. Вы можете использовать точку с запятой, запятую, AT, TAB, LINE и строковую подсказку точно так же, как обычно это делают с оператором INPUT. Отличие в том, что редактировать можно только одну переменную. Если Вы попробуете редактировать несколько, то все прочие, кроме первой, будут восприняты, как операторы INPUT. Нижеследующий пример показывает, как можно создавать массивы и редактировать их: 10 DIM а$(10, 15) 20 FOR n=1 то 10 30 INPUT а$(п) 40 NEXT n

50 PRINT "Редактирование" 60 FOR n=1 ТО 10 70 EDIT ("запись ";n;" ");а$(п) 80 NEXT n

Если переменная, подлежащая редактированию в EDIT не существует, то команда полностью эквивалентна INPUT.

20. ELSE <оператор>

Клавиша: Е

ELSE - один из элементов конструкции IF - THEN. Обычно, если условие, стоящее после if несправедливо (ложно), то следующей выполняется строка, стоящая за строкой, содержащей этот IF. Этот порядок можно изменить. Если IF и THEN содержат еще и ELSE, то в случае, когда условие не выполняется, управление передается оператору, стоящему после ELSE. С другой стороны, если условие справедливо, то строка IF исполняется только до ELSE и затем управление передается следующей строке (если THEN не передал его в иное место).

Например: 10 INPUT "Задайте число ";х 20 PRINT "Это число равно 1?" 30 PAUSE 50

40 IF x=1 THEN PRINT "ДА": ELSE PRINT "НЕТ" 50 GO TO 10

Однако, ситуация может быть осложнена, если на одной строке у Вас есть несколько IF THEN ELSE. Тогда может быть трудным определить, что же к чему относится. Приведенные ниже примеры помогут Вам разобраться.

IF..THEN...:IF..THEN...:ELSE...

IF..THEN...:IF..THEN....ELSE...:ELSE

IF..THEN..ELSE..:IF..THEN..:ELSE

Если ELSE используется без IF, например, когда ELSE стоит первым оператором строки, то и ELSE и остальная часть строки игнорируются.

21. END PROC

Клавиша: 3

См. также раздел, посвященный процедурам PROCEDURES; DEF PROC.

Этот оператор отмечает конец процедуры. Благодаря этому компьютер не будет выполнять ничего, стоящего между DEF PROC и END PROC, если процедура не была вызвана. Он просто перепрыгнет через нее за END PROC. Во время же исполнения процедуры, END PROC служит концом ее исполнения. Удаляются локальные переменные (LOCAL) восстанавливаются исходные значения глобальных (GLOBAL) переменных, если они есть. Если в процедуру какие-то параметры передавались по ссылке (перед формальным параметром стояло REF), то текущее значение формального параметра присваивается фактическому параметру, задействованному при вызове.

Если формальный параметр не найден, Вы получите сообщение "Variable not found".

После исполнения процедуры управление передается оператору, стоящему за вызовом процедуры.

Применение END PROC без соответствующего DEF PROC дает сообщение об ошибке:

W, "Missing DEF PROC".

22. EXIT IF <условие>

Клавиша: I

См. также DO, LOOP

Этот оператор является элементом конструкции цикла DO-LOOP (см. соответствующий раздел). EXIT IF используется для того, чтобы выйти по своему желанию из середины цикла DO-LOOP, если условие выполняется. После выхода из цикла управление передает оператору, следующему за LOOP.

Если условие не выполняется, ничего не происходит.

Пример: 100 DO

110 PRINT "строка 110" 120 PAUSE 20

130 EXIT IF INKEY$ = "" STOP 140 PRINT "строка 140" 150 PAUSE 20 160 LOOP

170 PRINT "Выход из цикла"

Программа будет работать до тех пор, пока не будет нажата клавиша "STOP" (SYM. SHIFT + A).

Если в программе опущен оператор LOOP, выдается сообщение ошибке:

S, "Missing LOOP"

23. FILL x,y

или FILL <INK число; > х,у

или FILL <PAPER число;> x,y

Клавиша: F

Команда FILL или FILL INK закрашивает область экрана, окрашенную цветом PAPER в цвет INK, начиная с координат x,y.

Команда FILL PAPER наоборот закрашивает область экрана, окрашенную цветок INK в цвет PAPER.

Закрашивание происходит от точки с координатами x,y во все стороны до тех пор, пока не встретятся участки, уже окрашенные в INK для команд FILL INK и FILL или в PAPER для команды FILL PAPER. Если исходная точка и ее окрестности окрашены в требуемый ничего не происходит.

В отличие от обычного Бейсика параметр цвета после INK или PAPER может не указываться, в этом случае идет закрашивание текущим цветом. Например, FILL PAPER; x,y -сработает.

Пример: 10 FOR n=1 TO 6 20 CLS

30 CIRCLE INK n;128,88,n*10 40 FILL INK n; 128,88 50 NEXT n

Возможно и использование сложных конструкций FILL, таких как: FILL INK 2; PAPER 1; FLASH 1; X,Y

В таких случаях первое ключевое слово после FILL указывает на то что используется при заполнении (INK или PAPER), а остальные просто меняют атрибуты заполняемой области.

Поскольку, как Вы знаете, в пределах одного знакоместа невозможно использование более двух цветов одновременно, техника работы с цветом должна быть очень хорошо продуманной. Очень легко получить неприемлемый результат, особенно в тех местах, где контактируют два цвета INK. Обычно это обходят за счет того, что стык областей с разными цветами проводят по границам знакомест. 10 LET х=128, у=88, rad=70 20 LET g= (SQR 2)*rad/2 30 CIRCLE x,y,rad 40 PLOT x,y : DRAW -g,-g 50 PLOT x,y : DRAW g,-g 60 PLOT x,y : DRAW 0,rad 70 FILL INK 2; x-5,y 80 FILL INK 4; x+5 y

FILL работает на областях любой геометрической формы. Для примера попробуйте заполнить весь экран, за исключением того, что находится внутри букв "Q". PRINT STRINGS (704, "Q"): FILL 0,0

Метод работает быстро, если есть большое количество доступной свободной памяти. Если Вы заполняете большую область, например весь экран, то сможете увидеть очевидные паузы в те моменты, когда компьютер проверяет не забыл ли он окрасить какие-то участки. Можно рекомендовать делить сложную область на несколько более простых и заполнять их порознь.

Можно установить, какое количество пикселей было закрашено по последней команде FILL, для этого служит функция FILLED().

Прервать заполнение можно в любое время нажатием BREAK.

24. GET числовая переменная

или GET строковая переменная

Клавиша: G

Это то же самое, что GET от клавиатуры. Как и INKEY$ это способ чтения клавиатуры без использования ENTER. Отличие от INKEY$ в том, что GET ждет нажатия клавиши. При использовании со строковой переменной, GET вводит один символ: 10 GET а$: PRINT а$;: GO ТО 10

Работа этой строки похожа на работу пишущей машинки. Обычным путем Вы можете переключаться на печать прописными и строчными буквами. Курсор можно перемещать в нужном направлении, работает стирание символов. ENTER дает переход к началу следующей строки. Более изощренная версия выглядит так: 10 GET а$

20 PRINT CHR$ 8; " "; CHR$ 8; а$; INVERSE 1; "В"; INVERSE 0; 30 GO TO 10

Может быть, Вы захотите изменить размер символов, воспользовавшись командой

CSIZE.

Если GET применяется с числовой переменной, то при нажатии клавиш от "1" до "9" вводится число от 1 до 9. При нажатии "А" или "а" вводится число 10, при нажатии "B" или "b" вводится число 11 и т.д. Это очень удобно для организации разного рода экранных меню при написании меню-управляемых программ (см. также ON).

25. GET строковая переменная, x,y <ширина, длинах><;тип>

Это как бы GET с экрана. Применяется для того, чтобы какой-то прямоугольный блок экрана присвоить некоей строковой переменной и впоследствии печатать его на экране с помощью PRINT или PLOT в тех позициях экрана, в каких захотите.

(Если Вы будете применять PRINT, то необходимо учесть, что установка CSIZE не должна быть нулевой. Так, например, CSIZE 8 даст печать сохраненного в строковой

переменной изображения в натуральную величину.)

Размер задается в знакоместах, а координаты - в пикселах. В простейшем случае за именем строковой переменной следуют координаты левого верхнего угла.

10 PRINT "QWE" 20 GET а$,4,175 30 PLOT 100, 100; а$

Т.к. размеры снимаемого с экрана блока не указаны, то по умолчанию предполагается, что длина и ширина равны по одному знакоместу.

В этом примере на экране будет напечатано "QWE", а затем правая половина буквы Q и левая половина буквы W будут сохранены в переменной а$. С помощью усовершенствованной команды Бета-Бейсика PLOT Вы сможете напечатать полученное изображение в любом месте экрана (см. PLOT), причем сделать это можно с разным увеличением (см. CSIZE).

Здесь есть один нюанс. Как может строковая переменная содержать часть графики экрана? Если Вам это не интересно, пропустите несколько следующих абзацев.

Поставим маленький эксперимент. Узнаем длину строковой переменной а$. Это можно сделать PRINT LEN а$. Вы увидите, что длина этой переменной равна 9 символам. Первый содержит управляющий код, который говорит о том, что в последующих 8 символах идет графический образ. Если Вы сняли блок большего размера, а не одно знакоместо, то в него вставлены там, где это надо, коды управления курсором (см. раздел Управляющие Коды).

Нижеприведенный пример изображает на экране блок размером 3x3 знакоместа, запоминает его в переменной а$ и затем печатает в случайно выбранных позициях экрана, причем делает это гораздо быстрее, чем это можно было бы сделать повторным его перестроением.

10 CIRCLE 10,165,10

20 CIRCLE 13,165,5

30 FILL 5,165

40 GET а$,0,175,3,3

50 PLOT RND*230, RND*150+20; а$

60 GO TO 50

Если Вы используете OVER 0, то увидите, что поля рисунка затрут цветом PAPER то, что лежит под ними. Для получения других результатов попробуйте использовать OVER 1 или OVER 2 и запустите пример еще раз (OVER 2 это режим не стандартного БЕЙСИКа, а БЕТА-БЕЙСИКа, позволяющий Вам рисовать и без затирания и без инвертирования того, что лежит под Вашим изображением.)

Если Вы хотите нарисовать много окружностей одного размера, то гораздо быстрее работают GET и PLOT, чем CIRCLE. Попробуйте удалить строки 20 и 30 и введите OVER 2 (или используйте в строке 50 PLOT OVER 2; RND * ... )

Эти рассмотренные примеры относятся к нулевому типу. Если Вы не указываете при команде GET параметр <тип>, то предполагается, что он равен нулю. Нулевой тип команды GET - "бесцветный".

То есть рисунок снимается с экрана без цветовых атрибутов и воспроизводится командой PLOT в текущих установленных цветах или в локальных цветах, указанных в команде PLOT или PRINT.

Вы можете использовать команду GET и другого типа. Это тип-1. Для его использования после команды поставьте точку с запятой и поставьте 1. В этом случае изображение снимается с экрана в строковую переменную вместе с цветовыми атрибутами. Точно так же оно будет и изображено по команде PLOT или PRINT. Принципиально важно, что если графический блок, с которым Вы работаете, имеет несколько цветов, то все их можно будет воспроизвести только при работе с первым типом GET. Ни глобальные, ни локальные установки цвета не повлияют. Изображение будет воспроизведено так, как было снято.

10 PRINT INK 2; "АВС" 20 PRINT: PRINT INK 4; "DEF" 30 GET s$,0,175,3,3; 1

40 PLOT 100,100; s$

Как обычно, Вы не должны забывать, что для "Спектрума" в пределах одного знакоместа возможны только 2 цвета (INK и PAPER), поэтому тщательно планируйте, куда Вы помещаете изображение, снятое по GET вместе с цветами. При неаккуратной печати его на экране Вам не избежать проблем с атрибутами ("клэшинг" атрибутов).

26. JOIN <номер строки>

Клавиша: SHIFT + 6 (то же, что и "&")

См. также SPLIT.

Объединяются вместе две строки. Первая строка - номер которой задан (если не задан - то та строка, на которой стоит курсор) и следующая за ней строка.

Совместно используя SPLIT и JOIN Вы получаете возможность "отрезать" часть строки и "пристегнуть" ее к другой.

27. JOIN строковый массив или числовой массив.

Клавиша: SHIFT + 6 (то же, что и "&")

См. также главу "Обработка данных", с. 8.

Эта команда позволяет переместить часть символьной строки или массива в любую позицию другой символьной строки или числового массива. С командой JOIN тесно связана еще команда COPY. Поскольку они очень похожи друг на друга, то и обсуждаться здесь будут совместно. Разница их действия состоит в том, что если команда JOIN перемещает данные, то команда COPY - копирует их. Разница очевидна. При копировании исходный материал не уничтожается, а при перемещении он пропадает.

а) Работа с символьными массивами.

Образец синтаксиса:

JOIN а$ <n TO m> TO b$ <k> COPY a$ <n TO m> ТО b$ <k>

Здесь:

а$ - исходная символьная строка;

b$ - строка назначения;

n,m - параметры выделения подстроки из строки;

k - позиция в строке назначения.

Пример:

10 LET а$ = "12345" 20 LET b$ = "ABCDEFG" 30 JOIN а$ ТО b$

40 PRINT b$: REM печатается ABCDEFG12345 50 PRINT a$: REM: а$ не найдено.

Поскольку мы применяли JOIN и не указывали параметров n,m, то вся переменная а$ целиком перешла в b$ и печать а$ в строке 50 ничего не даст. Если же теперь Вы в строке 30 замените JOIN на COPY, то сможете убедиться в строке 50, что а$ не пострадало. Вариант применения COPY, тем самым, похож на то же, что мы имеем просто работая с LET: LET b$ = b$ + a$

Но зато и JOIN и COPY работают даже тогда, когда а$ и b$ такие огромные, что заполняют всю память компьютера, a LET в этом случае работать не сможет. Например LET a$ = а$ + "х" не сможет работать, если а$ длиннее, чем одна треть свободной памяти компьютера.

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

Если не заданы параметры подстроки, то принимается по умолчанию вся строка. Если не задан параметр позиции вставки в строку назначения, то вставка выполняется после последней позиции. Попробуйте поэкспериментировать с вышеприведенным примером, заменяя строку 30:

30 JOIN а$ (2) TO b$ REM:

а$="1345", b$="ABCDEFG2" 30 JOIN а$ (3 ТО) ТО b$ REM:

а$="12", b$="ABCDEFG345" 30 COPY а$ ТО b$(3) REM:

а$="12345", b$="AB1234CDEFG" 30 JOIN a$(2 TO 3) TO b$(LEN b$+1) REM:

a$="145", b$="ABCDEFG23"

А теперь рассмотрим конкретный практический пример. Вам надо просмотреть символьную строку t$ и всякий раз, как в ней встретится слово "Spectrum" заменить его на "ZX". Для этого можно исполь зовать COPY, DELETE и INSTRING.

10 LET t$="The Spectrum is a versatile computer, but Spectrum owners may feel it should have

better editing" 20 PRINT t$

30 LET n$="ZX", o$="Spectrum" 40 LET P=1

50 LET P=INSTRING (P,t$,o$) 60 IF P<>0 THEN

DELETE t$(P TO P+LEN o$-1) COPY n$ TO t$(P) GO TO 50 70 PRINT t$

b) Работа с символьными массивами.

Образец синтаксиса:

JOIN а <n ТО m> ТО b <k> COPY а <n ТО m> ТО b <k>

Здесь:

а - исходный массив;

b - массив назначения;

n, m - параметры выделения подмассива из массива,

k - позиция в массиве назначения.

Массивы - это удобный метод работы с большим количеством данных, но обычно они имеют много серьезных ограничений. Наверное самое существенное из них - то, что массивы имеют фиксированный размер, объявленный в момент назначения массива. Вы можете нерационально расходовать память, назначив (DIM) массив больше, чем Вам на самом деле необходимо, и Вам может не хватать памяти например для создания еще одного массива.

БЕТА-БЕЙСИК позволяет более гибко манипулировать с массивами. Команды JOIN и COPY позволяют перемещать или копировать весь массив или его часть. Пространство для нового материала создается внутри назначенного массива, поэтому ничего не будет перезатерто. Можно обслуживать не только одномерные, но и двумерные массивы, а этого бывает достаточно для большинства приложений. Одномерные массивы трактуются, как двумерные, имеющие вторую размерность, равную единице. Нет никакой необходимости чтобы совпадали размерности исходного массива и массива назначения.

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

Предположим, что Вы имеете массив a$(100,30) и он полностью заполнен. Чтобы

добавить к нему еще 20 символьных строк, Вы можете действовать например так: DIM b$(20,30): JOIN b$ TO a$

Поскольку мы использовали JOIN, все строки будут реально удалены из массива b$ и помещены в a$, а не просто скопированы, как это было бы при применении COPY. Поскольку никаких параметров вырезки после имени исходного массива не было указано, то все его символьные строки будут перемещены и массив перестанет существовать. При использовании COPY он остался бы нетронутым.

Позиция вставки в массив назначения была указана. По умолчанию будет принято, что это позиция номер 101, то есть следующая за последней. Первая символьная строка из массива b$ станет сто первой в массиве a$, а последняя станет строкой номер 120.

Т.к. в БЕТА-БЕЙСИКе массивы могут часто менять свой размер, то Вам может потребоваться неоднократное применение функции LENGTH чтобы определить размер массива. В вышеприведенном примере LENGTH (1,"a$") дало бы величину 120.

Если Вы примените DIM b$(20,3) или DIM b$ (20,50), а затем сделаете JOIN b$ TO a$, то в результате строки массива b$ будут "подбиты" пробелами или, наоборот "подрезаны" так, чтобы они укладывались в строки массива а$, имеющие 30-символьную длину.

Если у Вас уже есть готовый массив и Вы решите, что в нем надо сделать строки подлиннее, Вы можете это сделать, задав через DIM массив с желаемой длиной только с одним элементом, а потом переместить (JOIN) свой массив в него. DIM b$(1,40): JOIN а$ ТО b$

Единственный недостаток, к сожалению, состоит в том, что теперь все наши данные будут находиться в b$, а а$ не будет существовать. Чтобы восстановить его, можно сделать обратный ход:

DIM a$(1,40): JOIN b$ ТО а$

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

Следующие примеры написаны для JOIN, но соответственно могут работать и с COPY. JOIN a$ TO b$(4)

- введет весь массив a$ в b$ таким образом, что первая символьная строка будет вставлена после четвертой символьной строки в увеличенном массиве b$.

JOIN а$(2 ТО 5) ТО b$(1)

- переместит 4 символьных строки из а$ в начало массива b$. После этого массив а$ станет на четыре строки короче, чем был, а массив b$ станет на четыре строки длиннее.

JOIN а$(10) то b$

- переместит десятую символьную строку из а$ в конец b$.

с) числовые массивы.

Одномерные и двумерные числовые массивы обрабатываются способом, похожим на символьные массивы. После имени массива должны обязательно стоять скобки, чтобы отличать массивы от простых переменных.

Нижеприведенный пример создает два массива, а затем объединяет их между собой.

10 DIM a(8) 20 FOR n=1 TO 8 30 LET a(n)=n 40 NEXT n 50 DIM b(5) 60 FOR n=1 ТО 5 70 LET b(n)=n*10 80 NEXT n

90 JOIN b() ТО а()

100 FOR n=1 ТО LENGTH (1,"a(")

110 PRINT а(п)

120 NEXT n

130 REM печать 1 2 3 4 5 6 7 8 10 20 30 40 50 140 REM b() - не существует

28. KEYIN строковая переменная

Клавиша: SHIFT + 4

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

10 LET a$ = "100 DATA" 20 FOR n=0 TO 9

30 LET a$ = a$+STR$(PEEK N) + "," 40 NEXT n

50 LET a$ = a$ (1 TO LEN a$ -1): REM удаление последней запятой 60 KEYIN a$

После запуска данного фрагмента Вы увидите, что к программе добавилась еще одна строка.

В режимах KEYWORDS 3 и 4 ключевые слова, набранные по символам, будут преобразованы в односимвольные токены.

29. KEYWORDS число.

Клавиша: 8

Оператор KEYWORDS управляет тем, как вводятся и как изображаются на экране ключевые слова стандартного БЕЙСИКА, БЕТА-БЕЙСИКа и символов графики пользователя (UDG).

KEYWORDS 0.

В этом режиме за клавишами в графическом режиме (курсор G) закреплены символы графики пользователя, как в стандартном БЕЙСИКе Вашего "Спектрума".

KEYWORDS 1.

В этом режиме за клавишами в графическом режиме закреплены ключевые слова БЕТА-БЕЙСИКА.

В исходном состоянии после загрузки система находится в режиме KEYWORDS 1. А если Вам надо воспользоваться символами графики пользователя, дайте команду KEYWORDS 0. Выбранный Вами режим KEYWORDS 1 или KEYWORDS 0 не влияет на то, как вводятся ключевые слова - по буквам или как токены, целиком, т.е. выбор режима 0 или 1 не влияет на установки режимов KEYWORDS 2, 3 и 4. После загрузки компьютер находится в состоянии KEYWORDS 3. Текущий режим ввода сохраняется вместе с Вашей программой, если Вы отгружаете вместе с ней код (CODE) самого БЕТА-БЕЙСИКА.

KEYWORDS 2.

В этом режиме все ключевые слова вводятся одним нажатием клавиш, при необходимости с одновременным нажатием шифтов. Ключевые слова стандартного БЕЙСИКа берутся, как обычно. Ключевые слова БЕТА-БЕЙСИКа вводятся в графическом режиме (курсор G), a функции БЕТА-БЕЙСИКа вводятся в порядке FN, буква, знак "$" или "(".

KEYWORDS 3.

Этот режим - тот же, что и KEYWORDS 2, за исключением того, что вводимая строка, прежде чем пойти в память компьютера, сначала проверяется на наличие в ней набранных по буквам ключевых слов и, если они найдены, происходит их замена на токены ключевых слов. По-видимому, это самый удобный режим, т.к. в нем можно работать и с вводом ключевых слов одним нажатием клавиш и со вводом их по буквам. Если нужно выйти из курсора "К", Вы можете использовать ведущий пробел.

KEYWORDS 4.

В этом режиме нет курсора "К", т.е. все ключевые слова вводятся только по буквам. Форсировать появление курсора "К", тем не менее, все же возможно. Это делается нажатием клавиш SYMBOL SHIFT и ENTER.

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

d) Распознавание ключевых слов.

Есть небольшое ограничение в режимах 3 и 4, которое заключается в том, что Вы не можете использовать имена переменных и процедур, совпадающие по написанию с ключевыми словами. Поскольку при запоминании программной строки в памяти компьютера может произойти их замена на токен ключевого слова. Тем не менее, ключевое слово может быть частью имени переменной или процедуры без проблем.

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

Символы, стоящие непосредственно перед ключевым словом или за ним не могут быть буквами или символами подчеркивания "_".

Printa - не будет конвертировано в PRINT а, т.к. компьютер предположит, что это имя переменной или процедуры.

Print a - будет преобразовано в PRINT а. Ниже приведены несколько примеров возможных строк и показано их возможное преобразование в результате "токенизации".

print 10......................PRINT 10

print fork, total.............PRINT fork, total

alter to ink3, paper1.........ALTER TO INK 3, PAPER 1

print string$(10,"Plot")......PRINT STRING$(10,"Plot")

goto10........................GO TO 10

go to x.......................GO TO x

gotox........................gotox

defproc pink..................DEF PROC pink

mat_print.....................mat_print

Пример с GO TO показывает, что внутренние пробелы в этот оператор можно и не включать. Точно так же и "gosub", "onerror", "defproc" будут распознаны, как полноценные ключевые слова.

Слово "ink", входящее как составная часть в "pink" и "print", входящее в "mat_print" распознаны не будут, т.к. перед ключевым словом не должно быть буквы или знака "_".

30. LET переменная = число <, переменная = число>...

Маленькое усовершенствование старой команды LET позволяет выполнять серию присвоений, разделяя их запятыми. Это сокращает объем занятой памяти (по одному байту на каждый опущенный LET), делает ввод более удобным и листинг более читаемым. Так, запись

10 LET x=1,y=2,z=3,a$="y",b$="n"

может заменить:

10 LET x=1: LET y=2: LET z=3: LET а$="y": LET b$="n"

31. LIST <номер строки> TO <номер строки>

или LLIST <номер строки> ТО <номер строки>

Вы видите по синтаксису, что здесь есть небольшое добавление к стандартному БЕЙСИКу. Вы можете выводить на экран или принтер заданный Вами блок программы. Если первый номер строки не указан, то по умолчанию принимается строка, следующая за нулевой. Если второй номер строки не указан, предполагается по умолчанию последняя строка программы. Если оба параметра опущены, Вы получаете эквивалент обычной команде LIST.

LIST 20 ТО 100

LIST TO 200

LLIST 100 ТО 180

Если строка с первым номером существует, то при листинге она будет изображена с курсором ">", т.е. она готова к вызову на редактирование.

Если оба номера совпадают, то будет изображена только одна строка.

32. LIST DATA

или LIST VAL или LIST VAL$

Эти разновидности команды LIST позволяют распечатать сводку переменных: LIST DATA - все переменные LIST VAL - числовые переменные LIST VAL$ - строковые переменные.

"Спектрум" имеет 6 типов переменных. Команда LIST VAL распечатывает из них 4 типа в следующем порядке:

1. Числовые массивы.

2. Переменные циклов FOR-NEXT.

3. Переменные с односимвольными именами.

4. Переменные с многосимвольными именами. Команда LIST VAL$ распечатает остальные два типа переменных

5. Символьные массивы.

6. Обычные символьные переменные.

Команда LIST DATA распечатает все 6 типов переменных.

Переменные каждого типа распечатываются в алфавитном порядке (для переменных с многосимвольными именем в расчет принимается только первая буква). Пример того что может дать LIST DATA приведен ниже:

d(10,4) k(3,3,4)

n STEP 1 500 LN 200

g 3.5

j 100

s 23.1

applen 1

number 9999

xos 0

xrg 2 56

yos 0

yrg 176

t$(100,10)

a$ LEN 5 "Hello"

b$ LEN 40 "Too long too..."

e$ LEN 5 "Bang!"

Для массивов изображается только их размерность, но не содержание. Переменные циклов FOR-NEXT можно отличить от прочих благодаря присутствию параметра STEP и параметра LN (looping number - номер строки, из которой производится возврат в голову цикла). Для длинных строковых переменных изображаются только первые 15 символов.

33. LIST DEF KEY

Здесь DEF KEY располагается на клавише SHIFT + 1.

См. также DEF KEY.

Эта команда позволит распечатать список клавиш, определенных пользователем. Сначала распечатывается клавиша, а затем символьная строка или оператор, которые за ней закреплены. Если в назначении клавиши последним символом является двоеточие, то полагается, что при нажатии этой клавиши то, что за ней закреплено, сопровождается последующим ENTER, т.е. сразу после нажатия содержимое появляется в нижней части экрана в системном окне.

Михайленко В.С.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Фэнтези - Айзенк Азимов "Человек, который никогда не мал".
Ликбез - полный дизассемблер ПЗУ (часть 27).
ZxNet - Приложение к Уставу и локальные правила узлов сети ZXNet.
Как я это сделал - Как я делал этот журнал
График работы - Графика работы серверов на неделю, входящив в ZXNet.

В этот день...   21 ноября