Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИНФОРМАТИКА_Паскаль.doc
Скачиваний:
7
Добавлен:
08.05.2019
Размер:
1.77 Mб
Скачать

9.3. Строковый тип

Строковый тип данных (STRING - строка) специально предназначен для обработки строк (цепочек символов, т.е. элементов типа CHAR). Помимо символов в строке хранится ее длина. Внутреннее представление строки показано на рисунке.

Group 3

Каждый символ строки занимает 1 байт, для хранения длины также требуется 1 байт. Поэтому для хранения строки выделяется память на единицу большая, чем максимальное количество возможных символов в строке (на рис.2 символов может быть максимум 5, поэтому отводится всего 6 байт). Символы строки нумеруются, начиная с 1 (ST[1]) до максимального значения фактической длины строки (в примере это 4). Остальные незанятые символами, но выделенные байты строки заполняются транслятором по умолчанию символом с кодом #0. Байт длины с номером ST[0] также заполняется символом, но с кодом, равным фактической длине строки #4. Таким образом, все 6 байт строки по типу являются символами.

Важнейшее отличие данных строкового типа от обычных символьных массивов заключается в том, что строки могут динамически изменять свою длину. Память под переменные строкового типа отводится по максимуму, но используется лишь часть этой памяти, реально занятая символами строки.

Для объявления строкового типа используется служебное слово STRING, вслед за которым в квадратных скобках указывается максимальная длина строки, например: STRING[15], STRING[27].

В отличие от переменных упакованного строкового типа, переменные типа STRING [N] имеют переменную длину в интервале от 0 до N. Длину строки [N] можно не указывать, в этом случае максимальная длина строки равна 255.

Объявление строковых переменных:

VAR

DAN1 : STRING;

DAN2 : STRING [39];

DAN3 : STRING [265];

В первом случае длина строки по умолчанию равна 255, во втором случае – 39, а в третьем случае компилятор выдает сообщение об ошибке.

Для определения значений констант строкового типа можно использовать непоименованные упакованные строковые константы, например:

CONST

ULICA : STRING = ‘УЛ. НОВАЯ’;

AUTO : STRING [10] = ‘ВОЛГА 3139’;

Поскольку строка трактуется как цепочка символов, то к любому символу константы или переменной строкового типа можно обратиться как к элементу массива ARRAY [0 .. N] OF CHAR, например:

VAR

ST : STRIING;

. . . . . . . . . . . .

IF ST [7] = ‘K’ THEN . . . .

Значение переменной строкового типа задается с помощью оператора присваивания, например:

LN : = ’ ‘;

LN : = ‘VOLGOGRAD’;

В первом случае задается пустая строка. Во втором – строке присваивается значение константы упакованного строкового типа.

Если переменной строкового типа присваивается значение, превышающее допустимую длину, то "лишние" символы отбрасываются справа, например:

D: STRING [11];…. D: = ‘МАРШРУТ4285’;

D примет значение ‘МАРШРУТ 428’

В правой части оператора присваивания допускаются константы и переменные символьного и строкового типов.

Строке может быть присвоено значение переменной упакованного строкового типа, обратное присваивание недопустимо, например:

VAR

S: = STRING [N];

M: = ARRAY [0. .K] OFCHAR;

. . . . . . . . . . . . . . . . . . . . . . . . . . .

S: = M; {ПРИСВАИВАНИЕ ДОПУСТИМО}

M: = S; {ПРИСВАИВАНИЕ НЕДОПУСТИМО}

Переменной символьного типа может быть присвоено значение одного символа, указанного путем индексирования, например:

VAR

A: CHAR;

B: STRING;

. . . . . . . . . . . . .

A: = B[3];

. . . . . . . . . . . . .

В правой части оператора присваивания может быть предусмотрено выполнение операции конкатенации, обозначенной знаком «+», например:

TYPE

LINE1 = STRING;

VAR

LINE2 : LINE1;

. . . . . . . . . . . . . .

LINE2: = ‘КОРОТКАЯ СТРОКА’; {ДЛИНА СТРОКИ 15 СИМВОЛОВ}

LINE2: = LINE2 + ‘СТАЛА ДЛИННЕЕ’; {ДЛ. СТРОКИ 28 СИМВОЛОВ}

