86281

Разработка приложения Windows, реализующего алгоритмы обработки данных

Курсовая

Информатика, кибернетика и программирование

Программа предназначена для выполнения алгоритмов над структурами данных, а именно: поиск цикла во взвешенном графе, среднее геометрическое весов ребер которого будет наименьшим; поиск наибольшего поддерева в дереве, у каждого элемента которого может быть произвольное число потомков...

Русский

2015-04-05

3.43 MB

11 чел.

Министерство образования и науки РФ

Федеральное бюджетное государственное образовательное учреждение высшего профессионального образования

"РЯЗАНСКИЙ ГОСУДАРСТВЕННЫЙ РАДИОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ"

Кафедра ЭВМ

К защите                 

Руководитель проекта      

________________________

дата, подпись                  

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

К КУРСОВОМУ ПРОЕКТУ

по дисциплине

«Структуры и алгоритмы компьютерной обработки данных»

по теме

«Разработка приложения Windows, реализующего алгоритмы обработки данных»

Выполнил: студент группы 8414

Цыбулько Д.М.     ______________________________

дата сдачи на проверку, подпись  

Руководитель: к.т.н. Засорин С.В.  _____________   ________________________

оценка                        дата защиты, подпись  

Рязань 2011


Оглавление

1 Введение 4

2 Техническое задание 5

2.1 Основания для разработки программы 5

2.2 Назначение разработки 6

2.3 Требования к программе 6

2.4 Требования к надежности 6

2.5 Требования к программной документации 6

2.6 Текст задания на разработку по варианту 7

3 Описание разработанной программы 8

3.1 Функциональное назначение 8

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

3.2.1 Разработка справочной системы 29

3.2.2 Разработка пакета установки 32

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

3.4 Входные данные 34

3.5 Выходные данные 34

4 Программа и методика испытаний 35

4.1 Объект испытаний 35

4.2 Цель испытаний 35

4.3 Требования к программе 35

4.4 Требования к программной документации 35

4.5 Средства и порядок испытаний 36

5 Эксплуатационные документы 41

5.1 Руководство программиста 41

5.1.1 Общие сведения о программе 41

5.1.2 Структура программы 41

5.1.3 Настройка программы 41

5.1.4 Проверка программы 41

5.1.5 Дополнительные возможности программы 42

5.1.6 Сообщения системный программисту 42

5.2 Руководство оператора (пользователя) 45

5.2.1 Назначение и условие применения программы 45

5.2.2 Условие выполнения программы 45

5.2.3 Выполнение программы 46

5.2.4 Сообщения оператору 52

6 Приложение 55

6.1 Исходный текст модуля Form1.cs 55

6.2 Исходный текст модуля InputGraph.cs 63

6.3 Исходный текст модуля InputPerson 65

6.4 Исходный текст модуля SearchForm 66

6.5 Исходный текст модуля WeightForm.cs 67

7 Список использованной литературы 69


Введение

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

Алгоритм – это последовательность математических, логических или вместе взятых операций, отличающихся детерменированностью, массовостью, направленностью и приводящая к решению всех задач данного класса за конечное число шагов.

Структуры данных и алгоритмы служат теми материалами, из которых строятся программы. Сам компьютер состоит из структур данных и алгоритмов. Встроенные структуры данных представлены теми регистрами и словами памяти, где хранятся двоичные величины. Заложенные в конструкцию аппаратуры алгоритмы - это воплощенные в электронных логических цепях жесткие правила, по которым занесенные в память данные интерпретируются как команды, подлежащие исполнению. Поэтому в основе работы всякого компьютера лежит умение оперировать только с одним видом данных - с отдельными битами,  или двоичными цифрами. Работает же с этими данными компьютер только в соответствии с неизменным набором алгоритмов, которые определяются системой команд центрального процессора.

Техническое задание

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

Разработка ведётся на основании:

1) «задания к курсовому проекту», утверждённому Рязанским радиотехническим университетом по теме «Разработка приложения Windows, реализующего алгоритмы обработки данных».

2) ГОСТ 19.201-78. ЕСПД. Техническое задание. Требования к содержанию и оформлению.

3) ГОСТ 19.301-79. ЕСПД. Программа и методика испытаний. Требования к содержанию и оформлению.

4) ГОСТ 19.402-78. ЕСПД. Описание программы

5) ГОСТ 19.504-79. ЕСПД. Руководство программиста. Требования к содержанию и оформлению.

6) ГОСТ 19.505-79. ЕСПД. Руководство оператора. Требования к содержанию и оформлению.


Назначение разработки

Программа предназначена для выполнения алгоритмов над структурами данных, а именно: поиск цикла во взвешенном графе, среднее геометрическое весов ребер которого будет наименьшим; поиск наибольшего поддерева в дереве, у каждого элемента которого может быть произвольное число потомков; вставка и поиск в хеш-таблице задаваемого элемента.

Требования к программе

Приложение должно выполнять следующие функции:

  1. Создание и отображение взвешенного графа
  2. Поиск и отображение цикла во взвешенном графе, среднее геометрическое весов ребер которого будет наименьшим
  3. Создание и отображение дерева, у каждого элемента которого может быть произвольное число потомков
  4. Поиск наибольшего поддерева
  5. Вставку и поиск в Хеш-таблице задаваемого элемента

Требования к надежности

Программа должна гарантировать полное покрытие проверки эффективных и функциональных требований, предъявляемых к данному программному продукту в настоящем разделе.

Требования к программной документации

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

  1.  Техническое задание.
  2.  Пояснительная записка к курсовому проекту.
  3.  Руководство программиста.
  4.  Руководство оператора.

Раздел «Руководство программиста» должен быть оформлен в соответствии с ГОСТом 19.504-79,  «Руководство оператора» – ГОСТ 19.505-79.

Текст задания на разработку по варианту

Задан ориентированный граф с N вершинами, каждому ребру которого приписан неотрицательный вес. Написать программу поиска простого цикла, для которого среднее геометрическое весов его ребер было бы минимально.

Реализовать построение дерева с произвольным числом потомков каждого узла. Разработать процедуру отображения поддерева с наибольшим числом узлов.

Разработать приложение, которое использует хеш-таблицу для организации прямого доступа к элементам массива данных. Разработать процедуру вставки задаваемого элемента. Для предотвращения коллизий использовать метод квадратичного апробирования. При выполнении задания рекомендуется использовать исходный массив, содержащий сведения, аналогичные списку физических лиц, например: порядковый номер, фамилия, имя, отчество, адрес.


Описание разработанной программы

Функциональное назначение

Функционально программа решает три задачи:

  1. Задача на графах: поиск и отображение цикла во взвешенном графе, среднее геометрическое весов ребер которого будет наименьшим.
  2. Задача на деревьях: поиск наибольшего поддерева, в дереве, у каждого элемента которого может быть произвольное число потомков
  3. Задача с использованием хеш-таблиц: поиск и вставка задаваемого элемента

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

Программа работает на основе событийного управления.

Для выбора, с какой из функций программы будет работать пользователь, на главной форме располагается компонент TabControl. Этот компонент позволяет удобно сгруппировать другие компоненты, которые будут размещены на форме, по содержанию, что позволяет пользователю эффективно взаимодействовать с приложением. Основой компонента TabControl являются страницы (закладки), которые должны содержать компоненты, необходимые для выполнения определённой функции программы. Разместим три закладки: «Задача на графах», «Задача на деревьях», «Хеш-таблица», которые будут использоваться для доступа к основным функциям программы.

На закладке «Задача на графах» размещаются элементы для отображения графа – компонент gViewer, а так же две кнопки – «Задать граф» и «Найти цикл». Компонент gViewer входит в состав библиотеки Microsoft GLEE и позволяет визуализировать граф. Для удобства использования в данном компоненте предусмотрены кнопки изменения масштаба, перемещения, а так же вывод изображения на печать. Кнопка «Задать граф» вызывает новое диалоговое окно, в котором выполняется процесс создания графа. В данном окне размещаются следующие элементы: numericUpDown (позволяет задать количество вершин графа), checkbox (позволяет задать ребро графа), gViewer (предварительный просмотр графа), кнопка «Создать» (завершение процесса создания графа). Компоненты checkbox создаются автоматически при изменении количества вершин графа. При изменении свойства checked в компоненте checkbox  с положения false на true вызывается новая диалоговая форма, которая состоит из компонентов:  numericUpDown (позволяет задать вес ребра) и кнопки «Применить» (применяет заданный вес). Кнопка «Найти цикл» запускает алгоритм поиска цикла, среднее геометрическое весов ребер которого будет наименьшим. В случае если поиск оказался успешным, программа выведет на экран диалоговое сообщение, содержащее вершины цикла и среднее геометрическое весов ребер цикла. Также программа подсветит данный цикл в компоненте gViewer. В случае неудачного поиска программа выведет на экран соответствующее диалоговое сообщение.

