ОПЕРАЦИИ С СИМВОЛЬНЫМИ СТРОКАМИ
INSTRINGQ, STRING$(), SHIFT$(), PRINT #14
INSTRING {< начальная позиция >, < строка символов >, < строка-о6разец>)
Эта функция осуществляет поиск
<строки-образца> в <строке символов). начиная с позиции,
заданной параметром Сначальная по-зиция>. Она возвращает номер
позиции в <строке символов), в которой первый раз встретился
образец. Если поиск оказался безуспешным, функция возвратит ноль.
Нулевое значение возвращается функцией также:
• если значение параметра <начальная позиция) выходит за пределы базовой строки,
• если <строка-образец) по длине больше исходной <строки символов), а также
• если одна из строк имеет нулевую длину.
<Строка символов) может иметь произвольную длину, но <строка-образец) не должна состоять более чем из 256 символов.
Для поиска можно использовать шаблон, вставляя
в <строку-образец) знак #. В этом случае при поиске содержимое
позиции, в которой стоит #, будет игнорироваться. Например, инструкция
PRINT INSTRING (1, А$, "ЬаоЬ#Ь")
будет искать в строке А$ позиции строк baobab, baobbb, baobcb и т. д.
INSTRING в сочетании с функцией MEMORY$ (см. предыдущий раздел) позволяет вести поиск в обширных участках памяти компьютера.
STRING$(<число),<строка символов))
Функция возвращает символьное значение,
состоящее из < число) раз повторенных <строк символов). Так,
например, STR!NG$(5,"la-") сформирует строку "la-la-la-la-la-".
Функция STRINGS формирует сгроку быстрее, чем
цикл FOR...NEXT, и поэтому ее целесообразно использовать совместно с
оператором РОКЕ для заполнения памяти требуемыми данными. К примеру,
для быстрой бчистки трети экрана достаточно выполнить строку:
РОКЕ 16384, STRING$(2048,CHR$ 0)
Пригодится функция STRINGS и для формирования
шаблона в операторе USING, когда число печатаемых разрядов определяется
значениями переменных, скажем, переменных Intr и Fr в следующем примере:
PRINT USING STRINO$(lntrf"#")+"."+STRING$(Fr,"#"); А
SHIFT $ (< номер режима >, < строка символов >)
Эта функция в зависимости от выбранного
<номера режима) (1...7) преобразует <строку символов):
избирательно заменяет сим волы другими символами, последовательностями
символов или удаляет символы из строки.
Режим 1. В этом режиме функция SHIFT$ заменяет все прописные буквы в <строке символов) на строчные.
Режим 2. Обратная процедура: заменяет строчные буквы прописными.
Режим 3. Все прописные буквы заменяются на строчные, а строчные — на прописные.
Режим 4.
Функция возвращает строку, в которой все управляющие символы (с кодами
от 0 до 31), за исключением символа возврата каретки (код 13), заменены
символом точки (CHR$ 46)96. Используя этот рел^им, удобно просматривать память компьютера, например, область бейсик-программы:
PRINT SHIFT$(4, MEMORV$()(<aApec начала> ТО <адрес конца>))
Режим
5. Функция SHIFT$ заменяет каждый символ с кодом N из второй половины
таблицы символов (ключевые слова интерпретатора) на символ с кодом N-12897.
Кроме этого, подобно режиму 4, все управляющие символы (как ранее
существующие, за исключением символа возврата каретки, так и полученные
в результате преобразования) заменяются символом точки. Заменяется
точкой и символ CHR$ 141, который после преобразования должен был бы
стать символом возврата каретки (141-128=13).
Режим 6.
Целиком совпадает с режимом 5, за исключением одного нюанса: символ
возврата каретки уже не находится на особом положении. Он, подобно
другим управляющим символам, обращается в точку.
Режим 7.
Прежде всего в этом режиме функция SHIFT$ удаляет из строки все символы
управления выводом на экран (перемещение курсора, изменение позиции
печати, управление цветовыми атрибутами) (см. табл. 19). Причем удаляет
не только управляющие символы, но и их параметры98
(если они предусмотрены). Так, к примеру, изымая символ
позиционирования вывода на экран — CHR$ 22 (АТ-управляющий),
функция SHIFT$ «подчистит» и два обязательно следующих за
ним параметра. А вот управляющий символ табуляции CHR$ 23
(TAB-управляющий) будет не только удален вместе со своими параметрами,
но еще и заменен необходимым количеством пробелов.
Таблица 19. Замена символов функцией SHIFT$ в режиме 7.
КЙАЫ <им*о*0*
|
д*й<т*и* при »ы*од* на экдои
|
3 амена
|
8.,,11
|
перемещение курсора
|
«пустая строка»
|
12
|
удаление символа (Delete)
|
CHR$ 32
|
15
|
пробел + возврат каретки + перевод строки
|
CHRS 32+CHR$ 13
|
16...21 + 1 параметр
|
управление атрибутами при выводе на экран
|
«пустая строка»
|
22 + 2 параметра
|
АТ-управляющий
|
«пустая строка»
|
23 + 2 параметра
|
ТАВ-управляющий
|
соответствующее число пробелов
|
Помимо изложенного, функция SHIFTS в режиме 7
вводит новый управляющий код, который ранее в ZX Spectrum не
использовался: в исходной строке символ с кодом 1 5 она заменяет
сочетанием символов пробела (CHR$ 32) и возврата каретки (CHR$ 13).
Но самое ценное в работе функции SHIFT$ в
режиме 7 — это замена символов с кодами 128...255 на
последовательности букв, составляющих соответствующие ключевые слова
интерпретатора. Такая интерпретация выполняется только в режиме
клавиатуры KEYWORDS 1. Например, функция SHIFT$(7,CHR$ 140) вернет
строку из пяти символов с кодами 76, 79, 67, 65 и 76, которые составят
слово LOCAL. Несколько иначе трактуется символ с кодом 168,
соответствующий ключевому слову FN. Если двум символам — букве и
открывающей скобке или букве и знаку $, стоящим за CHR$ 168,
соответствует одна из встроенных функций Beta Basic, то все эти символы
будут заменены на полное буквенное название соответствующей функции. В
противном случае код 168 будет просто заменен сочетанием символов F и N.
В режиме KEYWORDS 0 никаких изменений в старшей
половине кодовой таблицы не происходит, за исключением замены по
описанному сценарию символа с кодом 168.
Свойства функции SHIFTS в режиме 7, к примеру,
дают возможность написать на языке Beta Basic драйвер принтера,
позволяющего распечатывать тексты программ, или драйвера экрана для
независимого редактора программ.
Завершим рассказ о способах обработки
символьных значений описанием интереснейшего объекта системы Beta Basic
— символьной переменной Z$. Использовать эту переменную можно,
как и любые другие (A$...YS); при обычных операциях с символьными
значениями Z$ ничем не отличается от них, но...
Но кроме этого в символьную переменную ZS можно
заносить данные с помощью оператора PRINT (или LPRINT) в виде,
предназначенном для вывода на экран. Данные, направленные в Z$, можно
аккумулировать, то есть использовать неременную в качестве своего рода
буфера99.
«Печать» данных в переменную Z$ производится оператором PRINT #14. Выполним программу:
10 INPUT LINE А$: LET Z$=""
20 PRINT #14; AT 5,10;INK 4;A$;PAPER 2;12345
В результате работы программы на экране не
появятся ни значение, присвоенное переменной А$, ни числа, стоящие в
строке за PRINT — все они будут спрятаны в символьную переменную
Z$. В этом легко убедиться, распечатав ее содержимое с помощью
оператора PRINT Z$. Данные предстанут на экране, причем будут выведены
именно в том цвете и окажутся именно в тех позициях, которые были
предусмотрены в операторе PRINT #14. Все это говорит о том, что в
переменную Z$ передаются не только данные, hd и все коды управления выводом на экран.
Как уже упоминалось, переменная Z$ накапливает
выводимую в нее информацию. При этом, если в конце очередного PRINT #14
после выводимых данных не стоит запятая или точка с запятой, они будут
дополнены символом CHR$ 13 (возврат каретки). Вся информация может быть
мгновенно удалена оператором LET Z$="' Попытка осуществить вывод в Z$
до того, как она была впервые определена, приведет к выдаче сообщения
Variable not found.
Описанные свойства символьной переменной Z$
позволяют находить изящные решения многих вопросов программирования.
Так, с ее помощью можно задерживать предназначенную для вывода
информацию, при желании анализировать или видоизменять ее, пользуясь
всеми доступными средствами для работы с символьными переменными, а
затем по выбору направлять на то или иное внешнее устройство.
В заключение добавим, что такими
«волшебными» свойствами можно наделить любую символьную
переменную. Для этого достаточно выполнить оператор
РОКЕ 47027,"<имя переменной>"
- где <имя переменной> — заглавная
латинская буква (без знака $). Так, инструкция РОКЕ 47027,"А" предпишет
каналу "Z" работать с переменной А$. Делая аналогичные переключения на
разные переменные, можно в любую из них осуществлять запись оператором
PRINT #14 со всеми вытекающими отсюда последствиями.
Обращаем внимание на то, что переменные,
стоящие в списке вывода оператора PRINT #14, должны быть определены или
иметь последние изменения до инициализации переменной Z$. Если же это
условие соблюсти невозможно, перед оператором PRINT #14 необходимо
делать переинициализацию Z$ (без потери информации в ней) инструкцией
LET Z$=Z$.