| { 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