gViewer

Button

Рисунок 3.2.1 Вкладка "Задача на графах"

gViewer

Button

NumericUpDown

CheckBoxes

Рисунок 3.2.2 Диалог создания графа

Button

NumericUpDown

Рисунок 3.2.3 Создание веса ребра

На закладке «Задача на деревьях» размещаются следующие компоненты: TreeView (отображение дерева) и кнопка «Создать корневой элемент» (создает корневой элемент дерева). Для выполнения операций над деревом используется компонент ContextMenu (контекстное меню). Данное меню вызывается кликом правой кнопкой мыши по элементу дерева. Контекстное меню состоит из пунктов: «Добавить» (добавляет потомок выделенному элементу), «Удалить» (удаляет элемент дерева, включая потомки), «Наибольшее поддерево» (выполняет поиск наибольшего поддерева и выделяет его элементы красным цветом)

ContextMenu

Button

TreeView

Рисунок 3.2.4 Вкладка "Задача на деревьях"

На закладке «Хеш-таблица» размещаются следующие компоненты: listview, а так же кнопки «Добавить» и «Поиск». Кнопка «Добавить» вызывает диалоговую форму, с помощью которой данные вводятся в программу. Диалоговая форма состоит из следующих компонентов: numericUpDown (ввод порядкового номера), textbox (ввод строковых значение), кнопка «Добавить» (добавление данных в программу). Кнопка «поиск» вызывает диалоговую форму, с помощью которой задается ключ поиска данных в программе. Данная форма состоит из следующих компонентов: combobox (задает критерий поиска), textbox (задает ключ поиска), кнопка «Поиск» (запускает процесс поиска). В случае успешно завершения поиска, его результаты выводятся в компоненте listview, в противном случае пользователю выводится соответствующее сообщение.

Button

listview

Рисунок 3.2.5 Вкладка "Хеш-Таблица"

textbox

Button

NumericUpDown

Рисунок 3.2.6 Добавление данных

numericUpDown

Combobox

Button

Рисунок 3.2.7 Поиск данных

После запуска приложения пользователь попадает на главную форму. Для того, чтобы обеспечить доступ ко всем задачам в программе,  используется компонент TabControl, у которого есть три закладки: GraphPage, TreePage и hashTablePage, которые отвечают за выполнения задания на графе, дереве и Хеш-таблице. Для выбора задачи пользователь кликает по нужной закладке. Обработка события обеспечивается компонентом TabControl автоматически.

  1. Основные события вкладки «Задача на графах»:
  2. Нажатие кнопки «Задать граф».

Данная кнопка запускает процесс создания графа. После её нажатия появится диалоговая форма «Создание графа». Если пользователь в данной форме подтвердил создание, то форма вернет значение, что граф создан и выполнится отрисовка вершин и ребер графа. В противном случае произойдет выход из обработчика. Блок-схема алгоритма приведена на рисунке 3.2.8.

Рисунок 3.2.8 Событие "Нажатие на кнопку задания графа"

  1. Нажатие кнопки «Найти цикл»

Данная кнопка запускает процесс поиска цикла, среднее геометрическое весов ребер которого будет наименьшим. Сначала программа проверит, задан ли граф. Если нет – то выведется соответствующее сообщение. Если да, то запуститься процедура поиска всех возможных циклов в графе. Если циклы в графе отсутствуют, то будет выведено соответствующее сообщение. Если же циклы найдены, то для них выполнится расчет среднего геометрического весов ребер. Затем будет произведен поиск наименьшего из них. Далее на экране появится сообщение с вершинами данного цикла и его средним геометрическим. После этого  на главной форме он выделится красным цветом. Блок-схема представлена на рисунке  3.2.9.

Рисунок 3.2.9 Событие "Нажатие на кнопку поиска цикла"

Для поиска всех циклов в графе используется отдельная функция, которая возвращает список циклов. Сначала очищаются список циклов и индексы посещения вершин. Затем для каждой вершины, если она не посещена, вызывается процедура поиска. Функция возвращает список циклов. Каждый цикл представлен списком вершин. Блок-схема представлена на рисунке 3.2.10.

Рисунок 3.2.10 Функция поиска циклов в графе

Функция поиска циклов вызывает процедуру поиска. Данная функция формирует списки вершин, которые составляет цикл. Основой для данной функции служит поиск в глубину. Сначала текущая вершина помечается как посещенная. Затем проверяется условие: если текущая вершина совпадает с первой и список вершин не пуст, то данный список добавляется к списку циклов и происходит выход из функции. Если текущая вершина не совпадает с первой, то проверяется условие: если текущая вершина уже содержится в списке, то из списка удаляется последовательность, начиная с первого элемента и заканчивая текущим, затем сам список добавляется к списку циклов и происходит выход из функции. Если же текущая вершина не содержится в списке, то для каждой смежной с текущей вершиной выполняется следующие действия:

  1. Создать пустой список
  2. Добавить в список текущую вершину
  3. Выполнить рекурсивный вызов процедуры поиска, передав в функцию следующие параметры: первую вершину, смежную вершину, созданный список, граф.

Блок схема представлена на рисунке 3.2.11.

Рисунок 3.2.11 Функция поиска

Для создания графа используется вспомогательная форма «Диалог ввода графа». Для него написаны следующие обработчики события:

  1. Изменение значения компонента NumericUpDown.

При возникновении данного события происходит обновление числа элементов матрицы компонентов checkbox. Блок-схема представлена на рисунке 3.2.12.

Рисунок 3.2.12 Событие "Изменение значения компонента NumericUpDown"

  1. Изменение значения checked компонента checkbox.

При возникновении данного события выполнятся инициализация веса ребра. Сначала выполняется проверка Checked == true. Если да, происходит вызов диалоговой формы для ввода веса. Затем проверяется, подтвердил ли пользователь данные: если да, то значения веса берется из формы, если нет, то значение инициализируется нулем. Если же Checked == false, то вес обнуляется. Затем выполняется отрисовка графа и выход из обработчика. Блок-схема представлена на рисунке 3.2.13

Рисунок 3.2.13 Событие «Изменение свойства checked компонента CheckBox»

  1. Нажатие на кнопку «Создать».

При нажатии на данную кнопку выполняется процесс создания объекта класса граф в соответствии с введенными данными. Блок-схема представлена на рисунке 3.2.14.

Рисунок 3.2.14 Событие "Нажатие на кнопку  «Создать»

Ввод веса выполняется с помощью специального диалога. В нем используется обработчик события нажатия на кнопку «Применить». Блок-схема данного обработчика представлена на рисунке 3.2.15.

Рисунок 3.2.15 Событие «нажатие на кнопку применить»

  1. Основные события вкладки «Задача на деревьях»
  2. Нажатие на кнопку «Создать корневой элемент

При нажатии на данную кнопку происходит процесс создания корневого элемента. Блок схема представлена на рисунке 3.2.16.

Рисунок 3.2.16

  1. Выбор пункта «Добавить» в контекстном меню

При выборе данного пункта меню к потомкам выделенного узла добавляется новый элемент. Блок схема представлена на рисунке 3.2.17

Рисунок 3.2.17 Событие «Выбор пункта добавить в контекстном меню»

  1. Выбор пункта «Удалить» в контекстном меню

При выборе данного пункта происходит удаление выделенного узла, а так же его потомков. Блок-схема представлена на рисунке 3.2.18

Рисунок 3.2.18 Событие «Выбор пункта удалить в контекстном меню.

  1. Выбор пункта «Наибольшее поддерево» в контекстном меню.

При выборе данного пункта происходит окрашивание всех элементов в черный цвет, а также вызов процедуры поиска наибольшего поддерева выделенного элемента. Блок-схема представлена на рисунке 3.2.19.

