- •9.1. Типы данных char и string
- •9.1.1. Символьный тип
- •9.1.2. Строковый тип
- •9.2. Операции над строками
- •9.2.2. Операции отношения
- •I Листинг 9.4. Слияние двух отсортированных массивов строк,
- •9.3. Строковые процедуры и функции
- •9.3.1. Процедуры удаления и вставки символов
- •9.3.2. Функции для работы со строками
- •9.3.3. Процедуры преобразования типов
- •9.4. Примеры программ обработки строк
- •9.4.1. Вставка, удаление
- •9.4.2. Преобразование строчных букв в заглавные
- •10.1. Понятие множества
- •10.2. Операции над множествами
- •10.3. Формирование
- •11.1. Определение и правила записи
- •11.2. Записи с вариантами
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+}.
