Доступ к элементам строковых данных
ЛАБОРАТОРНАЯ РАБОТА N 8
Тема : " Строковые данные "
Цель работы
1. Ознакомиться со строковыми данными.
2. Получить навыки в организации работы со строковыми переменными: удалением,
вставкой, копированием, заменой одной строки на другую и т.д.
Краткие сведения из теории
Объявление строковых переменных
Турбо-Паскаль предоставляет средства для работы с данными строкового типа, которые
в дальнейшем будем называть стрингами. Строковый тип данных представляет собой
цепочку символов. Длина цепочки может изменяться от 0 до 255. Для определения
строкового типа используется служебное слово STRING, за которым в квадратных скобках
указывается максимальная длина строки, например:
TYPE
line = string[25];
VAR
mline : line;
...
В данном примере переменная mline представляет собой последовательность, включающую
до 25 символов, причем каждый символ имеет стандартный тип CHAR.
Значение строковой переменной может быть назначено оператором присваивания, либо
введено с устройства ввода, например:
aline := 'ВСТИ';
mline := aline;
readln(mline);
Изображение строки строится из цепочки символов и заключается в апострофы.
Максимальная длина строки может быть задана целым числом, или константой целого
типа. Указание максимальной длины может быть опущено; в этом случае подразумевается
число 255, например:
TYPE
line = string;
line1 = string[255];
Описания типов в данном примере эквивалентны. Основное отличие строк от символьных
|
|
массивов заключается в том, что строки могут динамически изменять свою длину,
например:
. . .
mline := 'строка';
mline := mline + 'стала длинной';
. . .
В приведенном примере после первого присваивания длина переменной mline равна шести.
Второе присваивание увеличивает ее длину до 19 символов.
Динамические строки организуются в Турбо-Паскале следующем образом: память под
стринги отводится по максимуму (согласно описанию), а используется лишь та ее часть,
которая реально занята символами строки. При такой организации работы со стрингами
Турбо-Паскаль должен знать реальную длину стринга. Поэтому для строковой переменной
длиной N символов отводится (N+1) байтов памяти, из которых N байтов предназначены для
хранения символов строки, а один байт - для хранения текущей длины строки.
Символы строки нумеруются целыми числами, начиная с единицы, а байт с текущей
длиной строки считается нулевым ее элементом. Длину текущей строки можно определить
следующим образом:
61
. . .
len := ord(st[0]);
. . .
Здесь st - переменная строкового типа.
Если стрингу присваивается значение строкового выражения с длиной, большей чем
максимально допустимая, происходит отсечение строки до максимальной длины, например:
|
|
VAR
st : string[5];
BEGIN
st := 'очень длинная строка';
writeln(st); { будет отображено только: 'очень'}
. . .
Основные операции
Для строковых типов данных определена операция "конкатенация", обозначаемая
символом '+'. Смысл операции заключается в формировании новой строки. Динамическая
длина сформированной строки равна сумме символов строк-операндов, а ее значение равно
последовательности символов исходных строк.
Например:
VAR
str1, str2 : string[10];
st : string[25];
BEGIN
str1 := 'Паскаль - ';
str2 := 'программа';
st := str1 + str2;
WriteLn(st)
END.
В результате выполнения программы будет на экране отображена текстовая строка: 'Паскаль
- программа'.
Кроме операции конкатенации над значениями строковых типов разрешены операции
сравнения < , <=, > , >=, = , <>, IN, при выполнении которых действуют следующие
правила:
а) более короткая строка всегда меньше более длинной;
б) если длины сравниваемых строк равны, то происходит поэлементное сравнение символов
этих строк с учетом лексикографической упорядоченности значений
в) компаратор IN определяет вхождение левого операнда в правый. Если левый операнд
входит в правый, то результат компарации будет истинным (TRUE), в противном случае -
|
|
ложным (FALSE). Левым операндом может быть только элементарное данное (здесь
символ), а правым - любое множество элементов, в данном случае стринг или литерный ряд.
Доступ к элементам строковых данных
Доступ к отдельным элементам строк осуществляется аналогично доступу к элементам
одномерного массива: после имени строковой переменной необходимо в квадратных
скобках указать арифметическое выражение целого типа, например:
VAR
mline : string;
i : integer;
BEGIN
. . .
for i := 1 to length( mline ) do
62
if mline[i] IN ['a'...'z'] then
mline[i] := chr( ord( mline[i] ) + 1);
. . .
Можно заметить, что работа со строковыми данными аналогична работе с символьными
массивами, однако, это не означает их полную идентичность. Так, распространенной
ошибкой является работа с элементами строки без учета ее текущей длины. Необходимо
помнить, что если длина символьного ряда статична, то длина стринга динамична.
Стринги и литерные ряды
Регулярную переменную типа ARRAY OF CHAR ( или литерный ряд) можно рассматривать
как стринг постоянной длины. Данные указанного типа могут быть использованы в любых
стринговых выражениях. При этом согласование операндов по типам обеспечивается
компилятором, который в подобных случаях просто преобразует литерный ряд в стринг
|
|
длиной, равной количеству элементов ряда. Это позволяет, например , сравнивать литерные
ряды между собой и обращаться с ними точно так же, как с переменными типа STRING.
Допускается выполнять присваивание, в левой части которого стоит имя литерного ряда, в
правой - стринговый литерал ( константа ) длиной, равной количеству элементов ряда.
Однако нельзя присваивать какой-либо переменной типа литерный ряд переменную типа
STRING или наоборот. Например:
Сonst
message = 'верно';
Type
СharАrray = array[1..5] of char;
Var
FixedString, FiveChar : CharArray;
VarString : string[10];
Begin
. . .
FiveString := 'мерно';
FixedString := message;
if FiveChar > FiveString then
writeln('"', FiveChar,' "больше, чем"', FiveString,'"');
VarString := 'при';
VarString := concat(VarString,FiveChar);
VarString := 'голос';
FiveChar := VarString; { так нельзя}
. . .
Пояснение к программе.
В рассмотренном примере объявлено два литерных ряда ( типа СharАrray) - FixedString и
FiveChar, а также стринг VarString.
1. Стринговый литерал 'мерно' присваивается переменной FiveChar.
2. Переменной FixedString присваивается стринговая константа message, имеющая значение
'верно'.
3. Сравниваются два ряда, в результате которого выясняется, что FiveChar больше
FixedString (поскольку 'мерно' > 'верно').
4. Переменная VarString получает значение 'при'.
5. В результате конкатенации VarString получает новое значение - 'примерно', которое на
следующем шаге затирается значением 'голос'.
6. В последнем операторе делается попытка литерному ряду назначить стринговую
переменную, это недопустимо по обычной в таких случаях ошибке "несоответствие типов".
В программе левый операнд объявлен как литерный ряд, а правый как стринг.
Пустой стринг
63
Стринг, длина которого равна 0, называется пустым. Пустой стринг изображается в виде
двух апострофов, записанных рядом, без пробела: ''.
Например:
. . .
If st = '' then
writeln('стринг st пуст');
. . .
Следует отметить, что переменную типа STRING необходимо инициировать пустым
значением. В противном случае, если к моменту первого использования переменной она
не получила какого-то определенного значения, в программе может возникнуть
непредсказуемая ситуация. Дело в том, что при включении компьютера оперативная память
очищается, в результате любые переменные инициализированы: числовые переменные
обнулены, а стринги получают нулевую длину.
В любое другое время работы ЭВМ переменные будут содержать неопределенные
значения, обусловленные прежним содержимым памяти. В этом случае текущая длина
переменной типа STRING может быть ненулевой.
Функции преобразования
Для строковых типов данных определены следующие функции преобразования:
a) STR(x[:width[:decimals]];var s:string) - эта функция преобразует численное значение x в
его строковое представление s.
b) VAL(s:string; var x code:integer) - эта функция преобразует строковое значение s в его
численное представление x.
Дата добавления: 2021-06-02; просмотров: 80; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!