Лекция: Строковые функции и операторы

Приведем наиболее часто употребляемые строковые функции:

Функции, возвращающие числовые значения:

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$ на экран.

еще рефераты
Еще работы по информатике