ZX-Ревю 1991 №10 1990 г.

Beta basic - часть 2. Функции.


Темы статьи: Программирование  

BETA BASIC

Часть 2. Функции.

Общий обзор.

В Бета-Бейсик добавлены десять новых функций. Их определение дано в строке 0, которая не выводится по команде LIST. Там размещено указание на блок, записанный в машинных кодах, размещенный в верхних областях памяти и выполняющий вычислительную работу. Эти функции работать не будут и вся система "зависнет", если основная машиннокодовая часть Бейсика не будет присутствовать в памяти. С другой стороны, если не будет присутствовать нулевая строка, то Вы получите резолюцию:

"FN Without DEF" ("функция не определена")

В этом случае остальная часть Бета-Бейсика будет работать нормально, Вы только не сможете использовать новые функции. При выгрузке программы на ленту выгружается и нулевая строка, поэтому, если Вы загрузите (LOAD) программу, написанную в Бета-Бейсике, то строка 0 в ней будет присутствовать. Однако, загрузка программы, записанной не в Бета-Бейсике, сотрет строку 0. Чтобы избежать этого, сначала дайте NEW, что очистит компьютер, но строку 0 оставит нетронутой, а затем загрузите новую программу через MERGE.

Нулевую строку можно удалить, например так: DELETE 0 то 0. Это позволит сократить объем памяти (строка 0 занимает до 221 байта).

1. Функция: FN C$

Структура: FN C$ (число)

См. также FN ^строка)

Эта функция конвертирует целые числа (от 0 до 65535) в двухсимвольные строки, что позволяет гораздо более экономно хранить числовые данные. Эквивалентом в Бейсике является:

LET A=INT^^/256): LET B = число - A*256 LET C$ = CHR$ A + CHR$ B

Результат при попытке распечатать эту строковую переменную может быть такой:

K,"Invalid colour"

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

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

Если у Вас есть число типа 87.643, Вы можете его умножить на 100 и получить 8764,3. Взяв целую часть 8764, Вы применяете к ней FN C$, получаете строку из двух символов. Последующее применение к ней FN N и деление на 100 даст 87.64. Это неплохая точность для большинства практических приложений.

100 DIM A$ (500,2)

110 FOR E=1 TO 500: LET A$(E)= FN C$(E*10): NEXT E

120 FRINT "Array created-press any key to print it" (массив создан, нажмите любую клавишу).

130 PAUSE 0

140 FOR E=1 TO 500: PRINT E, FN N (A$(E)): NEXT E

Это массив занимает только 1K памяти, в то время как в обычном формате он бы занимал 2.5K.

Команда SORT работает с такими массивами правильно.

2. Функция FN D

Структура: FN D (строка)

См. также FN Н$(число).

Эта функция дает десятиричный эквивалент для строковой переменной, которая представляет собой допустимое шестнадцатиричное число. Строка может иметь от 1 до 4 символов.

FN D ("FF") = 255 FN D ("10") = 16 FN D ("4000") = 16384 FN D ("e") = 14

Регистр (верхний или нижний) для букв не играет роли.

Чтобы выполнить POKE с шестнадцатиричным вводом, Вы можете сделать:

INPUT A$: POKE address, FN D(A$)

Если стринг не имеет символов или имеет более 4-х символов или имеет неразрешенные символы (т.е. символы кроме 0...9, A...F, a...f), то выдается сообщение:

"invalid argument" (неправильный аргумент)

3. Функция: FN H$

Структура: FN Н$ (число) См. также FN D (строка)

По этой команде десятиричный числовой аргумент переводится в шестнадцатиричный строковый. Он будет иметь 2 символа, если число было по абсолютной величине меньше 255 или 4 символа, если оно по абсолютной величине больше. Если число больше, чем 65535, то выдается сообщение: B, "integer out of range" ("целое число выходит за допустимые пределы") FN Н$ (32) = "20" FN Н$ (255) = "FF" FN Н$ (512) = "0200" FN Н$ (-1024) = "FC00"

Возможность работы с отрицательными числами должна быть очень полезной для тех,

кто программирует в машинных кодах для выполнения относительных переходов.

Если Вы хотите просмотреть содержимое памяти в шестнадцатиричных кодах, Вы

можете воспользоваться:

