МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

«ТЮМЕНСКИЙ ГОСУДАРСТВЕННЫЙ НЕФТЕГАЗОВЫЙ УНИВЕРСИТЕТ»

КАФЕДРА ИНФОРМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ
















КУРСОВАЯ РАБОТА

по дисциплине «Алгоритмические языки и программирование»

Тема:

Программа составления кроссвордов






Выполнил

студент группы

АСОИУс-1

Васечкин Иван

Проверила

Лозикова И.О.














Тюмень 2003

СОДЕРЖАНИЕ


Разработка эскизного и технического проектов программы.. 3

Введение. 3

Назначение и область применения. 4

Технические характеристики. 4

Постановка задачи: 4

Описание алгоритма. 5

Организация входных и выходных данных. 7

Выбор состава технических и программных средств. 7

Источники, использованные при разработке. 8

Разработка программы.. 8

Спецификация программы.. 10

Текст программы.. 11

Описание программы.. 20

Общие сведения. 20

Описание логической структуры.. 20

Используемые технические средства. 22

Вызов и загрузка. 23

Входные и выходные данные. 23

Тестирование программы.. 24

Заключение. 26

Литература. 27


Разработка эскизного и технического проектов программы



Введение


Задание на курсовую работу по дисциплине «Алгоритмические языки и программирование».

Студент группы АСОИУс-1 Васечкин И.И.

Специальность: «Автоматизированные системы обработки информации и управления».

Тема: Разработка программы составления кроссвордов.

Условие задачи:

Исходными данными является конфигурация 6 на 6 (некоторое расположение пустых и заполненных квадратов) и список слов, состоящих из шести или менее букв. Результатом должно быть расположение этих слов, образующее общепринятый кроссворд, или сообщение о том, что такая конфигурация невозможна.

Курсовая работа выполняется на языке С++ в среде программирования Builder 5, 6. 

.


Задание выдано:________________________/Число и подпись/


Назначение и область применения


Целью данной курсовой работы является изучение построения алгоритмов на языке С++ и создание приложения, реализующего алгоритм составления кроссвордов.

Данное приложение может быть использовано для составления кроссвордов с заданной сеткой размеров 6 на 6 квадратов.



Технические характеристики.



Постановка задачи:


Программа «Кроссворд» выполняется в среде разработки Borland C++ Builder 6.0 Enterprise Edition. Программа «Кроссворд» является Windows-приложением.

Интерфейс приложения должен предоставлять возможности для выполнения следующих действий:

 - редактирование и составление списка слов для подстановки в кроссворд;

 - составление кроссворда по имеющемуся списку слов и по умолчанию заданной сеткой;

 - вывод сообщения об успешном выполнении алгоритма составления кроссворда;

 - вывод на экран получившегося кроссворда.

Программный код должен удовлетворять требованиям объектно-ориентированного программирования по сокрытию данных и объектному представлению программных сущностей.

Описание алгоритма


Так что же такое кроссворд? Из словаря иностранных слов легко узнать, что это «род задачи - головоломки по разгадыванию слов; представляет собой фигуру, разбитую на квадраты, которые нужно заполнить буквами, чтобы по горизонтали и вертикали получился ряд разгаданных слов». Из этого же словаря можно узнать, что кроссворд — слово английского происхождения, образованное из cross-word, где cross — крест + word — слово, что можно перевести как «пересекающиеся слова» или «крестословица». В некоторых словарях понятие «кроссворд» толкуется другими словами, но смысл толкования остается неизменным — разгадывание, узнавание «спрятанных» — и порой весьма искусно — слов в вопросах о них, зачастую в хитроумной и необычной форме, например, в виде образов, «картинок», символов (в популярных кроссвордах с фрагментами).

Составные части кроссворда:

1. Фигура кроссворда, чаще называемая в обиходе сеткой, а в редакциях печатных изданий рисунком кроссворда.

2. Координаты слов в сетке кроссворда. Необходимый минимум – координаты по горизонтали и вертикали.

4. Условия кроссворда состоят из номеров позиций кроссворда с их толкованием или, как говорят кроссвордисты, определением - соответственно по горизонталям и вертикалям, а при нетрадиционной фигуре кроссворда — но дугам, окружностям, диагоналям.

