TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

 

 

Строки,

как они существуют, как их обрабатывают стандартно и как их обрабатывать эффективно

 

Представление в памяти

 

Строки в Pascal'е представляются достаточно специфично, совсем не так, как в других языках программирования. Каждая строка описанная

S: String[N];

представляет собой массив из элементов типа Char размерности N+1 с диапазоном индексов [0..N]. Соответственно, каждая строка может обрабатываться как единое целое, так и поэлементно:

S:= 'qwerty'; {S = 'qwerty'}
S[1]:= '1'; {S = '1werty'}

Из примера ясно, что первый символ строки индексируется числом 1. Это связано с тем, что первый элемент строки (с индексом 0) используется для хранения (текущей) длины строки. Значение этого элемента возвращается функцией

Function Length: Byte; возвращает текущую длину строки

Другим способом получить доступ к длине любой строки (в том числе и для записи) является Byte(S[0]) (те, кто не совсем понимает могут получить дополнительную информацию здесь).

Процедуры и функции

 

Как и над каждым стандартным типом Pascal'я, над строками определено некоторое множество операций.

S1+S2 конкатенация (сцепление)
S1=S2 сравнение на равенство
S1<S2 сравнение на меньше
S1>S2 сравнение на больше
S1<>S2 сравнение на неравенство

Сравнение производится в соответствии с кодами ASCII: если (первые) одноиндексные символы строк равны, то сравниваются следующие. Результат сравнения равен результату сравнения кодов первых (различных) символов. Пробел тоже является символом ASCII, поэтому, если строки различаются лишь количеством последних пробелов, то та, у которой их больше доминирует ту, у которой их меньше. Строка, которая обладает большей длиной, однако, не всегда более короткая строка меньше более длинной ('Cd'>'Abc', так как 'C'>'A').

Кроме того, Pascal содержит следующие встроенные процедуры и функции для работы со строками.
Function Copy(Str: String; I, J: Byte): String; функция, возвращающая подстроку строки S начиная с позиции I и дляной в J символов
Procedure Delete( Var Str: String; I, J: Integer); процедура, удаляющая из строки S J символов начиная с позиции I
Procedure Insert(Str1: String, Var Str2: String, I: Byte) процедура, вставляющая одну строку в другую начиная с позиции I
Function Pos(Str1; String; Str2: String): Byte; функция, возвращающая позицию начиная с которой первая строка входит во вторую и 0, если такого не случилось

Способ конкретного использования каждой из них желательно посмотреть в справочной системе. Как правило программистам не хватает встроенных функций Pascal'а, и они пишут некоторые свои (к примеру "удалить из одной строки другую или возвратить False, если удаления не произошло", etc.).

Элементарные алгоритмы,

или как обрабатывать строки быстрее

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

Рассмотрим наиболее часто встречающиеся операции со строками. Первая - уменьшение длины строки (удаление определенного количества символов из хвоста) должна делаться так:

Dec(S[0],N);

Удаление из хвоста строки всех символов, равных (не равных), скажем, пробелу - ' ' - примерно так

While S(Length(S[0])=' ' Do Dec(S[0]);

Удаление лидирующих символов, равных (не равных) тому же пробелу несколько сложнее, но тоже прозрачно

P:=1;
While (S[P]=' ') And (P<=Length(S))
Do Inc(P);
If P>1 Then Begin
Move(S[P], S[1], Succ(Length(S))-P);
Dec(S[0], P);
End;

Процедура Move, использованная в последнем примере имеет следующее описание

Procedure Move(Var Sourse, Dest; Count: Word; Копирует (байт за байтом) Count байт из области памяти, адресуемой ссылкой Sourse в область, адресуемую ссылкой Dest

Применение для вышеуказанных целей стандартной Delete недопустимо в программе, претендующей на эффективность. Процедуру Move также удобно применить для написания своих вариантов Delete и Insert.

Удаление из строки некоторых определенных символов можно производить с помощью алгоритма, приведенного здесь.

Следует отметить, что использование Pascal-строк не приветствуется при создании программ, котрые будут выполнятся в многозадачных системах: такого рода строки не вписываются в ASCIIZ спецификацию, являющуюся стандартом де-факто. Обработка ASCIIZ-строк стала возможна в Pascal'е начиная с версии 7.0 с введением дополнительного стандартного типа

PChar = ^Char;

процедуры обработки таких строк содержатся в модуле Strings. Они довстаточно эффективны и их перекрытие вряд ли что-нибудь даст в смысле выигрыша в скорости

 

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz