Разработка справочно-информационной системы на языке программирования C#

Бинарные деревья поиска, основные действия с ними. Сущность префиксного (прямого), инфиксного (симметричного) и постфиксного (обратного) обхода в глубину. Описание функций редактирования исходных данных. Листинг и текст программы Form 1 и Form 2.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 08.06.2014
Размер файла 1,7 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

[Введите текст]

Введение

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

Исходя из этого, с целью обеспечения потребностей пользователей создаётся программный продукт, основанный на методе организации данных «Бинарное дерево поиска», которое хранит информацию в строгой иерархии, что позволяет ускорить работу с информацией (манипуляцией), и особенно с поиском необходимой информации.

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

Основной целью данной работы является изучение фундаментальной абстрактной структуры - дерево, а также программная реализация добавления данных в упорядоченное бинарное дерево. Кроме того, необходимо закрепить теоретические знания и практические навыки в программировании на языке высокого уровня C#.

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

Справочно-информационная система - это система, обеспечивающая поиск и отбор необходимых данных в некоторой базе данных.

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

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

1. Бинарные деревья поиска

1.1 Древовидная структура - «Бинарное дерево поиска»

Бинарное (двоичное) дерево поиска - это конечное множество элементов, которое либо пусто, либо содержит один элемент, называемый корнем дерева[1], а остальные элементы множества делятся на два непересекающихся подмножества, каждое из которых само является бинарным деревом поиска. Эти подмножества называются правым и левым поддеревьями исходного дерева (рисунок 1.1).

Рисунок 1.1 - Бинарное дерево поиска

На рисунке вышепоказан наиболее часто встречающийся способ представления бинарного дерева. Оно состоит из девяти узлов. Корнем дерева является узел А. Левое поддерево имеет корень В, а правое поддерево - корень С. Они соединяются соответствующими ветвями, исходящими из А. Отсутствие ветви означает пустое поддерево. Например, у поддерева с корнем С нет левого поддерева, оно пусто. Пусто и правое поддерево с корнем Е. Бинарные поддеревья с корнями D, G, H и I имеют пустые левые и правые поддеревья. Узел, имеющий пустые правое и левое поддеревья, называется листом. Если каждый узел бинарного дерева, не являющийся листом, имеет непустые правое и левое поддеревья, то дерево поиска называется строго бинарным.

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

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

1.2 Действия с бинарными деревьями поиска

Рассматривая действия над деревьями, можно сказать, что для построения дерева необходимо формировать узлы, и, определив предварительно место включения, включать их в дерево поиска. Количество узлов определяется необходимостью. Алгоритмвключения должен быть известен и постоянен[2]. Узлы дерева могут быть использованы для хранения какой-либо информации.

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

Может возникнуть задача и уничтожения дерева в тот момент, когда необходимость в нем (в информации, записанной в его элементах) отпадает. В ряде случаев может потребоваться уничтожение поддерева.

Для того, чтобы совокупность узлов образовала дерево поиска, необходимо каким-то образом формировать и использовать связи узлов со своими предками и потомками. Все это очень напоминает действия над элементами списка[6].

1.3 Вырожденные деревья

При работе с двоичными деревьями поиска возможен случай, когда дерево поиска по сути примет вид линейного связанного списка (например, если элементы подавались на вход в порядке возрастания), в данном случае бинарное дерево поиска называется вырожденным[3]. В таком случае поиск элемента в дереве будет занимать линейное время. Одним из способов предотвращения подобной ситуации является балансировка дерева по мере добавления элементов.

2. Описание задачи и исходных данных

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

В курсовом проекте поставленной задачей является разработать справочно-информационную (Windows-приложение) систему на языке программирования C# выполняющее следующие функции:

чтение из текстового файла информации об объектах класса согласно варианту (таблица 2.1). Количество записей не менее 50. Предусмотреть наличие в файле не корректных записей, которые в процессе работы программы не будут обрабатываться. Использовать регулярные выражения (предусмотреть проверку по возможности всех полей);

вывод исходных данных в виде таблицы;

визуализация хеш-таблицы или бинарного дерева;

поиск информации по заданному ключу или способу обхода;

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

вывод справочной информации о программном продукте и об авторе;

демонстрация перегруженных операторов;

поиск максимального объекта.

2.2 Описание исходных данных

Исходными данными задачи являются:

название предметной области, а точнее название класса и его основные поля указаны в таблице 2.1, которое выбирается согласно варианту выданному преподавателем;

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

бинарное дерево поиска, ключ и способ обхода дерева указан в таблице 2.2.

Таблица 2.1- Описание класса

№ варианта

Название класса

Поля

14

Спортсмен

ФИО, возраст, количество побед, вид спорта

Таблица 2.2 - Способ обхода бинарного дерева

№ варианта

Ключ

Способ обхода бинарного дерева

Обход производить с помощью

14

ФИО

Обход в глубину - сверху вниз (префиксный обход)

Стека

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

создать класс согласно варианту. Класс должен содержать следующие элементы:

описание полей класса (выделенное жирным курсивов поле оформить как перечисление);

конструкторы с параметрами и по умолчанию, а также необходимые свойства и методы;

перегрузку одного из бинарных операторов (указать точно какой выбран самостоятельно бинарный оператор и что реализует);

перегрузку одного из операторов отношения (указать точно какой выбран самостоятельно оператор отношения и что реализует);

перегрузку префиксного и постфиксного инкремента (указать назначение инкремента);

перегрузку операторов <<и >> (указать назначение операторов);

создание массива из объектов вашего класса;

функцию, определяющую максимальный объект (указать по какому признаку выбирается максимальный объект). Для сравнения использовать перегруженный оператор отношения;

предусмотреть обработку и инициализацию исключительных ситуаций;

Класс должен реализовывать интерфейс IComparable;

разработать интерфейс Windows-приложения автоматизированной системы. Помимо самостоятельно выбранных элементов управления, обязательно могут присутствовать следующие элементы управления: MenuStrip, ContextMenuStrip, Button, TextBox,DataGridView, TextBox, ToolTIp, Panel, Label, ComboBox, OpenFileDialog, SaveFileDialog, PictureBox, CheckBox, RedioButton.

2.3 Анализ поставленной задачи

Обход в глубину производится рекурсивно либо с использованием стека. В обоих случаях можно обходить узлы дерева в различной последовательности[4]. Обход начинается от корня. Выделяют три наиболее важных порядка обхода в глубину:

префиксный (прямой) обход - сначала обрабатывается текущий узел, затем левое и правое поддеревья;

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

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

Рисунок 2.1 - Бинарное дерево поиска

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

префиксный обход: A, B, D, H, E, C, F, I, J, G;

инфиксный обход: D, H, B, E, A, I, F, J, C, G;

постфиксный обход: H, D, E, B, I, J, F, G, C, A.