5. Ответы на кроссворд. Как правило, они публикуются отдельно, вместе с публикацией следующего кроссворда.

Что же дано в кроссворде?

1. Количество загаданных слов

2. Количество букв в каждом из них.

3. Общие буквы на пересечениях.

5. Определения слов, на которые следует найти ответы.

В данной работе моделируется прямоугольный симметричный кроссворд.

Как известно, для построения кроссворда, необходимо выполнить следующие этапы работ:

1. Составить рисунок (фигуру, сетку) кроссворда.

2. Заполнить фигуру кроссворда словами.

3. Составить условия кроссворда.

4. Оформить работу для печати.

Разрабатываемая программа должна автоматизировать второй этап составления кроссворда по программно заданной сетке.


Описание алгоритма построения кроссворда


1. Перед началом запуска алгоритма должны быть выполнены следующие условия:

          - задана сетка, с указанием расположения слов и пересечений между ними;

          - получен список слов, которые можно использовать при составлении кроссворда;

          - задано количество слов и количество пересечений между ними.

2. Алгоритм является рекурсивным и возвращает булевскую переменную, обозначающую успех выполнения алгоритма. Инициализируется номером первого обрабатываемого слова.

3. До тех пор пока сетка не заполнена, по всем словам в списке, которые по длине совпадают с текущим словом, если слово можно подставить в данное место текущего слова на сетке, то оно устанавливается и удаляется из общего списка слов. Алгоритм вызывает сам себя для обработки следующего слова, пока не заполнит все слова. Если это удалось, происходит выход из алгоритма с признаком успешности составления, если нет – с признаком неуспешности.

4. После получения результата, в зависимости от полученного признака – выводится соответствующее сообщение и заполняется словами сетка кроссворда, если он составлен успешно.


Организация входных и выходных данных


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

Входными данными алгоритма являются список слов и заданная сетка кроссворда. Сетка кроссворда реализована как класс и задается специальными инициализирующими функциями.

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


Выбор состава технических и программных средств


Программа создавалась при помощи среды разработки Borland C++ Builder 6.0, что было обусловлено заданием.

Требования к рабочей станции типа PC:

 - операционная система Microsoft Windows 2000 и выше;

- процессор 300 Мгц и выше;

 - ОЗУ 32 Мб и выше;

 - комплектация: монитор, манипулятор «мышь», клавиатура.



Источники, использованные при разработке


В данной работе использовалась стандартная библиотека STL, входящая в состав стандарта ANSI на язык С++, файлы справочной системы данной библиотеки, Интернет-сайты по теории кроссвордов, средства визуального проектирования Borland C++ Builder.

 

Разработка программы


Интерфейс программы должен иметь следующие компоненты:

 - кнопка для запуска алгоритма составления кроссворда;

 - кнопка для очистки сетки кроссворда;

 - текстовое поле для добавления слов в список;

 - кнопка для добавления слов в список;

 - список слов в списке с возможностью редактирования;

 - поле сетки кроссворда 6 на 6;

 - поясняющие надписи для обозначения функционального назначения элементов интерфейса;

Windows-окно приложения приведено на рисунке 1.

Рисунок 1. Интерфейс программы «Кроссворд».

Техническая спецификация на используемые компоненты:

1.                             Компонент Кнопка TButton. Запускает алгоритм составления кроссворда. Событие – Click(). Изменены свойства:

a.     Name=”btnMakeCross”

2.                             Компонент Кнопка TButton. Очищает сетку кроссворда. Событие – Click(). Изменены свойства:

a.     Name=”btnClearCross”

3.                             Компонент Кнопка TButton. Добавляет слово в список, отображает его в списке. Событие – Click(). Изменены свойства:

a.     Name=”btnAddNewWord”

4.                             Компонент Текстовое Поле TEdit. Поле для ввода слов в списки. Изменены свойства:

a.     Name=”eNewWord”

5.                             Компоненты Надпись TLabel. Поясняющие надписи – в свойстве Captioin.

6.                             Компонент Строковая сетка TStringGrid. Отображение списка слов. Изменены Name=”sgList”, GoEditing=true, ColCount=1.

7.                             Компонент Строковая сетка TStringGrid. Отображение сетки кроссворда. Изменены Name=”sgCross”, ColCount=6, RowCount=6.

