program Project1;
//Перевод букв в верхний регистр для кодовой страницы CP866 (DOS).
function UpCase866(const aCh : Char) : Char;
begin
case aCh of
//а..п -> А..П.
#$A0..#$AF: UpCase866 := Char( Ord(aCh) - $20 );
//р..я -> Р..Я.
#$E0..#$EF: UpCase866 := Char( Ord(aCh) - $50 );
//ё -> Ё.
#$F1 : UpCase866 := #$F0;
//Все остальные символы.
else UpCase866 := UpCase(aCh);
end;
end;
const
//Разделители слов.
D = ['.', ',', ':', ';', '!', '?', '-', ' ', #9, #10, #13];
var
S, sWord : String;
i, j, Pos1, Len : Integer;
//Флаг, показывающий, найдены ли в слове повторы букв.
IsFound : Boolean;
//Множество различных букв в слове.
Da : set of Char;
Ch : Char;
begin
repeat
Writeln('Задайте строку:');
Readln(S);
Writeln('Список слов строки, которые содержат повторяющиеся буквы:');
Len := Length(S);
IsFound := False;
Da := [];
j := 0;
Pos1 := 0;
for i := 1 to Len do begin
//Пропускаем разделители.
if S[i] in D then Continue;
//Отслеживаем начало слова.
if (i = 1) or (S[i - 1] in D) then Pos1 := i;
//Формирование множества букв, наёденных в слове.
//И проверка - есть ли одинаковые буквы.
if not IsFound then begin
Ch := UpCase866(S[i]);
if Ch in Da then IsFound := True
else Da := Da + [Ch];
end;
//Отслеживаем конец слова.
if (i = Len) or (S[i + 1] in D) then begin
if IsFound then begin
j := j + 1;
//Выделяем слово из строки.
sWord := Copy(S, Pos1, i - Pos1 + 1);
//Распечатываем слово.
if j > 1 then Write(', ');
Write(sWord);
end;
//Сброс флага и обнуление множества.
IsFound := False;
Da := [];
end;
end;
Writeln;
Writeln('Повторить - Enter, выход - любой символ + Enter.');
Readln(S);
until S <> '';
end.