О ЧЕМ ЕЩЕ МОЖНО РАССКАЗАТЬ
В этом разделе мы дадим информацию, без которой наш рассказ был бы неполным.
Экспоненциальная форма записи чисел
Кроме обычной формы представления чисел Speccy
понимает и экспоненциальную, записывая степень через букву Е. Например,
числа 5.5* 1013, 2,3* Ю-1 запишутся следующим образом:
PRINT 5.5Е5 559999
PRINT 2.3Б—1 9.23
Оператор PRINT
при расчетах выводит результат не более чем с 8 значащими цифрами.
Причем и те не всегда точны, даже при обращении с целыми числами.
Например, выполним:
PRINT 1Е10+1—1Е10: PRINT 1Е10-1Е10+1 9 1
Сравнение чисел
Сравнение символьных значений
Поскольку каждому символу соответствует некий
числовой эквивалент — код, то можно сравнивать не только
числовые, но и символьные значения. Например, казалось бы, абсолютно
бессмысленное с точки зрения математики выражение:
PRINT "А"<"В" 1
- для компьютера имеет вполне конкретное
значение. Подумав, он сделал заключение, что оно верно, поскольку код
буквы А меньше кода буквы В. При сравнении символьных значений,
состоящих более чем из одного символа, происходит последовательное
сравнение кодов до тех пор, пока не встретятся неравные коды:
PRINT "ААААС">"ААААВ" 1
При прочих равных условиях меньшим будет признано более короткое символьное значение:
PRINT "АААА">"ААААВ" О
Двоичное счисление - где Do, Di, D2, D3,
соответственно, разряды двоичного числа, читаемые справа налево и
принимающие значения 0 или 1. Переведем из двоичного в десятичный вид
число 1101:
Do=l, Di=0, D2=l, D3=0, D4=l 1x2° + 0x2х + lx22 + lx23 = 13 Проверим: PRINT BIN 1101 13
Так оно и есть.
Случайные числа_
RND, RANDOMIZE
В набор числовых функций Бейсика входит функция RND — генератор
псевдослучайных чисел. Потребность в получении случайных чисел
возникает, например, при написании игровых программ, обучающих систем
(выдача неповторяющихся заданий) и во многих других случаях.
Для RND не нужен аргумент — при вызове
функция возвращает случайное число в интервале от 0 до 1. Распечатаем
на экране много-много раз значения, возвращаемые RND:
10 FOR i=1 ТО 100 20 PRINT RND; " 30 NEXT i
Получим ряд чисел, между которыми нет никакой
видимой зависимости, что и является признаком случайности. Однако если
генерировать числа с помощью RND долго-долго, то их последовательность
начнет повторяться. Поэтому в название функции добавлено слово
«псевдо». Хотя в подавляющем большинстве случаев этим
«псевдо» можно пренебречь.
Существенным неудобством RND является то, что
после запуска (или сброса) компьютера функция каждый раз начинает
генерировать с одного и того же числа одну и ту же последовательность
(происки все того же «псевдо»). Пришлось ввести в Бейсик
специальный оператор RANDOMIZE.
Выполняя его с указанием вслед за ним произвольного числа в интервале
1...65535, можно устанавливать начало последовательности случайных
чисел. Если требуется совершенно случайная последовательность с
совершенно случайным началом, то нужно вслед за RANDOMIZE поставить
ноль либо вообще ничего не писать. Выполним несколько раз (каждый раз
сбрасывая компьютер) строку:
RANDOMIZE: PRINT RND
Теперь-то уж мы приблизились к случайности — функция RND каждый раз выбрасывает различные значения.
Для генерации случайных чисел в интервалах,
отличных от стандартно заданного для функции RND (0...1), используются
элементарные алгебраические выражения. Например, оператор
PRINT 2+3+RND
будет выдавать случайные числа в интервале
2...5. Известная нам функция INT поможет генерировать целые случайные
числа. Скажем, с помощью оператора
PRINT 1 +INT(RND*9)
можно получить последовательность целых случайных чисел от 1 до 10.
Анализ атрибутов знакоместа
ATTR
При написании игровых программ, да и во многих
других случаях,часто бывает необходимо определить атрибуты знакоместа
экрана, то есть выяснить, какими цветами оно раскрашено. В Spectrum-Бейсике этим занимается функция ATTR.
Аргументами для нее являются координаты тестируемого знакоместа,
размещаемые за ней в скобках через запятую: номер строки (0...22) и
номер столбца (0...31). В качестве результата ATTR возвращает числовое значение от 0 до 255, которым зашифрованы значения атрибутов знакоместа.
Выполним программку:
10 PRINT AT 10,10; INK 1; PAPER 6; BRIGHT 1; FLASH 1;"*";
20 PRINT ATTR(10, 10)
RUN
«241
В ней задаются, а затем считываются атрибуты знакоместа с координатами (10, 10). Число 241
получается в результате вычисления выражения, в котором <INK>,
<PAPER>, <BRIGHT> и < FLASH> — значения
атрибутов:
1X < INK>+8 X < Р APER>+64 х <BRIGHT>+128 X <FL ASH >
— то есть в нашем случае:
1x1+8x6+64x1+128x1=241
Символы псевдографики
В ZX Spectrum коды от 32 до 127 (см. табл. 1 на
стр. 100) соответствуют стандартному набору компьютерных символов
(кроме знаков £ и ©). Этот набор называется ASCII-коды
(American Standard Code for Information Interchange).
Остальные символы не входят в ASCII. Символы с кодами от 128 до 143 включительно — это так называемые псевдографические символы.
«Графические» они потому, что представляют из себя
квадратики, прямоугольники и т. п. Их изображение помещено на цифровых
клавишах (от 1 до 8). «Псевдо» — потому, что по сути
они такие же символы, как и буквы, то есть выводятся на экран нажатием
соответствующих клавиш.
Переход в режим псевдографики происходит после
одновременного нажатия двух клавиш: CS/9 (Graphics). Курсор меняется на
[G]. Если одновременно с нажатием цифровых клавиш удерживать клавишу
SS, графические символы будут выводиться в инверсном виде. Для выхода
из режима [GJ нужно нажать клавиши CS/9 или даже просто 9.
Символы, определяемые пользователем
В режиме псевдографики, кроме нанесенных на
цифровые клавиши графических символов, на экран выводятся и так
называемые символы, определяемые пользователем (UDG — User
Defined Graphics). Их может быть до 22, и «привязываются»
они к клавишам от А до U. Это могут быть и дополнительные графические
символы, и произвольные значки, и — что часто можно встретить в
отечественных Speccy — буквы русского алфавита. Этим новым
символам присваиваются коды от 144 до 155.
Наша фантазия при создании новых символов
ограничена лишь размерами знакоместа (8x8 пикселей). Попробуем
«сконструировать» значок, показанный на рис. 5.
Для записи изображения символа в память
компьютера его надо представить последовательностью из 8 чисел,
соответствующих строкам пикселей знакоместа. Каждая строка
представляется в виде двоичного числа, исходя из принципа: есть точка в
данной позиции строки — ставится 1, нет — 0:
00011100 00011100 00001000 01111111 00011100 00011100 00010100
00010100 Рис. 5. Эскиз символа UDG.
Эти числа, преобразованные с помощью функции BIN в десятичные, последовательно записываются в память компьютера, начиная с адреса, возвращенного функцией USR14. Аргументом USR должен
быть символ клавиши, за которой мы хотели бы «закрепить»
новый значок. Например, если мы запишем последовательность полученных
чисел, начиная с адреса USR "А", то в режиме курсора [GJ при нажатии на клавишу А будет выводиться наш символ.
Запись в память осуществляет специальный оператор Spectrum-Бейсика РОКЕ15, вслед за которым через запятую нужно указать, куда записывать (адрес) и что записывать:
POKE USR "A", BIN 00111100
Второе число записывается по следующему адресу: POKE USR "А"+1, BIN 01000010
И так восемь раз. После этого можно перейти в режим курсора [G] и попробовать выводить значок, нажимая клавишу А16.
Управление выводом на экран с помощью «знаков препинания»
В какое место на экране будет размещать текст оператор PRINT, зависит от знака, стоящего в конце предыдущего PRINT.
Если он оканчивался точкой с запятой (;), то, как мы уже знаем, текст
будет выводиться на экран, начиная со следующего знакоместа в той же
строке:
10 PRINT "BASIC";
20 PRINT " IS MY LOVE"
RUN
BASIC IS MY LOVE
Запятая (,) укажет на то, что вывод нужно
продолжить с середины строки (если, конечно, последний помещенный
символ уже не перевалил за середину; в таком случае данные будут
размещены с начала следующей строки):
10 PRINT "SPECCY",
20 PRINT " IS MY LOVE"
RUN
SPECCY IS MY LOVE
Если вообще какой-либо знак отсутствует, значит, следующему оператору PRINT следует выводить символы с новой строки, то есть перед выводом будет выполнена операция «перевод строки».
PRINT сам по себе (без данных) вставляет «пустую строку» и переводит текущую позицию вывода в начало следующей.
В операторе PRINT может использоваться и апостроф ('). Натолкнувшись на него, компьютер осуществит перевод строки.
Знаки препинания могут отделять различные блоки данных, выводимых одним оператором PRINT:
10 PRINT 1234; " QWERT", "ASDF" r "ZXCV"
1234 QWER ASDF
EZXCV
Управляющие символы
Например, оператор
PRINT CHR$ 17+CHR$ 6;"ABC" равнозначен
PRINT PAPER 6;"АВС"
Управление цветом в режиме курсора [Е]
Назначить цвет фона и цвет тона можно еще одним
способом: раскрашивая предназначенный для вывода текст непосредственно
при его наборе. Нужно только, когда потребуется изменить цвет, войти в
режим курсора [Е] и нажать цифровую клавишу, соответствующую номеру
желаемого цвета. Нажатие цифровой клавиши совместно с CS задает цвет фона, без CS — цвет тона. При этом в текст будут вставляться «невидимые» управляющие символы CHR$ 17 и CHR$ 16.
В режиме курсора [Е] можно управлять и другими атрибутами экрана:
8 - BRIGHT О
9 - BRIGHT 1 CS/8 - FLASH О CS/9 - FLASH 1
Инверсный вывод можно задать при наборе текста непосредственно в режиме курсора [Ц:
CS/3 - INVERSE О CS/4 - INVERSE 1
Все действия по раскраске, выполненные в режиме
курсора [Е], можно легко отменить. «Невидимые» коды
управления цветом удаляются двойным нажатием Delete (CS/0).