100 INPUT "Start address?"; addr 110 PRINT FN H$ (addr);" ";

FN H$ (PEEK addr) 120 LET addr = addr + 1:GO TO 110

Если Вы хотите задать стартовый адрес в шестнадцатиричной форме, можете изменить строку 100

100 INPUT "Start address?":A$: LET addr = FN D(A$)

4. Функция FN I

Структура: FN I (старт, строка A, строка B).

Функция FN I проверяет строку A, начиная с позиции "старт" в поисках строки B. В других версиях Бейсика эту функцию называют INSTRING. Если строка найдена, то выдается позиция в строке A первого символа строки B, иначе выдается 0.

Строка A может быть любой длины, но строка B должна иметь не более 255 символов, иначе пройдет сообшение "invalid argument".

Если "старт" равен нулю, то Вы получите сообщение "Subscript out of range". Если строка B длиннее, чем A, то результат - 0, то же - если "старт" больше, чем длина A$ или если обе строки имеют длину, равную нулю.

Вы можете заменить некоторые символы в искомой строке на знак #, что означает "все равно".

Например: PRINT FN I (1,A$,"SM # TH")

отыщет положение в A$ таких строк как "SM/ТН", "SMAT^' и т.д.

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

буквально - это когда он стоит первым в искомой строке.

Возможность задания "старта" для поиска может быть полезной, если Вы предполагаете, что искомая строка содержится не один раз. В приведенном примере в A$ разыскивается каждое употребление "TEST".

100 DIM A$(1000)

110 FOR n=1 TO RND*10+3

120 LET pos = RND*995

130 LET A$(pos TO pos+3)="TEST"

140 NEXT n

150 PRINT "TESTs hidden in A$ - press any key to find them"

(в A$ спрятаны символьные строки TEST. Нажмите любую клавишу, чтобы их отыскать). 160 PAUSE 0 170 LET loc = 1

180 LET loc + FN I (loc, A$, "TEST")

190 IF loc <>0 THEN FRINT loc: LET loc=loc+1 : GO TO 180

200 PRINT "Finish"

Строка A$ просматривается, начиная с 1-ой позиции (loc =1), а затем с каждой позиции, в которой была найдена строка "TEST". Когда FN I выдает 0, все появления "TEST" были найдены.

FN I может применяться для проверки вводимых строк в обучающих или игровых программах. Представьте, например, что "Спектрум" задал Вам вопрос, правильный ответ на который "NAPOLEON". Те, кто введут "NAPOLEON " (обратите внимание на пробел в конце слова) или "NAPOLEON BONAPARTE", получат ответ, что они неправы и будут законно разочарованы такой недружественностью со стороны программиста, написавшего программу. A это происходит, когда сравнение того, что введено и того, что должно быть, проводится простейшим способом. Вы можете обеспечить проверку на содержание требуемой строки во вводимой.

INPUT A$: IF FN I (1,A$,C$)<>0 THEN PRINT "CORRECT"

Другое применение этой функции может быть найдено в "разупаковке" одной длинной строки, состоящей из многих символьных строк различной длины. Один из возможных приемов состоит в том, что резервируется определенный набор символов (например CHR$ 1...CHR$31) для выполнения функций "маркера". CHR$ 1 отмечает начало первой подстроки из длинной строки, CHR$ 2 - начало второго и т.д. Тогда:

PRINT A$ (FN I(1,A$,CHR$ n) + 1 то FN I (1,A$, CHR$ (n+1))-1)

выдает n-ую строку из A$.

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

5. Функция: FN M

Структура: FN M ( )

Эта функция выдает обьем свободной памяти. В скобках ничего ставить не надо. Попробуйте:

PRINT FN M( ): DIM A$ (100): PRINT FN M( )

Это очень простая функция, которая состоит в основном из обращения в ROM. При отсутствии Бета-Бейсика можете применять:

PRINT 65535 - USR 7962

6. Функция: FN N

Структура: FN N (стринг)

См. также FN C$ (число)

Конвертирует двухсимвольную строку в целое число от 0 до 65535. Эквивалент:

LET number = 256*CODE C$(1)+CODE C$(2)

Если в строке не два символа, то получите сообщение:

"invalid argument" ("неправильный аргумент")

7. Функция FN P

Структура: FN P (адрес)