8.                             Компонент Индикатор выполнения TProgressBar. Отображает процесс составления кроссворда. Изменены Name=pbMaking.



Спецификация программы


Ниже приводится точное название программы и ее состав.

Обозначение

Наименование

Примечание

CrossMaking.bpr

Файл проекта

Связывает все файлы приложения

MainUnit.cpp

Файл главного модуля проекта

Реализованы все события кнопок, вызов алгоритма

My.h

Заголовочный файл реализации классов и объявления констант

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


Текст программы

Код программы полностью откомментирован.

Файл MainUnit.cpp

//---------------------------------------------------------------------------


#include <vcl.h>

#pragma hdrstop


#include "MainUnit.h"

#include "my.h"

#include <list>

using namespace std;

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TFrmMain *FrmMain;

CrossNet MyNet;

TStringList *wordlist = new TStringList();

//---------------------------------------------------------------------------

__fastcall TFrmMain::TFrmMain(TComponent* Owner)

        : TForm(Owner)

{

}

//собственно алгоритм

bool MakingCross(int wnum)

{

bool made=false;

//если сетка не заполнена

if (MyNet.IsNetComplete()==false)

        {

        if (wnum<WordCount)

        {

        //по всем словам в списке

        for(int i=0;

        i<wordlist->Count;i++)

                {

                //замедление выполнения программы

                for (int y=0;y<100000000;y++)

                        {

                        int l=0;

                        }

                FrmMain->pbMaking->StepIt();

                //которые по длине совпадают с заданным словом

                if (wordlist->Strings[i].Length()==MyNet.GetWordLen(wnum)+1)

                        {

                        //если слово из списка можно подставить в данное место на сетке

                        if (MyNet.CheckWord(wnum,wordlist->Strings[i]))

                                {

                                //устанавливаем данное слово

                                MyNet.SetWord(wnum,wordlist->Strings[i]);

                                //удаляем слово из списка

                                wordlist->Delete(i);

                               made=true;

                                MakingCross(wnum+1);

                                if (MyNet.IsNetComplete()) return true;

                                }

                        }

                }

        }

        else return false;

        }

else return made;

}


//---------------------------------------------------------------------------

void __fastcall TFrmMain::FormCreate(TObject *Sender)

{

for (int i=0;i<DefWordCount;i++)

        {

        sgList->Cells[0][i]=defwords[i];

        }

//Задание описания сетки

MyNet.InitWord(0,0,0,0,5);

MyNet.InitWord(1,0,0,4,0);

MyNet.InitWord(2,5,0,5,5);

MyNet.InitWord(3,1,5,5,5);


MyNet.InitWord(4,3,0,3,3);

MyNet.InitWord(5,0,2,3,2);

MyNet.InitWord(6,2,2,2,5);

MyNet.InitWord(7,2,3,5,3);


MyNet.InitCross(0,0,0);

MyNet.InitCross(1,0,2);

MyNet.InitCross(2,2,2);

MyNet.InitCross(3,2,3);

MyNet.InitCross(4,2,5);


MyNet.InitCross(5,3,0);

MyNet.InitCross(6,3,2);

MyNet.InitCross(7,3,3);

MyNet.InitCross(8,5,3);

MyNet.InitCross(9,5,5);

}

//---------------------------------------------------------------------------

void __fastcall TFrmMain::btnAddNewWordClick(TObject *Sender)

{

if (eNewWord->Text!="" && eNewWord->Text.Length()<=6 && eNewWord->Text.Length()>=3)

        {

        sgList->RowCount=sgList->RowCount+1;

        sgList->Cells[0][sgList->RowCount-1]=eNewWord->Text;

        eNewWord->Text="";

        }

else ShowMessage("Введите слово, которое можно добавить в список!");

}


void __fastcall TFrmMain::btnClearCrossClick(TObject *Sender)

{

//Очистка сетки кроссворда

for (int i=0;i<CrossSize;i++)

        {

        for (int j=0;j<CrossSize;j++)

                {

                sgCross->Cells[i][j]="";

                }

        }

MyNet.Clear();

}

//---------------------------------------------------------------------------

void __fastcall TFrmMain::btnMakeCrossClick(TObject *Sender)

