Наверное, всем известна школьная игра Наборщик. В ней требуется из букв какого-либо заданного длинного слова составлять другие, более короткие слова, с условием, что они будут состоять только из тех букв, которые имеются в заданном слове. При этом, если в длинном слове, например, две буквы А, то и в каждом составленном слове их должно быть не больше двух. Побеждает тот игрок, который составит больше слов. Очень хорошая игра, в которую интересно играть, особенно на уроках математики.
Мы сделаем себе небольшое послабление в правилах игры - не будем требовать, чтобы число одинаковых букв в искомых словах не превышало числа этих букв в заданном слове, иначе говоря, любую букву этого слова можно использовать сколько угодно раз. Все остальные правила трогать не будем.
Все компоненты программы нам уже хорошо известны, поэтому обратим своё внимание на процедуру составления списка слов, в которую мы попадём после нажатия на кнопку sbtFind НАИТИ СЛОВА:
//НАЙТИ НУЖНЫЕ СЛОВА procedure TfrmMain.sbtFindClick(Sender: TObject);
var word : AnSiString; i/j: integer;
ch: set of Char; flag: boolean;
begin //конвертируем буквы з верхний регистр - как з слозаре:
word:= AnsiUpperCase(txtWord.Text);
if length (word) < 2 then Application.MessageBox('Слишком короткое 1Супернаборщик1, МВ_ОК);
//з множестзе пока нет букв: ch:=[]; //формируем множестзо из букз заданного слоза:
for i:=l to length(word) do begin //добазить букву з множестзо:
include(ch, word]);
ch:= ch + [word]; end; IstProtokol.Items.clear;
for i:=l to WordsAll do
begin flag:= TRUE;
for j:=l to length(spisok) do
begin
if not (spisok[i,j] in ch) then
begin
//- такой букзы нет!
flag:= FALSE;
break;
end;
end;
if flag then IstProtokol.Items.Add (spisok);
end;
end;
Сначала мы должны конвертировать все буквы в верхний регистр, потому что в словаре все слова записаны «большими» буквами. Иначе ни одного слова программа не найдёт!
Ясно, что бесполезно искать слова, состоящие только из одной буквы, хотя бы и взятой много раз (но такие слова могут появиться в будущем!), поэтому необходимо проверить введённое слово.
Далее мы заполняем пустое множество буквами заданного слова и просматриваем весь словарь. Все буквы каждого слова проверяем, имеются ли они в множестве ch (а значит, и в заданном слове). Как только нам встретилась «лишняя» буква, проверку текущего слова прекращаем и переходим к следующему в массиве spisok. Слово, которое с честью выдержало все испытания, печатаем в окне протокола. Все найденные слова можно сохранить в файле, нажав кнопку sbtSave с зазывным предложением Записать.
Всего за несколько минут мы написали очень интересную и полезную программу для игры в слова! Теперь вы смело можете играть в неё с кем угодно, не боясь ударить в грязь лицом, и каждый поверженный вами противник скажет о вас: «Да, этот парень в карман за словом не полезет!». Вот так, с помощью ловкости рук и без всякого мошенничества вы прослывёте настоящим эрудитом даже за пределами своей родной школы.
Нашу программу можно использовать и вот таким неожиданным образом.
Предположим, что на вашем компьютере имеются только латинские буквы. Сколько русских слов вы сможете напечатать?
Для определённости будем считать, что только русские буквы АВСЕНКМОРТХ имеют латинские аналоги
Злые шутки с идентификаторами
Так как Delphi позволяет записывать идентификаторы и русскими буквами, то легко разыграть начинающих программистов. Составьте идентификатор так, чтобы он мог быть записан русскими буквами, но при этом выглядел бы так, как будто записан латинскими.
Например, раса сера архар серсо. При попытке воспользоваться этими идентификаторами будет возникать ошибка, так как все программисты уверены, что идентификаторы составлены из латинских букв.