procedure GetWord(s: string; var ib: integer; var pWord: string; var l: integer); // Возвращает слово pWord, которое является подстрокой s // Разделителем слов являются один или более символов из delim. // ib при вызове процедуры указывает на позицию в строке s, // начиная с которой ведется поиск слова. // При выходе из процедуры ib - позиция начала найденного слова, // l- длина найденного слова, l=0 если слово не найдено. var i, n: integer; w: string; begin n := Length(s); l := 0; w := ''; if ib >= n then begin ib := n; pWord := '' end else begin i := ib; while (s[i] in delim) and (i < n) do i := i + 1; ib := i; w := ''; while (not (s[i] in delim)) and (i < n) do begin w := w + s[i]; i := i + 1 end; if i < n then begin l := i - ib; pWord := w end else begin l := i - ib + 1; pWord := w + s[n] end end end;
var w, x, a: string; n, k, i: integer;
begin write('Введите длину искомых слов n: '); readln(n); writeln('Введите строку с искомыми словами (где искать):'); readln(a); writeln('Введите строку с шаблоном поиска (что искать):'); readln(x); writeln('Результаты поиска:'); i := 1; repeat GetWord(a, i, w, k); if k = n then begin if Pos(w, x) > 0 then writeln(w); end; i := i + k until k = 0; end.
Тестовое решение:
Введите длину искомых слов n: 4 Введите строку с искомыми словами (где искать): Мама мыла раму, Маша мыла полы, а Таня не мыла ничего! Введите строку с шаблоном поиска (что искать): Даша перемыла всю посуду. Результаты поиска: мыла мыла мыла
delim = [' ', ',', '.', ':', ';', '!', '?'];{Набор разделителей}
procedure GetWord(s: string; var ib: integer; var pWord: string; var l: integer);
// Возвращает слово pWord, которое является подстрокой s
// Разделителем слов являются один или более символов из delim.
// ib при вызове процедуры указывает на позицию в строке s,
// начиная с которой ведется поиск слова.
// При выходе из процедуры ib - позиция начала найденного слова,
// l- длина найденного слова, l=0 если слово не найдено.
var
i, n: integer;
w: string;
begin
n := Length(s);
l := 0;
w := '';
if ib >= n then begin
ib := n;
pWord := ''
end
else begin
i := ib;
while (s[i] in delim) and (i < n) do i := i + 1;
ib := i;
w := '';
while (not (s[i] in delim)) and (i < n) do
begin
w := w + s[i];
i := i + 1
end;
if i < n then begin
l := i - ib;
pWord := w
end
else begin
l := i - ib + 1;
pWord := w + s[n]
end
end
end;
var
w, x, a: string;
n, k, i: integer;
begin
write('Введите длину искомых слов n: ');
readln(n);
writeln('Введите строку с искомыми словами (где искать):');
readln(a);
writeln('Введите строку с шаблоном поиска (что искать):');
readln(x);
writeln('Результаты поиска:');
i := 1;
repeat
GetWord(a, i, w, k);
if k = n then
begin
if Pos(w, x) > 0 then writeln(w);
end;
i := i + k
until k = 0;
end.
Тестовое решение:
Введите длину искомых слов n: 4
Введите строку с искомыми словами (где искать):
Мама мыла раму, Маша мыла полы, а Таня не мыла ничего!
Введите строку с шаблоном поиска (что искать):
Даша перемыла всю посуду.
Результаты поиска:
мыла
мыла
мыла