Стринги и литерные ряды

ЛАБОРАТОРНАЯ РАБОТА 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 может быть ненулевой.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: