Программирование в среде Турбо Паскаль (Поляков, Круглов) - страница 102

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

8.3.2. Преобразование строк


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

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