Ищем анаграммы в Delphi

Анаграммы - это слова, которые состоят из одних и тех же букв в равных количествах. Например, ТОПОР - РОПОТ - ОТПОР.

Естественно, все анаграммы состоят из равного количества букв, поэтому при поиске анаграмм нужно проверять только слова той же длины, что и заданное слово. Это значительно сокращает пере­бор слов, но - нужно заранее знать, что заданное слово имеет ана­грамму, иначе придётся перебирать все слова.

Но мы уже выяснили, что полный перебор слов лучше поручить компьютеру. Напишите программу, которая найдёт все анаграммы русского языка!

Анаграммы

Мы начнём с того, что загрузим словарь и сразу же приступим к поиску анаграмм 


procedure TfrmMam. FormCreate (Sender: TObject) ;
begin
{загрузить слозарь по умолчанию и запомнить его имя}
filename:= DefaultFileName;
loadfile;
end;
procedure TfrmMain.FormActivate(Sender: TObject);
begin
Find;
end;

 

Казалось бы, задача непростая, но достаточно сделать несколько дополне­ний к Наборщику, и можно приниматься за дело:


//НАЙТИ НУЖНЫЕ СЛОВА
procedure TfrmMain.Find;
var
s,str : String;
i,j,n,len: integer;
flag: boolean;
word, curWord: array[1 A'..1Я1 ] of integer;
ch: char;
begin
sbtSave.Enabled:= false;
sbtOpenFile.Enabled:= false;
IstProtokol.Items.clear;
for n:=l to WordsAll do begin
//обнуляем массив - ни одной буквы пока в нём нет:
for ch:='A' to 'Я' do
word[ch]:=0;
s:= spisok[n];
len:= length(s);
//считаем буквы в слове и формируем массиз:
for i:=l to len do begin
inc(word[s]);
end;
str:=1';
//отыскизаем анаграммы и заносим их з протокол:
for i:=BeginWord[len] to BeginWord[len]+NumWords[len]-1 do
begin
cu rWo rd:= word;
flag:= TRUE;
for j:=1 to len do begin
dec (curWord[spisok[i,j]]);
if curWord [spisok [i, j ] ]<0thenbegin//-такойбуквы
нет!
flag:= FALSE;
break;
end;
end;
if flag and (s<> spisok) then str:= str +''+spi-
sok  ;
end;
application.ProcessMessages;
if str<>'' then IstProtokol.Items.Add(s + 11 + str);
end;
sbtSave.Enabled:= true;
sbtOpenFile.Enabled:= true;
end;

На что нужно обратить внимание в этой процедуре?

 Желательно отключить «лишние» кнопки. Всё-таки поиск анаграмм дело небыстрое, немного придётся и подождать, но ведь от безделья пользователь начнёт жать на все кнопки, а это чревато. Нужно огра­дить его от вредной забавы (по-научному, это называется «защита от дурака», не в обиду будь сказано).

 Роль заданного слова будут последовательно исполнять все слова из списка.

 Изящнее и правильнее анаграммы выписывать не в колонку, а в одну строку, поэтому придётся постараться и сделать красиво.

 Так как каждое слово является анаграммой самого себя, то мы для всех слов найдём «анаграммы», что нехорошо. Это надо учесть!

Ищем анаграммы в Delphi



������� ������ ��� dle ������� ��������� ������

Помоги проекту! Расскажи друзьям об этом сайте: