Редактирование кроссворда

advertisement
Министерство образования Российской Федерации
Самарский государственный аэрокосмический университет
имени академика С.П. Королева
Кафедра информационных систем и технологий
Автоматизированная система генерирования
линейных кроссвордов
Пояснительная записка к лабораторной работе
Выполнили студенты
Сиганов С. гр. 637
Торопов А. гр. 637
Тарароев В. гр. 637
Руководитель проекта
доцент каф. ИСТ
Зеленко Л.С.
Дата сдачи:
Оценка:
Самара 2003
3
РЕФЕРАТ
Отчет
Пояснительная записка: 55 с., 6 рис., 6 схем программ и алгоритмов, 6 библиограф.
источников.
КРОССВОРД, ПОЛЕ, ГЕНЕРАЦИЯ, СЛОВАРЬ ПОНЯТИЙ, РАЗГАДЫВАНИЕ
В лабораторной работе разработан алгоритм и соответствующая ему программа,
позволяющая выполнять автоматическое составление кроссворда по выбранной теме.
Словарь терминов (понятие и его расшифровка) хранится в текстовом файле и
может
расширяться вручную (с использованием текстового редактора) или внутри программы.
Ограничений на длину словаря не существует. Программа написана на языке Object Pascal в
среде Delphi v.5.0.
4
Содержание
ВВЕДЕНИЕ .........................................................................................................................................5
1
СИСТЕМОТЕХНИЧЕСКАЯ ЧАСТЬ ........................................................................................6
1.1
Функциональная спецификация ..........................................................................................7
1.2
Описание структур данных ................................................................................................14
1.3
Классы объектов ...............................................................................................................155
1.4
Обоснование основных алгоритмов ................................................................................236
1.4.1 Алгоритм генерации линейного кроссворда...............................................................237
1.4.2 Алгоритм разгадывания кроссворда ..............................................................................19
1.5
2
Технические и системные требования ............................................................................270
КОНСТРУКТОРСКО-ТЕХНОЛОГИЧЕСКАЯ ЧАСТЬ.......................................................281
2.1
Состав программных модулей ПС ..................................................................................281
Список используемой литературы ...............................................................................................303
Приложение А. Руководство по эксплуатации системы. ...............................................................4
Приложение B. Текст программы (Основные модули) ................................................................39
5
ВВЕДЕНИЕ
Для разработки нам была предложена задача автоматизированного генерирования
линейных кроссвордов. Данная задача имеет немаловажное значение для предприятий и
частных лиц, работающих в сфере организации досуга.
Разработанная система позволяет быстро и легко создать линейный кроссворд любой
степени сложности, применяя готовые словари или словари пользователя. Предусмотрена
возможность создания кроссворда по заданной тематике, что, безусловно, может иметь
применение в средствах массовой информации. Так, например, наша система значительно
облегчит процесс составления кроссвордов для печатных изданий – газет и журналов.
Описываемая система создавалась таким образом, чтобы минимизировать затраты
системных и аппаратных ресурсов ЭВМ.
6
1
СИСТЕМОТЕХНИЧЕСКАЯ ЧАСТЬ
1.1 Функциональная спецификация
Разработанная система выполняет следующие функции:
 автоматическая генерация кроссворда (подсистема автоматической генерации
кроссворда). На входе – параметры кроссворда, подключенные словари, на выходе –
сгенерированный кроссворд;
 Ручное составление кроссворда (подсистема ручного составления кроссворда). На
входе – параметры кроссворда, на выходе – готовый кроссворд;
 Автоматическое
разгадывание
кроссворда
(подсистема
автоматического
разгадывания кроссворда). На входе – параметры кроссворда для разгадывания из
файла , на выходе – разгаданный кроссворд;
 Ручное разгадывание кроссворда (подсистема ручного разгадывания кроссворда). На
входе – готовый кроссворд для разгадывания из файла , на выходе – разгаданный
кроссворд;
 сохранение созданного кроссворда в файле на диск (файловая подсистема). На входе
– сгенерированное поле, составленный кроссворд и путь к словарю, на выходе –
файл, содержащий необходимую информацию;
 загрузка ранее сохраненного кроссворда из файла на диске (файловая подсистема).
На выходе - файл, содержащий сгенерированное поле, составленный кроссворд и
путь к словарю, на выходе – поле кроссворда для разгадывания.
 работа со словарями (подсистема работы со словарями). На входе – файл словаря, на