{

//составление списка слов

wordlist->Clear();

for (int i=0;i<sgList->RowCount;i++)

        {

        wordlist->Add(sgList->Cells[0][i]);

        }

//Заполнение кроссворда

MakingCross(0);

if (MyNet.IsNetComplete())

        {

        //Отображение кроссворда

        for (int i=0;i<sgCross->ColCount;i++)

                {

                for (int j=0;j<sgCross->RowCount;j++)

                        {

                        sgCross->Cells[i][j]=MyNet.GetCharFromWord(i,j);

                        }

                }

        ShowMessage("Кроссворд построен!");

        }

else ShowMessage("Из данного списка слов не удалось построить кроссворд!");

}

//---------------------------------------------------------------------------

Файл My.h

//Общие переменные


const int DefWordCount=10;

const int CrossSize=6;

const int WordCount=8;

const int CrossCount=10;


AnsiString defwords[DefWordCount]={"матрос","мутон","орава","труд","орда","пани","упор","певица","ладонь","мрак"};


//структура координаты

struct Coord

{

int VerCoor;

int HorCoor;

};


//описание структуры слова кроссворда

class CrWord

{

private:

//координаты начала слова

Coord WBegin;

//координаты конца слова

Coord WEnd;

//собственно слово

AnsiString strword;

public:

void InitWord(int wbegvert, int wbeghor, int wendvert, int wendhor)

        {

        WBegin.VerCoor=wbegvert;

        WBegin.HorCoor=wbeghor;

        WEnd.VerCoor=wendvert;

        WEnd.HorCoor=wendhor;

        strword="";

        }

void SetWord(AnsiString s)

        {

        int len=((WEnd.VerCoor-WBegin.VerCoor)+(WEnd.HorCoor-WBegin.HorCoor));

        if (len==s.Length()-1) strword=s;

        else ShowMessage("Не совпала длина слов при вставке!");

        }

void UnsetWord()

        {

        strword="";

        }

AnsiString GetWord()

        {

        return strword;

        }

int GetLength()

        {

        return (WEnd.VerCoor-WBegin.VerCoor)+(WEnd.HorCoor-WBegin.HorCoor);

        }

int GetBV() {return WBegin.VerCoor;}

int GetBH() {return WBegin.HorCoor;}

int GetEV() {return WEnd.VerCoor;}

int GetEH() {return WEnd.HorCoor;}

};


//сетка пересечений

class CrossNet

{

private:

Coord Crosses[CrossCount];

CrWord Words[WordCount];

public:

AnsiString GetWord(int num)

        {

        return Words[num].GetWord();

        }

//есть ли у этого слова это пересечение

bool IsCrossing(int numword, int numcross)

        {

        bool exi=false;

        if (Words[numword].GetBV()<=Crosses[numcross].VerCoor && Words[numword].GetBH()<=Crosses[numcross].HorCoor && Words[numword].GetEV()>=Crosses[numcross].VerCoor && Words[numword].GetEH()>=Crosses[numcross].HorCoor) exi=true;

        return exi;

        }

//получить номер слова, которое участвует в том же пересечении

int GetCrossingWord(int num, int numcross)

        {

        int exi=-1;

        for (int i=0;i<WordCount;i++)

                {

                if (IsCrossing(i,numcross) && i!=num) exi=i;

                }

        if (exi==-1) ShowMessage("Странно, у нас слово с самим собой пересекается и только!");

        return exi;

        }

//получить букву слова в данном пересечении

char GetLetterCross(int num, int numcross)

        {

        char exi=' ';

        AnsiString str=Words[num].GetWord();

        bool vert=false;

        if (Words[num].GetBV()!=Words[num].GetEV()) vert=true;

        int pos=0;

        if (vert) pos=Crosses[numcross].VerCoor-Words[num].GetBV();

        else pos=Crosses[numcross].HorCoor-Words[num].GetBH();

        exi=str[pos+1];

        return exi;

        }

//Функция, проверяющая - можно ли вставить слово по его номеру в массиве

bool CheckWord(int num, AnsiString str)

