Помощь в написании студенческих работ
Антистрессовый сервис

Построение бинарного дерева

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

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

Построение бинарного дерева (реферат, курсовая, диплом, контрольная)

древо бинарный программный Объектом разработки в курсовой работе является структура данных — бинарное дерево поиска.

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

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

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

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

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

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

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

1. Бинарное дерево

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

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

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

Узел дерева, не имеющий потомков, называется листом.

Пример бинарного дерева представлен на рисунке 1.1.

Рисунок 1.1 — Схематичное изображение бинарного дерева Глубина бинарного дерева — это максимальный уровень листа дерева, иначе говоря, длина самого длинного пути от корня к листу дерева[2].

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

Рисунок 1.2 — Вырожденное бинарное дерево Бинарное дерево будет представлять собой пустое множество, только в случаях отсутствия корня.

1.2 Терминология

Терминология, применяемая для описания бинарных деревьев[3]:

1) узел — это точка, где может возникнуть ветвь;

2) корень — «верхний» узел дерева;

3) ветвь — отрезок, описывающий связь между двумя узлами;

4) лист — узел, из которого не выходят ветви, т. е. не имеющий поддеревьев;

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

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

7) предки данного узла — это все узлы на пути вверх от данного узла до корня;

8) потомки — все узлы, расположенные ниже данного;

9) внутренний узел — узел, не являющийся листом;

10) порядок узла — количество его дочерних узлов;

11) глубина узла — количество его предков плюс единица;

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

13) длина пути к узлу — количество ветвей, которые нужно пройти, чтобы дойди от корня к данному узлу;

14) длина пути дерева (длина внутреннего пути) — сумма длин путей всех его узлов.

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

Существуют три порядка, использующие обход в глубину[4]:

1) Сверху вниз (PreOrder):

а) обработать корень;

б) обход левого поддерева;

в) обход правого поддерева;

2) Слева направо (InOrder):

а) обход левого поддерева;

б) обработать корень;

в) обход правого поддерева;

3) Снизу вверх (PosOrder):

а) обход левого поддерева;

б) обход правого поддерева;

в) обработать корень.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

№ варианта

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

Поля

Записная книжка

Ф.И.О. контактного лица, мероприятие, дата и время мероприятия

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

№ варианта

Ключ

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

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

Ф.И.О.

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

Стека

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3. Описание разработанного Программного продукта

3.1 Описание программных модулей

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

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

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

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

3) «Sub» — метод для осуществления замены элементов в дереве;

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

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

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

7) «Loading» — метод загрузки бинарного дерева в компоненты «DataGridView» и «TreeView»;

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

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

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

2) «Поиск — Поиск элемента» — осуществляется выполнение метода «Quest»;

3) «Поиск — Поиск максимального элемента» — происходит выполнение метода «Top»;

4) «Изменение» — вызов метода «Sub»;

5) «Удаление» — осуществление метода «Removal».

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

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

2) «Compare_Enum» — проверка наличия вида мероприятия в перечислении.

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

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

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

Метод «Scan» — осуществляет сам обход бинарного дерева (является практически основным методом программы). Данный метод не вызывается посредством меню, а выполняет роль второстепенного метода (подпрограммы) для остальных методов (таких как: «Quest», «Sub», «Removal»).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Рисунок 3.5 — Блок схема метода «Removal»

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

Рисунок 3.7 — Блок схема метода «Quest»

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

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

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

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

2) класс «Notebook» — записная книжка (предметная область), элементы описаны в таблице 3.2.

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

Имя

Вид элемента

Тип

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

Описание

Value

Поле

T:IComparable

Public

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

Left

Поле

Node

Private

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

Right

Поле

Node

Private

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

Parent

Поле

Node

Private

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

Node (T Value)

Конструктор

;

public

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

Add (T Value)

Метод

Void

Public

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

Quest (string Search)

Метод

Void

Public

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

Sub (string Search, string New)

Метод

Void

Public

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

Removal (string Search)

Метод

Void

Public

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

Top (Node Data)

Метод

Node

Public

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

Loading (TreeView Tree, DataGridView Table)

Метод

Void

Public

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

Preservation (string Path)

Метод

Void

Public

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

Scan (string Search)

Метод

Node

Public

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

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

Имя

Вид элемента

Тип

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

Описание

FIO

Поле

string

Private

Ф.И.О.

date

Поле

string

Private

Дата

view

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

Enum

Private

Вид мероприятия

Notebook (

string FIO, string date, string view)

Конструктор

;

