TYPE
{тип для набора ограничителей слов в строке}
TCharSet=Set of Char;
CONST
{Список всех ограничителей слов в строке}
Delim_Set : TCharSet = [ ' ', '.', ',', '!', '?', '-', ':',
';', '(', ')', '[', ']', '{', '}'
];
..................................................................
{Нахождение длины слова из строки Src.
Поиск слова начинается с позиции StartPos.
На выходе не только длина очередного слова, но и переменная StartPos
указывает на следующий за словом символ.
Если слово не найдено, то StartPos=Length(Src)+1.}
FUNCTION GetLengthNextWord(CONST Src : String;
VAR StartPos : Integer;
CONST Delimiters : TCharSet):Integer;
VAR
i : Integer;
BEGIN
i:=StartPos;
{i-текущая позиция в анализируемой строке}
{ищем первую букву слова}
while (i<=Length(Src)) do
if (Src[i] in Delimiters)
then Inc(i)
else Break;
StartPos:=i;{StartPos указывает на первую букву в слове или на "следующий за последним символом в строке"=Length(Src)+1}
{теперь просматриваем слово пока не закончится строка или
не начнутся ограничители слов}
.............................................................................
GetLengthNextWord:=i-StartPos;{i - указывает на следующий за словом индекс (т.е. на очередной пробел)}
StartPos:=i;{для дальнейшего использования}
END;
..................
CountWordK:=0; {счётчик количества слов длиной K}
StartPos:=1; {слово в строке s начинаем с 1-й позиции}
while StartPos<=Length(s) do {пока не закончились слова в строке}
if GetLengthNextWord(s, StartPos, Delim_Set)=K
then Inc(CountWordK); {если длина очередного слова равна K, то инкрементируем счётчик}
..................
count:= 0;
while Length(s)>0 do begin
l:= Pos(' ');
if l=0 then l:= Length(s)+1;
if l=k+1 then Inc(count);
Delete(s,1,l)
end;
writeln('total number of ',k,'-letter words is ',count);
PROGRAM VRamku;
TYPE
{тип для набора ограничителей слов в строке}
TCharSet=Set of Char;
CONST
{Список всех ограничителей слов в строке}
Delim_Set : TCharSet = [ ' ', '.', ',', '!', '?', '-', ':',
';', '(', ')', '[', ']', '{', '}'
];
{Нахождение длины слова из строки Src.
Поиск слова начинается с позиции StartPos.
На выходе не только длина очередного слова, но и переменная StartPos
указывает на следующий за словом символ.
Если слово не найдено, то StartPos=Length(Src)+1.}
FUNCTION GetLengthNextWord(CONST Src : String;
VAR StartPos : Integer;
CONST Delimiters : TCharSet):Integer;
VAR
i : Integer;
BEGIN
i:=StartPos;
{i-текущая позиция в анализируемой строке}
{ищем первую букву слова}
while (i<=Length(Src)) do
if (Src[i] in Delimiters)
then Inc(i)
else Break;
StartPos:=i;{StartPos указывает на первую букву в слове или на "следующий за последним символом в строке"=Length(Src)+1}
{теперь просматриваем слово пока не закончится строка или
не начнутся ограничители слов}
while (i<=Length(Src)) do
if NOT(Src[i] in Delimiters)
then Inc(i)
else Break;
GetLengthNextWord:=i-StartPos;{i - указывает на следующий за словом индекс (т.е. на очередной пробел)}
{$IFDEF Debug}
{Строка для отладки функции}
if (i<>StartPos) then
WriteLn((i-StartPos):3, ' - ', Copy(Src, StartPos, i-StartPos));
{$ENDIF}
StartPos:=i;{для дальнейшего использования}
END;
VAR
s : String;
CountWordK : Integer;
K : Integer;
StartPos : Integer;
BEGIN
K:=4;
s:='Фраза для проверки работы функции - она такая... внезапная и длинная!';
CountWordK:=0; {счётчик количества слов длиной K}
StartPos:=1; {слово в строке s начинаем с 1-й позиции}
while StartPos<=Length(s) do {пока не закончились слова в строке}
if GetLengthNextWord(s, StartPos, Delim_Set)=K
then Inc(CountWordK); {если длина очередного слова равна K, то инкрементируем счётчик}
WriteLn('Количество слов длиной ', K, ' символа(ов) в строке: ', CountWordK);
END.
PROGRAM VRamku;
TYPE
{тип для набора ограничителей слов в строке}
TCharSet=Set of Char;
CONST
{Список всех ограничителей слов в строке}
Delim_Set : TCharSet = [ ' ', '.', ',', '!', '?', '-', ':',
';', '(', ')', '[', ']', '{', '}'
];
{Нахождение длины слова из строки Src.
Поиск слова начинается с позиции StartPos.
На выходе не только длина очередного слова, но и переменная StartPos
указывает на следующий за словом символ.
Если слово не найдено, то StartPos=Length(Src)+1.}
FUNCTION GetLengthNextWord(CONST Src : String;
VAR StartPos : Integer;
CONST Delimiters : TCharSet):Integer;
VAR
i : Integer;
BEGIN
i:=StartPos;
{i-текущая позиция в анализируемой строке}
{ищем первую букву слова}
while (i<=Length(Src)) do
if (Src[i] in Delimiters)
then Inc(i)
else Break;
StartPos:=i;{StartPos указывает на первую букву в слове или на "следующий за последним символом в строке"=Length(Src)+1}
{теперь просматриваем слово пока не закончится строка или
не начнутся ограничители слов}
while (i<=Length(Src)) do
if NOT(Src[i] in Delimiters)
then Inc(i)
else Break;
GetLengthNextWord:=i-StartPos;{i - указывает на следующий за словом индекс (т.е. на очередной пробел)}
{$IFDEF Debug}
{Строка для отладки функции}
if (i<>StartPos) then
WriteLn((i-StartPos):3, ' - ', Copy(Src, StartPos, i-StartPos));
{$ENDIF}
StartPos:=i;{для дальнейшего использования}
END;
VAR
s : String;
CountWordK : Integer;
K : Integer;
StartPos : Integer;
BEGIN
K:=4;
s:='Фраза для проверки работы функции - она такая... внезапная и длинная!';
CountWordK:=0; {счётчик количества слов длиной K}
StartPos:=1; {слово в строке s начинаем с 1-й позиции}
while StartPos<=Length(s) do {пока не закончились слова в строке}
if GetLengthNextWord(s, StartPos, Delim_Set)=K
then Inc(CountWordK); {если длина очередного слова равна K, то инкрементируем счётчик}
WriteLn('Количество слов длиной ', K, ' символа(ов) в строке: ', CountWordK);
END.