Главная » Basic » ВЫРЕЗКИ И ФУНКЦИИ

0

В этом подразделе обсуждаются функции, возвращающие в качестве результата строки, являющиеся либо вырезками  из уже существующих строк, либо новыми строками,  получающимися,  например,  в процессе преобразования числового значения в строку символов. Здесь описываются только широко распространенные функции,  а для примеров,  если не оговорено, используются функции  Бейсика Microsoft. Перечни различных функций, сгруппированных по характеру их действия,  приводятся   в табл. 4.9 — 4.13.

Основное внимание  уделяется тем функциям, которые возвращают части строк или,  более точно, вырезки. Вырезка  представляет собой  последовательность смежных  символов,   извлеченную из другой строки. Так, "ДНЕМ" и  "М РОЖДЕНИЯ" представляют собой вырезки из строки  "С ДНЕМ РОЖДЕНИЯ", а "СДЕНИЯ" и  "НЕРОЖ" нет, хотя и  являются новыми строками,  которые можно получить  из нескольких  вырезок исходной  строки.

Если строка А$ содержала "ДОБРЫЙ ДЕНЬ", то в результате выполнения операторов

A1$ = LEFT$(A$,9) A2$ = LEFT$(A$,2) B1$ = RIGHT$(A$,4) В2$ = RIGHT$(A$,9) 109

Таблица 4.9. Функции Бейсика со строковыми значениями для персональной ЭВМ ZX81

фирмы Sinclair

Результат

Функция

Действие

Преобразование

кода в символ Вырезки строки

Символьная запись числа

Особый ввод символа

CHR$ N

Выделяется часть строки; не является функцией Строка (NТОМ) Строка (N)

STR$N

INKEY$

Дает символ, код которого равен N и

находится в пределах 0 … 255

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

В такой форме дает ровно один N-й символ строки

Дает строку, являющуюся символьной записью числа N. Обратной функцией является VAL(более общая функция, так как может входить  в состав  выражений)

Не имеет аргументов; обеспечивает  ввод с клавиатуры одного символа

Таблица 4.10. Функции Бейсика Microsoft со строковыми значениями

Результат

Функция

Действие

Преобразовани

е кода в символ

CHR$(N)

Дает символ с кодом ASCII, равным N

Вырезки строки

LEFT$(A$,N) RIGHT$(A$,N) MID$(A$,N,M)

Дает N левых (LEFT$) или правых

(RIGHT$) символов строки А$

Дает М символов строки А$, начиная с позиции N

Символьная запись числа

STR$(A)               Дает строку, являющуюся символьной записью числа А. Обратной функцией является VAL

Особый ввод символов

Средства форматирования вывода

INKEY$ INPUT$(N)

SPACE$(N) STRING$(N,M) STRING$(N,A$)

Не имеет аргументов и обеспечивает  ввод с клавиатуры одного символа

Обеспечивает  ввод с клавиатуры N символов. (Может быть использована и при работе с файлами)

Дает строку из N пробелов

Дает строку из N одинаковых символов с кодом ASCII, равным М, или N-кратно повторяет  первый символ строки А$

Разное                HEX$(A) OCT$(A)

Дает строку, содержащую шестнадцатеричную (НЕХ$) или восьмеричную (OCT$) запись числа А, предварительно округленного до целого значения

Таблица 4.11. Функции Бейсика ВВС со строковыми значениями

Результат

Функция

Действие

Преобразование кода

в символ Вырезки строки

Символьная запись числа

Особый ввод символа

Средства фор-

матирования вывода

CHR$(N)

LEFT$(A$,N) RIGHT$(A$,N) MID$(A$,N,M) STR$(M)

GETS INKEY$(N)

STRINGS(N,A$)

Дает символ, внутренний  код которого равен остатку от

деления N на 256

Дает N левых (LEFT$) или правых (RIGHT$) символов строки А$

Дает М символов строки А$, начиная с позиции N

Дает строку, являющуюся  символьной записью числа М.

Обратной функцией является VAL

Не имеет аргумента; ожидает ввода следующего символа,  который и предоставляет в качестве значения функции

Аналогична GETS, но ждет ввода  в течение не более чем N отсчетов внутренних часов. Если за это время символ не был введен, то возвращает в качестве значения

пустую строку (у этих функций есть версии с числовыми значениями)

Дает строку, составленную из N копий строки А$

Таблица 4.12. Функции Бейсика со строковыми значениями для персональной ЭВМ СВМ PET

Результат

Функция

Действие

Преобразование кода

в символ

CHR$(N)

Дает символ с кодом ASCII, равным N

Вырезки строки           LEFT$(A$,N) RIGHT$(A$,N) MID$(A$,N,M)

Дает N левых (LEFT$) или правых (RIGHT$) символов строки А$

Дает М символов строки А$, начиная с позиции N

Символьная запись числа

STR$(A)                Дает строку, являющуюся  символьной записью числа А.