выходе – модифицированный файл словаря.
Структурная схема ПС приведена на рисунке 1.
7
ПС Управления
Подсистема
автоматического
составления
кроссворда
Подсистема
ручного
составления
кроссворда
Подсистема
автоматического
разгадывания
кроссорда
Подсистема
ручного
разгадывания
кроссворда
Подсистема визуализации
Файловая подсистема
Подсистема помощи
Подсистема работы со
словарями
Рисунок 1 - Структурная схема ПС
9
Функциональная схема программной системы представлена на рисунке 2.
F0-1
F1-0
F1-5
5
1
F5-1
F3-0
0
3
F0-3
F1-18
F1-19 F1-14 F1-16
F4-0
F1-9 F1-15
4
F1-11
18
19
14
16
F5-6
9
F12-1
F1-10
15
F8-9
F14-2
11
F9-8
10
F18-2
F15-8
F2-18
F16-12
F10-13
F2-14
13
F19-8 F1-12
F13-8
6
F6-7
F7-8
7
8
f17-8
F8-17
2
12
F12-17
F17-2 F17-12
F2-17
17
F11-8
11
№ состояния
Название состояния
0
Исходное состояние программы. Главное меню.
1
Активна п/с “Файловая система”
2
Активна п/с “Редактирования словарей”.
3
Подключение словарей.
4
Активна п/с “Помощи”.
5
Параметры кроссворда заданы.
6
Запуск “алгоритм автоматического составления
кроссворда”
7
Выбор кроссворда, подтверждение ввода.
8
Активна п/с редактирования кроссворда.
9
Сохранение кроссворда.
10
Активна п/с “Ручного составления кроссворда”
11
Активна п/с “Автоматического разгадывания кроссворда”
12
Активна п/с “Ручного разгадывания кроссворда”.
13
Выбор языка.
14
Сохранение словаря.
15
Открытие кроссворда.
16
Открытие словаря.
17
Визуализация.
18
Новый словарь.
19
Новый кроссворд.
12
№ функции
Название функции
1-19
Создание нового кроссворда
1-18
Создание нового словаря
1-14
Сохранение словаря
1-16
Открытие словаря
1-9
Сохранение кроссворда
1-15
Открытие кроссворда
1-10
Ручное составление кроссворда
1-11
Автоматическое разгадывание кроссворда
1-0
возврат в гл. меню
0-1
Условный переход в файловую систему
1-5
Задание параметров кроссворда
5-6
Запуск алгоритма автоматического составления
6-7
Выбор одного из кроссвордов
7-8
Переход к редактированию кроссворда
19-8
Переход к редактированию кроссворда
9-8
Переход к редактированию кроссворда
15-8
Переход к редактированию кроссворда
13-8
Переход к редактированию кроссворда
11-8
Переход к редактированию кроссворда
17-8
Переход к редактированию кроссворда
10-13
Выбор языка
8-9
Сохранение кроссворда
2-14
Сохранение словаря
2-18
Создание нового словаря
12-1
Доступ к главному меню
2-17
Визуализация
12-17
Визуализация
8-17
Визуализация
17-2
Возврат к редактированию словарей
17-12
Возврат к ручному отгадыванию кроссворда
17-8
Возврат к редактированию кроссвордов
0-4
Показ помощи
13
4-0
Возврат из помощи в исходное состояние
2-14
Сохранение словаря
2-18
Создание нового словаря
14-2
Возврат к редактированию словарей
18-2
Возврат к редактированию словарей
14
1.2 Описание структур данных
В разработанной программе большинство объектов предназначены для качественной
визуализации
процессов
создания
кроссворда
и
его
дальнейшего
разгадывания.
Следовательно, вышеупомянутые объекты никак не влияют на «рабочие» данные –
основную информацию в программе. Промежуточные (или обслуживающие) данные
сформированы таким образом, что их структура позволяет беспрепятственно передавать их
из методов одного служебного класса в методы другого служебного класса. Так, например,
при работе с объектами визуального отображения процесса
используется графическая
структура Delphi TPaint, позволяющая очень быстро и легко создавать, изменять и
передавать графические данные. Но основной структурой данных в любой программе
считается структура, которую имеют «рабочая» информация программной системы.
Основной алгоритм нашего проекта, связанный с генерацией кроссворда заданной
длины, работает с отдельными словами из словаря. Следовательно, для работы алгоритму
необходимо передать массив слов (или массив строковых величин). Но такой массив будет
занимать очень много места в памяти и динамика такого массива весьма ограничена.
Решение лежит на поверхности – необходимо предавать в алгоритм текстовый файл, из
которого в самом алгоритме будет сформирован рабочий строковый массив. Это очень
удобно, так как многотысячные словари целесообразно хранить на диске в виде текстовых
файлов, которые обеспечивают:

легкий и быстрый допуск к файлу;

простота операций над текстовой информацией;