FN P - это двойной PEEK - указанного адреса и следующего за ним байта. Эквивалент: LET value = PEEK (address) + 256*PEEK (address+1)

Заметьте, что младший байт идет первый, как это принято в машинном кодировании и в таблице системных переменных.

DPOKE позволяет делать двойной POKE так же, как FN P - двойной PEEK.

8. Функция: FN S$

Структура: FN S$ (число, строка).

В других версиях Бейсика эту функцию часто называют "STRING$". Ее результат - это количество повторений символьной строки. FN S$ (32,"-") =32 знака минус FN S$ (4,"АВ") ="АВАВАВАВ" PRINT FN S$(704,"х") = целый экран знаков "X" PRINT FN S$ (3,"A"+CHR$13)= A

A A

FN S$ работает быстрее, чем цикл FOR-NEXT и занимает меньше места, чем прямой ввод строки, если строка длиннее, чем 14 символов.

9. Функция FN T$ ( )

См. также CLOCK

Эта функция выдает текущее время. Если часы не запущены, то: FN T$ ( ) ="00:00:00" Если часы были запущены, то независимо от того, выводится ли их показание на дисплей, FN T$ будет выдавать постоянно меняющееся значение:

100 CLOCK 1

110 LET N$ = FN T$( ): РRINТ N$

120 PRINT "Hours =";N$(1 TO 2); "Mins=";N$ (4 TO 5)

130 GO TO 110

Обычно неплохо передавать результат FN T$ переменной, чтобы "замораживать" его в какой-то момент.

10. Функция: FN U$

Структура: FN U$ (форматирующая строка, число) См. также USING

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

USING выполняет аналогичное действие, но применяется только с оператором PRINT, в то время как FN U$ можно использовать с любой командой, допускающей работу со строками. Для более подробного объяснения см. USING.

Приложение A Набор символов.

Здесь представлено дополнение к набору символов стандартного "Спектрума", вводимых программой BETA-BASIC.

Код

Клавиша

Символ

128

8

KEYWORDS

129

1

DEFPROC

130

2

PROC

131

3

END PROC

132

4

RENUM

133

5

EDIT

134

6

AUTO

135

7

DELETE

136-143

144

А

ALTER

*145

В

В

146

С

CLOCK

147

D

DO

148

E

ELSE

*149

F

F

150

G

GET

*151

H

H

152

I

EXIT IF

153

Y

WHILE

154

K

UNTIL

155

L

LOOP

156

M

SORT

157

N

ON ERROR

158

O

ON

159

P

DPOKE

160

Q

POP

161

R

ROLL

162

S

SCROLL

163

Т

TRACE

164

U

USING

* - осталось без изменений.

Приложение Б Сообщения.

Ниже перечислены сообщения, которых нет в стандартной версии Бейсика для "Спектрума". Исключение - G, но оно имеет другой смысл.

G: NO ROOM FOR LINE

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

S: MISSING LOOP

Оператор EXIT IF или оператор цикла DO с условием (UNTIL или WHILE) не содержит оператора конца цикла LOOP.

T: LOOP WITHOUT DO

Оператор конца цикла LOOP не имеет соответствующего открывающего DO.

U: NO SUCH LINE

Оператор DELETE использован с номером строки, которой нет в программе.

V: NO POP DATA

Была попытка снять данные с программного стека, обслуживающего операторы GO SUB, DO LOOP или PROC, в то время как стек пуст, т.е. операции GO SUB, DO LOOP и PROC еще не встречались в программе.

W: MISSING DEF PROC

Была вызвана незаданная процедура PROC или встретился оператор END PROC без соответствующего DEF PROC.

X: NO END PROC

При попытке "перепрыгнуть" через DEF PROC (не во время вычисления процедуры PROC) программа не нашла соответствующего END PROC.

Y: TOO HARD

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

(Продолжение следует)




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Pot-Pourri - Cокращенная версия прайса по тематике Spectrum-Scorpion.
Презент - новогодний гифт от O.C.A. - Original Computer Association.
Архив - Kokotoni Wilf, Lode Runner, Chuckie Egg.
Презентация - новгородская группа Digital Reality о себе.
Мысли о сцене - демосцена - это место, полигон, сфера для творчества. Разберемся как она устроена.

В этот день...   29 марта