Обратной функцией является VAL

Особый ввод символа He функция, а обычный оператор, например 10 GET A$

Обеспечивает  ввод с клавиатуры в строковую переменную следующего символа

Таблица 4.13. Функции Бейсика со строковыми значениями для ЭВМ ICL 2903/4

Результат                              Функция         Действие

Преобразование кода в символ

CHR$(N)         Дает символ, внутренний код которого равен остатку от деления N на 64

Вырезки строки                   SEG$(A$,N, M) SUB$(A$,N, M)

в позициях  с N-й по М-ю, а в случае SUB$ — из М символов, начиная с N-й позиции строки  А$

Символьная запись числа    STR$(A)          Дает строку, являющуюся  символьной записью числа А. Обратной функцией является VAL

Средства форматирования вывода

GAP$(N)

SGN$(X)

LIN$(N) DEL$(A$,B$, N) SDL$(A$,B$, N) REP$(A$,B$, C$,N) SRP$(A$,B$,

Возвращает  символы +, — или пробел соответственно при положительном,  отрицательном  или нулевом значении X Дает N символов перехода к новой строке Удаление  из строки А$ первого (DEL$) или всех

(SDL$) вхождений в нее строки В$ Замена в  строке А$ первого (REPS) или всех (SRP$)  вхождений в нее строки В$ на строку С$

                                                 C$,N)                                                                                                                 А1$ будет содержать "ДОБРЫЙ ДЕ", А2$ "ДО", В1$ "ДЕНЬ", а В2$ -"БРЫЙ ДЕНЬ". Если  нам требуется выполнить присваивания

С1$ = MID$(А$,8,4)

С2$ = MID$(А$,4,8) C3$ = MID$(A$,4)

то  C1$ примет значение "ДЕНЬ", С2$   "РЫЙ  ДЕНЬ", а  С3$  получит в  качестве  значения все символы справа от четвертого, т. е. тоже "РЫЙ ДЕНЬ".

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

10 REM ПРИМЕР ДЕЙСТВИЙ НАД СТРОКАМИ СИМВОЛОВ

20 А$="ОКТЯ ДЕКА"

30 B$="БРЬ"

40 FOR I=1 ТО 9 STEP 5

50   C$=MIDS$(A$,1,4)

60   C$=C$+B$

70   PRINT C$

80 NEXT I

90 END RUN ОКТЯБРЬ ДЕКАБРЬ

END AT LINE 90 112

Управляющая переменная цикла по очереди пробегает значения начальных позиций первых частей названий месяцев; в строке 50 первая часть очередного названия месяца вырезается, в строке 60 к ней добавляется "БРЬ", и полученный результат выводится оператором PRINT в строке 70. При желании эти три строки можно объединить в один  оператор PRINT MID$(A$, 1,3) + В$.

Если Вы  собираетесь приступить  к  обработке текста или редактированию   текстового файла, то стандартные строковые  функции могут оказаться не очень удобными, так как при обращении к ним надо указывать  номера позиций. Точная форма программных компонент зависит от таких деталей, как  тип изменяемых   данных  и   их   местонахождение (память  или   диск); поэтому  мы  сделаем определенные допущения. Предположим, что данные обрабатываются построчно и  текущая строка запоминается в  А$. Предположим также, что система должна воспринимать  команды изменения текущей строки  или замены ее на другую строку.

(а)   В удобной для работы системе от пользователя не должно требоваться вычисления номеров позиций для  выполнения каких-либо действий над частью строки. Поэтому первой необходимой операцией является ПОИСК В$ в  А$, где А$ — текущая строка, а В$ — некоторая вырезка. Эта операция вполне удовлетворительно выполняется функцией INSTR или ей подобной.

(б)  Следующая необходимая операция ВСТАВКА С$ В ПОЗИЦИИ I в  А$, что обычно  означает вставку новой строки непосредственно перед 1-й позицией исходной  строки. Эту операцию можно осуществить с помощью выражения

LEFT$(A$, I-1) + С$ + RIGHT$(A$,LEN(A$)-I+1)

(в)     Очередная   операция  УДАЛЕНИЕ   В$ ИЗ А$. Для ее выполнения сначала можно найти начальную позицию вырезки В$ в А$ так, как указано в (а); если она равна I, то изменение строки можно осуществить с помощью выражения

LEFT$(A$,I-1) + RIGHT$(A$,LEN(A$)-LEN(B$)-I + 1)

(г)  Нередко действия (а) , (б) и (в) приходится объединять в одну операцию ЗАМЕНА В$ НАС$ в А$.  Сначала  надо  определить начальную  позицию  I  вырезки В$  в   А$,  затем  удалить В$  и   в заключение вставить С$.

В  некоторых  системах, например ICL  2903/4  (см.  табл.  4.13)  предусмотрены  функции для выполнения подобных операций, а в других, например ВВС, для выполнения этих операций  можно создать специальные процедуры, не похожие на функции. Однако во всех системах  для выполнения этих операций можно составить подпрограммы.