Рисунок 3.2.19 Событие "Выбор пункта контекстного меню Поиск наибольшего поддерева"

Функция поиска наибольшего поддерева выполняет соответствующий поиск относительно выделенного элемента. Входные параметры: элемент дерева. Выходные параметры отсутствуют. Блок-схема функции представлена на рисунке 3.2.20.

Рисунок 3.2.20 Функция поиска наибольшего поддерева

  1. Основные события вкладки «Хеш-Таблица»:
  2. Нажатие на кнопку «Добавить»

При нажатии на кнопку «Добавить» выполняется процесс добавления данных в Хеш-таблицу. Блок-схема представлена на рисунке 3.2.21.

Рисунок 3.2.21 Событие «Нажатие на кнопку добавить»

В данном обработчике события используется функция вставки в Хеш-таблицу. Для устранения коллизий используется метод квадратичного апробирования. Блок-схема функции представлена на рисунке 3.2.22.

Рисунок 3.2.22. Функция вставки в Хеш-таблицу

При нажатии на кнопку «Добавить» вызывается диалоговая форма «Ввод данных». В ней используется обработчик события нажатия на кнопку «Добавить». Блок схема обработчика представлена на рисунке 3.2.23.

Рисунок 3.2.24 Событие «Нажатие кнопки добавить» диалоговой формы «Ввод данных»

  1. Нажатие на кнопку «Поиск».

При нажатии на данную кнопку выполняется процесс поиска данных с использованием Хеш-таблицы. Блок-схема представлена на рисунке 3.2.25. В данном обработчике используется функция поиска данных в Хеш-таблице. Блок-схема представлена на рисунке 3.2.26. При нажатии на кнопку «Поиск» вызывается диалоговая форма поиска данных. В ней используется обработчик события «нажатия на кнопку поиск». Его блок-схема представлена на рисунке 3.2.27.

Рисунок 3.2.25 Событие «нажатие на кнопку поиск»

Рисунок 3.2.26 Функция поиска данных в Хеш-Таблице

Рисунок 3.2.27 Событие «Нажатие кнопки поиск» диалоговой формы «Поиск данных.

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

В качестве справочной системы был выбран Microsoft Compressed HTML Help (файл с расширением .chm). Этот формат был разработан на замену устаревшему формату WinHelp.

Преимущества chm:

  1.  Возможность использования html для создания файлов справки
  2.  Поддержка графических изображений формата .jpeg, .png и других
  3.  Легкость модификации и расширения справки
  4.  Возможность обратной компиляции (получение .htm файлов из скомпилированного .chm файла)
  5.  Поддержка содержания, поиска по индексу, поиска по ключевым словам, поиска по содержанию, добавление страниц в избранное
  6.  Сжатие конечного .chm файла при компиляции
  7.  Файлы .chm работают как в старых версиях Windows (начиная с 95), так и в новых (Windows 7). Для работы этих файлов не нужны никакие дополнительные компоненты.

Разработка .chm файла включает три этапа:

  1.  Подготовка исходных .htm файлов.

Выполняется в любом текстовом редакторе (очень помогает подсветка html синтаксиса). В .htm файлах можно использовать все возможности html: от ссылок и вставки картинок, до CSS, фреймов и встроенных скриптов. Несколько итоговых файлов приведены на рисунках 3.2.28 и 3.2.29

Рисунок 3.2.28 Исходный файл mainFormPage.htm 

Рисунок 3.2.29 Исходный файл GraphPage.htm   

  1.  Создание вспомогательных файлов

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

Пример добавление конкретного пункта в содержание приведён на рисунке 3.2.30. Итоговое дерево заголовков содержания представлено на рисунке 3.2.31

На рисунке 3.2.32 приведён пример добавления автоматически создаваемых файлов (в данном проекте автоматически создаётся файл индексного поиска и поиска по ключевым словам).

Рисунок 3.2.30 Добавление пункта содержания

Рисунок 3.2.31 Полное содержание

Рисунок 3.2.32 Автоматически создаваемые файлы

  1.  


  1.  Компиляция

Перед компиляцией пользователь может выбрать файл назначения, сохранить все исходные файлы и автоматически показать скомпилированный файл по завершении (рисунок 3.2.33)

Если компиляция прошла успешно, то пользователь увидит некоторую информацию о получившемся файле (рисунок 3.2.34). Конечный файл .chm может быть добавлен в приложение.

 

Рисунок 3.2.33 Настройки перед компиляцией  Рисунок 3.2.34 Результаты компиляции

Разработка пакета установки

Разработка пакета установки осуществлялась с помощью встроенных средств MS Visual Studio 2010 и включала следующие этапы:

  1. Создание проекта установки (рисунок 3.2.35).

Рисунок 3.2.35 Создание проекта установки

  1. Выбор типа проекта (рисунок 3.2.36).

Рисунок 3.2.36 Выбор типа проекта

  1. Добавление файлов в проект (рисунок 3.2.37).

Рисунок 3.2.37 Добавление файлов в проект

  1. Построение решения (рисунок 3.2.38).

Рисунок 3.2.38 Построение решения


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

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

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

Входными данными являются:

  1. Для задачи на графах: взвешенный ориентированный граф
  2. Для задачи на деревьях: дерево, каждый элемент которого может иметь произвольное число потомков
  3. Для задачи с использованием Хеш-Таблицы: сведения, аналогичные списку физических лиц, например: порядковый номер, фамилия, имя, отчество, адрес.

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

Выходными данными являются:

  1. Для задачи на графах: цикл, среднее геометрическое весов ребер которого будет наименьшим
  2. Для задачи на деревьях: наибольшее поддерево
  3. Для задачи с использованием Хеш-таблиц: Хеш-таблица


Программа и методика испытаний

Объект испытаний

Программа siakod выполняет следующие задачи:

  1. поиск и отображение цикла во взвешенном графе, среднее геометрическое весов ребер которого будет наименьшим.
  2. поиск наибольшего поддерева, в дереве, у каждого элемента которого может быть произвольное число потомков
  3. поиск и вставка задаваемого элемента в хеш-таблице

Цель испытаний

Цель проведения испытаний – оценка полноты выполнения функциональных требований к программе и проверка правильности их выполнения.

Требования к программе 

Приложение должно выполнять следующие функции:

  1.  Создание взвешенного ориентированного графа
  2. Поиск и отображение цикла во взвешенном графе, среднее геометрическое весов ребер которого будет наименьшим 
  3.  Создание дерева, каждый элемент которого может иметь произвольное число потомков
  4.  Поиск наибольшего поддерева
  5.  Вставка данных в Хеш-таблицу
  6.  Поиск данных с использование Хеш-Таблицы

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

Программа должна содержать справочную систему и систему установки.

Требования к программной документации

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

  1.  Руководство оператора
  2.  Руководство программиста

Руководство оператора оформляется в соответствие с ГОСТ 19.505-79. ЕСПД, руководство программиста - ГОСТ 19.504-79. ЕСПД.

Средства и порядок испытаний

  1. Создание графа.

Выполним создание простейшего ориентированного графа, содержащего два цикла.

Рисунок 4.5.1  Создание графа

Рисунок 4.5.2 Создание графа завершено

  1. Поиск цикла, среднее геометрическое весов ребер которого будет наименьшим.

Рисунок 4.5.3 Цикл найден

Рисунок 4.5.4 Подсвечивание цикла

Цикл с наименьшим средним геометрическим весов ребер:  Значение среднего геометрического равно 2.5198421

В случае, если в графе отсутствую циклы, программа выдаст соответствующее сообщение (4.5.5)

Рисунок 4.5.5 Сообщение об отсутствии циклов

  1.  Создание дерева, каждый элемент которого может иметь произвольное число потомков

Рисунок 4.5.6 Создание дерева

  1. Поиск наибольшего поддерева

Рисунок 4.5.7 Поиск наибольшего поддерева

Наибольшее поддерево будет выделено красным цветом.

  1. Вставка данных в Хеш-таблицу.

Добавим в таблицу произвольные данные.

 

Рисунок 4.5.8 Вставка данных в Хеш-Таблицу

Убедимся, что данные добавлены.

Рисунок 4.5.9 Добавленные данные

  1. Поиск данных по таблице

Выполним поиск по таблице.

Рисунок 4.5.10 Ввод данных для поиска

В случае, если поиск завершился успешно, программа выведет данные в таблицу (рисунок 4.5.11).

