Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Обработка строк текста.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.3 Mб
Скачать

9.2.2. Операции отношения

Операции =, <>, >, <, >=, <= выполняют сравнение двух строковых операн­дов и используются в основном при проверке условий. Сравнение строк производится слева направо до первого несовпадающего символа, и та строка считается большей, в которой код первого несовпадающего символа больше. Такой способ сравнения строк называют лексикографическим. Стро­ки считаются равными, если они совпадают по длине и содержат одни и те же символы.

Например:

Выражение: Результат:

'Иванов '='Иванов И.И. ' false

'Иванов'<'Иванов И.И.' true

'program1 >' PROGRAM1 true

Операции отношения над строковыми данными широко используются при обработке массивов строк. Наиболее важными действиями над такими мас­сивами являются:

П сортировка массива в лексикографическом порядке; П быстрый поиск данных в отсортированном массиве; П слияние двух отсортированных массивов.

При решении данных задач используются те же самые алгоритмы, что и для числовых массивов (см. разд. 4.2.3), достаточно только заменить тип эле­ментов массива на тип string. Например, при организации электронного телефонного справочника огромный массив абонентов обычно сортируется, и за счет этого можно в считанные секунды найти телефон абонента по его фамилии.

В данном разделе приведем в качестве примера алгоритм слияния двух от­сортированных массивов строк (листинг 9.4). Допустим, происходит слия­ние двух предприятий и требуется объединить списки сотрудников таким образом, чтобы не нарушить алфавитного (лексикографического) порядка.

I Листинг 9.4. Слияние двух отсортированных массивов строк,

const m=4; n=3;

a: array [1. .m] of string=( 'Абрамов1 , 'Григорьев' , 'Иванов' , 'Сидоров' b:array [l..n] of string= ( 'Васильев' , 'Петров ', 'Яковлев' );

var crarray [1. .m+n] of string;

k, i, j : integer; (индексы трех массивов}

begin

э .

for k:=l to m+n do

{ если индекс i вышел за пределы массива а или b[j]<a[i] }

if (i>ra) or (b[j]<a[ij) then

begin

c[k]:=b[j]; j:=j+l; end else begin

c[k] :=a[i] ; i:=i+l; end;

writelnf 'Массив с:');

for k:=l to m+n do write (c[k],' ' ) ; readln end.

9.3. Строковые процедуры и функции

Любые действия по обработке строк, вплоть до самых сложных, можно за­программировать, используя алгоритмы обработки одномерных массивов. Однако для упрощения программирования задач обработки текстов Turbo Pascal, как и все другие языки программирования, содержит хорошо продуманный набор процедур и функций для выполнения типовых дейст­вий со строками.

Разумеется, программист может реализовать свои собственные подпрограм­мы, работая со строкой как с массивом символов и не забывая вовремя из­менять нулевой байт. Однако рекомендуем во всех случаях, где возможно, использовать стандартные процедуры и функции. Правильность их работы проверена многолетним опытом использования. Строковые процедуры и

функции располагаются в модуле system, поэтому для их применения допол­нительных модулей подключать не требуется.

Все подпрограммы разделим на несколько групп.

9.3.1. Процедуры удаления и вставки символов

Используются две процедуры, которые корректно удаляют и вставляют сим­волы в строку. При удалении символов оставшаяся часть строки подтягива­ется к началу, чтобы занять образовавшуюся после удаления "дырку". При вставке, наоборот, строка раздвигается, чтобы вместить вставляемые сим­волы.

Процедуры удаления и вставки вызываются следующим образом:

О delete(st,poz,п) — удаление п символов-строки st, начиная с позиции рог. Если значение poz больше, чем размер строки, ничего не удаляется.

Например:

st:='peKa Волга'; delete(st,I,5); { в результате зЪ='Волга' }

Следующий фрагмент программы удаляет все пробелы из начала строки st (пробелы в начале строки называются ведущими пробелами):

while st[l]=' ' do delete(st,1,1);

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

while stElength(st)]=' ' do delete(st,length(st),1);

Удаление ведущих и завершающих пробелов — типовое действие при об­работке строк. Цикл while позволяет записать этот фрагмент в компакт­ном виде, при этом ни один символ не удалится, если в строке нет веду­щих пробелов.

П insert(stri,str2,poz) — вставка строки stri в строку str2, начиная с позиции poz. He перепутайте: первый параметр — что вставляем, вто­рой — куда.

Например:

si := 'Я разрабатываю программы1; з2 := 'хорошие ';

insert{s2,si,16);

{ в результате з1='Я разрабатываю хорошие программы1

При вставке в начало и конец строки действие процедуры insert анало­гично выполнению операции конкатенации. Так, в примере со вставкой звездочек в конец строки (листинг 9.3) можно было бы заменить

з:=з+'*' на insert С*1, s, length (s)+1).

Обратите внимание — при вставке символов обязательно нужно контроли­ровать длину полученной строки, чтобы не потерять последние символы. При этом никакого сообщения об ошибке не выдается даже при включен­ной директиве {$R+}.