сравнительно небольшой объём на диске.
По завершении работы основного алгоритма программной системы в нём формируется
выходной список подобранных слов – строковый список. В качестве результирующего
списка мы взяли список стандартного типа Delphi TStringList, который занимает мало места
в памяти и при этом позволяет хранить очень большие объёмы данных в упорядоченном по
определённому признаку виде. Далее этот результирующий список сохраняется на диск в
виде того же текстового файла для дальнейшего разгадывания. Это позволяет разгадывать
ранее загаданный кроссворд.
Итак, в нашей разработанной программной системе используются две структуры
данных – строковые массивы и строковые списки. Для удобства передачи информации из
подсистемы создания кроссворда в подсистему его разгадывания используются потоки
данных – текстовые файлы.
15
1.3 Классы объектов
В разработанной программе существует всего 2 класса TMainForm и TKross.
TMainForm отвечает за визуализацию всех процессов происходящих в программе, а
также за работу со словарями. Класс TKross отвечает за работу с кроссвордами.
TMainForm = class(TForm)
MainControlBar: TControlBar;
MainStatusLine: TStatusBar;
DialogOpen: TOpenDialog;
DialogSave: TSaveDialog;
DialogFind: TFindDialog;
GridDic: TStringGrid;
KrossBox: TScrollBox;
ButtonNew: TToolButton;
ButtonOpen: TToolButton;
ButtonSave: TToolButton;
ButtonHelp: TToolButton;
ButtonAbout: TToolButton;
ButtonDicInsert: TToolButton;
ButtonDicDelete: TToolButton;
ButtonDicRedact: TToolButton;
ButtonDicSeparator1: TToolButton;
ButtonDicFind: TToolButton;
ButtonDicSeparator2: TToolButton;
ButtonDicInclude: TToolButton;
ButtonKrossViewLine: TToolButton;
ButtonKrossViewSnake: TToolButton;
ButtonKrossViewSpiral: TToolButton;
ButtonKrossViewZabor: TToolButton;
ButtonKrossViewSeparator1: TToolButton;
ButtonKrossViewHeight: TSpinEdit;
ButtonKrossViewWidth: TSpinEdit;
ButtonKrossViewLabelWidth: TLabel;
ButtonKrossViewLabelHeight: TLabel;
ButtonKrossSizeSpinMax: TSpinEdit;
ButtonKrossSizeSpinOstatok: TSpinEdit;
ButtonKrossSizeLabelMax: TLabel;
ButtonKrossSizeLabelOstatok: TLabel;
ButtonKrossSizeStart: TToolButton;
ButtonKrossSizeSeparator1: TToolButton;
ButtonKrossSizeSpinCheck: TSpinEdit;
ButtonKrossSizeLabelCheck: TLabel;
ButtonKrossSizeSeparator2: TToolButton;
ButtonKrossSizeStop: TToolButton;
ButtonKrossSizeCheck: TToolButton;
ButtonEdit: TEdit;
ButtonMenuFile: TToolButton;
ButtonMenuKross: TToolButton;
ButtonMenuDic: TToolButton;
ButtonMenuHelp: TToolButton;
ImagesFile: TImageList;
16
ImagesKrossView: TImageList;
ImagesKrossSize: TImageList;
ImagesDic: TImageList;
ImagesHelp: TImageList;
ImagesOnOff: TImageList;
ImagesNew: TImageList;
ImagesOpen: TImageList;
MenuFileNew: TMenuItem;
MenuFileOpen: TMenuItem;
MenuFileSave: TMenuItem;
MenuFileSaveAs: TMenuItem;
MenuFileSeparator1: TMenuItem;
MenuFileExit: TMenuItem;
MenuFileNewDic: TMenuItem;
MenuFileNewKross: TMenuItem;
MenuFileOpenKross: TMenuItem;
MenuFileOpenDic: TMenuItem;
MenuKrossView: TMenuItem;
MenuKrossViewLine: TMenuItem;
MenuKrossViewSnake: TMenuItem;
MenuKrossViewSpiral: TMenuItem;
MenuKrossViewZabor: TMenuItem;
MenuKrossSeparator1: TMenuItem;
MenuKrossRun: TMenuItem;
MenuDicInsert: TMenuItem;
MenuDicDelete: TMenuItem;
MenuDicRedact: TMenuItem;
MenuDicSeparator1: TMenuItem;
MenuDicFind: TMenuItem;
MenuDicSeparator2: TMenuItem;
MenuDicInclude: TMenuItem;
MenuHelpAbout: TMenuItem;
MenuHelpSeparator1: TMenuItem;
MenuHelpHelp: TMenuItem;
PopUpFile: TPopupMenu;
PopUpKross: TPopupMenu;
PopUpDic: TPopupMenu;
PopUpHelp: TPopupMenu;
PopUpNew: TPopupMenu;
PopUpNewKross: TMenuItem;
PopUpNewDic: TMenuItem;
PopUpOpen: TPopupMenu;
PopUpOpenKross: TMenuItem;
PopUpOpenDic: TMenuItem;
PopUpToolBar: TPopupMenu;
PopUpToolBarFile: TMenuItem;
PopUpToolBarView: TMenuItem;
PopUpToolBarSize: TMenuItem;
PopUpToolBarEdit: TMenuItem;
PopUpToolBarDic: TMenuItem;
PopUpToolBarHelp: TMenuItem;
ToolBarFile: TToolBar;
ToolBarKrossView: TToolBar;
17
ToolBarKrossSize: TToolBar;
ToolBarEdit: TToolBar;
ToolBarDic: TToolBar;
ToolBarHelp: TToolBar;
PaintBox: TPaintBox;
RefreshButton: TButton;
ButtonKrossSizeLabelNalogenie: TLabel;
ButtonKrossSizeSpinNalogenie: TSpinEdit;
AnimateMain: TAnimate;
ToolBarClose: TToolBar;
ButtonClose: TToolButton;
ImagesClose: TImageList;
ToolBarCaption: TToolBar;
EditCaption: TEdit;
MenuKrossSeparator2: TMenuItem;
MenuKrossAns: TMenuItem;
ButtonKrossAnsAuto: TToolButton;
cbVisual: TCheckBox;
ButtonCloseSeparator1: TToolButton;
ButtonKrossAnsMan: TToolButton;
ButtonKrossSizeCheckMan: TToolButton;
procedure FormCreate(Sender: TObject);
procedure ShowHint(Sender: TObject);
//Обработчики команд
procedure FileNew(Sender : TObject;
Messager : LongWord);
function CheckDicFile(Name : string;
var Size : integer;
var lng : LongWord;
var Mean : string):boolean;
procedure FileOpen(Sender : TObject;
Messager : LongWord);
procedure FileSave(Sender : TObject;
Messager : LongWord);
procedure FileSaveAs(Sender : TObject;
Messager : LongWord);
procedure KrossView(Messager : LongWord);
procedure KrossRun;
function AnswerRun(FileName : string;
var CurLang : LongWord) : boolean;
procedure KrossRefresh(View
: LongWord;
KrossStr : AnsiString;
StartPos, EndPos : integer);
procedure HelpHelp(Sender: TObject;
Messager : LongWord);
procedure InsertInGrid(Wrd : String; Mean : String);
procedure DeleteFromGrid(pos : integer);
procedure RedactInGrid(Wrd : String; Mean : String);
procedure FindInGrid(Wrd : String);
procedure FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
//Обработчики сообщений от мышки и меню
procedure MenuFileNewKrossClick(Sender: TObject);
18
procedure MenuFileNewDicClick(Sender: TObject);
procedure MenuFileOpenKrossClick(Sender: TObject);
procedure MenuFileOpenDicClick(Sender: TObject);
procedure MenuFileSaveClick(Sender: TObject);
procedure MenuFileSaveAsClick(Sender: TObject);
procedure MenuFileExitClick(Sender: TObject);
procedure MenuDicInsertClick(Sender: TObject);
procedure MenuDicDeleteClick(Sender: TObject);
procedure MenuDicRedactClick(Sender: TObject);
procedure MenuDicFindClick(Sender: TObject);
procedure MenuDicIncludeClick(Sender: TObject);
procedure MenuKrossViewLineClick(Sender: TObject);
procedure MenuKrossViewSnakeClick(Sender: TObject);
procedure MenuKrossViewSpiralClick(Sender: TObject);
procedure MenuKrossViewZaborClick(Sender: TObject);
procedure MenuKrossRunClick(Sender: TObject);
procedure MenuKrossAnsAutoClick(Sender: TObject);
procedure MenuHelpHelpClick(Sender: TObject);
procedure MenuHelpAboutClick(Sender: TObject);
procedure PopUpToolBarClick(index : byte);
procedure PopUpToolBarFileClick(Sender: TObject);
procedure PopUpToolBarViewClick(Sender: TObject);
procedure PopUpToolBarSizeClick(Sender: TObject);
procedure PopUpToolBarEditClick(Sender: TObject);
procedure PopUpToolBarDicClick(Sender: TObject);
procedure PopUpToolBarHelpClick(Sender: TObject);
procedure GridDicSelectCell(Sender: TObject;
ACol, ARow: Integer;
var CanSelect: Boolean);
procedure GridDicKeyDown(Sender: TObject;
var Key: Word;
Shift: TShiftState);
procedure FormKeyDown(Sender: TObject;
var Key: Word;
Shift: TShiftState);
procedure DialogFindFind(Sender: TObject);
procedure RefreshButtonClick(Sender: TObject);
procedure ButtonKrossSizeCheckClick(Sender: TObject);
procedure ButtonKrossSizeSpinCheckChange(Sender: TObject);
procedure ButtonCloseClick(Sender: TObject);
procedure ButtonEditKeyDown(Sender: TObject;
var Key: Word;
Shift: TShiftState);
procedure ButtonEditKeyUp(Sender: TObject;
var Key: Word;
Shift: TShiftState);
procedure ButtonEditKeyPress(Sender: TObject;
var Key: Char);
procedure ButtonEditMouseUp(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
procedure ButtonEditClick(Sender: TObject);
19
procedure ButtonEditDblClick(Sender: TObject);
procedure ToolBarCaptionResize(Sender: TObject);
procedure EditCaptionKeyPress(Sender: TObject;
var Key: Char);
procedure ButtonKrossAnsManClick(Sender: TObject);
procedure ButtonKrossSizeCheckManClick(Sender: TObject);
private
LetW, LetH
View
: integer;
: LongWord;
end;
TTmpKross = ^PTmpKross;
PTmpKross = record
//начальная и конечная
StartPos,
EndPos : integer; //позиция в строке редактирования
Wrd
: string;
Mean
: string;
Ans
: boolean;
Next
: TTmpKross;
end;
TKrossList = ^PKrossList;
PKrossList = record
Krs : TTmpKross;
next : TKrossList;
end;
TDic = ^PDic;
PDic = record
FileName,
DicCaption : string;
Dic
: TStringList;
next
: TDic;
end;
TKross = class(TObject)
//Максимум букв
MaxLet,
Rest,
Jount
//остаток
: integer;
DicDir
IncludeDic
: string;
//Наложение
//'C:\...\'-Путь к словарям
: TStrings; //Имена файлов словарей
//Инициализация
constructor KrossInit;
//Делает текущий кроссворд основным
procedure DoKrossCurrently;
//Вставка словаря в список
procedure InsertDicInList(var Elem : TDic);
//Удаление словаря из списка
procedure DeleteDicFromList(FileName : string);
//Удаление всех словарей из списка
procedure DeleteAllDicFromList;
//Удаление текущего словаря
procedure DeleteCurKross;
20
function CheckExistingWord : integer;
//Возвращает строку кроссворда
function
GetKrossLine(Num : integer) : AnsiString;
//Автоматическое составление
function CreateAuto : integer;
//Разгадывает кроссворд, но перед вызовом этой процедуры необходимо
//вызвать процедуру CheckAnsFile, а также Ans = false. Процедура
//если разгадает кроссворд в Ans возвратит true
procedure DoAnswerKross(var Ans : boolean;
Count : integer;
RightWay : AnsiString);
//забивает определения из файлов
procedure DoCaptionsFromDic;
//Возвращает определение по позиции указателя в строке, начиная с 1 или
//меняет его
function
GetChangeCaption(GC : boolean;
NewS : string;
Pos : integer;
var StartPos : integer;
var EndPos : integer) : string;
//проверка на принадлежность буквы пересечению
function
InExt(Pos : integer) : boolean;
//Сохранение кроссворда
procedure SaveKross(FileName : string;
Lang
: string); //@Lang Rus
//Чтение и проверка файла кроссворда на правильность записи
function ReadAndCheck(FileName : string;
var Lang: string) : integer;
//Проверка строки на принадлежность языку
function CheckForLang(S
: string;
Lang : string) : boolean;
//Удаление буквы из кроссворда по указанной позиции
procedure DeleteLetter(Pos : integer);
//Вставляет букву в кроссворд
function
InsertLetterInKross(Pos : integer;
Letter : char) : boolean;
//Проверка на правильность формата файла для разгадывания
//Язык должен быть настроен извне (CurrentLang)
function CheckAnsFile(FileName : string) : integer;
public
//Удаление класса из памяти
destructor Destroy; override;
private
//Голова списка словарей
HeadDicList
: TDic;
//Голова списка кроссвордов
HeadKrossList
: TKrossList;
//Голова текущего видимого кроссворда
HeadCurKross
WrdCount
: TTmpKross;
: integer;
//Строка текущего кроссворда
KrossStr
: AnsiString;
//Количество кроссвордов
21
KrossCount
: integer;
//Номер текущего кроссворд
CurrentKross
: integer;
//Функция проверяет, отгадан ли кроссворд полностью?
function CheckForAnswer : boolean;
//Функция имеет два состояния определяемых параметром ToCheck:
//True: пометить слово кроссворда отгаданным
//False: проверить, помечено ли слово
function WrdCheck(Pos : integer;
ToCheck : boolean) : boolean;
//Возвращает слово по позиции в кроссворде
function GetWordByPos(Pos : integer) : string;
//Возвращает координаты слова в строке кроссворда по позиции в списке
procedure GetWordPosByNum(Pos : integer; //позиция в кроссворде
var x1, x2 : integer);//коор-ты слова
//Проверка: Относится ли буква из KrossLine к отгаданным?
function
IsAnswered(Pos : integer) : boolean;
//Нахождение свободного пути для выбора
function
GetEmptyPos(RightWay,
WrongWay : AnsiString) : integer;
//Проверка слов на совместимость начала и конца
function CmpWrdExt(Ext : string) : boolean;
//Вставка нового кроссворда в список
procedure InsertNewKross;
//Рекурсивная функция составления кроссвордов
procedure DoKross(Count
: integer;
Krosslen : integer;
RightWay : AnsiString);
//Получение слова по индексу из списка слов словарей
function
GetWrd(Index : integer) : string;
//Удаление одного кроссворда из списка кроссвордов
procedure DeleteOneKross(Elem : TTmpKross);
//Вставка определения
procedure InsertCaption(Wrd : string;
Cap : string);
//Выделение слова в TS из S
procedure ReadWord(var S : string;
var TS : string);
//Переставляет элементы в обратном порядке и устанавливает границы
//Изначально слова в списке идут с начала
procedure DoKrossBorder;
//Беря исходный список HeadCurKross в формате StartPos = кол-ву букв
//в слове. Слов идут с конца, т.е. голова содержит последнее слово
//в кроссворде. Затем приводит кроссворд в божеский вид.
//Не устанавливает поля СЛОВО и ОПРЕДЕЛЕНИЕ
function
DoKrossBorderAns : boolean;
//Устанавливает границы, т.е. уменьшает значения StartPos и EndPos
//на еденицу до Elem включительно
//Изначально слова в списке идут с конца(нормальный порядок)
procedure DoKrossBorderNormalDec(Elem : TTmpKross);
//Устанавливает границы, т.е. увеличивает значения StartPos и EndPos
//на еденицу до Elem включительно
//Изначально слова в списке идут с конца(нормальный порядок)
22
procedure DoKrossBorderNormalInc(Elem : TTmpKross);
//Вставка еще одного наложения
function
InsertJount(Pos : integer) : boolean;
//Разбиение слова на два
procedure DivideWord(Elem : TTmpKross;
Pos : integer);
//Попытка вставить слово в разгадываемый кроссворд, true - успешно
function
TryToInsert(Wrd : string) : boolean;
//Проверка на составление кроссворда, True - составлен
function
KrossIsReady : boolean;
//Удаляет последнее вставленное слово в кроссворде
procedure DeleteLastWord;
end;
Иерархия классов представлена на рисунке 3.
1.4 Иерархия классов
TObject
TPersistent
TKross
TComponent
TMenu
TApplication
TControl
TMainMenu
TForm
TWinControl
TCustomEdit
TCustomMemo
TMemo
TEdit
TScrolling
WinControl
TScrollBox
TGraphicControl
TCustomControl
TCustomGroupBox
TCustomRadioGroup
TRadioGroup
TMainForm
23
Обоснование основных алгоритмов
1.4.1 Алгоритм генерации линейного
кроссворда
В задачу основного алгоритма генерации линейного кроссворда входит просмотр всех
возможных перестановок N элементов множества. Число таких перестановок равно N!.
Т.е мы получаем дерево всех вариаций. При прохождении дерева составляется кроссворд, с
учетом заданных параметров. (1)Если следуещее слово по параметрам не подходит, мы
делаем откатку назад по дереву и заходим в другую ветвь. Если по ходу прохождения дерева
мы получили кроссворд удовлетворяющий всем параметрам мы сохраняем кроссворд и
продолжаем поиск по той же ветви начиная с пункта (1).
Структурную схему рекурсивного «отката» назад при генерации (создании) линейного
кроссворда можно представить в следующем виде (рисунок 4):
24
начало
Набор уже имеющихся во временном
массиве подобранных слов
Нет
Да
Попытка вставки слова в
строку кроссворда
Вставка кроссворда в
список.Очистка строки
кроссворда.
Выходим из ветвения. Переходим в
другую ветвь.
Выход из алгоритма. На
выходе список кроссвордов.
Рисунок 4 – Логическая схема алгоритма генерации линейных кроссвордов
25
Вышеописанный алгоритм носит название алгоритма рекурсивного
отката и позволяет произвести выборку k слов из m –единичного словаря за
число шагов <= m!. Необходимо учитывать, что алгоритм устроен таким
образом, что для больших словарей (на несколько тысяч слов), поиск идёт
значительно быстрее, так как имеется больше возможных вариантов подбора.
26
Алгоритм автоматического разгадывания кроссворда
При разгадывании кроссворда используется следующий алгоритм:

Берется строка кроссворда не заполненная словами.

Используем алгоритм идентичный алгоритму автоматического составления, с той лишь
разницей, что мы не генерируем все возможные кроссворды, а берем первый подходящий
по всем параметрам кроссворд: совпадение клеток, совпадение наложения и т.д.
27
1.5 Технические и системные требования
Для нормального функционирования системы Snake необходимы:

IBM – совместимый компьютер с тактовой частотой процессора 100 МГц и более;

Объем оперативной памяти не менее 16 Мб;

Объем видеопамяти 1 Мб;

Монитор с разрешением 640480;

Манипулятор мышь;

Объем свободного дискового пространства не менее 10 Мб.

Следующий пакет файлов: Snake.EXE, папка Help;
28
2
КОНСТРУКТОРСКО-ТЕХНОЛОГИЧЕСКАЯ ЧАСТЬ
2.1 Обоснование выбора инструментальных средств и среды
реализации.
Для реализации системы Snake использован язык программирования Object Pascal.
Средa программирования – Delphi 5.0, которая идеально сочетает в себе возможности
структурного и объектно-ориентированного программирования. Кроме того, с этим языком
знакома
вся
проектная
группа.
Данный
язык
значительно
облегчает
разработку
интерфейсной части программы и предоставляет пользователю возможность легкого
манипулирования процессом составления и разгадывания кроссворда.
2.2 Состав программных модулей ПС
Программная система «линейный кроссворд» состоит из следующих программных
модулей:

Snake.cfg – файл конфигурации

Snake.dpr – файл проекта

AddUnit_new.pas

AutoFieldFormUnit.pas

CreateUnit.pas

CrossGen.pas

CrossGenFormUnit.pas

EditWin.pas

MainFormUnit.pas

MainUnit.pas

PaintObjects.pas

AddUnit_new.dfm

AutoFieldFormUnit.dfm

CreateUnit.dfm

CrossGenFormUnit.dfm

EditWin.dfm

MainFormUnit.dfm

MainUnit.dfm

файлы помощи (About.htm, Error.htm, Formats.htm, Main.htm, Structure.htm,
Toolbars.htm, Work.htm)
исходные тексты модулей
файлы форм
29

TestDic 26-5-1

TestDic 38-5-2

Snake.exe – исполняемый модуль.
файлы словарей
Для реализации программы разработаны 7 модулей. Их число объясняется работой в
команде и соответствующим разделением исполняемых функций между участниками,
объемностью программного кода и упорядочиванием структурной организации проекта.

Main in 'MAIN.PAS' {Главное окно приложения},

AboutU in 'AboutU.pas' {Окно "О программе"},

InsertU in 'InsertU.pas' {Окно вставки в словарь},

IncludeU in 'IncludeU.pas' {Окно подключения словарей},

SelDicLangU in 'SelDicLangU.pas' {Выбор языка и имени словаря},

SelKrossLangU in 'SelKrossLangU.pas' {Выбор языка кроссворда},

EnterWordU in 'EnterWordU.pas' {Окно ввода разгадываемого слова}
Тексты модулей CrossGen.pas и PaintObjects.pas с комментариями помещены в Приложении
B.
Схема взаимодействия модулей программы представлена на рисунке 6.
Main
SelKrossLang
U
AboutU
InsertU
EnterWordU
IncludeU
SelDicLangU
Рисунок 6 – Схема взаимодействия модулей
30
Список используемой литературы
1. Зеленко Л.С. Лекции по курсу «Технологии программирования». Самара, СГАУ, 2003.
2. СТП СГАУ 6.1.4-97. Общие требования к оформлению учебных текстовых документов:
Методические указания. - Самара, Самар. аэрокосм. ун-т, 1997. - 16 с.
3. Информационная технология. Комплекс стандартов и руководящих документов на
автоматизированные системы: (Сборник): ГОСТ 34.003-90,
РД 50-680-88, РД 50-682-89, ГОСТ 34.201-89 - ГОСТ 34.602.89. - М.: Изд-во стандартов,
1992. -150 с.
4. ГОСТ 19.701-90 (ИСО 5807-85). ЕСПД. Схемы алгоритмов, программ, данных и систем.
Условные обозначения и правила выполнения. – М.: Изд-во стандартов, 1991. - 26 с.
5. Система программирования Delphi. Валерий Фаронов. Санкт-Петербург «БХВПетербург»2003
31
Справочное руководство по "Змейка" .
Программа предназначена для составления кроссвордов и их разгадывания.
Общее
Проект создан студентами СГАУ в 2003 году, как задание по дисциплине технологии
программирования. Рабочее название проекта SNAKE. Задачей программы является
составление линейных кроссвордов, редактирование кроссвордов, а также их разгадывание.
Проект написан с использованием языка программирования Borland Delphi 5.
Руководителем проекта является Зеленко Лариса Сергеевна.
Иходные файлы для компиляции
Мы не знаем, какие файлы нужны действительно, а какие нет. Тут перечисленны все, какие
есть.
AboutU.dcu
AboutU.dfm
AboutU.pas
IncludeU.dcu
IncludeU.dfm
IncludeU.pas
InsertU.dcu
InsertU.dfm
InsertU.pas
Main.dcu
Main.dfm
Main.pas
Main.txt
SelDicLangU.dcu
SelDicLangU.dfm
SelDicLangU.pas
SelKrossLangU.dcu
SelKrossLangU.dfm
SelKrossLangU.pas
Snake.cfg
Snake.dof
Snake.dpr
Snake.res
Папка "Dictionary"
Данная папка является, по умолчанию, папкой, где содержатся словари для подключения.
Вне этой папки программа, при подключени словарей, никаких других словарей не увидит.
Поэтому, чтобы включить словарь в видимость программы, необходимо просто перенести
нужный словарь в эту папку.
Папка "Krosswords"
Данная папка предназначена для хранения кроссвордов, хотя это и не принципиально.
Кроссворд может находиться в любой другой папке. Она предназначена лишь для
концентрирования кроссвордов в одной куче.
Папка "Res"
Данная папка содержит все рисунки, значки, иконки используемые программой.
32
Папка "Help"
Данная папка содержит файлы справки по программе. начальной страницей является файл
Main.htm
Создание нового кроссворда
Порядок выполнения:
 Изменить на нужное значение поле "Наложение".
 Выбрать создание нового кроссворда.
Автоматическое создание кроссворда
Порядок выполнения:





Подключить словарь(и).
Установить необходимые значения "Max", "Остаток", "Наложение".
Нажать клавишу "Автомат".
Если хотя бы один кроссворд составлен, выбирите один меняя поле "Выбор".
Нажмите клавишу "Подтверждение выбора кроссворда".
Автоматическое разгадывание кроссворда
Порядок выполнения:
 Подключить словарь(и).
 Нажать клавишу "Разгадать автоматически".
 Выбрать файл и нажать открыть.
Ручное разгадывание кроссворда
Порядок выполнения:





Нажать клавишу "Разгадать в ручную".
Выбрать файл и нажать открыть.
Выбрать слово с помощью кнопки "Выбор"
Нажать клавишу
Ввести слово, используя определение внизу рабочего экрана. Подтвердить ввод.
Редактирование кроссворда
Возможные действия:
 Добавление буквы в кроссворд. Добавление происходит обычным нажатием буквы текущего языка
кроссворда в нужном месте поля "Редактирование кроссворда". Добавление может не произойти, если
наложение > 2 и курсор стоит между буквами наложения
 Удаление происходит при нажатии клавиш "DELETE" и "BACKSPACE" в нужном месте поля
"Редактирование кроссворда". Если удаляемая буква лежит на пересечении слов то удаляются оба этих слова и
все слова идущие после них. Если в слове не занятых наложениям одна буква то слово удаляется целиком, а
также удаляются все слова идущие за ним.
 Разбиение происходит при нажатии клавиши "ENTER" в позиции поля "Редактирование кроссворда" после
которого должно быть наложение. Наложение не произойдёт, если будущее наложение накладывается на какоенибудь другое или если при наложении образуется слово в котором свободных от наложения букв не будет.
При разбиении поле "Определение" исходного слова, копируется в первое из разбитых слов.
Редактирование определения
Порядок выполнения:
 Выбрать в кроссворде слово, определение которого необходимо изменить.
 Изменить определение в поле ввода "Редактирование определений"
 Нажать клавишу "ENTER"
"Файл"
"Новый..."
33
Служит для создания нового словаря или кроссворда. Нажав непосредственно на иконку
создатся по умолчанию новый кроссворд. Нажав же на стрелку справа выкатится подменю,
состоящее из двух элементов:

"Создать новый словарь"

"Создать новый кроссворд"
"Открыть..."
Служит для открытия словаря или кроссворда. Нажав непосредственно на иконку
открывается по умолчанию новый кроссворд. Нажав же на стрелку справа выкатится
подменю, состоящее из двух элементов:

"Открыть словарь"

"Открыть кроссворд"
"Сохранить"
Служит для сохранения словаря или кроссворда. При имени файла Untitled.* вызывается
"SaveAs..."
"Вид"
Существует 4 способа отображения кроссворда, а также некоторым из них соответствуют настройки по
ширине(x) пролета и высоте(o):

"Линейный"(-)(-)
Кроссворд отображается ввиде горизонтальной линии.

"Змейка"(x)(o)
Кроссворд отображается ввиде змейки.

"Спираль"(x)(o)
Кроссворд отображается ввиде спирали.

"Забор"(x)(-)
Кроссворд отображается ввиде зубчатой линии.
"Размеры"
"Автомат"
Служит для автоматического составления кроссворда. Перед нажатием необходимо
подключить хотя бы один не пустой словарь и настроить три параметра:
 Max - максимальное число букв в составляемом кроссворде.
 Остаток - число букв на которое может быть меньше максимальное число букв в кроссворде.
 Наложение - число букв с которым будут накладываться друг на друга слова в кроссворде.
"Разгадать автоматически"
Служит для автоматического разгадывания кроссворда. До нажатия необходимо подключить
хотя бы один не пустой словарь. После нажатия выплывает окно открытия файла.
Необходимо выбрать файл и нажать открыть.
"Разгадать в ручную"
34
Служит для ручного разгадывания кроссворда. После нажатия выплывает окно открытия
файла. Необходимо выбрать файл и нажать открыть.
"Остановить"
Служит для остановки процесса автоматического составления или разгадывания. В данной
версии не доступна!
"Выбор"
При окончании составления, дает возможность выбрать один из нескольких составленных
кроссвордов.
"Подтверждение выбора кроссворда"
После того как вы выбрали один из составленных кроссвордов, нажав на эту кнопку, вы
получите доступ ко всем функциям редактирования кроссворда.
"Разгадать слово"
После того как вы выбрали слово из кроссворда, нажав на эту кнопку, вы сможете ввести
отгаданное слово.
"Редактирование"
Это строка для ввода в главной рабочей панели (наверху). Позволяет редактировать
кроссворд.
"Словари"
"Вставить"
Позволяет вставить слово в словарь.
"Удалить"
Позволяет удалить слово из словаря.
"Редактировать"
Позволяет редактировать слово из словаря.
"Найти"
Позволяет найти слово из словаря.
"Подключение/отключение словарей"
Позволяет подключить или отключить словарь.
"Помощь"
"Помощь"
35
При нажатии показывает максимальную информацию о программе.
"Информация о программе"
При нажатии показывает минимальную информацию о программе.
"Редактирование определений"
Это строка для ввода в нижней части рабочего окна. Позволяет редактировать определения
слов в кроссворде.
"Закрыть"
"Закрыть"
Служит для закрытия словаря или кроссворда.
Формат файла словаря.
В самом начале определяем поле имени словаря, например:
@NAME Зоология
Затем определяем язык словаря. Язык может быть русским(RUS) или английским(ENG).
Например:
@LANG RUS
Затем идет непосредственно словарь.Первое слово "СЛОВО", второе
"ОПРЕДЕЛЕНИЕ".Одно слово должно располагаться на одной строке, ENTER - это уже
другое слово. Например:
Собака Домашнее животное
Муха Насекомое
Ягуар Хищное животное, семейства кошачих
В итоге имеем:
@NAME Зоология
@LANG RUS
СОБАКА Домашнее животное
МУХА Насекомое
ЯГУАР Хищное животное, семейства кошачих
Формат файла кроссворда.
Сначала определяем язык кроссворда. Язык может быть русским(RUS) или
английским(ENG). Например:
@LANG RUS
Затем определяем наложение используемое в кроссорде. Допустимые значения - 1, 2, 3
буквы. Например:
1
36
Затем идет непосредственно словарь.Первое слово "СЛОВО", второе
"ОПРЕДЕЛЕНИЕ".Одно слово должно располагаться на одной строке, ENTER - это уже
другое слово. Причем слова располагаются в обратном порядке. Слова записываются
полностью, без обрезания. Необходимо контролировать, чтобы наложения были
правильными, иначе программа выдаст вам ошибку.Например, для кроссворда с наложением
1,
ТРАКТА Т ОПО Р УКА
имеем:
РУКА Часть тела человека.
ТОПОР Инструмент плотника.
ТРАКТАТ Форма изложения мысли или описание чего-то.
В итоге имеем:
@LANG RUS
1
РУКА Часть тела человека.
ТОПОР Инструмент плотника.
ТРАКТАТ Форма изложения мысли или описание чего-то.
Формат файла кроссворда для разгадывания.
Сначала определяем язык кроссворда. Язык может быть русским(RUS) или
английским(ENG). Например:
@LANG RUS
Затем определяем наложение используемое в кроссорде. Допустимые значения - 1, 2, 3
буквы. Например:
1
Затем идут длины слов.Причем слова располагаются в прямом порядке. Например для
кроссворда
ТОПО Р ОКО Т РАКТА Т РАНЗИСТОР
имеем:
5
5
7
10
В итоге имеем:
@LANG RUS
1
37
5
5
7
10
Ошибки.
1. Поле "Слово" не может быть пустым.
Возникает, когда при в вставке слова в словарь поле "Слово" пустое или содержит одни
пробелы.
2. Поле "Определение" не может быть пустым.
Возникает, когда при в вставке слова в словарь поле "Определение" пустое или содержит
одни пробелы.
3. Такое слово уже есть в словаре.
Возникает, когда при в вставке слова в словарь, такое слово в словаре уже есть.
4. Такого слова в словаре нет.
Возникает, когда при поиске слова в словаре такое слово не найдено.
5. Неверный формат файла. Не указано имя словаря.
Возникает, когда в файле словаря поле "@NAME" пропущено.
6. Кроссворд невозможно корректно отобразить.
Возникает, когда по заданным параметрам отображения кроссворда, его невозможно
корректно отобразить. Совет: попробуте, например, увеличить поле "ширина кроссворда".
Ну, а если лень, то выбирите тип отображения "Змейка" или "Забор".
7. В файле не определено ни одного слова.
Возникает, когда в файле кроссворда не определено ни одного слова.
8. Поле "Слово" не может содержать разделители, а также буквы должны
соответствовать выбранному языку.
Возникает при вводе поля "Слово" в словаре. Видимо вы вставили в него какой-нибудь
раздилитель или ввели буквы не соответствующие языку словаря.
9. Ни один кроссворд не составлен.
Возникает при автоматическом составлении словарей. Совет: увеличьте количество
подключенных словарей или количество слов в подключенных. Также можно уменьшить
поле "Наложение".
10. Неверный формат файла. Не указан язык словаря.
Возникает, когда в файле словаря не указано или указано не верно поле "@LANG".
11. Необходимо ввести имя словаря.
Возникает при создании файла словаря. Совет: набейте имя словаря в поле "Имя словаря".
38
12. Необходимо ввести имя словаря.
Неверный формат файла. Строка номер: N. Возникает при анализе файла словаря. Возможна
при совпадении слов, не соответствии слова языку словаря и т.д. Совет: гляньте в файле
слово N из внешнего текстового редактора (NotePad, WordPad) и исправьте ошибку.
13. Подключите хотя бы один словарь.
Возникает, когда в списке подключенных словарей, ни один словарь не подключен.
14. Подключеные словари не имеют ни одного слова.
Возникает, когда в списке подключенных словарей, ни один словарь не содержит хотя бы
одного слова.
15. В файле не определен язык!
Возникает, когда в файле кроссворда не определено поле "@LANG".
16. Неверный формат наложения(1..3)!
Возникает, когда в файле кроссворда наложение определено неверно. Оно должно быть
принимать одно из трёх значений - 1,2,3.
17. Файл пустой!
Возникает, когда файл совершенно пустой.
18. Неверный формат записи слова!
Возникает, когда в файле поле слова записано в неверном формате.
19. Язык в файле не совпадает с языком выбранных словарей!
Возникает, когда файл, который нужно отгадать имеет язык не совпадающий с языком
выбранных словарей.
39
Приложение B. Текст программы (Основные модули)
Текст программы на дискете (дискета прилагается).
Download