Доступ к элементам строковых данных



ЛАБОРАТОРНАЯ РАБОТА 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!