        {

        bool exi=false;

        //проверка на то, что данное слово не заполнено

        if (Words[num].GetWord().Length()!=0) ShowMessage("Ошибка заполнения массива слов - слово уже задано!");

        else

                {

                //по всем пересечениям

                for (int i=0;i<CrossCount;i++)

                        {

                        //если у данного слова есть это пересечение

                        if (IsCrossing(num,i))

                                {

                                //проверить, заданы ли слова, которые с ним пересекаются

                                int crwnum=GetCrossingWord(num,i);

                                if (Words[crwnum].GetWord().Length()!=0)

                                        {

                                        //проверить по заданныи словам - что буквы в местах пересечения совпадают


                                               bool vert=false;

                                                if (Words[num].GetBV()!=Words[num].GetEV()) vert=true;

                                                int pos=0;

                                                if (vert) pos=Crosses[i].VerCoor-Words[num].GetBV();

                                                else pos=Crosses[i].HorCoor-Words[num].GetBH();

                                        if (str[pos+1]==GetLetterCross(crwnum,i)) exi=true;

                                        else return false;

                                        }

                                else exi=true;

                                }

                        }

                }

        return exi;

        }

//Заполнена ли сетка

bool IsNetComplete()

        {

        bool exi=false;

        int numcomplete=0;

        for (int i=0;i<WordCount;i++)

                {

                if (Words[i].GetWord().Length()>0) numcomplete++;

                }

        if (numcomplete==WordCount) exi=true;

        return exi;

        }

//Инициализировать слово

void InitWord(int num, int wbegvert, int wbeghor, int wendvert, int wendhor)

        {

        Words[num].InitWord(wbegvert, wbeghor, wendvert, wendhor);

        }

//Задать точку пересечения

void InitCross(int num, int ver, int hor)

        {

        Crosses[num].VerCoor=ver;

        Crosses[num].HorCoor=hor;

        }

//Получить вертикальную координату точки пересечения

int GetCrossVer(int num)

        {

        return Crosses[num].VerCoor;

        }

//Получить горизонтальную координату точки пересечения

int GetCrossHor(int num)

        {

        return Crosses[num].HorCoor;

        }

//Задать слово

void SetWord(int num, AnsiString str)

        {

        Words[num].SetWord(str);

        }

//ПОлучить длину слова

int GetWordLen(int num)

        {

        return Words[num].GetLength();

        }

//Очистить сетку

void Clear()

        {

        for (int i=0;i<WordCount;i++)

                {

                Words[i].UnsetWord();

                }

        }

//Получить букву по координатам

char GetCharFromWord(int ver, int hor)

        {

        char exi='-';

        for (int i=0;i<WordCount;i++)

                {

                if (Words[i].GetBV()<=ver && Words[i].GetEV()>=ver && Words[i].GetBH()<=hor && Words[i].GetEH()>=hor)

                        {

                        bool vert=false;

                        if (Words[i].GetBV()!=Words[i].GetEV()) vert=true;

                        if (vert)

                                {

                                exi=Words[i].GetWord()[ver-Words[i].GetBV()+1];

                                }

                        else

                                {

                                exi=Words[i].GetWord()[hor-Words[i].GetBH()+1];

                                }

                        }

                }

        return exi;

        }


};

Описание программы


Общие сведения

Программа «Кроссворд» была разработана в рамках курсовой работы. Основной целью являлось создание Windows-приложения, осуществляющего алгоритм построения кроссворда по заданной сетке и списку слов.

Для функционирования программы необходимо наличие двух библиотек производства Borland Interprise, которые реализуют функционирование используемых компонентов.

Список библиотек: cc3260mt.dll, borlndmm.dll. Библиотеки поставляются вместе с исполняемым файлом CrossMaking.exe. Программа не требует установки.

Программа разработана в среде Borland C++ Builder 6.0. Для функционирования программы необходима операционная система Windows версии 2000 и выше и наличие указанных библиотек. Библиотеки могут находиться как в папке с исполняемым файлом, так и в папке Windows.

Функциональное назначение: составление общепринятого прямоугольного кроссворда.

В рамках создания программы было реализовано несколько классов, которые эмулируют объекты предметной области.


Описание логической структуры


Программа построена по модульному принципу, который является стандартом для всех приложений, разрабатываемых в среде Borland С++ Builder 6.0.

Имеется интерфейс, построенный на одной главной форме, модуль, хранящий все процедуры и действия, реализуемые при помощи компонентов формы и заголовочный файл, который предоставляет интерфейс спроектированных классов.