Основным из достоинств постфиксного обхода является - нахождение минимального элемента в бинарном дереве[5]. Так как первым условием данного обхода является: «Обход левого поддерева», а по условию организации бинарного дерева - самый левый элемент является минимальным.

Также к достоинству данного метода можно отнести быструю скорость нахождения элемента, так как будет происходит сравнивание текущего элемента (в бинарном дереве) с элементом который требуется найти и уже по свойствам организации бинарных деревьев следует «дойти» до необходимого элемента[7].

3. Описание разработанного приложения

3.1 Описание методов

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

Класс «Node» - узел бинарного дерева, содержит в себе следующие методы:

«Add» - метод добавления узла в дерево поиска;

«Find_v1» -метод поиска элемента в бинарном дереве, способом обхода «В глубину - сверху вниз (префиксный обход)», по заданному ключу (введённым пользователем в отдельном окне);

«Shift» -метод для осуществления замены элементов в дереве;

«Delete» -метод удаления элемента из бинарного дерева (описаны все 3 случая удаления элемента из дерева);

«Max» - метод, осуществляющий поиск максимального элемента в дереве по средством операторов отношения и алгоритма организации бинарного дерева;

«Find_v2» -метод, осуществляющий сам «Обход» бинарного дерева способом «В глубину - сверху вниз (префиксный обход)»;

«Download» - метод загрузки бинарного дерева в компоненты «DataGridView»и «TreeView»;

«Save» -метод сохранения (выгрузки) бинарного дерева в файл, по указанному пути пользователем.

Каждому из перечисленных методов выше (кроме Find_v2 и «Download») соответствует свой пункт в меню («MenuStrip»):

пункт меню «Вставка» - вызывает метод «Add»;

«Поиск - Поиск элемента» - осуществляется выполнение метода «Find_v1»;

«Поиск - Поиск максимального элемента» - происходит выполнение метода «Max»;

«Изменение» - вызов метода «Shift»;

«Удаление» - осуществление метода «Delete».

Класс «Sportsman» - спортсмен (описанная предметная область с её полями и названием класс), включает в себя основные методы:

«CompareTo» -переопределение метода интерфейса «IComparable», который сравнивает текущий экземпляр с другим объектом того же типа и возвращает целое число, которое показывает, расположен ли текущий экземпляр перед, после или на той же позиции в порядке сортировки, что и другой объект;

«Compare_Enum» -метод, который осуществляет проверку наличиявида спорта считанного из файла в виде спорта указанным в перечислении «Enum».

3.2 Описание работы методов

Метод «Add» - вызывается при нажатии пунктов меню «Файл - Открыть» и «Данные - Вставка». Сам алгоритм работы данного метода представлен на рисунке 3.1.

Размещено на http://www.allbest.ru/

[Введите текст]

Рисунок 3.1 - Блок схема метода «Add»

Метод «Find_v2» -осуществляет сам обход бинарного дерева (является практически основным методом программы). Данный метод не вызывается посредством меню, а выполняет роль второстепенного метода (подпрограммы) для остальных методов (таких как: «Find_v1», «Shift», «Delete»).

Алгоритм обхода (метод «Find_v2») представлен на рисунке 3.2.

Рисунок 3.2 - Блок схема метода «Find_v2»

Метод «Shift» - метод для осуществления замены элементов в дереве. Сам алгоритм заключается в следующем:

произвести поиск элемента с помощью обхода (метода «Find_v2»);

заменить найденных элемент на новый элемент файле;

произвести перестройку дерева с помощью метода «Add», алгоритм которого представлен на рисунке 3.1.

Более подробно алгоритм работы метода «Shift» представлен на рисунке 3.3.

Рисунок 3.3 - Блок схема метода «Shift»

Метод «Max»-осуществляет поиск максимального элемента в дереве по средством операторов отношения. Алгоритм работы представлен на рисунке 3.4.

Рисунок 3.4 - Блок схема метода «Max»

Метод «Delete» - удаляет элемент из бинарного дерева. Удаление элемента в бинарном дереве включает в себя 3 случая[8]:

удаляемый элемент не имеет сыновей, в данном случае такой элемент называется листом и заменяется просто на пустое значение. Данный случай представлен на рисунке 3.5 (удаляемый элемент выделен синим цветом).

Рисунок 3.5 - Удаление элемента из бинарного дерева (случай 1)

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

Рисунок 3.6 - Удаление элемента из бинарного дерева (случай 2)

удаляемый элемент имеет и левого и правого сына. В данной ситуации требуется найти максимальный элемент из левого поддерева удаляемого элемента (либо минимальный элемент из правого поддерева удаляемого элемента) и переместить его на место удаляемого узла. Посмотреть этапы удаления элемента (имеющего двух потомков) из бинарного дерева можно на рисунке 3.7.

Рисунок 3.7 - Удаление элемента из бинарного дерева (случай 3)

Алгоритм работы метода «Delete» более подробно можно увидеть на рисунке 3.8, с выполнением всех ситуаций удаления элемента из бинарного дерева.

Рисунок 3.8 - Блок схема метода «Delete»

Метод «Find_v1»- метод поиска элемента в бинарном дереве, способом обхода «В глубину - сверху вниз (префиксный обход)», по заданному ключу. При использовании данному метода автоматически происходит запуск метода «Find_v2» - Обход (рисунок 3.2), в которой происходит поиск данному элемента и возвращает его обратно в «Find_v1» где происходят второстепенные действия (выделение найденного элемента в таблицу и дереве). Блок схема метода «Find_v1» представлена на рисунке 3.9.

Рисунок 3.9 - Блок схема метода «Find_v1»

Оставшиеся методы «Download» и «Save» - аналогичны методу «Find_v2», то есть такой же алгоритм, но вместо «Процессов» выполняемых после удовлетворения «Решения» происходит «Загрузка» (метод «Download») бинарного дерева в соответствующие компоненты справочно- информационной системы или «Выгрузка» (метод «Save») бинарного дерева в файл.

3.3 Структура программного продукта

Программа состоит из двух классов:

класс «Node» - узел бинарного дерева, элемента класса отображены в таблице 3.1;

класс «Sportsman»- спортсмен (предметная область), элементы описаны в таблице 3.2.

Таблица 3.1 - Элементы класса «Node»

Имя

Вид элемента

Тип

Спецификатор

Описание

1

2

3

4

5

Value

Поле

T:IComparable

Public

Содержимое узла бинарного дерева

Left

Поле

Node<T>

Private

Ссылка на левого сына

Right

Поле

Node<T>

Private

Ссылка на правого сына

Parent

Поле

Node<T>

Private

Ссылка на отца

Node (T Value)

Конструктор

-

public

Инициализация поля «Value»

Add (T Value)

Метод

Void

Public

Добавлениеузлавбинарноедерево

Find_v1 (string Search)

Метод

Void

Public

Поиск элемента в бинарном дереве

Shift (string Search, string New)

Метод

Void

Public

Замена элемента в бинарном дереве

Delete (string Search)

