Лекция: Строковые функции и операторы
Приведем наиболее часто употребляемые строковые функции:
Функции, возвращающие числовые значения:
ASC(Str$)– выдает числовое значение ASCII-кода первого символа в Str$.
LEN(Str$)– выдает целое число, равное длине строкового выражения Str$.
VAL(Str$)– преобразует строку в числовое выражение, если первый символ аргумента не числовой, то функция возвращает ноль.
INSTR(n, Str$, Str1$)– определяет позицию вхождения выражения Str1$ в Str$, начиная с позиции n.
Функции, аргумент которых числовое выражение):
CHR$(код)– выдает символ ASCII, код которого является аргументом.
STR$(числовое выражение) – преобразует числовое выражение в символьное. Если значение выражения положительно, то к полученной строке слева добавляется пробел.
Пары функций ASC(Str$)иCHR$(код); VAL(Str$)иSTR$(числовое выражение) являются обратными по своему назначению.
Функции, и аргумент и значение которых символьные выражения:
MID$(St$, n, m) в качестве результата дает фрагмент строки St$, длиной m, начиная с позиции n.
Оператор MID$(St$, n, m)= Zt$ заменяет фрагмент строки St$ длиной m, начиная с позиции n на строку Zt$.
LEFT$(St$, n) — выделяет из выражения n левых символов.
RIGHT$(St$, n) — выделяет из выражения n правых символов.
LTRIM$(St$) — удаляет левые пробелы.
RTRIM$(St$) — удаляет правые пробелы.
INKEY$ — функция анализирует информацию о нажатых клавишах. Эта функция, помещенная в цикл DO … LOOP, может быть использована для создания паузы произвольной продолжительности, управления графическим объектом, выхода из цикла и т.д.
HEX$(числовое выражение&) – возвращает шестнадцатеричное представление аргумента.
OCT$(числовое выражение&) – возвращает восьмеричное представление аргумента.
LCASE$(Str$) –переводит все буквы строки Str$ в строчные.
UCASE$(Str$) –переводит все буквы строки Str$ в прописные.
SPASE$(n%) –возвращает строку из n% пробелов.
STRING$(n%, {код | строковое выражение}) –возвращает строку из n% повторяющихся символов.
Следует обратить внимание на то, что тексты могут содержать числовую информацию, но в этом случае цифры в тексте воспринимаются как символы.
ПРИМЕР 14.1. Из исходной строки a$ удалить подряд идущие повторяющиеся пробелы (из группы подряд идущих пробелов остается один).
CLS
LINE INPUT a$ ' вводим исходную строку
DIM I, dl AS INTEGER
dl = LEN(a$) 'определяем длину строки
FOR I = 1 TO dl-1
REM Формируем новую строку b$ без лишних пробелов
REM Из строки a$ выделяем очередной символ и следующий за ним
s$ = MID$(a$, i, 1)
ss$ = MID$(a$, i + 1, 1)
IF s$ <> " " AND ss$ <> " " OR s$ <> " " AND ss$ = " " THEN
b$ = b$ + s$
REM В строку b$ записывается последний пробел из подряд идущих пробелов
ELSEIF s$ = " " AND ss$ <> " " THEN
b$ = b$ + s$
END IF
NEXT I
PRINT b$ 'выводим полученную строку
END
Пояснения к программе:
Новую строку b$ формируем следующим образом:
— в исходной строке a$ выделяются два соседних символа;
— если первый из них не пробел, то он присоединяется к новой строке;
— если оба символа пробелы, то в новую строку ничего не добавляется;
— пробел добавляется с случае, когда первый из символов пробел, а второй нет. Таким образом, в новую строку добавляется последний пробел из группы подряд идущих пробелов;
— все условия в блочном операторе можно объединить в одно сложное условие.
ПРИМЕР 14.2.Для строки a$ определить, является ли она симметричной (читается одинаково слева направо и справа налево).
LINE INPUT a$ 'вводим исходную строку
DIM I AS INTEGER
FOR I=LEN(a$) TO 1 STEP -1 'используем отрицательный шаг
b$=b$ + MID$(a$, I, 1) 'заполнение зеркально отраженной строки
NEXT I
IF a$=b$ THEN 'сравнение исходной строки и зеркально отраженной
PRINT «Строка симметричная»
ELSE PRINT «Строка несимметричная»
END IF
END
Пояснения к программе:
— по исходной строке a$ формируем новую строку b$, которая является зеркальным отображением исходной (исходная строка переписанная от конца к началу);
— если строки a$ и b$ совпадают, то исходная строка a$ является симметричной.
Рассмотрим другой способ решения задачи.
LINE INPUT a$ 'вводим исходную строку
DIM I, n AS INTEGER
n=LEN(a$)
FOR I=1 TO n\2
b1$=MID$(a$, I, 1) 'считывание очередного символа строки
b2$=MID$(a$, n-I+1, 1) 'считывание симметричного символа
IF b1$<>b2$ THEN PRINT «Строка несимметричная»: END
NEXT I
PRINT «Строка симметричная»
END
Пояснения к программе:
— в этом способе в цикле считываются очередной символ исходной строки и симметричный ему символ из второй половины строки;
— если эти символы не совпадают, исходная строка не является симметричной.
ПРИМЕР 14.3. Сложить два целых положительных числа большой длины.
CLS
INPUT «введите первое число», a$
INPUT «введите второе число», b$
DIM la, lb, I, per, sd, s1, s2 AS INTEGER
la = LEN(a$): lb = LEN(b$)
IF la < lb THEN
DO WHILE la <> lb 'цикл выравнивания строк по длине
a$=«0»+a$: la = LEN( a$)
LOOP
END IF
IF la > lb THEN
DO WHILE la <> lb ' цикл выравнивания строк по длине
b$=«0» + b$: lb = LEN(b$)
LOOP
END IF
per = 0
FOR I = la TO 1 STEP -1
REM Выделяем по одному символу из строк и преобразуем их в числа
s1 = VAL(MID$(a$, I, 1))
s2 = VAL(MID$(b$, I, 1))
s = s1 + s2 + per 'складываем поразрядно числа и перенос
IF s > 9 THEN
ed = s MOD 10: per = 1 'разделяем сумму на единицы и десятки-перенос
ELSE
ed = s: per = 0
END IF
REM Преобразуем число в строку, убираем пробелы
REM и присоединяем к результату
c$ = LTRIM$(STR$(ed)) + c$
NEXT I
IF per = 1 THEN c$ = STR$(per) + c$ 'присоединяем последний перенос
PRINT a$: PRINT b$: PRINT c$
END
Пояснения к программе:
— т.к. диапазон представления чисел ограничен, для операций над ними могут быть использованы символьные данные, с их помощью имитируют арифметические действия над числами большой величины;
— в данной программе имитируется сложение двух чисел столбиком;
— вводятся два числа в символьной форме;
— строки выравниваются по длине, для этого к началу более короткой строки приписываются нули;
— начиная с конца строк, выделяется по одной цифре из каждой строки, которые преобразуются в числовую форму, и складываются (s1 и s2);
— если их сумма больше 9, то отдельно записываются единицы в ячейку «ed» и перенос — в ячейку «per»; перенос участвует в сложении цифр следующего разряда заданных чисел.
ПРИМЕР 14.4. Дана строка символов, заканчивающаяся точкой. Посчитать, сколько слов содержит данная строка.
CLS
LINE INPUT a$ ' вводим исходную строку
REM Описываем целочисленные переменные, K – счетчик слов
DIM L, I, K AS INTEGER
L = LEN(a$)
K = 0 'устанавливаем начальное значение счетчика слов
FOR I = 1 TO L-1
REM Считываем из исходной строки два соседних символа
s$ = MID$(a$, I, 1)
ss$ = MID$(a$, I + 1, 1)
REM Счетчик увеличивается, если за пробелом следует не пробел
IF s$ <> " " AND ss$ <> " " THEN K = K + 1
NEXT I
PRINT K + 1
END
Пояснения к программе:
— учитываем, что слова отделяются друг от друга пробелами. Подсчитав количество пробелов (групп пробелов), можно определить количество слов в строке. Т.к. в конце строки стоит точка, то количество пробелов будет на единицу меньше, чем число слов;
— в исходной строке a$ выделяются два соседних символа;
— если первый из них пробел, а второй нет, то счетчик слов увеличивается на единицу;
— после обработки строки выводится увеличенное на единицу значение счетчика слов;
— данная программа правильно работает и в случае, когда слова отделяются друг от друга более чем одним пробелом;
— считаем, что перед первым словом исходной строки пробелов нет и между последним словом и завершающей точкой также нет пробелов, иначе программа будет выдавать неверный результат.
Группу строк (символов) можно хранить в строковом массиве, например A$(i), и обращаться к отдельным строкам по именам A$(1),A$(2),A(3) и т.д. Например, список фамилий в телефонном справочнике можно представить, как одномерный строковый массив.
Для массивов строк допустимы те же имена, что и для числовых массивов, только к имени добавляется знак $ или в описании указывается тип. Каждый элемент массива равноценен строковой переменной. Действие всех вышеперечисленных строковых функций распространяется и на элементы массивов.
ПРИМЕР 14.5. С клавиатуры вводится список фамилий. Количество фамилий заранее известно. Распечатать список фамилий в алфавитном порядке.
REM Задача представляет собой задачу сортировки одномерного массива
CLS
DIM n, i, j AS INTEGER
INPUT n 'вводим количество фамилий
DIM fio(n) AS STRING 'описываем символьный массив
REM Вводим с клавиатуры список фамилий
FOR i = 1 TO n
INPUT fio(i)
NEXT
REM Сортировка массива методом «пузырька»
FOR i = 1 TO n — 1
FOR j = 1 TO n — i
REM Если фамилии не по алфавиту, меняем их местами оператором «swap»
IF fio(j) > fio(j + 1) THEN SWAP fio(j), fio(j + 1)
NEXT j
NEXT i
REM Выводим на экран отсортированный список фамилий
FOR i = 1 TO n
PRINT fio(i)
NEXT
END
ПРИМЕР 14.6. Дана строка, состоящая из нескольких слов. Записать слова строки в символьный массив (элемент массива – слово строки). Вывести полученный массив в столбик.
CLS
LINE INPUT a$ ' вводим исходную строку
REM Описываем целочисленные переменные, K – счетчик слов в строке
DIM L, I, K, J, m AS INTEGER
L = LEN(a$)
K = 0 'устанавливаем начальное значение счетчика слов
FOR I = 1 TO L-1
REM Считываем из исходной строки два соседних символа
s$ = MID$(a$, I, 1)
ss$ = MID$(a$, I + 1, 1)
REM Счетчик увеличивается, если за пробелом следует не пробел
IF s$ <> " " AND ss$ <> " " THEN K = K + 1
NEXT I
K = K + 1 'окончательное значение счетчика слов
a$ = a$ + " " 'пробел в конце строки: каждое слово заканчивается пробелом
DIM SL$(1 TO K) 'описываем строковый массив по числу слов в строке
REM Формируем строковый массив
I = 1 'устанавливаем позицию начала поиска первого пробела в строке
FOR J = 1 TO K
m = INSTR(I, a$, " ") 'ищем позицию вхождения в строку очередного пробела
SL$(J) = MID$(a$, I, m-I) 'записываем очередное слово в массив
I = m +1 'устанавливаем позицию начала поиска очередного пробела
PRINT SL$(J) 'выводим сформированный элемент массива на экран
NEXT J
END
Пояснения к программе:
— подсчитываем число слов в исходной строке a$: переменная K;
— добавляем пробел в конце строки, теперь каждое слово в строке заканчивается пробелом;
— описываем строковый массив SL$, количество элементов которого равно числу слов в исходной строке a$;
— переменная I – позиция начала поиска очередного пробела в строке одновременно является позицией начала очередного слова в строке, начальное значение переменной I равно 1;
— ищем позицию вхождения очередного пробела в строке – функция INSTR и формируем элемент массива SL$;
— выводим очередной элемент массива SL$ на экран.