При создании классов использовались возможности языка С++ по созданию объектно-ориентированных программ.

В таблице 1 приведена спецификация на используемые классы:

Имя класса

Назначение

Функции

Элементы

1

Coord

Координаты квадрата сетки

Нет, является структурой и хранит элементы

int VerCoor – вертикальная координата

int HorCoor – горизонтальная координата

2

CrWord

Структура слова кроссворда

InitWord – инициализация слова по координатам букв

Coord WBegin – координаты первой буквы слова

SetWord – установка слова (значения строкового)

Coord WEnd – координаты последней буквы слова

UnsetWord() – удаление значения слова

AnsiString strword - слово

GetWord() – получение значения слова

GetLength() – получить длину заданного слова

GetBV() – получить верт корд первой буквы

GetBH() – получить гор корд первой буквы

GetEH() – получить гор корд последней буквы

GetEV() – получить верт корд посл буквы

3

CrossNet

Сетка пересечений, является основным классом, предоставляющим интерфейс приложению

GetWord() – получения строки слова по номеру в массиве

Coord Crosses[CrossCount] – массив координат точек пересечений в сетке кроссворда. CrossCount=10 – общее количество пересечений в заданной сетке

IsCrossing(int numword, int numcross) – проверка, пересекает ли заданное слово заданную точку пересечения

GetCrossingWord(int num, int numcross) – получить номер слова, которое пересекается с заданным словом в заданной точке пересечения

GetLetterCross(int num, int numcross) – получить букву, которая находится в заданной  точке пересечения заданного слова

CheckWord(int num, AnsiString str) – проверка, можно ли данное слово-строку вставить под номером заданного слова

IsNetComplete() – заполнена ли сетка

CrWord Words[WordCount] – массив слов кроссворда. WordCount=8 – общее количество слов в кроссворде при такой сетке

InitWord() – инициализировать слово по номеру и координатам

InitCross() – инициализировать пересечение по номеру и координатам

GetCrossVer(int num) – получить вертикальную координату заданной точки пересечения

GetCrossHor(int num) – получить горизонтальную координату заданной точки пересечения

SetWord(int num, AnsiString str) – установить слово по номеру и строке

GetWordLen(int num) – получить длину слова по номеру

Clear() – очистить сетку от установленных слов

GetCharFromWord(int ver, int hor) – получить букву по координатам


Основной модуль MainUnit включает в себя заголовочный файл my.h при помощи директивы include, что позволяет использовать в нем созданные классы.

В общем пространстве видимости модуля объявлен экземпляр класса CrossNet.

При создании формы инициализируется сетка кроссворда

При нажатии на кнопки вызываются соответствующие процедуры.

Например, процедура void __fastcall TFrmMain:: btnMakeCrossClick(TObject *Sender) выполняет следующие действия:

 - составление списка слов;

 - заполнение кроссворда;

 -вывод сообщений об успешности выполнения алгоритма;

 - прорисовку кроссворда.



Используемые технические средства


Программа создавалась при помощи среды разработки Borland C++ Builder 6.0, что было обусловлено заданием.

Требования к рабочей станции типа PC:

 - операционная система Microsoft Windows 2000 и выше;

- процессор 300 Мгц и выше;

 - ОЗУ 32 Мб и выше;

 - комплектация: монитор, манипулятор «мышь», клавиатура.


Вызов и загрузка


Программа вызывается путем запуска файла CrossMaking.exe. При загрузкe программы загружается форма и инициализируются экземпляры классов. В папке, где находится исполняемый файл, должны присутствовать указанные выше библиотеки, если неизвестно, что они уже присутствуют в системе.


Входные и выходные данные

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

Входными данными алгоритма являются список слов и заданная сетка кроссворда – то есть экземпляр класса CrossNet с инициализированными элементами слов и координат через функции типа Init(). Сетка кроссворда реализована как класс и задается специальными инициализирующими функциями.

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

В таблице 2 отражены данные по словам сетки. Номера слов и координаты первой и последней буквы

Первая буква - Y

Первая буква - Х

Последняя буква - Y

Последняя буква - Х

0

0

0

0

5

1

0

0

4

0

2

5

0

5

5

3

1

5

5

5

4

