Во многих случаях поиск нужных слов ведётся среди слов одной и той же длины. Например, в игре Виселица, при составлении списка анаграмм, метаграмм, палиндромов, при разгадывании кроссвордов число букв в словах известно, поэтому бывает очень полезно иметь список, в котором слова расположены не только по алфавиту, но и по длине слов.
Если у нас есть под рукой обычный словарь, то нажатием всего одной кнопки мы его превратим во «фракционированный», то есть «просеем» все слова через сито с разными по величине ячейками. В итоге получится вот такой полезный списочек:
- АД
- АЗ
- АР
- АС
- ГО
- ЁЖ
- ИЛ
- ОМ
- ОР
- ПА
- РЭ
- СУ
- УЖ
- УМ
- УС
- ЩИ
- ЮГ
- ЮЗ
- ЮР
- ЮС
- ЯД
- ЯК
- ЯЛ
- ЯМ
- ЯР
- АЗУ
- АКР
- АКТ
- АУЛ
- СВЕТОЧУВСТВИТЕЛЬНОСТЬ
- ЕСТЕСТВОИСПЫТАТЕЛЬНИЦА
- НЕУДОВЛЕТВОРИТЕЛЬНОСТЬ
- ПЕРЕОСВИДЕТЕЛЬСТВОВАНИЕ
- ЧЕЛОВЕКОНЕНАВИСТНИЧЕСТВО
Интерфейс программы ещё более скудный и лаконичный, чем у HangmanHelper
Обратите внимание на значки компонентов 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 по длине слов, и только потом записывать новый словарь в файл. Конечно, компьютеру это сделать несложно, но нам-то зачем делать лишнюю работу!