Образование вырезок удобно и  элегантно выполняется системой ZX81 фирмы Sinclair. В скобках после  имени  переменной  указывается диапазон извлекаемых позиций. Например, в   результате исполнения операторов

А$ = "OKAY" В$ = А$(1 ТО 2) 113

в В$ окажется "ОК". Кроме того, вырезки можно указать слева от знака присваивания (=) для того, чтобы заменить на новую не всю строку, а только определенную ее часть. Жаль, что большинство систем с Бейсиком предпочитает  ограничиваться неуклюжей системой функций.

Вернемся к рассмотрению некоторых из оставшихся  строковых  функций.  Действие функции CHR$

иллюстрируется следующей программой:

10 REM ПРИМЕР ДЕЙСТВИЯ ФУНКЦИИ CHR$

20 FOR I=45 ТО 69

30   PRINT CHR$(I);

40 NEXT I

50 END RUN

-. /0123456789: ; = ?@ABCDE END AT LINE 50

Функцией CHR$ можно генерировать  символы любого типа, даже не печатаемые. Например, число 13  является десятичным кодом символа  возврата  каретки, поэтому  PRINT CHR$(13)  приведет  к возврату  курсора на начало строки. С помощью CHR$ можно осуществить  все типы управления печатающим устройством (например, прогон на начало следующей страницы  или многопроходную печать), что никакими другими  средствами выполнить не удается. Если Вы попробуете исполнить указанную выше программу для I, меняющегося от 0 до 255, что отвечает полному набору символов ASCII,   то   увидите   очень  странные  результаты,  так  как  дисплей  реагирует  на  выдаваемые управляющие  символы. При этом может оказаться, что работа Бейсика прекратилась и вновь  вызвана операционная система!

Функции STR$ и VAL взаимно обратны. Функция VAL очень полезна для извлечения  из строк чисел для последующего проведения вычислений. Например, в результате исполнения оператора

В = VAL(RIGHT$("ЦEHA РАВНА 105.12" ,6))

в  В окажется число 105.12. А функцию STR$ можно использовать для обратного преобразования числа в  строку символов.  Если В содержит 105.12 и  добавляется налог в  15 %, то мы получим 120.888,  но  так  как  сумму  надо  выражать в   целых  фунтах  стерлингов и    пенсах,  то  перед преобразованием полученной суммы в  строку символов последнюю цифру 8 надо отбросить. Для этого можно использовать операторы

100   В = 105.12

110   В=В* 1.15

120  B$ = STR$(B)

130   В$ = LEFT$(B,6)

140   А$ = "ЦЕНА РАВНА" + В$ +" (ВКЛЮЧАЯ НАЛОГ) " Заметим, что вместо строк 110  140

можно написать один оператор

А$ = "ЦЕНА РАВНА" + LEFT$(STR$(B*1.15),6) +"(ВКЛЮЧАЯ НАЛОГ)"

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

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

Как видно из таблиц, существует много различных форм ввода одного символа; операторы

10     А$ = GET$

10      В$ = INKEY$

10   LET C$ = INKEY$

10  GETD$

выполняют одни и  те же действия   в  системах ВВС, Microsoft, Sinclair и  PET соответственно.  В Бейсике PET ввод одного символа реализован как оператор, а не функция и может быть использован с  числовой  переменной. В Бейсике ВВС существует дополнительная функция, ожидающая ввода заданное время. Если за это время ни одного символа не было набрано, то программа продолжает работу и получает в качестве значения пустую строку.

Указанная функция почти всегда используется в цикле  для ожидания ввода. Например,  при работе с Бейсиком Microsoft цикл

50   В$ = INKEY$

60   IF LEN(B$)= 0 THEN 50

70   ……

продолжается неопределенное время до тех пор, пока не будет нажата хоть какая-нибудь клавиша. Таким способом можно организовать  свою систему  ввода, занося набираемые  символы в строку до тех пор, пока не будет набран специальный  символ или символ возврата каретки (равный CHR$(13)): 100 I$=""

110   B$=INKEY$

120   IF LEN(B$)=0 THEN 110

130   IF B$=CHH$(13) THEN 200

140   I$=I$+B$

150  GOTO 110

200  REM В I$ СОДЕРЖИТСЯ ПОСЛЕДОВАТЕЛЬНОСТЬ НАБРАННЫХ СИМВОЛОВ

210   ……

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

Так  как  функции  INKEYS  (или  GETS)  дают возможность полного  управления  вводом, то  с  их помощью  можно  конструировать  собственные процедуры  ввода,  например ввода в   свободном формате, и т. д.

Источник: Уолш Б.    Программирование на Бейсике: Пер. с англ. М.: Радио и связь, 1988. 336 с: ил.

По теме:

  • Комментарии