Рисунок 4.5.11 Результаты поиска

В случае, если данные не найдены, программа выведет соответствующее сообщение (рисунок 4.5.12)

Рисунок 4.5.12 Данные не найдены

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

Эксплуатационные документы

Руководство программиста

Общие сведения о программе

Программа предназначена для выполнения алгоритмов над структурами данных, а именно: поиск цикла во взвешенном графе, среднее геометрическое весов ребер которого будет наименьшим; поиск наибольшего поддерева в дереве, у каждого элемента которого может быть произвольное число потомков; вставка и поиск в хеш-таблице задаваемого элемента.

Для выполнения программа требует наличия ОС Windows XP SP2 и выше, а так же .Net framework 2.0 и аппаратное обеспечение, обеспечивающее работу этих систем. Для комфортной работы рекомендуется использовать манипуляторы типа клавиатура и мышь.

Для своей работы программа требует 10 Мб оперативной памяти.

Тип программы  – оконное приложение Windows.

Режим работы – постоянно с момента запуска программы.

Структура программы

Структура программы представлена в разделе 3.2. Описание логической структуры

Настройка программы

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

Проверка программы

Проверка программы осуществляется в соответствии с разделом 4.5 (Средства и порядок испытаний).

Дополнительные возможности программы

Программа оснащена справочной системой. Для вызова её вызова необходимо выбрать пункт меню Справка  Вызов справки, либо нажать клавишу F1. В зависимости от выбранной вкладки, на экран будет выведен справочный материал (рисунок 5.1.1)

Рисунок 5.1.1 Вызов справочной системы

Сообщения системный программисту

  1. Справка  О программе.

Будет показано сообщение, изображенное на рисунке 5.1.2.

Рисунок 5.1.2 О программе

Для продолжения следует нажать кнопку «Ок»

  1. В случае поиска цикла в незаданном графе будет показано сообщение, изображенное на рисунке 5.1.3.

Рисунок 5.1.3 Граф не задан

Для продолжения следует нажать кнопку «Ок»

  1. В случае, если в графе отсутствуют циклы, будет показано сообщение, изображенное на рисунке 5.1.4.

Рисунок 5.1.4  В графе отсутствуют циклы

Для продолжения следует нажать кнопку «Ок»

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

Рисунок 5.1.5 Цикл найден

Для продолжения следует нажать кнопку «Ок»

  1. В случае, если пользователь не ввел значение ни в одно из полей формы ввода данных и нажал «Добавить», будет показано сообщение, изображенное на рисунке 5.1.6.

Рисунок 5.1.6 Все поля ввода пустые

Для продолжения следует нажать кнопку «Ок»

  1. В случае, если пользователь не задал ключ поиска и нажал кнопку «Поиск» будет показано следующее сообщение (рисунок 5.1.7)

Рисунок 5.1.7 Введите ключ поиска

Для продолжения следует нажать кнопку «Ок»

  1. В случае, если поиск завершился неудачно, будет показано сообщение, изображенное на рисунке 5.1.8.

Рисунок 5.1.8 Данные не найдены

Для продолжения следует нажать кнопку «Ок»

Руководство оператора (пользователя)

Назначение и условие применения программы

Программа предназначена для выполнения алгоритмов над структурами данных, а именно: поиск цикла во взвешенном графе, среднее геометрическое весов ребер которого будет наименьшим; поиск наибольшего поддерева в дереве, у каждого элемента которого может быть произвольное число потомков; вставка и поиск в хеш-таблице задаваемого элемента.

Условие выполнения программы

Для выполнения программа требует наличия ОС Windows XP Service Pack 2 и выше, а так же .Net framework 2.0 и аппаратное обеспечение, обеспечивающее работу этих систем. Для комфортной работы рекомендуется использовать манипуляторы типа клавиатура и мышь.

Для своей работы программа требует 10 Мб оперативной памяти.

Тип программы  – оконное приложение Windows.

Режим работы – постоянно с момента запуска программы.

Выполнение программы

Для запуска программы необходимо открыть siakod.exe или воспользоваться ярлыками, созданными при установке. После запуска программы пользователь видит окно, изображённое на рисунке 5.2.1, на котором необходимо выбрать с какой из операций он хочет работать.

Рисунок 5.2.1 Главная форма при запуске программы

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

Рисунок 5.2.2 Выбор вкладки задач

Для того, чтобы выбрать "Задачу на графах" необходимо кликнуть на соответствующую вкладку (Рисунок 5.2.2.).

Создание графа происходит с помощью диалогового окна. Чтобы его вызвать, необходимо нажать на кнопку "Создать граф" либо в пункте меню "Задача на графах" выбрать "Задать граф" (Рисунок 5.2.3).

Рисунок 5.2.3 Кнопка создания графа

На экране появится диалог создания графа. Далее необходимо ввести количество вершин в графе (Рисунок 5.2.4).

Рисунок 5.2.4 Количество вершин

Затем при помощи аналога матрицы производится задание ребер и их весов. Например, чтобы задать ребро, исходящее из вершины 1 и входящее в вершину 3 с весом 5, необходимо на пересечении строки 1 и столбца 3 поставить галочку (Рисунок 5.2.5) и в появившемся диалоговом окне ввести 5 и нажать применить (Рисунок 5.2.6)

Рисунок 5.2.5 Создание ребра из вершины 1 в вершину 3

Рисунок 5.2.6 Добавление веса созданному ребру.

После заполнения матрицы необходимыми значениями граф отобразится в дополнительном окне.

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

Рисунок 5.2.7 Кнопки управления отображением графа

Чтобы завершить процесс создания графа необходимо нажать на кнопку "Создать" (Рисунок 5.2.8).

Рисунок 5.2.8 Кнопка подтверждения создания графа

Для поиска цикла, у которого среднее геометрическое весов его ребер было бы минимально необходимо нажать на кнопку "Найти цикл" (Рисунок 5.2.9)

Рисунок 5.2.9 Кнопка поиска цикла

Для того, чтобы выбрать "Задачу на деревьях" необходимо кликнуть на соответствующую вкладку (Рисунок 5.2.2).

Для того, чтобы создать корневой элемент необходимо нажать на кнопку "Создать корневой элемент" (Рисунок 5.2.10) или в пункте меню выбрать "Задача на деревьях" и нажать на "Создать корневой элемент".

Рисунок 5.2.10 Кнопка создания корневого элемента

Чтобы создать потомка определенного элемента, необходимо кликнуть по элементу правой кнопкой и в контекстном меню выбрать "Добавить" (Рисунок 5.2.11). Данную операцию продолжать до тех пор, пока не будет получено желаемое дерево

Рисунок 5.2.11 Создание подоска

Чтобы удалить какой-либо элемент дерева, необходимо кликнуть по нему правой кнопкой и в контекстном меню выбрать "Удалить" (Рисунок 5.2.12).

Рисунок 5.2.12 Удаление элемента

Чтобы выполнить поиск наибольшего поддерева, необходимо кликнуть правой кнопкой по элементу, относительно которого будет идти поиск наибольшего поддерева и в контекстном меню выбрать пункт "Наибольшее поддерево" (Рисунок 5.2.13).

Рисунок 5.2.13 Поиск наибольшего поддерева

Для того, чтобы выбрать "Хеш-таблицу" необходимо кликнуть на соответствующую вкладку (Рисунок 5.2.2).

Чтобы добавить данные в таблицу, необходимо нажать кнопку "Добавить" (Рисунок 5.2.14)

Рисунок 5.2.14 Добавление данных

Появится диалоговая форма, в которую необходимо ввести данные (Рисунок 5.2.15). Хотя бы одно поле должно быть заполнено, либо порядковый номер должен быть не нулевым. После того, как данные введены, необходимо нажать на кнопку "Добавить".

Рисунок 5.2.15 Форма добавления данных

Чтобы выполнить поиск данных необходимо нажать на кнопку "Поиск" (Рисунок 5.2.16).

Рисунок 5.2.16 Кнопка поиска данных

Появится диалоговая форма, в которую необходимо ввести критерий поиска и ключ поиска (Рисунок 5.2.17). После ввода данных необходимо нажать на кнопку "Поиск". Внимание: порядковый номер должен иметь не нулевое значение.

Рисунок 5.2.17 Форма поиска данных

Сообщения оператору

  1. Справка  О программе.

