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 Countthen Inc(PN,p);{ суммирование позиций }

| 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

<p>8.3.2. Преобразование строк</p>

8.3.2.1. Процедура Str( X [: Width [: dec ] ]; VAR S : String)

служит для преобразования числовых значений в строковые. Это, в частности, необходимо для работы с процедурами модуля Graph OutText и OutTextXY. X может быть переменной или значением целого или вещественного типов. Можно задавать поля формата, указывая ширину поля для числа и число знаков после десятичной

- 159 -

Перейти на страницу:

Поиск

Похожие книги