Метод

Void

Public

Удаление элемента из бинарного дерева

Max (Node<T> Data)

Метод

Node<T>

Public

Поиск макс. элемента в дереве

Download (TreeView Tree,DataGridView Table)

Метод

Void

Public

Загрузка бинарного дерева в «Таблицу» и «Дерево»

Save (string Path)

Метод

Void

Public

Сохранение бинарного дерева в файл

Find_v2 (string Search)

Метод

Node<T>

Public

Обход бинарного дерева

Таблица 3.2 - Элементы класса «Sportsman»

Имя

Вид элемента

Тип

Спецификатор

Описание

1

2

3

4

5

FIO

Поле

string

Private

ФИО

age

Поле

int

Private

Возраст

wins

Поле

int

Private

Кол-во побед

view

Перечисление

Enum

Private

Вид спорта

Sportsman (

string FIO, int age, int wins, string view)

Конструктор

-

Public

Инициализация полей: FIO, age, wins,view

4. Описание интерфейса

Интерфейс - совокупность возможностей, способов и методов взаимодействия двух систем (любых, а не обязательно являющиеся вычислительными или информационными), устройств или программ для обмена информацией между ними, определённая их характеристиками, характеристиками соединения, сигналов обмена и т. п. В случае, если одна из взаимодействующих систем - человек, чаще говорят лишь о второй системе, то есть об интерфейсе той системы, с которой человек взаимодействует[10].

Первый запуск программы вызывает следующее окно, в котором доступны лишь 2 пункта меню (и 3 пункта подменю), данное окно изображено на рисунке 4.1.

Рисунок 4.1 - Интерфейс справочно-информационной системы при первом запуске

Как видно по рисунку первоначально доступны лишь пункты меню «Файл» и «О программе», и каждой пункт меню содержит свои подпункты, которые изображены на рисунке 4.2.

Рисунок 4.2 - Первоначальные подпункты меню пунктов «Файл» и «О программе»

При первом запуске, в программном продукте возможны только следующие функции:

«Файл - Открыть» - позволяет открыть файл *txtформата для организации бинарного дерева и осуществления с данной информацией необходимых действий (таких как поиск, удаление и т.д.);

«О программе - Об авторе» - открывает окно, содержащее информацию об авторе программного продукта. Данное окно изображено на рисунке 4.3;

Рисунок 4.3 - Окно появляющееся при нажатии пункта меню «О программе - Об авторе»

«О программе - Справка» - при нажатии данного пункта появляется окно, которое содержит информацию по работе с данной справочно-информационной системой (рисунок 4.4).

Рисунок 4.4 - «О программе - Справка»

После открытия файла (для начало работы с информацией) «Файл - Открыть» интерфейс принимает следующую новую форму (пункты меню, расширение столбов таблицы, загрузка информации в программу и т.д.). Данное окно изображено на рисунке 4.5.

Рисунок 4.5 - Интерфейс программы после открытия файла

Если при считывании файла (информации в справочно-информационную систему) были обнаружены некорректные записи, то произойдёт вызов окна, на котором изображено количество данных некорректных записей (рисунок 4.6).

Рисунок 4.6 - Окно отображающее количество некорректных записей

Рисунок 4.7 - Пункты меню после открытия файла

Становятся доступны следующие пункты меню (рисунок 4.7):

«Файл - Сохранить» - сохранить в текущий открытый файл всё бинарное дерево, со всеми изменениями;

«Файл - Сохранить как» - сохранить бинарное дерево со всеми изменениями в новый файл (указание пути сохранения файла предоставляется пользователю);

4.1 Описание функций редактирования исходных данных

«Данные - Вид»- позволяет изменить вид отображения информацию. Доступны 2 вида: «Таблица» (по умолчанию) и «Дерево» - визуализация информации в виде дереве (рисунок 4.8);

Рисунок 4.8 - Отображение информации в виде «Дерева»

«Данные - Вставка» - даёт возможность пользователю добавить в бинарное дерево элемент. Как это происходит изображено на рисунке 4.9;

Рисунок 4.9 - Окно «Вставка»

«Данные - Поиск» - позволяет произвести поиск элемента по ключу (рисунок4.10), либо найти максимальный элемент в бинарном дереве (рисунок 4.11). После выполнения поиска (любым из предложенных) в «Таблице» (рисунок 4.12) и «Дереве» (рисунок 4.13) произойдёт выделение найденных элементов;

Рисунок 4.10 - Окно «Поиск элемента»

Рисунок 4.11 - Окно «Поиск максимального элемента»

Рисунок 4.12 - «Данные - Вид - Таблица» после выполнения метода «Данные - Поиск - Поиск элемента»

Рисунок 4.13 - «Данные - Вид - Дерево» после выполнения метода «Данные - Поиск - Поиск максимального элемента»

«Данные - Изменение» - позволяет изменить уже существующие элементы в бинарном дереве на указанный (в отдельном окне) новый элемент. При нажатии данного пункта меню, произойдёт вызов нового окна «Изменение», в котором необходимо ввести «Старое значение» и «Новое значение», данное окно представлено на рисунке 4.15;

Рисунок 4.14 - Окно «Изменение»

«Данные - Удаление» - даёт возможность удалить элемент из бинарного дерева. Работа с данным пунктом изображена на рисунке 4.16;

Рисунок 4.15 - Окно «Удаление»

При работе с такими пунктами меню как: «Данные - Вставка», «Данные - Поиск - Поиск элемента», «Данные - Изменение», «Данные - Удаление» предусмотрена система «Сохранение информации», то есть если в любом из окон (пунктов меню перечисленных выше) присутствует какая- либо информация, то будет сработана данная система и появится окно (рисунок 4.17) с запросом «В текстовом поле обнаружена информация, вы уверены что хотите выйти?» с возможностью ответа «Да» или «Нет». При нажатии на кнопку «Да» - произойдёт выход из текущего окна без сохранения информации, при нажатии на кнопку «Нет» - произойдёт возврат обратно в текущее окно.

Рисунок 4.16- Запрос о сохранение текущей информации

4.2 Работа с файлом

Если при работе со справочно-информационной системой (с открытым файлом) попытаться выполнить пункт «Файл - Открыть» (то есть открыть новый файл) или просто при нажатии на кнопку «Закрыть» (выход из программы), произойдёт автоматический запуск окна (рисунок 4.18) с запросом «Сохранить информацию?», если будет нажата кнопка «Да» - произойдёт сохранение бинарного дерева в текущий файл, кнопка «Нет» - означает закрыть программу без сохранения информации, то есть очистка текущей сессии (рисунок 4.19), кнопка «Отмена» - вернуться обратно в программу без выполнения каких либо действий.

Рисунок 4.17 - Окно с запросом о сохранении текущей информации

Рисунок 4.18 - Окно, сообщающее, что данная сессия обнулена

Заключение

