Дан текст на русском языке. Напечатать в алфавитном порядке все гласные буквы, которые входят в каждое слово — Pascal(Паскаль)

program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
type
  TCharDim = set of Char;
 
//Возвращает заглавный вариант гласной буквы кириллицы для кодовой страницы CP866.
function AUp866(const aCh : Char) : Char;
begin
  case aCh of
  #160 : Result := #128;
  #165 : Result := #133;
  #168 : Result := #136;
  #174 : Result := #142;
  #227 : Result := #147;
  #235 : Result := #155;
  #237 : Result := #157;
  #238 : Result := #158;
  #239 : Result := #159;
  else
    Result := aCh;
  end;
end;
 
//Возвращает множество гласных букв кириллицы, которые встречаются не более,
//чем в одном слове строки aStr.
function GetA(const aStr : String) : TCharDim;
const
  //Множество разделителей.
  Delims = [' ', '.', ',', ':', ';', '!', '?', '-', Char(9)];
  //Множество гласных букв кириллицы.
  //Для кодовой страницы ANSI (CP1251), если текст набран в редакторе Delphi.
  //Это же самое для кодовой страницы CP866, если текст набран в DOS редакторе PASCAL.
  //A = ['А', 'а', 'Е', 'е', 'И', 'и', 'О', 'о', 'У', 'у', 'Ы', 'ы', 'Э', 'э', 'Ю', 'ю', 'Я', 'я'];
  //Для кодовой страницы CP866 независимо от редактора.
  A = [#128, #160, #133, #165, #136, #168, #142, #174, #147, #227, #155, #235, #157, #237, #158, #238, #159, #239];
var
  //Множество гласных букв, которые обнаружены в тексте.
  DimText : TCharDim;
  //Множество гласных букв, которые обнаружены в отдельном слове.
  DimWord : TCharDim;
  //Индекс символов в строке.
  i : Integer;
  //Индекс конца очередного слова.
  Pos2 : Integer;
begin
  //Результирующее множество.
  Result := [];
 
  DimText := [];
  DimWord := [];
  Pos2 := 0;
  for i := 1 to Length(aStr) do begin
    //Если очередной символ является разделителем - пропускаем итерацию.
    if aStr[i] in Delims then Continue;
 
    //Обработка символов слова.
    //Если очередная буква является гласной, то добавляем её
    //заглавную версию в множество DimWord.
    if aStr[i] in A then DimWord := DimWord + [ AUp866(aStr[i]) ];
 
    //Отслеживаем конец слова.
    if i = Length(aStr) then
      Pos2 := i
    else if aStr[i + 1] in Delims then
      Pos2 := i
    ;
    //Если конец слова найден.
    if Pos2 > 0 then begin
      //Удаляем из Result те гласные буквы, которые присутствуют
      //одновременно в множествах DimWord и DimText.
      Result := Result - (DimWord * DimText);
      //Добавляем в множество Result те гласные буквы, которые присутствуют
      //в множестве DimWord, но которых нет в DimText.
      Result := Result + (DimWord - DimText);
      //Добавляем в множество DimText гасные буквы, которые имеются в множестве DimWord.
      DimText := DimText + DimWord;
 
      //Обнуляем сведения по слову перед следующей итерацией.
      DimWord := [];
      //Флаг - "Конец слова не найден".
      Pos2 := 0;
    end; //if Pos2 > 0
  end; //for i
end;
 
var
  DimRes : TCharDim;
  StrRes, StrTmp : String;
  CharTmp : Char;
begin
  repeat
    Writeln('Vvedite strku:');
    Readln(StrTmp);
 
    //Получаем множество, которое содержит только те гласные буквы, которые
    //присутствуют не более чем в одном слове текста StrTmp.
    DimRes := GetA(StrTmp);
    //Переписываем буквы множества DimRes в строку StrRes.
    StrRes := '';
    for CharTmp := Low(Char) to High(Char) do begin
      if CharTmp in DimRes then begin
        if StrRes <> '' then StrRes := StrRes + ', ';
        StrRes := StrRes + CharTmp;
      end;
    end;
 
    Writeln('Glasnie bukvi, kotorie vstrechaiutca ne bolee, chem v odnom slove:');
    Writeln(StrRes);
    Writeln('Povtorit - ENTER. Bihod - luboi simvol + ENTER.');
    Readln(StrTmp);
  until StrTmp <> '';
end.

Leave a Comment

35 − 32 =