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.