В ходе работы были изучены теоретические сведения и закреплены знания, полученные ранее при изучении дисциплины «Конструирование программ и языки программирования». А так же были практически применены полученные знания при выполнении данной работы.

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

Программа была разработана на языке программирования C#, с организацией удобного пользовательского интерфейса.

В процессе выполнения курсового проекта были решены следующие задачи:

изучена организация бинарных деревьев, их свойств;

реализовано бинарное дерево на языке программирования C#;

создано полноценное приложение (со всеми функциями) по работе с информацией, организованной в виде бинарного дерева и осуществления визуализации данной информации.

К достоинствам программного продукта можно отнести:

возможность выполнения операций таких как: поиск (по ключу и максимального элемента), удаление данных, чтение информации из файла в бинарное дерево, сохранение бинарного дерева в файл, отображение информации в двух видах («Таблица» и «Дерево»), изменение уже имеющейся информации, добавление данных уже в сформированное бинарное дерево;

удобство интерфейса;

простота и надёжность.

Результатом выполнения курсового проекта является сформированное «Бинарное дерево» которое можно отобразить в виде «Таблицы» и «Дерева», включающая в себя большое количество методов, таких как: «Find_v1», «Add», «Shift», «Delete», «Find_v2», «Save» и так далее.

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

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

Список использованных источников

бинарный дерево листинг программа

1. Левитин А.В. Алгоритмы: введение в разработку и анализ. - Москва: Издательский дом Вильямс, 2006. - 65 с.

2. Ахо А.В. Структуры данных и алгоритмы /Д.Д. Хопкрофт, Д.Д. Ульман. - Издательский дом Вильямс, 2000. - 92 с.

3. Джозеф А. C# 5.0. Справочник. Полное описание языка. - Издательский дом Вильямс, 2013. - 1008 с.

4. Скит Д. C#: программирование для профессионалов. - Издательский дом Вильямс, 2011. - 544 с.

5. CSharp [Электронный ресурс]. - Режим доступа: http://ru.wikipedia.org/wiki/C_Sharp. - Дата доступа: 20.05.2014.

6. Нейгел К. VisualC#: полный курс. - Издательство «Диалектика», 2010. - 236 с.

7. Деревья выражений [Электронный ресурс]. - Режим доступа: http://msdn.microsoft.com/ru-ru/library/bb397951.aspx. - Дата доступа: 22.05.2014.

8. Павловская Т.А. C#. Программирование на языке высокого уровня: учебник для вузов. - СПб.: Питер, 2007. - 432 с.

Приложение

Листинг программы

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

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using System.IO; //Файлы

using System.Text.RegularExpressions; //Регулярные выражения

namespace Курсовая_работа

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

static StreamReader Read;

static string Path;

static int k = 0;

Node<Sportsman> ekz = null; //Экземпляр дерева

class Node<T> where T : IComparable //Дерево

