Обработка строковой
информации. Базовые алгоритмы обработки строк (на примере любого языка
программирования).
Для обработки строковой информации в Турбо Паскаль введен строковый тип данных. Строкой в Паскале
называется последовательность из определенного количества символов.
Количество символов последовательности называется длиной строки. Синтаксис:
var s: string;
В Паскаль имеется простой доступ к отдельным символам строковой переменной: i-й
символ переменной st записывается как st[i]. Например, если st - это 'Строка',
то st[1] - это 'С', st[2] - это 'т', st[3] - 'р' и так далее.
В системе Pascal имеется несколько полезных стандартных процедур и функций,
ориентированных на работу со строками.
• Length(s) – определяет длину строки S: кол-во символов в строке.
• Concat (a, b) – склеивает значения строковых переменных
Н\Р: a:=’par’; b:=’hod’; concat(a, ‘o’, b) = parohod.
• Pos (b,a) – возвращает номер позиции, с которой подстрока b входит в строку
a.
Н\р: a:=’par’; b:=’a’; pos (b,a) = 2 (на втором месте находится ‘a’).
• Copy(s,I,k) – копировать из строки S с позиции I k символов.
• Delete (S,I,k) – удалить из строки s с позиции I k-символов.
• Insert (s1,s2,i) – вставляет строку s1 в строку s2 перед i-ым символом
Н\р: a:=’пар’; insert( ‘и’, a, 2) = ‘пиар’.
• Str (h, s), где h: integer – переводит числовое значение h в строковую
переменную s
Н\р: h:=8; str (h, s), тогда s:=’8’.
• Val (S, h, osh) – переводит строку S в число H с кодом ошибки osh.
Если Osh=0, то перевод осуществлен
Если Osh<>0, то строка не переведена в число.
Н\р: val (‘84’, h, osh); h=84; osh=0;
Val (‘abs’, h, osh); h=0; osh <>0.
Определить содержится ли в данном тексте заданное слово
Var a,c:string; k:integer;
Begin
Writeln('vvedi text');
Readln(a);
Writeln('vvedi slovo');
Readln(c);
K:=0;
While pos (c,a)>0 do
Begin
K:=k+1;
Delete (a, pos(c,a), length(c));
End;
If k=0 then writeln ('нет') else writeln
('да ',K,' ','раз');
Readln;
End.
Подсчитать сколько раз заданная буква встречается в слове
Var a,b:string; I,k:integer;
Begin
Writeln('vvedi slovo');
Readln(a);
Writeln('vvedi bukvu');
Readln(b);
K:=0;
For i:=1 to length(a) do
If a[i]=b then k:=k+1;
if k=0 then writeln ('не встречается') else writeln
(k,'
','раз');
readln;
end.
Заменить букву А
на Б, букву Б на А
Var a:string; i: integer;
Begin
Writeln('введи слово');
Readln(a);
For i:=1 to length(a) do
Begin
If a[i] = 'a' then a[i]:='b' else if a[i]='b' then a[i]:='a';
End;
Writeln(a);
End.
В строке заменить букву ‘к’ на сочетание ‘ку’
Var a,b:string; i:integer;
Begin
Writeln ('введи строку');
Readln(a);
B:='';
For i:=1 to length(a) do
Begin
If a[i]='k' then b:=b+'ku';
End;
Writeln(b);
End.
Все языки программирования высокого уровня имеют средства работы с
литерными величинами. Паскаль - не исключение. В стандарте языка описаны
два типа переменных для литерных величин. Это - String и Char. Переменная типа
Char может содержать в себе только один единственный символ, тип String
предназначен для хранения строковых величин до 255 символов длиною. При
описании переменной типа String вы можете сами указать максимальное число
символов, которое можно занести в нее. Конечно же, это число не должно
превышать 255. Делается это так:
Var
S : String[30];
Для чего это нужно? Дело в том, что при компиляции для каждой переменной
отводится свой участок памяти. Если мы будем выделять для всех переменных типа
String по 256 байт, то это приведет к тому, что при использовании достаточно
большого их количества, памяти может и не хватить. Но если в переменной мы
собираемся хранить, например, фамилию пользователя, то тридцати символов
(тридцати байт) для этого вполне достаточно. Таким образом, экономится память и
увеличивается быстродействие программ.
Переменным строкового типа можно присваивать строковые величины (внутри
программы они заключаются в апострофы), значения выражений, которые приводят к
строковым величинам. Значения можно также вводить с клавиатуры. При этом
апострофы не используются. В числовую переменную нельзя ввести строковую
величину. Сделать наоборот возможно, однако число, находящееся в строковой
переменной представляет собой просто последовательность символов (цифр),
поэтому в арифметических выражениях участвовать не может.
При использовании строковой переменной, к каждому ее символу можно обратиться
отдельно. Необходимо только знать номер нужного символа от начала строки. Его
достаточно поставить после имени переменной типа String в квадратных скобках.
Пример: S[5] - пятый символ строки S.
С отдельным символом строки можно производить все действия, которые можно
производить с любой символьной переменной (ввод, присвоение, вывод на экран,
участие в выражениях и т.д.). Нумерация символов в строке начинается с
единицы. Внутри квадратных скобок вместо числа может находиться
выражение, результатом которого является целое число. Главное чтобы символ с
таким номером в строке существовал. Для того чтобы определить, сколько
символов в данный момент находится в строковой переменной существует
специальная функция, которая возвращает длину строковой переменной в символах.
Это функция Length. Ее формат: Length(S), здесь S - либо строковая
величина, либо строковая переменная.
Пример: Введенную строку вывести на экран по одному символу в строке
экрана.
(Byte -занимает один байт для беззнаковых чисел, т. е. от 0 до 255)
Program Str2;
Var
S : String;
I : Byte;
Begin
Writeln('Введите строку');
Readln(S);
For I:=1 to Length(S) do
Writeln(S[I]);
End.
Две строковые величины можно состыковывать.
Эта операция называется конкатенацией и обозначается знаком "+".
Например, результатом выполнения следующих команд:
R:= 'kadabra';
H:= 'abra';
S:=H+R;
в переменной S будет значение 'abrakadabra'.
Для конкатенации результат зависит от порядка операндов (в отличие от операции
сложения). Следует помнить о том, какой максимальной длины может быть
результирующая переменная, так как в случае превышения значением выражения
числа, указанного после String в описании переменной, "лишние"
символы в переменную не попадут.
Строковые
величины можно сравнивать между собой. Такая
проверка проходит довольно сложно: компьютер сравнивает сначала первые символы
строк. Большим из двух считается тот, код которого больше. Если равны первые
символы, то так же анализируется следующая пара до тех пор, пока не будет
найдено различие. Если начало строк совпадает, а одна из них кончается раньше,
то вторая автоматически называется большей.
Код символа в Паскале можно определить при помощи функции Ord.
Ее формат: Ord(C), где С - либо непосредственно указанный символ, либо
переменная символьного типа, либо один символ строковой переменной.
Есть и обратная функция, которая возвращает символ по известному коду.
Это функция Chr(N), где N - выражение, приводящее к целому числу в интервале от
0 до 255 (возможные значения кода символа). Очевидно, что Chr(Ord(C))=C,
Ord(Chr(N))=N.
Следующая маленькая программа выводит на экран кодовую таблицу:
Program Str3;
Var
I : Byte;
Begin
For I:=32 to 255 do
Write('VV',I:4, '-',Chr(I))
End.
Цикл в программе начинается с 32 потому, что
символы с кодами от 0 до 31 являются управляющими и не имеют соответствующего
графического представления.
Число, записанное в строковую переменную, естественно числом не является, но
очень часто требуется его все же использовать в качестве числа. Для этого нужно
произвести преобразование типа. Перевод строкового представления числа в
числовое выполняет в Паскале оператор Val.
Его формат:
Val(S,X,C);
Здесь S - строка, содержащая число, X - числовая переменная, в которую будет
помещен результат, С - переменная целочисленного типа, в которую помещается
первого встреченного в S отличного от цифры символа. Если после выполнения
оператора Val переменная С имеет значение 0, то это означает, что
преобразование типа прошло совершенно успешно и в строке нецифровых символов не
встретилось.
Противоположное действие осуществляет оператор Str. Для перевода
числа в строку используется процедура Str . Формат оператора:
Str(X,S);
X - число (либо арифметическое выражение), S - строковая переменная.
В переменную S попадает строковое представление числа X. Это нужно, например,
при необходимости выводить на экран числа в графическом режиме, так как
стандартные процедуры вывода на экран там работают только со строковыми
величинами.
Пример: "Найти сумму цифр введенного натурального числа".
Program Str5;
Var
S : String;
I,X,A,C : Integer;
Begin
Writeln('Введите натуральное число');
Readln(S); {Число вводится в строковую переменную}
A:=0;
For I:=1 To Length(S) Do
Begin
Val(S[I],X,C); {Цифровой символ превращается в число}
A:=A+X {Цифры суммируются}
End;
Writeln('Сумма цифр равна ',A)
End.
Еще несколько действий над строками:
оператор
DELETE(S,I,C) из строковой переменной S удаляет C символов, начиная с I-того;
оператор INSERT(SN,S,I) вставляет подстроку SN в строковую переменную S перед
символом с номером I;
функция COPY(S,I,C) возвращает подстроку строки S из C символов, начиная с
символа с номером I;
функция Pos(SN,S) возвращает номер символа, с которого в строке S начинается
подстрока SN (позицию первого вхождения подстроки в строку). Если такой
подстроки нет, то возвращается ноль.
Пример их использования:
"Во введенной строке заменить все вхождения подстроки 'ABC' на подстроки
'KLMNO'".
Program Str6;
Var
S : String;
A : Byte;
Begin
Writeln('Введите строку');
Readln(S);
While Pos('ABC',S)<>0 Do
Begin
A:= Pos('ABC',S);
Delete(S,A,3);
Insert('KLMNO',S,A)
End;
Writeln(S)
End.
Со строковыми переменными можно производить
операции сравнения (<, <=, >, >=, <>) по правилу сравнения
десятичных дробей. Сравнение строк осуществляется посимвольно слева направо:
сравниваются коды соответствующих символов до тех пор, пока не нарушится равенство
или не кончится одна из строк (или обе сразу), при этом делается вывод о знаке
неравенства. Например,
• 'Паскаль '>'Паскаль' (первая строка будет больше второй, так как в первой
строке еще присутствует пробел),
• 'Balkon'<'balkon' (первая строка меньше второй, так как код символа 'b'
больше кода символа 'B':Ord ('b')>Ord ('B')),
на экран будет выведено сообщение: "Пароход ".
Оставьте свой комментарий
Авторизуйтесь, чтобы задавать вопросы.