Будет показано сообщение, изображенное на рисунке 5.2.18.

Рисунок 5.2.18 О программе

Для продолжения следует нажать кнопку «Ок»

  1. В случае поиска цикла в незаданном графе будет показано сообщение, изображенное на рисунке 5.1.19.

Рисунок 5.2.19 Граф не задан

Для продолжения следует нажать кнопку «Ок»

  1. В случае, если в графе отсутствуют циклы, будет показано сообщение, изображенное на рисунке 5.2.20.

Рисунок 5.2.20  В графе отсутствуют циклы

Для продолжения следует нажать кнопку «Ок»

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

Рисунок 5.2.21 Цикл найден

Для продолжения следует нажать кнопку «Ок»

  1. В случае, если пользователь не ввел значение ни в одно из полей формы ввода данных и нажал «Добавить», будет показано сообщение, изображенное на рисунке 5.2.22.

Рисунок 5.2.22 Все поля ввода пустые

Для продолжения следует нажать кнопку «Ок»

  1. В случае, если пользователь не задал ключ поиска и нажал кнопку «Поиск» будет показано следующее сообщение (рисунок 5.2.23)

Рисунок 5.2.23 Введите ключ поиска

Для продолжения следует нажать кнопку «Ок»

  1. В случае, если поиск завершился неудачно, будет показано сообщение, изображенное на рисунке 5.2.24.

Рисунок 5.2.24 Данные не найдены

Для продолжения следует нажать кнопку «Ок»


Приложение

Исходный текст модуля Form1.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Diagnostics;

using System.Drawing;

using System.Windows;

using System.Text;

using System.Windows.Forms;

using System.Xml;

using System.Media;

using Microsoft.Glee.Drawing;

using Color = Microsoft.Glee.Drawing.Color;

namespace siakod

{

   public partial class mainForm : Form

   {

       const int SIZE = 200;

       int[] emptyLastName = new int[SIZE + 1];

       int[] emptyFirstName = new int[SIZE + 1];

       int[] emptyMiddleName = new int[SIZE + 1];

       int[] emptyId = new int[SIZE + 1];

       int[] emptyAddress = new int[SIZE + 1];

       Person[] LastNameHashTable = new Person[SIZE + 1];

       Person[] FirstNameHashTable = new Person[SIZE + 1];

       Person[] MiddleNameHashTable = new Person[SIZE + 1];

       Person[] AddressHashTable = new Person[SIZE + 1];

       Person[] IdHashTable = new Person[SIZE + 1];

       List<Person> persons = new List<Person>();

       private static List<List<Vertex>> ListCycles = new List<List<Vertex>>();

       public Graph graph;

       public static int index;

       InputGraph InputGraphForm = new InputGraph();

       InputPerson InputPersonForm = new InputPerson();

       SearchForm SearchPersonForm = new SearchForm();

       private TreeNode rightClickedNode;

       public List<List<Vertex>> FindCycle(Graph g) // Функция поиска цикла в графе

       {

           g.ClearIndexes();

           ListCycles.Clear();

           foreach (var vertex in g.ListVertex)

           {

               if (vertex.Index < 0)

                   find(vertex, vertex, new List<Vertex>(), g);

           }

           return ListCycles;

       }

       public void find(Vertex first, Vertex curr, List<Vertex> a, Graph g) // Поиск циклов с использованием поиска в глубину

       {

           curr.Index = 1;

           if ((first.NameVertex == curr.NameVertex) && (a.Count > 0))

           {

               ListCycles.Add(a);

               return;

           }

           if (a.Contains(curr))

           {

               a.RemoveRange(0, a.IndexOf(curr));

               ListCycles.Add(a);

               return;

           }

           foreach (var weightedEdge in g.Dependencies(curr))

           {

               var list = new List<Vertex>(a);

               list.Add(curr);

               find(first, weightedEdge.Vertex, list, g);

           }

       }

       public mainForm()

       {

           InitializeComponent();

       }

       private void panel1_SizeChanged(object sender, EventArgs e)

       {

           tabControl1.Size = panel1.Size;

           tabControl1.Refresh();

       }

       private void InputGraph_Click(object sender, EventArgs e)

       {

           //MessageBox.Show("OK");

           InputGraphForm.ShowDialog();

           if (InputGraphForm.DialogResult == DialogResult.OK)

           {

               graph = InputGraphForm.GetGraph;

               //InitializeGraph();

               var d = new Microsoft.Glee.Drawing.Graph("graph");

               foreach (var vertex in graph.ListVertex)

               {

                   d.AddNode(vertex.NameVertex);

                   var listweight = graph.Dependencies(vertex);

                   foreach (var weightedEdge in listweight)

                   {

                       d.AddEdge(vertex.NameVertex, weightedEdge.Weight.ToString(), weightedEdge.Vertex.NameVertex);

                   }

               }

               d.GraphAttr.AspectRatio = 1;

               d.GraphAttr.EdgeAttr.Fontsize = 7;

               gViewer1.Graph = d;

           }

       }

       private void findCycleWithMinWeight_Click(object sender, EventArgs e)

       {

           if (graph != null)

           {

               //InitializeGraph();

               //var cycles = DetectCycle(graph);

               var cycles = FindCycle(graph);

               //ListCycles.

               foreach (var cycle in ListCycles) // Поиск цикла с наименьшим средним геометрическим

               {

                   foreach (var vertex in cycle)

                   {

                       textBox1.Text += vertex.NameVertex + " -> ";

                   }

                   textBox1.Text += Environment.NewLine;

               }

               var minCycle = -1;

               var count = -1;

               double minAverGeom = double.MaxValue;

               //  MessageBox.Show(cycles.Count.ToString());

               foreach (var v in cycles) // для каждого найденного цикла

               {

                   //v.Reverse();

                   int indx0 = 0;

                   int indx1 = 1;

                   double buff = 1;

                   while (true)

                   {

                       Vertex dest;

                       if (v.Count != indx1)

                           dest = v[indx1];

                       else

                           dest = v[0];

                       foreach (var edge in graph.ListWeighedEdge[graph.ListVertex.IndexOf(v[indx0])]) // Выполнить перемножение весов ребер

                           if (dest.NameVertex == edge.Vertex.NameVertex)

                           {

                               //MessageBox.Show(edge.Weight.ToString());

                               buff *= edge.Weight;

                               break;

                           }

                       indx0++;

                       indx1++;

                       if (indx1 > v.Count)

                           break;

                   }

                   count++;

                   //MessageBox.Show("min " + Math.Pow(buff, 1.0 / cycles[count].Count));

                   // Если средненн геометрическое меньше записанного, то запоминаем его

                   if (minAverGeom > Math.Pow(buff, 1.0 / cycles[count].Count))

                   {

                       minAverGeom = Math.Pow(buff, 1.0 / cycles[count].Count);

                       minCycle = count;

                   }

               }

               if (minCycle != -1)

               {

                   var s = "";

                   foreach (var cycle in cycles[minCycle])

                   {

                       s += cycle.NameVertex + " -> ";

                   }

                   MessageBox.Show("Минимальное среднее геометрическое: " + minAverGeom + Environment.NewLine + s, "Поиск циклов", MessageBoxButtons.OK, MessageBoxIcon.Information);

                   string str = "";

                   //cycles[minCycle].Reverse();

                   foreach (var vertex in cycles[minCycle])

                   {

                       gViewer1.Graph.FindNode(vertex.NameVertex).Attr.Fontcolor = Color.Red;

                   }

                   for (int i = 0; i < cycles[minCycle].Count; i++)

                   {

                       int src = i;

                       int dest;

                       if (i != cycles[minCycle].Count - 1)

                       {

                           dest = i + 1;

                       }

                       else

                       {

                           dest = 0;

                       }

                       foreach (var edge in gViewer1.Graph.Edges) // Окрашивание цикла красным цветом

                       {

                           if ((edge.SourceNode.Id == cycles[minCycle][src].NameVertex) &&

                               (edge.TargetNode.Id == cycles[minCycle][dest].NameVertex))

                               edge.Attr.Color = Color.Red;

                       }

                   }

                   gViewer1.Invalidate();

               }

               else

               {

                   MessageBox.Show("В графе отсутствуют циклы", "Поиск циклов", MessageBoxButtons.OK, MessageBoxIcon.Information);

               }

           }

           else

           {

               MessageBox.Show("Граф не задан", "Поиск циклов", MessageBoxButtons.OK, MessageBoxIcon.Warning);

           }

       }

