8.3.1.6. Функции Pos(Subs, S : String) : Byte возвращает номер символа в строке S, с которого начинается включение в S подстроки Subs. Если же S не содержит в себе Subs, то функция вернет 0. Пример использования функции дан на рис. 8.6, где построена модификация процедуры преобразования Str.
| { Процедура преобразования числа X в строку S}
| { Вход : X — числовое значение; }
| { F — полная длина поля числа; }
| { N — число цифр после запятой. }
| { Выход: строка S, в которой предшествующие }
| { числу пробелы заменены на 0. }
| PROCEDURE ZStr( X : Real; F,N : Byte; VAR S : String );
| VAR p : Byte;
| BEGIN
| Str( X:F:N, S ); { строка с пробелами }
| { Цикл замены пробелов на нули : }
| while Pos(' ', S) > 0 do S[Pos(' ', S)] := '0';
| p := Pos('-',S); { позиция минуса в числе }
| if р <> 0 then begin
{ Если минус имеется, то }
| S[p] := '0'; S[1] := '-' { переместить его в нача-}
| end; { ло строки S. }
| END;
| { ======= ПРИМЕРЫ ВЫЗОВОВ ФУНКЦИИ ======= }
| CONST
| r : Real = 123.456;
| b : Byte = 15;
| i : Integer = -3200;
| St : String = ' ';
| BEGIN
| ZStr( r, 10, 5, St ); WriteLn( St ); { 0123.4560 }
| ZStr{ b, 10, 1, St ); WriteLn( St ); { 0000015.0 }
| ZStr( i, 10, 0, St ); WriteLn( St ); { -00003200 }
| ReadLn { пауза до нажатия клавиши ввода }
| END.
Рис. 8.6
Очевидным недостатком функции Pos является то, что она возвращает ближайшую стартовую позицию Subs в S от начала строки, т.е. вызов
P := Pos( 'noo', 'Boonoonoonoos');
завершит свою работу, вернув значение 4, хотя есть еще и 7, и 10.
- 158 -
На рис. 8.7 приведен вариант функции, использующей функцию Pos и возвращающей позицию любого вхождения Subs в S, если оно существует.
| { Функция возвращает номер символа, с которого начинается N-e вхождение подстроки Subs в строку S. Одновременно возвращается общее число вхождений Count. При неудаче поиска функция возвращает значение 0. }
| FUNCTION PosN( Subs, S : String; N : Byte;
| VAR Count : Byte ) : Byte;
| VAR
| p, PN : Byte; { вспомогательные переменные }
| BEGIN
| Count:=0; PN:=0;
| repeat { Цикл по вхождениям : }
| p := Pos( Subs, S ); { поиск вхождения }
| if Count
| Inc( Count ); { счетчик вхождений }
| Delete( S, 1, p ) { уменьшение строки }
| until p=0; { конец цикла, если р=0 }
| Dec( Count ); { надо уменьшить Count }
| if N<=Count { N не больше, чем Count? }
| then PosN := PN {Да, возвращаем позицию }
| else PosN := 0; { Нет, возвращаем 0 }
| END;
| VAR { ===== ПРИМЕР ВЫЗОВА ФУНКЦИИ ===== }
| C : Byte; {количество вхождений подстроки в строку }
| BEGIN
| WriteLn('3-я позиция noo в Boonoonoonoos начинается',
| ' с символа ', PosN('noo','Boonoonoonoos',3,С):3);
| WriteLn( 'Всего найдено вхождений : ', С );
| ReadLn { пауза до нажатия клавиши ввода }
| END.
Рис. 8.7
8.3.2. Преобразование строк
8.3.2.1. Процедура Str( X [: Width [: dec ] ]; VAR S : String)
служит для преобразования числовых значений в строковые. Это, в частности, необходимо для работы с процедурами модуля Graph OutText и OutTextXY. X может быть переменной или значением целого или вещественного типов. Можно задавать поля формата, указывая ширину поля для числа и число знаков после десятичной
- 159 -