- •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.3.2. Функции для работы со строками
Имеется несколько полезных функций:
П length (st) — вычисляет текущую длину в символах строки st. Результат имеет целочисленный тип.
Например, n:=length('123456789'}; { п=9 }
Обратите внимание— функция length возвращает выражение ord(s[0]), т. к. сам элемент s[0] имеет тип char. Некоторые программисты предпочитают не использовать функцию length, обращаясь непосредственно к нулевому байту.
П copy (st,poz, n) — выделяет из строки st подстроку длиной п символов, начиная с позиции poz. Если poz больше длины строки, то результатом будет пустая строка.
Например:
si:='Turbo Pascal';
s2:=copy(si,1,5);
s3:=copy(si,7, 3);
{ в результате s2='Turbo'; s3='Pas' }
П concat (stri, str2,..., strn) — выполняет сцепление строк stri, str2, ... strn в том порядке, в каком они указаны в списке параметров.
Например: sr^concat('АД', 'XX', 'У'); { в результате s='AAXXY'; }
Функция concat выполняет те же действия, что и операция конкатенации. Например, для приведенного случая то же самое можно было записать так: s:='AA'+'XX'+'Y';.
D pos(stri,str2) — обнаруживает первое появление в строке str2 подстроки stri. Результат имеет целочисленный тип и равен номеру той позиции, где находится первый символ подстроки stri. Если в str2 подстроки stri не найдено, результат равен 0.
Например:
sl:= 'Turbo Pascal';
nl:=pos('Pascal',si); n2:=pos('pascal', si);
|в результате nl=7; n2=0 (pascal и Pascal — это разные строки)}
Следующий фрагмент удаляет из строки первое слово вместе со следующим за ним пробелом. При этом предусматривается удаление ведущих пробелов:
while st[l]=' ' do deletefst,1,1); delete(si,1,роз(' ',sl));
9.3.3. Процедуры преобразования типов
Turbo Pascal позволяет преобразовывать данные числового типа в строку символов, а также преобразовывать строку в число, если она содержит последовательность символов, удовлетворяющую правилам записи чисел. Для этой цели имеется две процедуры: str и val.
Процедура str уже упоминалась, когда речь пила о выводе текста в графическом режиме (см. разд. 8,4). Удобно использовать процедуру str для вставки числовых данных в какой-либо текст, т. к. операция конкатенации и процедура insert могут работать только со строковыми данными.
Вызов этой процедуры имеет вид:
О str (number, st) — преобразование числового значения величины number в строку st. После number может записываться формат, аналогичный формату вывода. Если в формате указано недостаточное для вывода количество разрядов, поле вывода расширяется автоматически до нужной длины.
Например:
var Sl,S2,s3,s4 : string; numl:integer;num2:real;
numl:=5; num2:-5,18;
str (numl,SI);str (numl:3,s2}; str(num2,s3);str(num2:3:1,s4);
! в результате sl='5'; S2=' 5';s3='5.78QOOOOOOOOOE+00';s4='5.8'; }
Соответственно, процедура val часто используется, чтобы преобразовать введенную с клавиатуры или прочитанную из файла строку в числовые данные.
П val (st, number, code) — преобразует значение st в величину целочисленного или вещественного типа и помещает результат в numder. code — целочисленная переменная. Если во время операции преобразования ошибки не обнаружено, значение code равно нулю, если ошибка обнаружена (строковое значение не переводится в цифровое), code будет содержать номер позиции первого ошибочного символа, а значение number не определено.
Например:
sl:= '5.78'; s2:= '5,78'; val(sl,numl,codl);
val(s2,num2,cod2);
{ в результате codl=0, cod2=2 — второй символ ошибочный }
Обратите внимание — использование функции val позволяет избежать неприятной ошибки выполнения Invalid numeric format, возникающей при неправильном вводе числовых данных. Приходится прибегать к такой хитрости — вводить вместо числовой переменной строковую (в ней разрешены любые символы). После этого введенная строка преобразуется в число и, если преобразование невозможно, об этом выводится сообщение на русском языке. Чаще всего в таких случаях не прерывают программу, а просят пользователя ПОВТОРИТЬ ВВОД. ЗдеСЬ ОЧеНЬ удобно ИСПОЛЬЗОВатЬ ЦИКЛ repeat, Т. К.
гарантируется выполнение тела цикла хотя бы один раз. Например:
var s:string; n,error:integer; begin
repeat
write ('Введите число ')/' ( просим ввести число, } readln(s); { а вводим строку }
val(s,n,error); { преобразуем строку в число } if error>0 then writeln('Неверный символ № ',error) until error=0; { продолжение программы }
Еще один способ решения той же самой проблемы ошибок ввода числовых данных, основанный на использовании функции ioresuit в цикле repeat, рассматривался ранее (см. разд. 3.9.1). Все же более универсальным вариантом представляется использование вспомогательной строки, т. к. в эгом случае можно не просто проверить правильность ввода, но даже исправить некоторые ошибки при вводе.
