Выделить из предложения слова, содержащие две или более одинаковые буквы — Pascal(Паскаль)

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.

Leave a Comment

88 + = 96