Лекция
2.2.13. Строки символов
Рассмотрим еще один структурный тип данных — строковый тип. Строковый тип данных был введен в Турбо Паскале. Он позволяет программировать обработку слов, предложений, текстов.
Строка — это последовательность символов. Каждый символ занимает 1 байт памяти (код ASCII). Количество символов в строке называется ее длиной. Длина строки может находиться в диапазоне от 0 до 255. Строковые величины могут быть константами и переменными.
Строковая константа записывается как последовательность символов, заключенная в апострофы.
Например:
' Язык программирования ПАСКАЛЬ'
' IBM PC - computer'
'33-45-12'
Строковая переменная описывается в разделе описания переменных следующим образом:
Var <идентификатор>: string[<максимальная длина строки>]
Например:
Var Name: string[20]
Параметр длины может и не указываться в описании. В таком случае подразумевается, что он равен максимальной величине — 255. Например:
Var slovo: string
Строковая переменная занимает в памяти на 1 байт больше, чем указанная в описании длина. Дело в том, что один (нулевой) байт содержит значение текущей длины строки. Если строковой переменной не присвоено никакого значения, то ее текущая длина равна нулю. По мере заполнения строки символами ее текущая длина возрастает, но она не должна превышать максимальной по описанию величины.
Символы внутри строки индексируются (нумеруются), начиная с единицы. Каждый отдельный символ идентифицируется именем строки с индексом, заключенным в квадратные скобки. Например:
Name[5], Name[i], slovo[k+1].
Значение индекса может быть задано положительной константой, переменной, выражением целочисленного типа. Оно не должно выходить за границы описания.
Тип string и стандартный тип char совместимы: строки и символы могут употребляться в одних и тех же выражениях.
Строковые выражения строятся из строковых констант, переменных, функций и знаков операций. Над строковыми данными допустимы операции сцепления и операции отношения.
Операция сцепления (+) применяется для соединения нескольких строк в одну результирующую строку. Сцеплять можно как строковые константы, так и переменные.
Например:
'ЭВМ'+' IBM'+' PC'
В результате получится строка:
'ЭВМ IBM PC'
Длина результирующей строки не должна превышать 255.
Операции отношения: =,<,>, <= , >= , < > производят сравнение двух строк, в результате чего получается логическая величина (true или false). Операция отношения имеет более низкий приоритет, чем операция сцепления. Сравнение строк производится слева направо до первого несовпадающего символа, и та строка считается больше, в которой первый несовпадающий символ имеет больший номер в таблице символьной кодировки.
Если строки имеют различную длину, но в общей части символы совпадают, считается, что более короткая строка меньше, чем более длинная. Строки равны, если они полностью совпадают по длине и содержат одни и те же символы.
Пример
Выражение: Результат:
'cosml'<'cosm2' True
'pascal' >'PASCAL' True
'Ключ_'> 'Ключ' True
'MS DOS' = 'MS DOS' True
Функции и процедуры
Функция Copy (S, Poz,N) выделяет из строки S подстроку длиной N символов, начиная с позиции Poz. N и Poz— целочисленные выражения.
Пример
Значение S: Оператор: Результат:
'ABCDEFG' Copy (S, 2, 3) 'BCD'
'ABCDEFG' Copy(S, 4, 4) 'DEFG'
Функция Concat (S1,S2,...,SN) выполняет сцепление (конкатенацию) строк S1, ..., SN в одну строку.
Пример
Выражение: Результат:
Concat('АА', 'XX', 'Y') 'AAXXY'
Функция Length (S) определяет текущую длину строки S. Результат — значение целочисленного типа.
Пример
Значение S: Оператор: Результат:
'test-5' Length(S) 6
'(А+В)*С' Length(S) 7
Функция Pos(Sl,S2) обнаруживает первое появление в строке S2 подстроки S1. Результат — целое число, равное номеру позиции, где находится первый символ подстроки S1. Если в S2 не обнаружена подстрока S1, то результат равен 0.
Пример
Значение S2: Оператор: Результат:
'abcdef' Pos('cd',S2) 3
'abcdcdef' Pos('cd',S2) 3
'abcdef' Pos('k',S2) 0
Процедура Delete (S, Poz,N) — удаление N символов из строки S, начиная с позиции Роz.
Пример
Исходное значение: Оператор: Конечное значение:
‘abcdefg' Delete(8,3,2) 'abefg'
'abcdefg' Delete(S,2,6) 'a'
Процедура Val(S,Chislo,Err) - преобразовывает строковое значение S в его числовое представление Chislo целого типа. Если преобразование успешно, то err=0, иначе err>0.
Пример
Исходное значение S: Chislo Err:
‘123456' 123456 0
'215ро4564--90' 0 1
Процедура Str(Chislo; S) - Преобразует числовое значение Chislo к строковому представлению S
Пример
Исходное значение Chislo: S
123456 ‘123456'
123.58 '123.58'
Примеры программ обработки строк
Пример 1
Составить программу, формирующую символьную строку, состоящую из N звездочек (N — целое число, 1 ≤N ≤255).
Program Stars;
Var A : string;
N, I: byte;
begin
Write ('Введите число звездочек '); ReadLn(N);
A:='';
for I:=1 to N do
A:=A+'*';
WriteLn(A)
end.
Здесь строковой переменной А вначале присваивается значение пустой строки, обозначаемой двумя апострофами (''). Затем к ней присоединяются звездочки.
Пример 2
В символьной строке подсчитать количество цифр, предшествующих первому символу «!».
program С;
var
S: string;
K, i: byte;
begin
WriteLn('Введите строку');
ReadLn(S);
K:=0; i:=1;
while (i <= Length(S)) and (S[i] <> '!') do
begin
if (S[i] >= '0') and (S[i] <= '9') then K := K + 1;
i := i + 1 end;
WriteLn('Количество цифр до символа "!" равно ', K)
end.
В этой программе переменная К играет роль счетчика цифр, а переменная i — роль параметра цикла. Цикл закончит выполнение при первом же выходе на символ '!' или если в строке такого символа нет, то при выходе на конец строки. Символ S[I] является цифрой, если истинно отношение: '0'≤S[I]≤'9'.