Фракционирование в Delphi, или Слова мелкого и крупного помола

Во многих случаях поиск нужных слов ведётся среди слов одной и той же длины. Например, в игре Виселица, при составлении списка анаграмм, ме­таграмм, палиндромов, при разгадывании кроссвордов число букв в сло­вах известно, поэтому бывает очень полезно иметь список, в котором сло­ва расположены не только по алфавиту, но и по длине слов.

 

Если у нас есть под рукой обычный словарь, то нажатием всего одной кнопки мы его превратим во «фракционированный», то есть «просеем» все слова через сито с разными по величине ячейками. В итоге получится вот такой полезный списочек:

  • АД
  • АЗ
  • АР
  • АС
  • ГО
  • ЁЖ
  • ИЛ
  • ОМ
  • ОР
  • ПА
  • РЭ
  • СУ
  • УЖ
  • УМ
  • УС 
  • ЩИ
  • ЮГ
  • ЮЗ
  • ЮР
  • ЮС
  • ЯД
  • ЯК
  • ЯЛ
  • ЯМ
  • ЯР
  • АЗУ
  • АКР
  • АКТ
  • АУЛ
  • СВЕТОЧУВСТВИТЕЛЬНОСТЬ
  • ЕСТЕСТВОИСПЫТАТЕЛЬНИЦА
  • НЕУДОВЛЕТВОРИТЕЛЬНОСТЬ
  • ПЕРЕОСВИДЕТЕЛЬСТВОВАНИЕ
  • ЧЕЛОВЕКОНЕНАВИСТНИЧЕСТВО

 

Интерфейс программы ещё более скудный и лаконичный, чем у Hang­manHelper

Фракционирование в Delphi, или Слова мелкого и крупного помола

Обратите внимание на значки компонентов OpenDialog и SaveDialog! Первый даёт пользователю возможность выбрать файл словаря на диске для его загрузки, второй - для записи нового, фракционированного слова­ря.

 

На экран выводим только скупую информацию о загруженном и о запи­санном словарях. Выбрать же нужный файл со словарём на диске легко с помощью кнопки sbtOpenFile, которая приветливо встречает пользовате­ля в верхнем левом углу формы.


// Загрузить словарь по выбору
procedure TfrmMain.sbtOpenFileClick(Sender: TObject); begin
opendialog1.DefaultExt:=’txt’;
opendialog1.Filter:=’Text files (*.txt)|*.TXT’; opendialog1.InitialDir:= extractfilepath(application.exename); opendialog1.Title:=’Загрузите новый словарь’; if opendialog1.Execute then begin
filename:= opendialog1.filename; loadfile;
end
 
else

В процедуре loadfile мы совместим приятное с полезным: и готовый сло­варь с диска загрузим, и новый создадим: 


///////////////////////////////////////////// // // // ЗАГРУЗИТЬ СЛОВАРЬ // // // /////////////////////////////////////////////
procedure TfrmMain.LoadFile;
//имя файла хранится в переменной FileName var
s : String;
F: TextFile; i,j: integer;

 

Все слова из файла мы считываем в массив строк Spisok, при этом находим число букв в самом длинном слове - оно хранится в переменной MaxLen- Word.

И остаётся только в цикле for j:=1 to MaxLenWord do просматри­вать все слова в массиве Spisok и последовательно записывать в файл сло­ва длиной от 1 до максимальной, то есть весь алгоритм уместился в не­сколько строк кода 


for j:=1 to MaxLenWord do for i:=1 to WordsAll do
if length(spisok)= j then 
begin 
writeln (f, spisok);
 end;

А не подумавши, можно было бы сначала отсортировать массив Spisok по длине слов, и только потом записывать новый словарь в файл. Конечно, компьютеру это сделать несложно, но нам-то зачем делать лишнюю рабо­ту!

 Фракционирование в Delphi, или Слова мелкого и крупного помола

dle

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