Данный пример показывает, как можно сцеплять две и более строки.

Операции сравнения выполняются над двумя строками посимвольно, слева направо с учетом внутренней кодировки символов. Если одна строка короче другой, то недостающие символы короткой строки заменяются значением #0. Если при посимвольном сравнении окажется, что один символ больше другого (его код больше), то строка, его содержащая, тоже считается большей. Остатки строк и их длины не играют роли. Любой символ всегда больше "пустого места":

‘klmn’ > ‘klMn’ {так как ‘m ‘ > ‘M’}

‘klmn’ > ‘klm’ {так как ‘n’ > ‘ ‘}

Можно использовать нестрогие отношения: >= и <=.

9.4. Стандартные подпрограммы для работы со строками

Синтаксис и формат функции

Назначение подпрограммы, примеры

Аналог в

Basic

LENGTH(S)

LENGTH(S: STRING): INTEGER

Функция возвращает значение фактической длины строки S (не длину, зарезервированную при объявлении), например:

S := ‘РОСТОВ-НА-ДОНУ’

N:= LENGTH(S)

Результат: N= 14

LEN(X)

COPY(S,P,N)

COPY(S: STRING, P: INTEGER, N: INTEGER): STRING

Функция выделяет из строки S подстроку длиной N символов, начиная с позиции P, например:

S:=‘ABCDEF’

S2:= COPY(S,2,4)

Результат: S2 = ‘BCDE’

MID$(F$,M,N)

LTFT$(S$,N)

RIGHT$(S$,N)

POS(S1,S2)

POS(S1: STRING, S2: STRING): BYTE

Функция определяет начальную позицию подстроки S1 в строке S2, с которой начинается ее первое вхождение. Если вхождений нет, то возвращается НОЛЬ. Например:

S2:='СТРОКА'

S1:='РО'

N:=POS(S1,S2) или

N:=POS('PO',S2) или

N:=POS('PO','СТРОКА')

Результат: N=3

INSTR(K,S1,S2)

INSERT(S1,S2,P)

INSERT(S1: STRING, VAR S2: STRING; P: INTEGER)

Процедура обеспечивает вставку строки S1 в строку S2, начиная с позиции P, например:

VAR

S1, S2, S3 : STRING[20];

. . . . . . . . . . . . . . . . . . . .

S1: = ‘1 ’;

S2: = ‘СПОРТСМЕН РАЗРЯДА’;

S3: = INSERT(S1,S2,11);

В результате выполнения операции значение строки S3 будет равным‘СПОРТСМЕН 1 РАЗРЯДА’.

CONCAT(S1,S2,…,SN)

CONCAT(S1,S2,…,SN: STRING): STRING

Функция осуществляет конкатенацию (сцепление) строк в порядке их записи, например:

S3:=CONCAT(‘TOР’, ‘ПЕ’, ‘ДO’);

Результат: S3 = ‘ТОРПЕДО’

STR(N,S2)

STR(N: числовой, VAR S2: STRING)

Процедураслужит для преобразования числовых значений в строковые. Переменной строкового типа S2 присваивается строковое значение, представляющее собой символьное изображение значения переменной числового типа N. Например:

VAR S: String;

. . .

STR(2008,S);

В результате обращения к процедуре целочисленное значение 2008 будет преобразовано в строковое "2008"

VAL(S,N,ERRCODE)

VAL(S:STRING, N:числовое, ERRCODE:INTEGER)

Процедура преобразует строку числовых символов S в числовую переменную N. Параметр ERRCODE равен нулю, если преобразование выполнено успешно. Если S содержит символы недопустимые при записи числа, то параметр равен номеру позиции с ошибочно заданным символом. Например:

VAR S: String;

N: Integer;

. . .

S:='2008';

VAL(S,N,ERRCODE);

IF ERRCODE <>0 THEN

WRITELN('ОШИБКАВпоз. ',ERRCODE)

ELSE

WRITELN('ЗНАЧЕНИЕ = ',N);

DELETE(S,P,N)

DELETE(VAR: S: STRING; P: INTEGER; N: INTEGER)

Процедура осуществляет удаление N символов из строк S, начиная с позиции P, например:

S:= ‘ГРУППА5211’;

DELETE(S,8,2);

Результат процедуры S = ’ГРУППА 11’