3

0

3

3

5

0

2

3

2

6

2

2

2

5

7

2

3

5

3


В таблице 3 отражены данные по точкам пересечения сетки. Номера точек и их координаты.

Y

X

0

0

0

1

0

2

2

2

2

3

2

3

4

2

5

5

3

0

6

3

2

7

3

3

8

5

3

9

5

5



Тестирование программы


Для создания программы был использован Borland C++ Builder 6.0 Enterprise Edition - визуальная среда для быстрой разработки приложений на языке C++, промышленный выпуск.

Для проверки кода использовался CodeGuard – средство проверки стиля написания кода.

Для отладки приложения использовался встроенный отладчик, средства прерывания и окна просмотра текущих значений переменных во время исполнения программы, пошаговое исполнение и формирование текстовых файлов, отражающих ход исполнения алгоритма.

Ниже приведен пример текста такого файла:

MakingCross - 0

!         Complete 0 - 0

сетка не заполнена

цикл по словам, текущее значение - 0 - jhklhjlk

цикл по словам, текущее значение - 1 - мутон

цикл по словам, текущее значение - 2 - орава

цикл по словам, текущее значение - 3 - труд

цикл по словам, текущее значение - 4 - орда

цикл по словам, текущее значение - 5 - пани

цикл по словам, текущее значение - 6 - упор

цикл по словам, текущее значение - 7 - певица

совпадает по длине с словом в сетке номер 0

Checkword - num=0, слово=певица

проверка пересечения 0

показано, что слово 0 пересекается с точкой 0

GetCrossingWord - со словом 0  точке 0 итог - 1

пересекающееся слово -

проверка пересечения 1

показано, что слово 0 пересекается с точкой 1

GetCrossingWord - со словом 0  точке 1 итог - 5

пересекающееся слово -

проверка пересечения 2

проверка пересечения 3

проверка пересечения 4

проверка пересечения 5

проверка пересечения 6

проверка пересечения 7

проверка пересечения 8

проверка пересечения 9

его можно подставить под номером 0

SetWord - певица с длиной 5 - длина места на сетке - 5

MakingCross - 1

!         Complete 1 - 0

сетка не заполнена


Основным требованием при испытании программы было корректное исполнение ею своих функций.

В результате испытаний было показано, что созданный алгоритм корректно справляется с поставленной задачей.

Заключение


В результате выполнения данной курсовой работы была создана программа «Кроссворд», автоматизирующая составление кроссвордов.

В ходе выполнения данной работы была изучена среда программирования Borland C++ Builder 6.0, приемы объектно-ориентированного программирования, стандартная библиотека STL, организация рекурсивных функций.

Создан собственный класс описания сетки.

Алгоритм составления кроссворда был разработан в общем виде.

Чтобы на основе исходного кода создать программу для составления кроссворда любой конфигурации – необходимо только создать интерфейс для задания сетки кроссворда, который бы инициализировал экземпляр класса CrossNet, и задать константы – количество слов и пересечений в кроссворде.

Алгоритм и классы будут работать для любой прямоугольной сетки кроссворда.


Литература


1.     Архангельский А.Я. Программирование в С++Builder 6. – М.: «Издательство БИНОМ», 2003 г. – 1152 с.

2.     Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Приемы объектно-ориентированного проектирования. Паттерны проектирования. – СПб.: Питер, 2001 г. – 368 с.

3.     Б. Страуструп. Язык программирования С++, 3-е изд. / Пер. с англ. – СПб.: М.: «Невский диалект» - «Издательство БИНОМ», 1999 г., 991 с.

4.     Айра Пол, Объектно-ориентированное программирование на С++, 2-е изд. СПб.: М.: «Невский диалект» - «Издательство БИНОМ», 1999 г. – 462 с.

5.     Одинцов И.О. Профессиональное программирование. Системный подход. – СПб.: БХВ-Петербург, 2002. – 512 с.: ил.

6.     Александровский А.Д. Delphi 4. Шаг в будущее. – М.:ДМК, 1999 – 528 с.

7.     Бентли Дж. Жемчужины программирования. 2-е издание. - СПб.:Питер, 2002. - 272 с.

8.     Выдержки из Большой энциклопедии кроссвордиста. http://www.scan-studio.ru/enc.html