       private void CreateRoot_Click(object sender, EventArgs e)

       {

           if (treeView1.Nodes.Count == 0)

           {

               var t0 = new TreeNode("T0");

               t0.ContextMenuStrip = contextMenuStrip1;

               treeView1.Nodes.Add(t0);

           }

       }

       private void добавитьToolStripMenuItem_Click(object sender, EventArgs e)

       {

           var count = rightClickedNode.Nodes.Count + 1;

           var node = new TreeNode(rightClickedNode.Text + " -> " + "T" + count.ToString());

           node.ContextMenuStrip = contextMenuStrip1;

           rightClickedNode.Nodes.Add(node);

           rightClickedNode.Expand();

       }

       private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)

       {

           if (e.Button == System.Windows.Forms.MouseButtons.Right) // Если произошел клик правой кнопкой

           {

               rightClickedNode = e.Node; // Запомнить ссылку на узел

           }

       }

       private void changeColorSubtree(TreeNode node, System.Drawing.Color color)

       {

           var largestCountNodes = -1;

           TreeNode largestSubTree = null;

           var buff = 0;

           for (int i = 0; i < node.Nodes.Count; i++) // Поиск поддерева с наибольшим числом элементов

           {

               buff = node.Nodes[i].GetNodeCount(true);

               if (largestCountNodes < buff)

               {

                   largestCountNodes = buff;

                   largestSubTree = node.Nodes[i];

               }

           }

           if (largestSubTree != null) // Если указатель не пуст, окрасить элементы наибольшего поддерева в красный цвет

           {

               largestSubTree.ForeColor = color;

               ChangeColorNode(largestSubTree, color);

           }

       }

       private void ChangeColorNode(TreeNode node, System.Drawing.Color color)

       {

           foreach (TreeNode n in node.Nodes)

           {

               ChangeColorNode(n, color);

               n.ForeColor = color;

           }

       }

       private void удалитьToolStripMenuItem_Click(object sender, EventArgs e)

       {

           rightClickedNode.Remove();

       }

       private void наибольшееПоддеревоToolStripMenuItem_Click(object sender, EventArgs e)

       {

           // if (prevNode.ForeColor == System.Drawing.Color.Red)

           ChangeColorNode(treeView1.Nodes[0], System.Drawing.Color.Black);

           changeColorSubtree(rightClickedNode, System.Drawing.Color.Red);

       }

// Динамическая смена пунктов главного меню в зависимости от вкладки

       private void treePage_Enter(object sender, EventArgs e)

       {

           graphProblemToolStripMenuItem.Visible = false;

           treeProblemToolStripMenuItem.Visible = true;

           hashtableProblemToolStripMenuItem.Visible = false;

       }

       private void graphPage_Enter(object sender, EventArgs e)

       {

           graphProblemToolStripMenuItem.Visible = true;

           treeProblemToolStripMenuItem.Visible = false;

           hashtableProblemToolStripMenuItem.Visible = false;

       }

       private void hashtablePage_Enter(object sender, EventArgs e)

       {

           graphProblemToolStripMenuItem.Visible = false;

           treeProblemToolStripMenuItem.Visible = false;

           hashtableProblemToolStripMenuItem.Visible = true;

       }

 // Функция вставки к Хеш-таблицу. Для избежания коллизий используется метод квадратичного аппробирования

       int quadratic_probing_insert(Person[] hashtable, string str, Person person, int[] empty)

       {

           int j = 0, hk;

           int key = str[str.Length - 1];

           hk = key % SIZE;

           while (j < SIZE)

           {

               if (empty[hk] == 0)

               {

                   hashtable[hk] = person;

                   empty[hk] = 1;

                   return (hk);

               }

               j++;

               hk = (key + j * j) % SIZE;

           }

           return (-1);

       }

// Функция поиска элемента в Хеш-таблице

       public List<Person> quadratic_probing_search(Person[] hashtable, string str, int searchMode, int[] empty)

       {

           List<Person> persons = new List<Person>();

           int j = 0, hk;

           int key = str[str.Length - 1];

           hk = key % SIZE;

           string DataSearch = "";

           while (j < SIZE)

           {

               if (empty[hk] == 1)

               {

                   switch (searchMode)

                   {

                       case 0:

                           DataSearch = hashtable[hk].Id.ToString();

                           break;

                       case 1:

                           DataSearch = hashtable[hk].LastName;

                           break;

                       case 2:

                           DataSearch = hashtable[hk].FirstName;

                           break;

                       case 3:

                           DataSearch = hashtable[hk].MiddleName;

                           break;

                       case 4:

                           DataSearch = hashtable[hk].Address;

                           break;

                   }

                   if (DataSearch.ToLower() == str.ToLower())

                       persons.Add(hashtable[hk]);

               }

               else

                   return persons;

               j++;

               hk = (key + j * j) % SIZE;

           }

           return persons;

       }

       private void AddBtn_Click(object sender, EventArgs e)

       {

           InputPersonForm.ShowDialog();

           if (InputPersonForm.DialogResult == DialogResult.OK)

           {

               var person = InputPersonForm.GetPerson;

               persons.Add(person);

               if (person.LastName != "")

                   quadratic_probing_insert(LastNameHashTable, person.LastName, person, emptyLastName);

               if (person.Id != 0)

                   quadratic_probing_insert(IdHashTable, person.Id.ToString(), person, emptyId);

               if (person.FirstName != "")

                   quadratic_probing_insert(FirstNameHashTable, person.FirstName, person, emptyFirstName);

               if (person.MiddleName != "")

                   quadratic_probing_insert(MiddleNameHashTable, person.MiddleName, person, emptyMiddleName);

               if (person.Address != "")

                   quadratic_probing_insert(AddressHashTable, person.Address, person, emptyAddress);

           }

       }

       private void SearchBtn_Click(object sender, EventArgs e)

       {

           List<Person> persons = null;

           SearchPersonForm.ShowDialog();

           if (SearchPersonForm.DialogResult == DialogResult.OK)

           {

               listView1.Items.Clear();

               switch (SearchPersonForm.GetComboboxIndex)

               {

                   case 0:

                       persons = quadratic_probing_search(IdHashTable, SearchPersonForm.GetNumericDownValue.ToString(),

                                                         SearchPersonForm.GetComboboxIndex, emptyId);

                       break;

                   case 1:

                       persons = quadratic_probing_search(LastNameHashTable, SearchPersonForm.GetTextboxText,

                                                         SearchPersonForm.GetComboboxIndex, emptyLastName);

                       break;

                   case 2:

                       persons = quadratic_probing_search(FirstNameHashTable, SearchPersonForm.GetTextboxText,

                                 SearchPersonForm.GetComboboxIndex, emptyFirstName);

                       break;

                   case 3:

                       persons = quadratic_probing_search(MiddleNameHashTable, SearchPersonForm.GetTextboxText,

                                 SearchPersonForm.GetComboboxIndex, emptyMiddleName);

                       break;

                   case 4:

                       persons = quadratic_probing_search(AddressHashTable, SearchPersonForm.GetTextboxText,

                                 SearchPersonForm.GetComboboxIndex, emptyAddress);

                       break;

               }

               if (persons != null)

               {

                   if (persons.Count != 0)

                   {

                       listView1.Items.Clear();

                       foreach (var person in persons)

                       {

                           var item = new List<string>();

                           item.Add(person.Id.ToString());

                           item.Add(person.LastName);

                           item.Add(person.FirstName);

                           item.Add(person.MiddleName);

                           item.Add(person.Address);

                           listView1.Items.Add(new ListViewItem(item.ToArray()));

                       }

                   }

                   else

                   {

                       MessageBox.Show("Данные не найдены", "Поиск", MessageBoxButtons.OK, MessageBoxIcon.Information);

                   }

               }

               else if (persons.Count == 0)

               {

                   MessageBox.Show("Данные не найдены", "Поиск", MessageBoxButtons.OK, MessageBoxIcon.Information);

               }

           }

       }