Public

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Рисунок 4.6 — Окно отображающее количество некорректных записей Рисунок 4.7 — Пункты меню после открытия файла Становятся доступны следующие пункты меню (рисунок 4.7):

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

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

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

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

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

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

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

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

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

7) «Работа с данными — Удаление» — даёт возможность удалить элемент из бинарного дерева.

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

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

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

Заключение

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

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

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

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

Для реализации бинарного дерева поиска были созданы собственные классы «Node» и «Notebook». В итоге разработано приложение, предназначенное для работы с бинарным деревом поиска.

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

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

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

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

1. Бинарное дерево поиска [Электронный ресурс]. — Режим доступа: http://ru.wikipedia.org/wiki/Двоичное_дерево_поиска. — Дата доступа: 09.05.2014.

2. Бинарные деревья в пространстве имён C# [Электронный ресурс]. — Режим доступа: http://msdn.microsoft.com/enus/library/ms379572 (v=vs.80).aspx. — Дата доступа: 11.05.2014.

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

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

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

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

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

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

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

10. Павловская, Т.А. 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 ekz = null; // Экземпляр дерева

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

{

public T Value;

private Node Left = null;

private Node Right = null;

private Node Parent = null;

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

{

this. Value = Value;

}

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

{

try

{

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

{

this. Value = Value;

}

else

{

Node Data = this;

bool Stop = false;

while (! Stop)

{

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

{

throw new Exception («Невозможно добавить 2 одинаковых элемента в дерево»);

}

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

{

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

{

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

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

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

}

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

{

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

}

}

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

{

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

{

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

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

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

}

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

{

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

}

}

} //While (stop)

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

}

catch (Exception error)

{

k++;

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

}

} //Add

public static TreeNode[] Coloor = null;

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

{

if (Scan (Search)≠ null)

{

Node Data = Scan (Search);

int i=0;

bool Stop = false;

while (Table. Rows. Count>i)

{

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

{

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. Green;

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

Coloor = Find;

Tree. SelectedNode = Find[0];

Tree. SelectedNode. BackColor = Color. Green;

Stop = true;

}

else

{

i++;

}

}

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

}

else

{

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

}

}

public Node Scan (string Search) // Обход (поиск)

{

try

{

Stack> Stack = new Stack>();

Node Data = this;

bool Stop = false;

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

{

Stack. Push (Data);

while (Stack. Count > 0)

{

Data = Stack. Pop ();

while (Stop≠ true)

{

if (Data. Left≠null && (Data. Left. Value as Notebook).CompareTo (Search) == 0)

{

return Data;

}

else if (Data. Right≠ null && (Data. Right. Value as Notebook).CompareTo (Search) == 0)

{

return Data;

}

else if (Data≠ null && (Data. Value as Notebook).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 // Поиск произошёл неудачно

{

throw new Exception («Отсутствует корень дерева»);

}

}

catch (Exception error)

{

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

}

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

}

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

{

if (Scan (Search)≠ null)

{

Node Data = Scan (Search);

(Data. Value as Notebook).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 Removal (string Search)

{

try

{

if (Scan (Search)≠ null)

{

Node Data = Scan (Search);

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

{

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

{

Data. Parent. Left = null;

}

else if (Data. Parent. Right≠ null && (Data. Value as Notebook).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 Stock = Data. Left; //Stock — запас

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

if (Data. Parent≠ null)

{

Stock. Parent = Data. Parent;

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

{

Data. Parent. Left = Stock;

}

else if (Data. Parent. Right≠ null && (Data. Value as Notebook).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 Stock = Data. Right; //Stock — запас

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

if (Data. Parent≠ null)

{

Stock. Parent = Data. Parent;

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

{

Data. Parent. Left = Stock;

}

else if (Data. Parent. Right≠ null && (Data. Value as Notebook).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 Data2 = Top (Data. Left); //Data2 — максимальный элемент из левого поддерева

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

{

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

{

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

{

Data2. Parent. Left = null;

}

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

{

Data2. Parent. Right = null;

}

Data2. Parent = Data. Parent;

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

{

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

}

else if (Data. Parent. Right≠ null && (Data. Value as Notebook).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 Notebook).CompareTo (Data2. Parent. Left. Value) == 0) // Определяем, для отца мы левый сын?

{

Data2. Parent. Left = null;

}

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

{

Data2. Parent. Right = null;

}

}

}

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

{

Node 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. Value as Notebook).CompareTo (Data. Parent. Left. Value) == 0) // Определяем, для отца (удаляемого элемента) мы левый сын?

{

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

}

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

{

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

}

Data = null;

}

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

{

Data. Value = Data2. Value;

}

}

}

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

{

throw new Exception («Дерево построенно с ошибкой»);

}

}

else

{

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

}

}

catch (Exception error)

{

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

}

}

public Node Top (Node Data) // Поиск максимального элемента

{

bool Stop = false;

while (Stop≠true)

{

if (Data. Right≠ null && Data < Data. Right)

{

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

}

else

{

Stop = true;

}

}

return Data;

}

public Node Least (Node Data) // Поиск максимального элемента

{

bool Stop = false;

while (Stop≠ true)

{

if (Data. Left≠ null && Data > Data. Left)

{

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

}

else

{

Stop = true;

}

}

return Data;

}

public void Loading (TreeView Tree, DataGridView Table)

{

try

{

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

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

Stack> Stack = new Stack>();

TreeNode[] Find;

Node Data = this;

bool Stop = false;

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

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

Tree. SelectedNode = Find[0];

Tree. SelectedNode. ToolTipText = «Дата и время:» + (Data. Value as Notebook).date_OutPut + «nМероприятие:» + (Data. Value as Notebook).view_OutPut. ToString ();

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

{

Stack. Push (Data);

while (Stack. Count > 0)

{

Data = Stack. Pop ();

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

{

Table. Rows. Add ((Data. Value as Notebook).FIO_OutPut, (Data. Value as Notebook).date_OutPut, (Data. Value as Notebook).view_OutPut);

}

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

{

Tree. ShowNodeToolTips = true;

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

Tree. SelectedNode = Find[0];

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

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

Tree. SelectedNode = Find[0];

Tree. SelectedNode. ToolTipText = «Дата и время:» + (Data. Value as Notebook).date_OutPut + «nМероприятие:» + (Data. Value as Notebook).view_OutPut. ToString ();

}

while (Stop≠ true)

{

if (Data. Left≠ null && Data. Right≠ null)

{

Stack. Push (Data. Right);

Table. Rows. Add ((Data. Left. Value as Notebook).FIO_OutPut, (Data. Left. Value as Notebook).date_OutPut, (Data. Left. Value as Notebook).view_OutPut);

Table. Rows. Add ((Data. Right. Value as Notebook).FIO_OutPut, (Data. Right. Value as Notebook).date_OutPut, (Data. Right. Value as Notebook).view_OutPut);

if (Data. Parent == null) // Значит корень

{

Table. Rows. Add ((Data. Value as Notebook).FIO_OutPut, (Data. Value as Notebook).date_OutPut, (Data. Value as Notebook).view_OutPut);

}

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

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

Tree. SelectedNode = Find[0];

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

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

Tree. SelectedNode = Find[0];

Tree. SelectedNode. ToolTipText = «Дата и время:» + (Data. Value as Notebook).date_OutPut + «nМероприятие:» + (Data. Value as Notebook).view_OutPut. ToString ();

}

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

{

Table. Rows. Add ((Data. Left. Value as Notebook).FIO_OutPut, (Data. Left. Value as Notebook).date_OutPut, (Data. Left. Value as Notebook).view_OutPut);

if (Data. Parent == null) // Значит корень

{

Table. Rows. Add ((Data. Value as Notebook).FIO_OutPut, (Data. Value as Notebook).date_OutPut, (Data. Value as Notebook).view_OutPut);

}

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

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

Tree. SelectedNode = Find[0];

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

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

Tree. SelectedNode = Find[0];

Tree. SelectedNode. ToolTipText = «Дата и время:» + (Data. Value as Notebook).date_OutPut + «nМероприятие:» + (Data. Value as Notebook).view_OutPut. ToString ();

}

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

{

Table. Rows. Add ((Data. Right. Value as Notebook).FIO_OutPut, (Data. Right. Value as Notebook).date_OutPut, (Data. Right. Value as Notebook).view_OutPut);

if (Data. Parent == null) // Значит корень

{

Table. Rows. Add ((Data. Value as Notebook).FIO_OutPut, (Data. Value as Notebook).date_OutPut, (Data. Value as Notebook).view_OutPut);

}

Stack. Push (Data. Right);

Stop = true;

}

else

{

Stop = true;

}

} //while (Stop)

if (Stack. Count > 0)

{

Stop = false;

}

} //while (Stack)

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

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

{

throw new Exception («Отсутствует корень дерева»);

}

}

catch (Exception error)

{

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

}

}

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

{

Path = Path2;

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

Stack> Stack = new Stack>();

Node Data = this;

bool Stop = false;

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

{

Stack. Push (Data);

while (Stack. Count > 0)

{

Data = Stack. Pop ();

while (Stop≠ true)

{

if (Data. Left≠ null && Data. Right≠ null)

{

Stack. Push (Data. Right);

Write. WriteLine ((Data. Left. Value as Notebook).FIO_OutPut +"; «+ (Data. Left. Value as Notebook).date_OutPut +»; «+ (Data. Left. Value as Notebook).view_OutPut);

Write. WriteLine ((Data. Right. Value as Notebook).FIO_OutPut +"; «+ (Data. Right. Value as Notebook).date_OutPut +»; «+ (Data. Right. Value as Notebook).view_OutPut);

if (Data. Parent == null)

{

Write. WriteLine ((Data. Value as Notebook).FIO_OutPut +"; «+ (Data. Value as Notebook).date_OutPut +»; «+ (Data. Value as Notebook).view_OutPut);

}

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

}

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

{

Write. WriteLine ((Data. Left. Value as Notebook).FIO_OutPut +"; «+ (Data. Left. Value as Notebook).date_OutPut +»; «+ (Data. Left. Value as Notebook).view_OutPut);

if (Data. Parent == null)

{

Write. WriteLine ((Data. Value as Notebook).FIO_OutPut +"; «+ (Data. Value as Notebook).date_OutPut +»; «+ (Data. Value as Notebook).view_OutPut);

}

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

}

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

{

Write. WriteLine ((Data. Right. Value as Notebook).FIO_OutPut +"; «+ (Data. Right. Value as Notebook).date_OutPut +»; «+ (Data. Right. Value as Notebook).view_OutPut);

if (Data. Parent == null)

{

Write. WriteLine ((Data. Value as Notebook).FIO_OutPut +"; «+ (Data. Value as Notebook).date_OutPut +»; «+ (Data. Value as Notebook).view_OutPut);

}

Stack. Push (Data. Right);

Stop = true;

}

else

{

Stop = true;

}

}

if (Stack. Count > 0)

{

Stop = false;

}

} //while (Stop)

Write. Close ();

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

}

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

{

return Data = Data. Right;

}

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

{

return Data = Data. Left;

}

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

{

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

{

return true;

}

else

{

return false;

}

}

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

{

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

{

return true;

}

else

{

return false;

}

}

} // Дерево

class Notebook: IComparable // Класс «Записная книжка»

{

string FIO;

string date;

enum views {Благотворительный_праздник, Дефиле, Свадьба, Крестины, День_рождение, Вечеринка, Турнир, Экскурсия, Фестиваль, Спектакль, Выставка, Ярмарка, Конкурс, Марафон, Конгресс, Парад};

views view;

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

public string FIO_OutPut // Свойство для получения «FIO»

{

get

{

return this. FIO;

}

set

{

FIO = value;

}

}

public string date_OutPut // Свойство для получения «date»

{

get

{

return this. date;

}

}

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

{

get

{

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

}

}

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

{

}

public Notebook (string FIO, string date, string view)

{

this.FIO = FIO;

this.date = date;

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

}

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

{

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

if (string. Compare (this.FIO, (Data as Notebook).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;

}

}

} // Класс «Notebook»

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 ();

Notebook view = new Notebook ();

if (strokFile≠ null)

{

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

{

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

try

{

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

{

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

{

ekz = new Node (new Notebook (str[0], str[1], str[2]));

}

else

{

k++;

}

}

else

{

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

{

ekz. Add (new Notebook (str[0], str[1], str[2]));

}

else

{

k++;

}

}

}

catch (Exception)

{

k++;

}

finally

{

strokFile = Read. ReadLine ();

}

}

ekz. Loading (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. Preservation (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. Preservation (Path);

}

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

{

Form2 f = new Form2 ();

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

{

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

ekz. Loading (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. Removal (f.textBox1. Text);

ekz. Loading (treeView1, dataGridView1);

}

}

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

{

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

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

{

ekz. Preservation (saveFileDialog1. FileName);

}

}

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

{

Notebook view = new Notebook ();

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 Notebook (f.textBox1. Text, f. textBox2. Text, f. comboBox1. Text));

ekz. Loading (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. Preservation (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. Quest (f.textBox1. Text, dataGridView1, treeView1);

}

}

public static TreeNode[] Coloor_Blue = null;

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

{

Node Data = ekz;

Data = ekz. Top (Data);

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

{

int i = 0;

bool Stop = false;

while (dataGridView1. Rows. Count > i)

{

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

{

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 Notebook).FIO_OutPut)

{

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

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

treeView1. SelectedNode = Find[0];

treeView1. SelectedNode. BackColor = Color. Blue;

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)

Показать весь текст
Заполнить форму текущей работой