{

public T Value;

private Node<T> Left = null;

private Node<T> Right = null;

private Node<T> Parent = null;

public Node(T Value) //Конструктор

{

this.Value = Value;

}

public void Add(T Value) //Добавление

{

try

{

if (this.Value == null) //Если корень пуст

{

this.Value = Value;

}

else

{

Node<T> Data = this;

bool Stop = false;

while (!Stop)

{

if ((Data.Value as Sportsman).CompareTo((Value as Sportsman)) == 0) //Одинаковые

{

thrownewException("Невозможно добавить 2 одинаковых элемента в дерево");

}

if ((Data.Value as Sportsman).CompareTo((Value as Sportsman)) == 1) //Меньше Узла

{

if (Data.Left == null) //Если левый сын "Узла" пуст

{

Data.Left = new Node<T>(Value); //Новый узел

Data.Left.Parent = Data; //Отмечаем его родителя

Stop = true; //Остановиться

}

else //Значит делаем текущим (Data) - левого сына (Data.Left)

{

Data--; //Сделать текущим левого сына

}

}

else if ((Data.Value as Sportsman).CompareTo((Value as Sportsman)) == -1) //Больше

{

if (Data.Right == null) //Если правый сын "Узла" пуст

{

Data.Right = new Node<T>(Value); //Новый узел

Data.Right.Parent = Data; //Отмечаем его родителя

Stop = true; //Остановиться

}

else //Значит делаем текущим (Data) - правого сына (Data.Right)

{

Data++; //Сделать текущим правого сына

}

}

} //While(stop)

} //else (Если "Корня" нет)

}

catch (Exceptionerror)

{

k++;

MessageBox.Show(error.Message+"\""+(ValueasSportsman).FIO_OutPut+"\"\nНажмите ОК чтобы продолжить","Ошибка организации дерева", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

} //Add

public static TreeNode[] Coloor = null;

public void Find_v1(string Search,DataGridView Table, TreeView Tree) //Поиск элемента в дереве

{

if (Find_v2(Search) != null)

{

Node<T> Data = Find_v2(Search);

int i=0;

bool Stop = false;

while (Table.Rows.Count>i)

{

if (Table.Rows[i].DefaultCellStyle.BackColor == Color.Red)

{

Table.Rows[i].DefaultCellStyle.BackColor = Color.White;

break;

}

else

{

i++;

}

}

if (Coloor != null)

{

Tree.SelectedNode = Coloor[0];

Tree.SelectedNode.BackColor = Color.White;

}

i=0;

while (Stop!=true)

{

if (Table[0, i].Value.ToString() == Search)

{

Table.Rows[i].DefaultCellStyle.BackColor = Color.Red;

TreeNode[] Find = Tree.Nodes.Find(Search,true);

Coloor = Find;

Tree.SelectedNode = Find[0];

Tree.SelectedNode.BackColor = Color.Red;

Stop = true;

}

else

{

i++;

}

}

MessageBox.Show("Найденный элемент выделен красным цветом.\nДля снятия выделения цветом, кликните левой кнопкой мыши в любом месте строки", "Информация", MessageBoxButtons .OK, Message BoxIcon.Information);

}

else

{

MessageBox.Show("Данного спортсмена не существует", "Ошибка поиска", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

public Node<T> Find_v2(string Search) //Обход (поиск) - только для: Shfit (замена) и Delete (удаления)

{

try

{

Stack<Node<T>> Stack = new Stack<Node<T>>();

Node<T> Data = this;

bool Stop = false;

if (Data != null) //Если корень не пустой

{

Stack.Push(Data);

while (Stack.Count > 0)

{

Data = Stack.Pop();

while (Stop != true)

{

if ((Data.Value as Sportsman).CompareTo(Search) == 0)

{

return Data;

}

else if (Data.Left != null && Data.Right != null)

{

Stack.Push(Data.Right);

Data--; //Сделать текущим левого сына

}

else if (Data.Left != null && Data.Right == null)

{

Data--; //Сделать текущим левого сына

}

else if (Data.Left == null && Data.Right != null)

{

Stack.Push(Data.Right);

Stop = true;

}

else

{

Stop = true;

}

}

if (Stack.Count > 0)

{

Stop = false;

}

} //while (Stop)

} //if (Если корень не пуст)

else //Поиск произошёл неудачно

{

thrownewException("Отсутствует корень дерева");

}

}

catch (Exceptionerror)

{

MessageBox.Show(error.Message + "\nНажмите ОК чтобы продолжить", "Ошибка обхода дерева", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

returnnull; //Вернуть пустое значение, т.к. поиск произошёл неудачно

} //Find

public void Shift(string Search, string New) //Замена

{

if (Find_v2(Search) != null)

{

Node<T> Data = Find_v2(Search);

(Data.Value as Sportsman).FIO_OutPut = New;

Read = new StreamReader(Path, Encoding.Default);

string str;

str = Read.ReadToEnd();

//str = str.Replace(Search, New);

Regex Regular = new Regex(Search);

str = Regular.Replace(str, New);

Read.Close();

StreamWriter Write = new StreamWriter(Path, false, Encoding.Default);

Write.Write(str);

Write.Close();

}

else

{

MessageBox.Show("Данного спортсмена не существует", "Ошибка изменения", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

public void Delete(string Search)

{

try

{

if (Find_v2(Search) != null)

{

Node<T> Data = Find_v2(Search);

if (Data.Left == null&&Data.Right == null) //СЛУЧАЙ 1: Отсутствуют оба сына (у удаляемого элемента)

{

if (Data.Parent.Left != null&& (Data.ValueasSportsman).CompareTo(Data.Parent.Left.Value) == 0) //Определяем, для отца (удаляемого элемента) мы левый сын ?

{

Data.Parent.Left = null;

}

elseif (Data.Parent.Right!=null&& (Data.ValueasSportsman).CompareTo(Data.Parent.Right.Value) == 0) //Определяем, для (удаляемого элемента) отца мы правый сын ?

{

Data.Parent.Right = null;

}

Data.Value = default(T);

Data = null;

}

else if (Data.Left != null && Data.Right == null) //СЛУЧАЙ 2: Есть только левый сын (у удаляемого элемента)

{

Node<T> Stock = Data.Left; //Stock - запас

Data.Left = null; //Удаление связи между отцом (текущим узлом) и левым сыном

if (Data.Parent != null)

{

Stock.Parent = Data.Parent;

if (Data.Parent.Left != null && (Data.Value as Sportsman).CompareTo(Data.Parent.Left.Value) == 0) //Определяем, для отца (удаляемого элемента) мы левый сын ?

{

Data.Parent.Left = Stock;

}

else if (Data.Parent.Right != null && (Data.Value as Sportsman).CompareTo(Data.Parent.Right.Value) == 0) //Определяем, для (удаляемого элемента) отца мы правый сын ?

{

Data.Parent.Right = Stock;

}

Data = null; //Очистка памяти

}

else

{

Data.Value = Stock.Value;

}

}

else if (Data.Left == null && Data.Right != null) //СЛУЧАЙ 2.1: Есть только правый сын (у удаляемого элемента)

{

Node<T> Stock = Data.Right; //Stock - запас

Data.Right = null; //Удаление связи между отцом (текущим узлом) и правым сыном

if (Data.Parent != null)

{

Stock.Parent = Data.Parent;

if (Data.Parent.Left != null && (Data.Value as Sportsman).CompareTo(Data.Parent.Left.Value) == 0) //Определяем, для отца (удаляемого элемента) мы левый сын ?

{

Data.Parent.Left = Stock;

}

else if (Data.Parent.Right != null && (Data.Value as Sportsman).CompareTo(Data.Parent.Right.Value) == 0) //Определяем, для (удаляемого элемента) отца мы правый сын ?

{

Data.Parent.Right = Stock;

}

Data = null; //Очистка памяти

}

else

{

Data.Value = Stock.Value;

}

}

else if (Data.Left != null && Data.Right != null) //СЛУЧАЙ 3: Есть оба сына (у удаляемого элемента)

{

Node<T>Data2 = Max(Data.Left); //Data2 - максимальный элемент из левого поддерева

if (Data2.Left == null&&Data2.Right == null) //Если Data2 (максимальный из левого поддерева) не имеет сынов

{

if (Data.Parent != null) //Если удаляемый элемент не корень

{

if (Data2.Parent.Left != null && (Data2.Value as Sportsman).CompareTo(Data2.Parent.Left.Value) == 0) //Определяем, для отца мы левый сын ?

{

Data2.Parent.Left = null;

}

else if (Data2.Parent.Right != null && (Data2.Value as Sportsman).CompareTo(Data2.Parent.Right.Value) == 0) //Определяем, для отца мы правый сын ?

{

Data2.Parent.Right = null;

}

Data2.Parent = Data.Parent;

if (Data.Parent.Left != null && (Data.Value as Sportsman).CompareTo(Data.Parent.Left.Value) == 0) //Определяем, для отца (удаляемого элемента) мы левый сын ?

{

Data.Parent.Left.Value = Data2.Value;

}

else if (Data.Parent.Right != null && (Data.Value as Sportsman).CompareTo(Data.Parent.Right.Value) == 0) //Определяем, для отца (удаляемого элемента) мы правый сын ?

{

Data.Parent.Right.Value = Data2.Value;

}

Data = null;

}

else //Значит удаляемый элемент - это корень

{

Data.Value = Data2.Value;

if (Data2.Parent.Left != null && (Data2.Value as Sportsman).CompareTo(Data2.Parent.Left.Value) == 0) //Определяем, для отца мы левый сын ?

{

Data2.Parent.Left = null;

}

else if (Data2.Parent.Right != null && (Data2.Value as Sportsman).CompareTo(Data2.Parent.Right.Value) == 0) //Определяем, для отца мы правый сын ?

{

Data2.Parent.Right = null;

}

}

}

else if (Data2.Left != null) //Если Data2 (максимальный из левого поддерева) имеет левого сына

{

Node<T> Stock = Data2.Left; //Stock - запас

Data2.Left = null; //Удаление связи между отцом (текущим узлом) и левым сыном

Data2.Parent.Right = Stock;

Stock.Parent = Data2.Parent;

if (Data.Parent != null) //Если удаляемый элемент не корень

{

Data2.Parent = Data.Parent;

if (Data.Parent.Left != null&& (Data.ValueasSportsman).CompareTo(Data.Parent.Left.Value) == 0) //Определяем, для отца (удаляемого элемента) мы левый сын ?

{

Data.Parent.Left.Value = Data2.Value;

}

else if (Data.Parent.Right != null && (Data.Value as Sportsman).CompareTo(Data.Parent.Right.Value) == 0) //Определяем, для отца (удаляемого элемента) мы правый сын ?

{

Data.Parent.Right.Value = Data2.Value;

}

Data = null;

}

else //Значит удаляемый элемент - это корень

{

Data.Value = Data2.Value;

}

}

}

else //Была обнаружена ошибка в дереве (т.к. не один из критериев не подходит)

{

thrownewException("Дерево построенно с ошибкой");

}

}

else

{

MessageBox.Show("Данного спортсмена не существует", "Ошибка удаления", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

catch (Exceptionerror)

{

MessageBox.Show(error.Message + "\nНажмите ОК чтобы продолжить", "Ошибка удаления", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

} //Delete

publicNode<T>Max(Node<T>Data) //Поиск максимального элемента

{

bool Stop = false;

while (Stop!=true)

{

if (Data.Right != null && Data < Data.Right)

{

Data++; //Сделать текущим правого сына

}

else

{

Stop = true;

}

}

return Data;

}

public void Download (TreeView Tree,DataGridView Table)

{

try

{

Table.Rows.Clear(); //Таблица

Tree.Nodes.Clear(); //Дерево

Stack<Node<T>> Stack = new Stack<Node<T>>();

TreeNode[] Find;

Node<T> Data = this;

bool Stop = false;

Tree.Nodes.Add((Data.Value as Sportsman).FIO_OutPut, (Data.Value as Sportsman).FIO_OutPut);

Find = Tree.Nodes.Find((Data.Value as Sportsman).FIO_OutPut, true);

Tree.SelectedNode = Find[0];

Tree.SelectedNode.ToolTipText = "Возраст: " + (Data.Value as Sportsman).age_OutPut + "\nКоличество побед: " + (Data.Value as Sportsman).wins_OutPut.ToString() + "\nВид спорта: " + (Data.Value as Sportsman).view_OutPut.ToString();

if (Data != null) //Если корень не пустой

{

Stack.Push(Data);

while (Stack.Count > 0)

{

Data = Stack.Pop();

Table.Rows.Add((Data.Value as Sportsman).FIO_OutPut, (Data.Value as Sportsman).age_OutPut, (Data.Value as Sportsman).wins_OutPut, (Data.Value as Sportsman).view_OutPut);

if (Data.Parent != null) //Если текущий элемент не корень

{

Tree.ShowNodeToolTips = true;

Find = Tree.Nodes.Find((Data.Parent.Value as Sportsman).FIO_OutPut, true);

Tree.SelectedNode = Find[0];

Tree.SelectedNode.Nodes.Add((Data.Value as Sportsman).FIO_OutPut, (Data.Value as Sportsman).FIO_OutPut);

Find = Tree.Nodes.Find((Data.Value as Sportsman).FIO_OutPut, true);

Tree.SelectedNode = Find[0];

Tree.SelectedNode.ToolTipText = "Возраст: " + (Data.Value as Sportsman).age_OutPut + "\nКоличество побед: " + (Data.Value as Sportsman).wins_OutPut.ToString() + "\nВид спорта: " + (Data.Value as Sportsman).view_OutPut.ToString();

}

while (Stop != true)

{

if (Data.Left != null && Data.Right != null)

{

Stack.Push(Data.Right);

Data--; //Сделать текущим левого сына

Table.Rows.Add((Data.Value as Sportsman).FIO_OutPut, (Data.Value as Sportsman).age_OutPut, (Data.Value as Sportsman).wins_OutPut, (Data.Value as Sportsman).view_OutPut); //Добавление в дерево

Find = Tree.Nodes.Find((Data.Parent.Value as Sportsman).FIO_OutPut, true);

Tree.SelectedNode = Find[0];

Tree.SelectedNode.Nodes.Add((Data.Value as Sportsman).FIO_OutPut, (Data.Value as Sportsman).FIO_OutPut);

Find = Tree.Nodes.Find((Data.Value as Sportsman).FIO_OutPut, true);

Tree.SelectedNode = Find[0];

Tree.SelectedNode.ToolTipText = "Возраст: " + (Data.Value as Sportsman).age_OutPut + "\nКоличество побед: " + (Data.Value as Sportsman).wins_OutPut.ToString() + "\nВид спорта: " + (Data.Value as Sportsman).view_OutPut.ToString();

}

else if (Data.Left != null && Data.Right == null)

{

Data--; //Сделать текущим левого сына

Table.Rows.Add((Data.Value as Sportsman).FIO_OutPut, (Data.Value as Sportsman).age_OutPut, (Data.Value as Sportsman).wins_OutPut, (Data.Value as Sportsman).view_OutPut); //Добавление в дерево

Find = Tree.Nodes.Find((Data.Parent.Value as Sportsman).FIO_OutPut, true);

Tree.SelectedNode = Find[0];

Tree.SelectedNode.Nodes.Add((Data.Value as Sportsman).FIO_OutPut, (Data.Value as Sportsman).FIO_OutPut);

Find = Tree.Nodes.Find((Data.Value as Sportsman).FIO_OutPut, true);

Tree.SelectedNode = Find[0];

Tree.SelectedNode.ToolTipText = "Возраст: " + (Data.Value as Sportsman).age_OutPut + "\nКоличество побед: " + (Data.Value as Sportsman).wins_OutPut.ToString() + "\nВид спорта: " + (Data.Value as Sportsman).view_OutPut.ToString();

}

else if (Data.Left == null && Data.Right != null)

{

Stack.Push(Data.Right);

Stop = true;

}

else

{

Stop = true;

}

} //while (Stop)

if (Stack.Count > 0)

{

Stop = false;

}

} //while (Stack)

} //if (Если корень не пуст)

else //Поиск произошёл неудачно

{

thrownewException("Отсутствует корень дерева");

}

}

catch (Exceptionerror)

{

MessageBox.Show(error.Message + "\nНажмите ОК чтобы продолжить", "Ошибка загрузки бинарноего дерева в \"Таблицу и Дерево\"", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

} //Download

public void Save(string Path2) //Сохранение

{

Path = Path2;

StreamWriter Write = new StreamWriter(Path,false,Encoding.Default);

Stack<Node<T>> Stack = new Stack<Node<T>>();

Node<T> Data = this;

bool Stop = false;

if (Data != null) //Если корень не пустой

{

Stack.Push(Data);

while (Stack.Count > 0)

{

Data = Stack.Pop();

Write.WriteLine((Data.Value as Sportsman).FIO_OutPut + ";" + (Data.Value as Sportsman).age_OutPut + ";" + (Data.Value as Sportsman).wins_OutPut + ";" + (Data.Value as Sportsman).view_OutPut);

while (Stop != true)

{

if (Data.Left != null && Data.Right != null)

{

Stack.Push(Data.Right);

Data--; //Сделать текущим левого сына

Write.WriteLine((Data.Value as Sportsman).FIO_OutPut + ";" + (Data.Value as Sportsman).age_OutPut + ";" + (Data.Value as Sportsman).wins_OutPut + ";" + (Data.Value as Sportsman).view_OutPut);

}

else if (Data.Left != null && Data.Right == null)

{

Data--; //Сделать текущим левого сына

Write.WriteLine((Data.Value as Sportsman).FIO_OutPut + ";" + (Data.Value as Sportsman).age_OutPut + ";" + (Data.Value as Sportsman).wins_OutPut + ";" + (Data.Value as Sportsman).view_OutPut);

}

else if (Data.Left == null && Data.Right != null)

{

Stack.Push(Data.Right);

Stop = true;

}

else

{

Stop = true;

}

}

if (Stack.Count > 0)

{

Stop = false;

}

} //while (Stop)

Write.Close();

} //if (Если корень не пуст)

} //Save

public static Node<T> operator ++(Node<T> Data) //Сделать текущим правого сына

{

return Data = Data.Right;

}

public static Node<T> operator --(Node<T> Data) //Сделать текущим левого сына

{

return Data = Data.Left;

}

public static bool operator >(Node<T> Data,Node<T> Data2) //Сравнение "Больше"

{

if ((Data.Value as Sportsman).CompareTo((Data2.Value as Sportsman)) == 1)

{

return true;

}

else

{

return false;

}

}

public static bool operator <(Node<T> Data, Node<T> Data2) //Сравнение "Меньше"

{

if ((Data.Value as Sportsman).CompareTo((Data2.Value as Sportsman)) == -1)

{

return true;

}

else

{

return false;

}

}

} //Дерево

class Sportsman: IComparable //Класс "Спортсмен"

{

string FIO;

int age;

int wins;

enum views { Футбол, Хоккей, Теннис, Биатлон, Формула_1, Баскетбол, Бокс, Велоспорт, Волейбол, Гольф };

views view;

public string[] sports = Enum.GetNames(typeof(views));

publicstringFIO_OutPut //Свойство для получения "FIO"

{

get

{

return this.FIO;

}

set

{

FIO = value;

}

}

public int age_OutPut //Свойство для получения "age"

{

get

{

return this.age;

}

}

public int wins_OutPut //Свойство для получения "wins"

{

get

{

return this.wins;

}

}

public string view_OutPut //Свойство для получения "view"

{

get

{

return Enum.GetName(typeof(views),view);

}

}

publicSportsman() //Пустой конструктор без параметров (для обращения к методам)

{

}

public Sportsman(string FIO, int age, int wins, string view)

{

this.FIO = FIO;

this.age = age;

this.wins = wins;

this.view = (views)Enum.Parse(typeof(views), view);

}

public int CompareTo (object Data) //Сравнение с "Object"

{

if (string.Compare(this.FIO,(Data as Sportsman).FIO) > 0) return 1;

if (string.Compare(this.FIO, (Data as Sportsman).FIO) < 0) return -1;

else return 0;

}

public int CompareTo(string Data) //Сравнение со "String"

{

if (string.Compare(this.FIO, Data)==1) return 1;

if (string.Compare(this.FIO, Data)==-1)return -1;

else return 0;

}

public bool Compare_Enum(string view)

{

if (Enum.IsDefined(typeof(views), view) == true)

{

return true;

}

else

{

return false;

}

}

} //Класс "Sportsmen"

private void открытьToolStripMenuItem_Click(object sender, EventArgs e)

{

if (ekz == null) //Если корня нет (то есть дерево пусто)

{

openFileDialog1.Filter = "Текстовый файл | *.txt";

if (openFileDialog1.ShowDialog() == DialogResult.OK)

{

сохранитьToolStripMenuItem.Visible = true;

данныеToolStripMenuItem.Visible = true;

сохранить КакToolStripMenuItem.Visible = true;

string[] str;

Read = new StreamReader(openFileDialog1.FileName, Encoding.Default); //Cоздание «потокового читателя» и связывание его с файловым потоком

Path = openFileDialog1.FileName; //Сохранение пути к текущему файлу

string strokFile = Read.ReadLine();

Sportsman view = new Sportsman();

if (strokFile != null)

{

while (strokFile != null) //Загрузка файла в дерево

{

str = strokFile.Split(';'); //Отделение слов

try

{

if (ekz == null) //Если корня нет

{

if (view.Compare_Enum(str[3]) == true)

{

ekz = new Node<Sportsman>(new Sportsman(str[0], Convert.ToInt32(str[1]), Convert.ToInt32(str[2]), str[3]));

}

else

{

k++;

}

}

else

{

if (view.Compare_Enum(str[3]) == true)

{

ekz.Add(new Sportsman(str[0], Convert.ToInt32(str[1]), Convert.ToInt32(str[2]), str[3]));

}

else

{

k++;

}

}

}

catch (Exception)

{

k++;

}

finally

{

strokFile = Read.ReadLine();

}

}

ekz.Download(treeView1, dataGridView1);

if (k > 0)

{

MessageBox.Show("Обнаруженно некоректных записей: " + k.ToString(), "Открыть файл", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

Read.Close();

}

}

}

else

{

DialogResult = MessageBox.Show("Сохранить текущий файл ?", "Информация", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

if (DialogResult == DialogResult.Yes)

{

ekz.Save(Path);

}

else if (DialogResult == DialogResult.No)

{

k = 0;

ekz = null;

сохранитьToolStripMenuItem.Visible = false;

данныеToolStripMenuItem.Visible = false;

сохранитьКакToolStripMenuItem.Visible = false;

dataGridView1.Rows.Clear();

treeView1.Nodes.Clear();

MessageBox.Show("Текущая сессия обнулена, теперь можете открыть новый файл", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

}

}

private void древовидностьToolStripMenuItem_Click(object sender, EventArgs e)

{

dataGridView1.Visible = false;

treeView1.Visible = true;

}

private void таблицаToolStripMenuItem_Click(object sender, EventArgs e)

{

dataGridView1.Visible = true;

treeView1.Visible = false;

}

private void сохранитьToolStripMenuItem_Click(object sender, EventArgs e)

{

ekz.Save(Path);

}

private void изменитьToolStripMenuItem_Click(object sender, EventArgs e)

{

Form2 f = new Form2();

if (f.ShowDialog()==DialogResult.OK)

{

ekz.Shift(f.textBox1.Text, f.textBox2.Text);

ekz.Download(treeView1, dataGridView1);

}

}

private void удалениеToolStripMenuItem_Click(object sender, EventArgs e)

{

Form3 f = new Form3();

f.Text = "Удаление";

f.label1.Text = "Введите значение для удаления";

f.button1.Text = "Удалить";

if (f.ShowDialog() == DialogResult.OK)

{

ekz.Delete(f.textBox1.Text);

ekz.Download(treeView1, dataGridView1);

}

}

private void сохранитьКакToolStripMenuItem_Click(object sender, EventArgs e)

{

saveFileDialog1.Filter = "Текстовый файл | *.txt";

if (saveFileDialog1.ShowDialog() == DialogResult.OK)

{

ekz.Save(saveFileDialog1.FileName);

}

}

private void вставкаToolStripMenuItem_Click(object sender, EventArgs e)

{

Sportsman view = new Sportsman();

Form4 f = new Form4();

for (int i = 0; i < view.sports.Count(); i++)

{

f.comboBox1.Items.Add(view.sports[i]);

}

if (f.ShowDialog() == DialogResult.OK)

{

ekz.Add (new Sportsman(f.textBox1.Text, Convert.ToInt32 (f.textBox2.Text), Convert.ToInt32(f.textBox3.Text), f.comboBox1.Text));

ekz.Download(treeView1,dataGridView1);

}

}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

if (ekz!=null)

{

DialogResult = MessageBox.Show("Сохранить информацию ?", "Информация", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

if (DialogResult == DialogResult.Yes)

{

ekz.Save(Path);

}

else if (DialogResult == DialogResult.No)

{

Dispose();

}

else if (DialogResult == DialogResult.Cancel)

{

ShowDialog();

}

}

}

private void поиск Элемента ToolStripMenuItem_Click(object sender, EventArgs e)

{

Form3 f = new Form3();

f.Text = "Поиск";

f.label1.Text = "Введите значение для поиска";

f.button1.Text = "Поиск";

if (f.ShowDialog() == DialogResult.OK)

{

ekz.Find_v1(f.textBox1.Text, dataGridView1,treeView1);

}

}

public static TreeNode[] Coloor_Blue = null;

private void поискToolStripMenuItem1_Click(object sender, EventArgs e)

{

Node<Sportsman> Data = ekz;

Data = ekz.Max(Data);

if (ekz!= null) //Если корень есть

{

int i = 0;

bool Stop = false;

while (dataGridView1.Rows.Count > i)

{

if (dataGridView1.Rows[i].DefaultCellStyle.BackColor == Color.BlueViolet)

{

dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.White;

break;

}

else

{

i++;

}

}

if (Coloor_Blue!=null)

{

treeView1.SelectedNode = Coloor_Blue[0];

treeView1.SelectedNode.BackColor = Color.White;

}

i = 0;

while (Stop != true)

{

if (dataGridView1[0, i].Value.ToString() == (Data.Value as Sportsman).FIO_OutPut)

{

dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.BlueViolet;

TreeNode[] Find = treeView1.Nodes.Find((Data.Value as Sportsman).FIO_OutPut, true);

treeView1.SelectedNode = Find[0];

treeView1.SelectedNode.BackColor = Color.BlueViolet;

Stop = true;

}

else

{

i++;

}

}

MessageBox.Show("Максимальный элемент выделен феолетовым цветом.\nДля снятия выделения цветом, кликните левой кнопкой мыши в любом месте строки", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

else

{

MessageBox.Show("Данного спортсмена не существует", "Ошибка поиска максимального элемента", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)

{

if (dataGridView1.CurrentRow.DefaultCellStyle.BackColor == Color.Red || dataGridView1.CurrentRow.DefaultCellStyle.BackColor == Color.BlueViolet)

{

dataGridView1.CurrentRow.DefaultCellStyle.BackColor = Color.White;

}

}

private void treeView1_Click(object sender, EventArgs e)

{

if (treeView1.SelectedNode.BackColor == Color.Red || treeView1.SelectedNode.BackColor == Color.BlueViolet)

{

treeView1.SelectedNode.BackColor = Color.White;

}

}

private void обАвтореToolStripMenuItem_Click(object sender, EventArgs e)

{

MessageBox.Show("Выполнил Захаренко Максим Григорьевич ПО-32, 2014 г.\nОснованием для разработки курсового проекта служит задание выданное преподавателем Ясоновым А.А.", "Об авторе", MessageBoxButtons. OK, MessageBoxIcon.Information);

}

private void справкаToolStripMenuItem_Click(object sender, EventArgs e)

{

Form5 f = new Form5();

f.ShowDialog();

}

}

}

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

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace Курсовая_работа

{

public partial class Form2 : Form

{

public Form2()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

if (textBox1.Text != "" && textBox2.Text != "")

{

DialogResult = DialogResult.OK;

Close();}

else if (textBox1.Text != "" && textBox2.Text == "")

{

MessageBox.Show("В поле \"Новое значение\" отсутствует значение", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

else if (textBox1.Text == "" && textBox2.Text != "")

{

MessageBox.Show("В поле \"Старое значение\" отсутствует значение", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);}

}

private void Form2_FormClosing(object sender, FormClosingEventArgs e)

{if ((textBox1.Text!="" && DialogResult!= DialogResult.OK) || (textBox2.Text!="" && DialogResult!= DialogResult.OK))


Подобные документы

  • Сущность объектно-ориентированного подхода в программировании. Описание языков программирования. Использование бинарных деревьев для поиска данных, алгоритмы их обхода. Разработка Windows-приложения автоматизированной системы "Планета животных".

    курсовая работа [3,7 M], добавлен 16.09.2016

  • Язык Паскаль - процедурно-ориентированный язык высокого уровня, его основные достоинства. Разработка программ для решения задач. Выбор метода обработки информации. Форма представления исходных данных. Разработка алгоритма, его описание, листинг программы.

    курсовая работа [3,6 M], добавлен 17.02.2013

  • Основы программирования на 32-битном Ассемблере, разработка с его помощью программы, демонстрирующей работу одного из разделов ОС Windоws. Описание используемых АРI-функций как интерфейса программирования приложений. Листинг программы, результаты работы.

    курсовая работа [164,5 K], добавлен 18.05.2014

  • Древовидная структура – "Бинарное дерево поиска", его структура и взаимосвязь основных компонентов, исследование в глубину. Описание разработанного программного продукта. Главные функции редактирования исходных данных и принципы работы с файлами.

    курсовая работа [1,6 M], добавлен 13.06.2014

  • Технические средства обеспечения функционирования информационной системы. Проектирование базы данных информационной системы. Разработка веб-приложения – справочно-информационной системы для предприятия. Организация записи информации в базу данных.

    дипломная работа [4,4 M], добавлен 16.05.2022

  • Разработка и реализация проекта информационной системы, предназначенной для хранения сведения о клиентах и недвижимости. Моделирование и реализация информационной системы. Разработка пользовательского интерфейса. Затраты на написание программы и отладку.

    курсовая работа [1,0 M], добавлен 30.06.2022

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

    курсовая работа [224,3 K], добавлен 11.02.2016

  • Составление программы lab3.exe, реализующей удаление элемента из списка перед указанным методом и его сортировку по возрастанию. Описание предикатов, используемых в программе. Проверка на корректный вывод информации. Программа для обхода бинарного дерева.

    контрольная работа [559,3 K], добавлен 20.05.2012

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

    курсовая работа [1,9 M], добавлен 28.05.2014

  • Особенности разработки приложений для операционной системы с помощью императивного, структурированного, объектно-ориентированного языка программирования Delphi. Формальное начало программы. Выделение конца программного блока. Листинг и описание программы.

    курсовая работа [1,2 M], добавлен 04.08.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.