       private void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e)

       {

           MessageBox.Show(

               "Курсовой проект. 11 вариант" + Environment.NewLine + "Разработал: студент гр 8414 Цыбулько Д.М.",

               "О программе", MessageBoxButtons.OK, MessageBoxIcon.Information);

       }

       private void InputGraphBtn_MouseEnter(object sender, EventArgs e)

       {

           toolStripStatusLabel1.Text = "Создание графа с помощью диалога";

       }

       private void FindCycleBtn_MouseEnter(object sender, EventArgs e)

       {

           toolStripStatusLabel1.Text = "Поиск цикла с минимальным средним геометрическим весом ребер";

       }

       private void gViewer1_MouseEnter(object sender, EventArgs e)

       {

           toolStripStatusLabel1.Text = "Представление графа";

       }

       private void graphPage_MouseEnter(object sender, EventArgs e)

       {

           toolStripStatusLabel1.Text = "Страница задачи на графах";

       }

       private void statusStrip1_MouseEnter(object sender, EventArgs e)

       {

           toolStripStatusLabel1.Text = "Статусная строка";

       }

       private void menuStrip1_MouseEnter(object sender, EventArgs e)

       {

           toolStripStatusLabel1.Text = "Главное меню";

       }

       private void treePage_MouseEnter(object sender, EventArgs e)

       {

           toolStripStatusLabel1.Text = "Страница задачи на деревьях";

       }

       private void CreateRootBtn_MouseEnter(object sender, EventArgs e)

       {

           toolStripStatusLabel1.Text = "Создание корневого элемента дерева";

       }

       private void treeView1_NodeMouseHover(object sender, TreeNodeMouseHoverEventArgs e)

       {

           toolStripStatusLabel1.Text = "Элемент дерева " + e.Node.Text;

       }

       private void treeView1_MouseEnter(object sender, EventArgs e)

       {

           toolStripStatusLabel1.Text = "Представление дерева";

       }

       private void AddBtn_MouseEnter(object sender, EventArgs e)

       {

           toolStripStatusLabel1.Text = "Добавление данных";

       }

       private void SearchBtn_MouseEnter(object sender, EventArgs e)

       {

           toolStripStatusLabel1.Text = "Поиск данных";

       }

       private void listView1_MouseEnter(object sender, EventArgs e)

       {

           toolStripStatusLabel1.Text = "Таблица результатов поиска";

       }

       private void hashtablePage_MouseEnter(object sender, EventArgs e)

       {

           toolStripStatusLabel1.Text = "Страница задачи с Хеш-таблицей";

       }

       private void mainForm_MouseEnter(object sender, EventArgs e)

       {

           toolStripStatusLabel1.Text = "Главная форма";

       }

       private void tabControl1_MouseEnter(object sender, EventArgs e)

       {

           toolStripStatusLabel1.Text = "Переключение заданий";

       }

       private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)

       {

           var index = tabControl1.SelectedIndex;

           //MessageBox.Show(index.ToString());

           switch (index)

           {

               case 0:

                   helpProvider1.SetHelpKeyword(tabControl1,"graphPage.htm");

                   break;

               case 1:

                   helpProvider1.SetHelpKeyword(tabControl1, "treePage.htm");

                   break;

               case 2:

                   helpProvider1.SetHelpKeyword(tabControl1, "hashtablePage.htm");

                   break;

           }

       }

       private void вызовСправкиToolStripMenuItem_Click(object sender, EventArgs e)

       {

           try

           {

               Process SysInfo = new Process();

               SysInfo.StartInfo.ErrorDialog = true;

               SysInfo.StartInfo.FileName = "help.chm";

               SysInfo.Start();

           }

           catch (Exception ex)

           {

               MessageBox.Show(ex.Message);

           }

       }

       private void AllDataBtn_Click(object sender, EventArgs e)

       {

           listView1.Items.Clear();

           foreach (var person in persons)

           {

               var item = new List<string>();

               item.Add(person.Id.ToString());

               item.Add(person.LastName);

               item.Add(person.FirstName);

               item.Add(person.MiddleName);

               item.Add(person.Address);

               listView1.Items.Add(new ListViewItem(item.ToArray()));

           }

       }

       private void ClearBtn_Click(object sender, EventArgs e)

       {

           listView1.Items.Clear();

       }

       private void выходToolStripMenuItem_Click(object sender, EventArgs e)

       {

           Close();

       }

   }

}

Исходный текст модуля InputGraph.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

namespace siakod

{

   public partial class InputGraph : Form

   {

       WeightForm weightForm = new WeightForm();

       private CheckBox[,] checkBoxs;

       private Label[] labelsY;

       private Label[] labelsX;

       private Graph graph;

       private Microsoft.Glee.Drawing.Graph g;

       public InputGraph()

       {

           InitializeComponent();

       }

// Создание компонентов checkbox при изменении компонента NumericUpDown

       private void numericUpDown1_ValueChanged(object sender, EventArgs e)

       {

           panel2.Controls.Clear();

           int startX = 30;

           int startY = 30;

           int sizeX = 65;

           int sizeY = 30;

     //      WeightForm weightForm = new WeightForm();

           checkBoxs = new CheckBox[(int)numericUpDown1.Value, (int)numericUpDown1.Value];

           Label[] labelsY = new Label[(int)numericUpDown1.Value];

           Label[] labelsX = new Label[(int)numericUpDown1.Value];

           for (int i = 0; i < numericUpDown1.Value; i++)

           {

               labelsY[i] = new Label();

               labelsY[i].Size = new Size(20,15);

               labelsY[i].Location = new Point(startX-20,startY +i*sizeY);

               labelsY[i].Text = (i + 1).ToString();

               panel2.Controls.Add(labelsY[i]);

               labelsX[i] = new Label();

               labelsX[i].Size = new Size(20, 15);

               labelsX[i].Location = new Point(startX + i * sizeX, startY - 15);

               labelsX[i].Text = (i + 1).ToString();

               panel2.Controls.Add(labelsX[i]);

               for (int j = 0; j < numericUpDown1.Value; j++)

               {

                   checkBoxs[i,j] = new CheckBox();

                   if (i == j)

                       checkBoxs[i, j].Enabled = false;

                   checkBoxs[i,j].Size = new Size(60,15);

                   checkBoxs[i,j].Location = new Point(startX + j*sizeX , startY + i *sizeY);

                   checkBoxs[i, j].CheckedChanged += InputGraph_CheckedChanged;

                   panel2.Controls.Add(checkBoxs[i,j]);

               }

           }

           GraphPaint();

       }

// Вызов формы ввода веса ребра, при установлении метки в checkbox

       void InputGraph_CheckedChanged(object sender, EventArgs e)

       {

           if (((CheckBox) sender).Checked == true)

           {

               weightForm.ShowDialog();

               if (weightForm.DialogResult == DialogResult.OK)

               {

                   //MessageBox.Show(weightForm.NumtBoxValue.ToString());

                   ((CheckBox) sender).Text = weightForm.NumtBoxValue.ToString();

               }

               else

               {

                   ((CheckBox) sender).Text = 0.ToString();

               }

           }

           else

           {

               ((CheckBox) sender).Text = "";

           }

           GraphPaint();

       }

       private void OKBtn_Click(object sender, EventArgs e)

       {

           if (numericUpDown1.Value > 0)

           {

               graph = new Graph();

               for (int i = 0; i < numericUpDown1.Value; i++)

               {

                   graph.ListVertex.Add(new Vertex("V" + (i + 1).ToString(), -1, -1));

               }

               for (int i = 0; i < numericUpDown1.Value; i++)

               {

                   var list = new List<WeightedEdge>();

                   for (int j = 0; j < numericUpDown1.Value; j++)

                   {

                       if (checkBoxs[i, j].Checked)

                       {

                           list.Add(new WeightedEdge(graph.ListVertex[j], Convert.ToDouble(checkBoxs[i, j].Text)));

                       }

                   }

                   graph.ListWeighedEdge.Add(list);

               }

               DialogResult = DialogResult.OK;

           }

           Close();

       }

// Обновление графа в gView

       private void GraphPaint()

       {

           g = new Microsoft.Glee.Drawing.Graph("Graph");

           for (int i = 0; i < numericUpDown1.Value; i++)

           {

               g.AddNode("V" + (i + 1));

               for (int j = 0; j < numericUpDown1.Value; j++)

               {

                   if (checkBoxs[i, j].Checked)

                       g.AddEdge("V" + (i + 1), checkBoxs[i, j].Text, "V" + (j + 1));

               }

           }

           g.GraphAttr.AspectRatio = 1;

           g.GraphAttr.EdgeAttr.Fontsize = 7;

           gViewer1.Graph = g;

       }

       public Graph GetGraph

       {

           get { return graph; }

       }

   }

}

Исходный текст модуля InputPerson

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

namespace siakod

{

   public partial class InputPerson : Form

   {

       private Person person;

       public InputPerson()

       {

           InitializeComponent();

       }

       private void OKBtn_Click(object sender, EventArgs e)

       {

           if (numericUpDown1.Value == 0 && FirstNameTextBox.Text == "" && LastNameTextBox.Text == "" && MiddleNameTextBox.Text == "" && AddressTextBox.Text == "")

               MessageBox.Show("Хотя бы одно поле должно быть заполнено","Ввод данных",MessageBoxButtons.OK,MessageBoxIcon.Warning);

           else

           {

               person = new Person

                            {

                                Id = (int) numericUpDown1.Value,

                                FirstName = FirstNameTextBox.Text,

                                LastName = LastNameTextBox.Text,

                                MiddleName = MiddleNameTextBox.Text,

                                Address = AddressTextBox.Text

                            };

               DialogResult = DialogResult.OK;

               Close();

           }

       }

       public Person GetPerson

       {

           get { return person; }

       }

   }

}

Исходный текст модуля SearchForm

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

namespace siakod

{

   public partial class SearchForm : Form

   {

       NumericUpDown numericUpDown1 = new NumericUpDown();

       TextBox textbox1 = new TextBox();

       public SearchForm()

       {

           InitializeComponent();

           comboBox1.SelectedIndex = 0;

           

           numericUpDown1.Parent = groupBox2;

           numericUpDown1.DecimalPlaces = 0;

           numericUpDown1.Maximum = 100;

           numericUpDown1.Dock = DockStyle.Fill;

 

           textbox1.Dock = DockStyle.Fill;

       }

       private void SearchBtn_Click(object sender, EventArgs e)

       {

           if (comboBox1.SelectedIndex == 0)

               if (numericUpDown1.Value != 0)

               {

                   DialogResult = DialogResult.OK;

                   Close();

               }

               else

               {

                   MessageBox.Show("Введите ключ поиска", "Поиск", MessageBoxButtons.OK, MessageBoxIcon.Warning);

               }

           else

           {

               if (textbox1.Text != "")

               {

                   DialogResult = DialogResult.OK;

                   Close();

               }

               else

               {

                   MessageBox.Show("Введите ключ поиска", "Поиск", MessageBoxButtons.OK, MessageBoxIcon.Warning);

               }

           }

       }

       private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)

       {

           if (comboBox1.SelectedIndex == 0)

           {

               textbox1.Parent = null;

               numericUpDown1.Parent = groupBox2;

           }

           else

           {

               numericUpDown1.Parent = null;

               textbox1.Parent = groupBox2;

           }

       }

       public int GetComboboxIndex

       {

           get { return comboBox1.SelectedIndex; }

       }

       public int GetNumericDownValue

       {

           get { return (int) numericUpDown1.Value; }

       }

       public string GetTextboxText

       {

           get { return textbox1.Text; }

       }

   }

}

Исходный текст модуля WeightForm.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

namespace siakod

{

   public partial class WeightForm : Form

   {

       public WeightForm()

       {

           InitializeComponent();

       }

       public double NumtBoxValue

       {

           get { return (double)numericUpDown1.Value; }

       }

       private void button1_Click(object sender, EventArgs e)

       {

           DialogResult = DialogResult.OK;

           Close();

       }

       private void WeightForm_Load(object sender, EventArgs e)

       {

           numericUpDown1.Value = 0;

       }

   }

}


Список использованной литературы

  1.  СИАКОД. Методические указания к курсовой работе. 2011
  2.  http://www.msdn.com
  3.  http://en.wikipedia.org/wiki/Quadratic_probing
  4.  http://research.microsoft.com/en-us/downloads/f1303e46-965f-401a-87c3-34e1331d32c5/default.aspx
  5. Вирт Н. Алгоритмы и структуры данных. М: Мир, 1989. 360 с.


 

А также другие работы, которые могут Вас заинтересовать

32386. Восприятие 14.1 KB
  Различие процессов восприятия и ощущения заканчиваются в том что ощущение – это отражение отдельных свойств предметов и явлений а восприятие – целостное отражение предметов в единстве и во взаимосвязи их свойств. Свойства восприятия Предметность – это способность отражать предметы и явления реального мира в соответствии с их функциональным значением. Она тесно связана с целостностью восприятия. В результате их взаимодействия и достраивания посредством памяти и мышления приобретает структурную целостность это не сумма ощущений это...
32387. Естественн-научные основы психологии. Физиологические механизмы психики 14.55 KB
  Физиологические механизмы психики. Изучая отдельные факты психической жизни человека выявляется закономерности их развития раскрываются механизмы лежащие в основе. 4 этап психологии наука изучает факты закономерности механизмы психики. Физиологические механизмы психики.
32388. Внимание 15.34 KB
  Успешность освоения систематизированных знаний и выполнение той или иной деятельности зависит в значительной степени от уровня развития и индивидуальных особенностей внимания человека. Наличие внимания является обязательным условием обеспечивающим успешность протекания каждого психического процесса. В качестве обоснования этой точки зрения указывается на то что в мозге человека можно обнаружить и выделить особого рода нервные структуры связанные именно с процессом внимания. Функции внимания: Отбор значимых воздействий которые...
32389. Содержание, задачи, функции, методы, основные направления и этические принципы работы практического психолога в системе образования 13.8 KB
  Осуществление работы по направлениям личности. Методы работы: Индивидуальная форма работы для детей – игра и рисунок. Групповая форма работы для детей – ролевые игры и психодрама.
32390. Общие представления о мышлении 16.24 KB
  Физиологические основы мышления выявить и исследовать достаточно трудно это объяснятся той специфической ролью которую мышление играет в психологической деятельности человека. Следовательно для функционирования мышления необходимы отделы коры головного мозга отвечающие за познавательные процессы. Установлено также что особую значимую роль для процессов мышления играет лобная доля и речевые центры коры головного мозга. Функции мышления: Понимание решение проблемы и задачи целеобразование рефлексия – деятельность человеческого...
32391. Особенности развития личности ребенка на различных возрастных этапах 14.83 KB
  Внутри этого вида деятельности формируется новая ведущая деятельность характерная для следующего этапа возрастного развития. ведущая деятельность способствует появлению характерных только для этого возраста качественных особенностей. Ведущая деятельность: непосредственно эмоциональное общение внутри и на фоне которой формируются ориентировочные и сенсомоторные манипулятивные действия т. Ведущая деятельность: предметноманипулятивная в процессе которой ребенок овладевает общественными выработанными способами действий с предметами в...
32392. Метод эксперимента 15.17 KB
  Отличительные признаки эксперимента: Исследователь не дожидается проявлений интересующих его психических свойств а сам создает условия чтобы вызвать их у испытуемых. В эксперименте обязателен строгий учет и регистрация условий протекания исследования. Эксперимент может быть повторен другими исследователями и в другое время что позволяет проверить результаты исследования.
32393. Психодиагностика как наука. История, предмет и методы психодиагностики. Классификация методов психодиагностического исследования 16.22 KB
  Задачи психодиагностики: Разработка теоретических принципов оценки и измерения индивидуальных психологических свойств человека. Этапы становления психодиагностики: Донаучный до начала 19 века Стихийное использование некоторых заданий для определения индивидуальных особенностей человека. Пифагор допускал в свою школу лишь тех кто проходил череду испытаний смех и походка считались отражением характера человека. Экспериментальная психология накопила огромное количество методик для исследования психических функций человека многие из...
32394. Представление о личности в отечественной и зарубежной психологии. Личность и индивидуальность 14.43 KB
  Личность и индивидуальность. Личность – специфическое человеческое образование производится общественными отношениями в которых индивид вступает в своей деятельности. Личность понятие социальное возникает в результате культурного и социального развития есть своя позиция жизни к которой пришел в итоге большой сознательной работы; самостоятельность мысли; глубина и богатство связей с миром с другими людьми; разрыв этих связей самоизоляция опустошают. Личность – как субъект межличностных социальных отношений и сознательной деятельности...