Имя
|
Вид элемента
|
Тип
|
Спецификатор
|
Описание
|
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 - Первоначальные
подпункты меню пунктов «Файл» и «О программе»
При первом запуске, в программном
продукте возможны только следующие функции:
) «Файл - Открыть» -
позволяет открыть файл *txt формата для организации бинарного дерева и осуществления с данной
информацией необходимых действий (таких как поиск, удаление и т.д.);
) «О программе - Об авторе» -
открывает окно, содержащее информацию об авторе программного продукта. Данное
окно изображено на рисунке 4.3;
Рисунок 4.3 - Окно появляющееся при
нажатии пункта меню «О программе - Об авторе»
) «О программе - Справка» -
при нажатии данного пункта появляется окно, которое содержит информацию по
работе с данной справочно-информационной системой (рисунок 4.4).
Рисунок 4.4 - «О программе -
Справка»
После открытия файла (для начало
работы с информацией) «Файл - Открыть» интерфейс принимает следующую новую
форму (пункты меню, расширение столбов таблицы, загрузка информации в программу
и т.д.). Данное окно изображено на рисунке 4.5.
Рисунок 4.5 - Интерфейс программы
после открытия файла
Если при считывании файла
(информации в справочно-информационную систему) были обнаружены некорректные
записи, то произойдёт вызов окна, на котором изображено количество данных
некорректных записей (рисунок 4.6).
Рисунок 4.6 - Окно отображающее
количество некорректных записей
Рисунок 4.7 - Пункты меню после
открытия файла
Становятся доступны следующие пункты
меню (рисунок 4.7):
) «Файл - Сохранить» -
сохранить в текущий открытый файл всё бинарное дерево, со всеми изменениями;
) «Файл - Сохранить как» -
сохранить бинарное дерево со всеми изменениями в новый файл (указание пути
сохранения файла предоставляется пользователю);
4.1 Описание функций
редактирования исходных данных
3) «Работа с данными - Вид» - позволяет изменить вид
отображения информацию. Доступны 2 вида: «Таблица» (по умолчанию) и «Дерево» -
визуализация информации в виде дереве (рисунок 4.8);
Рисунок 4.8 - Отображение информации
в виде «Дерева»
) «Работа с данными -
Вставка» - даёт возможность пользователю добавить в бинарное дерево элемент.
Как это происходит изображено на рисунке 4.9;
Рисунок 4.9 - Окно «Вставка»
) «Работа с данными - Поиск»
- позволяет произвести поиск элемента по ключу , либо найти максимальный
элемент в бинарном дереве. После выполнения поиска (любым из предложенных) в
«Таблице»и «Дереве» произойдёт выделение найденных элементов;
) «Работа с данными -
Изменение» - позволяет изменить уже существующие элементы в бинарном дереве на
указанный (в отдельном окне) новый элемент. При нажатии данного пункта меню,
произойдёт вызов нового окна «Изменение», в котором необходимо ввести «Старое
значение» и «Новое значение».
) «Работа с данными -
Удаление» - даёт возможность удалить элемент из бинарного дерева.
При работе с такими пунктами меню
как: «Работа с данными - Вставка», «Работа с данными - Поиск - Поиск элемента»,
«Работа с данными - Изменение», «Работа с данными - Удаление» предусмотрена
система «Сохранение информации», то есть если в любом из окон (пунктов меню
перечисленных выше) присутствует какая-либо информация, то будет сработана данная
система и появится окно с запросом «В текстовом поле обнаружена информация, вы
уверены что хотите выйти?» с возможностью ответа «Да» или «Нет». При нажатии на
кнопку «Да» - произойдёт выход из текущего окна без сохранения информации, при
нажатии на кнопку «Нет» - произойдёт возврат обратно в текущее окно.
.2 Работа с файлом
Если при работе со
справочно-информационной системой (с открытым файлом) попытаться выполнить
пункт «Файл - Открыть» (то есть открыть новый файл) или просто при нажатии на
кнопку «Закрыть» (выход из программы), произойдёт автоматический запуск окна с
запросом «Сохранить информацию?», если будет нажата кнопка «Да» - произойдёт
сохранение бинарного дерева в текущий файл, кнопка «Нет» - означает закрыть
программу без сохранения информации, то есть очистка текущей сессии, кнопка
«Отмена» - вернуться обратно в программу без выполнения каких либо действий.
Заключение
В ходе работы были изучены
теоретические сведения и закреплены знания, полученные ранее при изучении
дисциплины «Конструирование программ и языки программирования». А так же были
практически применены полученные знания при выполнении данной работы.
Созданная курсовая работа - отличное
решение для организаций, которые в своей профессиональной среде сталкивается с
большим количеством информации.
Программа была разработана на языке
программирования C#, с организацией
удобного пользовательского интерфейса.
В данной пояснительной записке
выполнены анализ задачи, проектирование и реализация программных средств,
которые являются необходимыми этапами разработки программного обеспечения.
Для реализации бинарного дерева
поиска были созданы собственные классы «Node» и «Notebook». В итоге разработано
приложение, предназначенное для работы с бинарным деревом поиска.
Удобный пользовательский интерфейс
бинарного дерева, а так же его простота - обеспечит легкое и быстрое получение
нужной информации об интересующих пользователя вопросах. При выполнении поиска
запрошенной информации, разработанный программный продукт выдаст всю найденную
по запросу пользователя информацию без потерь и без показа лишней информации,
что позволит пользователю сократить затраты времени на поиск необходимой
информации.
Для написания курсовой работы были
использованы методические и учебные пособия, учебники современных и иностранных
авторов, а также материалы интернет-ресурсов.
Данная курсовая работа помогает
закрепить полученные знания на протяжения всего курса обучения, улучшить навыки
решения поставленных задач, дает возможность научиться поиску необходимой информации
для облегчения решения поставленной задачи.
Список использованных
источников
1. Бинарное дерево поиска [Электронный ресурс]. - Режим
доступа: http://ru.wikipedia.org/wiki/Двоичное_дерево_поиска. - Дата доступа:
09.05.2014.
. Бинарные деревья в пространстве имён C# [Электронный ресурс]. - Режим
доступа: http://msdn.microsoft.com/enus/library/ms379572 (v=vs.80).aspx. - Дата
доступа: 11.05.2014.
. Левитин, А.В. Алгоритмы: введение в разработку и анализ.
- Москва: Издательский дом Вильямс, 2006. - 65 с.
. Ахо, А.В. Структуры данных и алгоритмы / Д.Д. Хопкрофт,
Д.Д. Ульман. - Издательский дом Вильямс, 2000. - 92 с.
. Джозеф, А. C# 5.0. Справочник. Полное описание языка. - Издательский дом
Вильямс, 2013. - 1008 с.
. Скит, Д. C#: программирование для профессионалов. - Издательский дом
Вильямс, 2011. - 544 с.
7. C Sharp [Электронный ресурс]. -
Режим доступа: http://ru.wikipedia.org/wiki/C_Sharp. - Дата доступа:
20.05.2014.
. Нейгел, К. Visual C#: полный курс. - Издательство «Диалектика», 2010. - 236 с.
. Деревья выражений [Электронный ресурс]. - Режим доступа:
http://msdn.microsoft.com/ru-ru/library/bb397951.aspx. - Дата доступа:
22.05.2014.
. Павловская, Т.А. C#. Программирование на языке
высокого уровня: учебник для вузов. - СПб.: Питер, 2007. - 432 с.
Приложение А Листинг
программы
Текст программы Form1.cs
using System;System.
Collections. Generic;System. ComponentModel;System. Data;System.
Drawing;System. Linq;System. Text;System. Threading. Tasks;System. Windows.
Forms;System.IO; // ФайлыSystem. Text. RegularExpressions; // Регулярные
выражения
Курсовая_работа
{partial class Form1:
Form
{Form1 ()
{();
}
StreamReader Read;string
Path;int k = 0;<Notebook> ekz = null; // Экземпляр дерева
class Node<T>
where T: IComparable // Дерево
{T Value;Node<T>
Left = null;Node<T> Right = null;Node<T> Parent = null;
Node (T Value) //
Конструктор
{. Value = Value;
}
void Add (T Value) //
Добавление
{
{(this. Value == null)
// Если корень пуст
{. Value = Value;
}
{<T> Data =
this;Stop = false;(! Stop)
{((Data. Value as
Notebook).CompareTo((Value as Notebook)) == 0) // Одинаковые
{
throw new Exception («Невозможно добавить 2 одинаковых элемента в дерево»);
}((Data. Value as
Notebook).CompareTo((Value as Notebook)) == 1) // Меньше Узла
{(Data. Left == null) //
Если левый сын «Узла» пуст
{. Left = new
Node<T>(Value); // Новый узел. Left. Parent = Data; // Отмечаем его
родителя
Stop = true; // Остановиться
}
{
Data-; // Сделать текущим левого сына
}
}if ((Data. Value as
Notebook).CompareTo((Value as Notebook)) == -1) // Больше
{(Data. Right == null)
// Если правый сын «Узла» пуст
{. Right = new
Node<T>(Value); // Новый узел. Right. Parent = Data; // Отмечаем его
родителя
Stop = true; // Остановиться
}
else // Значит делаем текущим (Data) - правого сына (Data. Right)
{
Data++; // Сделать текущим правого сына
}
}
} //While(stop)
} //else (Если «Корня» нет)
}(Exception error)
{++;. Show (error.
Message+»\" «+(Value as Notebook).FIO_OutPut+»\ "\nНажмите ОК чтобы продолжить», «Ошибка организации дерева»,
MessageBoxButtons.OK, MessageBoxIcon. Error);
}
} //Add
static TreeNode[] Coloor
= null;
void Quest (string
Search, DataGridView Table, TreeView Tree) // Поиск элемента в дереве
{(Scan(Search)!= null)
{<T> Data =
Scan(Search);i=0;Stop = false;(Table. Rows. Count>i)
{(Table.
Rows[i].DefaultCellStyle. BackColor == Color. Green)
{.
Rows[i].DefaultCellStyle. BackColor = Color. White;;
}
{++;
}
}(Coloor!= null)
{. SelectedNode =
Coloor[0];. SelectedNode. BackColor = Color. White;
}=0;(Stop!=true)
{(Table [0, i].Value.
ToString() == Search)
{.
Rows[i].DefaultCellStyle. BackColor = Color. Green;[] Find = Tree. Nodes. Find
(Search, true);= Find;. SelectedNode = Find[0];. SelectedNode. BackColor =
Color. Green;= true;
}
{++;
}
}. Show («Найденный
элемент выделенн зелёным цветом.\nДля снятия выделения цветом, кликните левой
кнопкой мыши в любом месте строки», «Информация», MessageBoxButtons.OK,
MessageBoxIcon. Information);
}
{. Show («Данного контактного
лица не существует», «Ошибка поиска», MessageBoxButtons.OK, MessageBoxIcon.
Error);
}
}
Node<T> Scan
(string Search) // Обход (поиск)
{
{<Node<T>>
Stack = new Stack<Node<T>>();<T> Data = this;Stop = false; (Data!= null) // Если корень не пустой
{. Push(Data);(Stack.
Count > 0)
{= Stack. Pop();(Stop!=
true)
{(Data. Left!=null
&& (Data. Left. Value as Notebook).CompareTo(Search) == 0)
{Data;
}if (Data. Right!= null
&& (Data. Right. Value as Notebook).CompareTo(Search) == 0)
{Data;
}if (Data!= null &&
(Data. Value as Notebook).CompareTo(Search) == 0)
{Data;
}if (Data. Left!= null
&& Data. Right!= null)
{. Push (Data. Right);;
// Сделать текущим левого сына
}if (Data. Left!= null
&& Data. Right == null)
{
Data-; // Сделать текущим левого сына
}if (Data. Left == null
&& Data. Right!= null)
{. Push (Data. Right);=
true;
}
{= true;
}
}(Stack. Count > 0)
{= false;
}
} //while (Stop)
} //if (Если корень не пуст)
else // Поиск произошёл неудачно
{
throw new Exception («Отсутствует корень дерева»);
}
}(Exception error)
{. Show (error. Message
+ «\nНажмите ОК чтобы продолжить», «Ошибка обхода дерева»,
MessageBoxButtons.OK, MessageBoxIcon. Error);
}
return null; // Вернуть пустое значение, т.к. поиск произошёл неудачно
}
void Sub (string Search,
string New) // Замена
{(Scan(Search)!= null)
{<T> Data =
Scan(Search);
(Data. Value as
Notebook).FIO_OutPut = New;= new StreamReader (Path, Encoding. Default);str;=
Read. ReadToEnd();
//str = str. Replace
(Search, New);Regular = new Regex(Search);= Regular. Replace (str, New);.
Close();Write = new StreamWriter (Path, false, Encoding. Default);.
Write(str);. Close();
}
{. Show («Данного
контактного лица не существует», «Ошибка изменения», MessageBoxButtons.OK,
MessageBoxIcon. Error);
}
}
void Removal (string
Search)
{
{(Scan(Search)!= null)
{<T> Data =
Scan(Search);(Data. Left == null && Data. Right == null) // СЛУЧАЙ 1: Отсутствуют оба сына (у удаляемого элемента)
{(Data. Parent. Left!=
null && (Data. Value as Notebook).CompareTo (Data. Parent. Left. Value) == 0) // Определяем, для отца (удаляемого элемента) мы левый
сын?
{. Parent. Left = null;
}if (Data. Parent.
Right!= null && (Data. Value as Notebook).CompareTo (Data. Parent. Right. Value) == 0) // Определяем, для (удаляемого элемента) отца мы правый
сын?
{. Parent. Right = null;
}. Value = default(T);=
null;
}if (Data. Left!= null
&& Data. Right == null) // СЛУЧАЙ 2: Есть только левый сын
(у удаляемого элемента)
{<T> Stock = Data.
Left; //Stock - запас. Left = null; // Удаление связи
между отцом (текущим узлом) и левым сыном
if (Data. Parent!= null)
{. Parent = Data.
Parent;(Data. Parent. Left!= null && (Data. Value as
Notebook).CompareTo (Data. Parent. Left. Value) == 0) // Определяем, для отца (удаляемого
элемента) мы левый сын?
{. Parent. Left = Stock;
}if (Data. Parent.
Right!= null && (Data. Value as Notebook).CompareTo (Data. Parent. Right. Value) == 0) // Определяем, для (удаляемого элемента) отца мы правый сын?
{. Parent. Right =
Stock;
}= null; // Очистка
памяти
}
{. Value = Stock. Value;
}
}if (Data. Left == null
&& Data. Right!= null) // СЛУЧАЙ 2.1: Есть только правый
сын (у удаляемого элемента)
{<T> Stock = Data.
Right; //Stock - запас. Right = null; // Удаление связи
между отцом (текущим узлом) и правым сыном
if (Data. Parent!= null)
{. Parent = Data.
Parent;(Data. Parent. Left!= null && (Data. Value as
Notebook).CompareTo (Data. Parent. Left. Value) == 0) // Определяем, для отца (удаляемого
элемента) мы левый сын?
{. Parent. Left = Stock;
}if (Data. Parent.
Right!= null && (Data. Value as Notebook).CompareTo (Data. Parent. Right. Value) == 0) // Определяем, для (удаляемого элемента) отца мы правый сын?
{. Parent. Right =
Stock;
}= null; // Очистка
памяти
}
{. Value = Stock. Value;
}
}if (Data. Left!= null
&& Data. Right!= null) // СЛУЧАЙ 3: Есть оба сына (у
удаляемого элемента)
{<T> Data2 = Top
(Data. Left); //Data2 - максимальный элемент
из левого поддерева
if (Data2. Left == null
&& Data2. Right == null) // Если Data2 (максимальный из
левого поддерева) не имеет сынов
{
if (Data. Parent!= null) // Если удаляемый элемент не корень
{(Data2. Parent. Left!=
null && (Data2. Value as Notebook).CompareTo (Data2. Parent. Left. Value) == 0) // Определяем, для отца мы левый сын?
{
Data2. Parent. Left =
null;
}if (Data2. Parent.
Right!= null && (Data2. Value as Notebook).CompareTo (Data2. Parent. Right. Value) == 0) // Определяем, для отца мы правый сын?
{
Data2. Parent. Right =
null;
}. Parent = Data.
Parent;(Data. Parent. Left!= null && (Data. Value as
Notebook).CompareTo (Data. Parent. Left. Value) == 0) // Определяем, для отца (удаляемого
элемента) мы левый сын?
{. Parent. Left. Value =
Data2. Value;
}if (Data. Parent.
Right!= null && (Data. Value as Notebook).CompareTo (Data. Parent. Right. Value) == 0) // Определяем, для отца (удаляемого элемента) мы правый сын?
{. Parent. Right. Value
= Data2. Value;
}
Data = null;
}
else // Значит удаляемый элемент - это корень
{. Value = Data2.
Value;(Data2. Parent. Left!= null && (Data2. Value as
Notebook).CompareTo (Data2. Parent. Left. Value) == 0) // Определяем, для отца мы левый
сын?
{
Data2. Parent. Left =
null;
}if (Data2. Parent.
Right!= null && (Data2. Value as Notebook).CompareTo (Data2. Parent. Right. Value) == 0) // Определяем, для отца мы правый сын?
{
Data2. Parent. Right =
null;
}
}
}if (Data2. Left!= null) // Если
Data2
(максимальный из левого поддерева) имеет левого сына
{<T> Stock =
Data2. Left; //Stock - запас2. Left = null; // Удаление связи
между отцом (текущим узлом) и левым сыном
Data2. Parent. Right =
Stock;. Parent = Data2. Parent;(Data. Parent!= null) // Если удаляемый
элемент не корень
{. Parent = Data.
Parent;(Data. Parent. Left!= null && (Data. Value as
Notebook).CompareTo (Data. Parent. Left. Value) == 0) // Определяем,
для отца (удаляемого элемента) мы левый сын?
{. Parent. Left. Value =
Data2. Value;
}if (Data. Parent.
Right!= null && (Data. Value as Notebook).CompareTo (Data. Parent. Right. Value) == 0) // Определяем, для отца (удаляемого элемента) мы правый сын?
{. 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<T> Top (Node<T> Data) // Поиск максимального элемента
{Stop =
false;(Stop!=true)
{(Data. Right!= null
&& Data < Data. Right)
{
Data++; // Сделать текущим правого сына
}
{= true;
}
}Data;
}
Node<T> Least
(Node<T> Data) // Поиск максимального элемента
{Stop = false;(Stop!=
true)
{(Data. Left!= null
&& Data > Data. Left)
{
Data-; // Сделать текущим левого сына
}
{= true;
}
}Data;
}
void Loading (TreeView
Tree, DataGridView Table)
{
{. Rows. Clear(); //
Таблица. Nodes. Clear(); // Дерево<Node<T>> Stack = new
Stack<Node<T>>();[] Find;<T> Data = this;Stop = false;.
Nodes. Add((Data. Value as Notebook).FIO_OutPut, (Data. Value as
Notebook).FIO_OutPut);= Tree. Nodes. Find((Data. Value as Notebook).FIO_OutPut,
true);. SelectedNode = Find[0];. SelectedNode. ToolTipText = «Дата и время:» + (Data. Value as
Notebook).date_OutPut + «\nМероприятие:» + (Data. Value as
Notebook).view_OutPut. ToString();(Data!= null) // Если корень не пустой
{. Push(Data);(Stack.
Count > 0)
{= Stack. Pop();(Data.
Parent== null && Data. Left == null && Data. Right == null)
{. Rows. Add((Data.
Value as Notebook).FIO_OutPut, (Data. Value as Notebook).date_OutPut, (Data.
Value as Notebook).view_OutPut);
}(Data. Parent!= null)
// Если текущий элемент не корень
{. ShowNodeToolTips =
true;= Tree. Nodes. Find((Data. Parent. Value as Notebook).FIO_OutPut, true);.
SelectedNode = Find[0];. SelectedNode. Nodes. Add((Data. Value as
Notebook).FIO_OutPut, (Data. Value as Notebook).FIO_OutPut);= Tree. Nodes.
Find((Data. Value as Notebook).FIO_OutPut, true);. SelectedNode = Find[0];.
SelectedNode. ToolTipText = «Дата и время:» + (Data. Value as Notebook).date_OutPut + «\nМероприятие:» + (Data. Value
as Notebook).view_OutPut. ToString();
}(Stop!= true)
{(Data. Left!= null
&& Data. Right!= null)
{. Push (Data. Right);.
Rows. Add((Data. Left. Value as Notebook).FIO_OutPut, (Data. Left. Value as
Notebook).date_OutPut, (Data. Left. Value as Notebook).view_OutPut);. Rows.
Add((Data. Right. Value as Notebook).FIO_OutPut, (Data. Right. Value as
Notebook).date_OutPut, (Data. Right. Value as Notebook).view_OutPut);(Data.
Parent == null) // Значит корень
{. Rows. Add((Data.
Value as Notebook).FIO_OutPut, (Data. Value as Notebook).date_OutPut, (Data.
Value as Notebook).view_OutPut);
}; // Сделать текущим
левого сына= Tree. Nodes. Find((Data. Parent. Value as Notebook).FIO_OutPut,
true);. SelectedNode = Find[0];. SelectedNode. Nodes. Add((Data. Value as
Notebook).FIO_OutPut, (Data. Value as Notebook).FIO_OutPut);= Tree. Nodes.
Find((Data. Value as Notebook).FIO_OutPut, true);. SelectedNode = Find[0];.
SelectedNode. ToolTipText = «Дата и время:» + (Data. Value as Notebook).date_OutPut + «\nМероприятие:» + (Data. Value
as Notebook).view_OutPut. ToString();
}if (Data. Left!= null
&& Data. Right == null)
{. Rows. Add((Data.
Left. Value as Notebook).FIO_OutPut, (Data. Left. Value as
Notebook).date_OutPut, (Data. Left. Value as Notebook).view_OutPut);(Data.
Parent == null) // Значит корень
{. Rows. Add((Data.
Value as Notebook).FIO_OutPut, (Data. Value as Notebook).date_OutPut, (Data.
Value as Notebook).view_OutPut);
}; // Сделать текущим
левого сына= Tree. Nodes. Find((Data. Parent. Value as Notebook).FIO_OutPut,
true);. SelectedNode = Find[0];. SelectedNode. Nodes. Add((Data. Value as
Notebook).FIO_OutPut, (Data. Value as Notebook).FIO_OutPut);= Tree. Nodes.
Find((Data. Value as Notebook).FIO_OutPut, true);. SelectedNode = Find[0];.
SelectedNode. ToolTipText = «Дата и время:» + (Data. Value as Notebook).date_OutPut + «\nМероприятие:» + (Data. Value
as Notebook).view_OutPut. ToString();
}if (Data. Left == null
&& Data. Right!= null)
{. Rows. Add((Data.
Right. Value as Notebook).FIO_OutPut, (Data. Right. Value as
Notebook).date_OutPut, (Data. Right. Value as Notebook).view_OutPut);(Data.
Parent == null) // Значит корень
{. Rows. Add((Data.
Value as Notebook).FIO_OutPut, (Data. Value as Notebook).date_OutPut, (Data.
Value as Notebook).view_OutPut);
}. Push (Data. Right);=
true;
}
{= true;
}
} //while (Stop)(Stack.
Count > 0)
{= false;
}
} //while (Stack)
} //if (Если корень не пуст)
else // Поиск произошёл неудачно
{
throw new Exception («Отсутствует корень дерева»);
}
}(Exception error)
{. Show (error. Message
+ «\nНажмите ОК чтобы продолжить», «Ошибка загрузки бинарноего дерева в \ «Таблицу и Дерево\"», MessageBoxButtons.OK, MessageBoxIcon. Error);
}
}
void Preservation
(string Path2) // Сохранение
{= Path2;Write = new
StreamWriter (Path, false, Encoding. Default);<Node<T>> Stack = new
Stack<Node<T>>();<T> Data = this;Stop = false; (Data!= null) // Если корень не пустой
{. Push(Data);(Stack.
Count > 0)
{= Stack. Pop();(Stop!=
true)
{(Data. Left!= null
&& Data. Right!= null)
{. Push (Data. Right);.
WriteLine((Data. Left. Value as Notebook).FIO_OutPut +»;» + (Data. Left. Value
as Notebook).date_OutPut +»;» + (Data. Left. Value as Notebook).view_OutPut);.
WriteLine((Data. Right. Value as Notebook).FIO_OutPut +»;» + (Data. Right.
Value as Notebook).date_OutPut +»;» + (Data. Right. Value as
Notebook).view_OutPut);(Data. Parent == null)
{. 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)
{. WriteLine((Data.
Left. Value as Notebook).FIO_OutPut +»;» + (Data. Left. Value as
Notebook).date_OutPut +»;» + (Data. Left. Value as
Notebook).view_OutPut);(Data. Parent == null)
{. 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)
{. WriteLine((Data.
Right. Value as Notebook).FIO_OutPut +»;» + (Data. Right. Value as Notebook).date_OutPut
+»;» + (Data. Right. Value as Notebook).view_OutPut);(Data. Parent == null)
{. WriteLine((Data.
Value as Notebook).FIO_OutPut +»;» + (Data. Value as Notebook).date_OutPut +»;»
+ (Data. Value as Notebook).view_OutPut);
}. Push (Data. Right);=
true;
}
{= true;
}
}(Stack. Count > 0)
{= false;
}
} //while (Stop). Close();
} //if (Если корень не пуст)
}
static Node<T>
operator ++(Node<T> Data) // Сделать текущим правого сына
{Data = Data. Right;
}
static Node<T>
operator - (Node<T> Data) // Сделать текущим левого сына
{Data = Data. Left;
}
static bool operator
>(Node<T> Data, Node<T> Data2) // Сравнение «Больше»
{((Data. Value as
Notebook).CompareTo((Data2. Value as Notebook)) == 1)
{true;
}
{false;
}
}
static bool operator
<(Node<T> Data, Node<T> Data2) // Сравнение «Меньше»
{((Data. Value as
Notebook).CompareTo((Data2. Value as Notebook)) == -1)
{true;
}
{false;
}
}
} // Дерево
Notebook: IComparable //
Класс «Записная книжка»
{
string FIO;
string date;
enum views {Благотворительный_праздник, Дефиле, Свадьба, Крестины,
День_рождение, Вечеринка, Турнир, Экскурсия, Фестиваль, Спектакль, Выставка,
Ярмарка, Конкурс, Марафон, Конгресс, Парад};
views view;string[]
sports = Enum. GetNames (typeof(views));
string FIO_OutPut // Свойство для получения «FIO»
{
{this.FIO;
}
{= value;
}
}
string date_OutPut //
Свойство для получения «date»
{
{this.date;
}
}
string view_OutPut //
Свойство для получения «view»
{
{Enum. GetName
(typeof(views), view);
}
}
public Notebook() // Пустой конструктор без параметров (для обращения к методам)
{
}
Notebook (string FIO,
string date, string view)
{.FIO = FIO;.date =
date;.view = (views) Enum. Parse (typeof(views), view);
}
int CompareTo (object
Data) // Сравнение с «Object»
{(string. Compare
(this.FIO, (Data as Notebook).FIO) > 0) return 1;(string. Compare (this.FIO,
(Data as Notebook).FIO) < 0) return -1;return 0;
}
int CompareTo (string
Data) // Сравнение со «String»
{(string. Compare
(this.FIO, Data)==1) return 1;(string. Compare (this.FIO, Data)==-1) return
-1;return 0;
}
bool Compare_Enum
(string view)
{(Enum. IsDefined
(typeof(views), view) == true)
{true;
}
{false;
}
}
} // Класс «Notebook»
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;[] str;= new StreamReader (openFileDialog1. FileName, Encoding. Default); //Cоздание «потокового читателя» и связывание его с файловым потоком
Path = openFileDialog1. FileName; // Сохранение пути к текущему файлу
string strokFile = Read.
ReadLine();view = new Notebook();(strokFile!= null)
{(strokFile!= null) //
Загрузка файла в дерево
{
str = strokFile. Split (';'); // Отделение слов
try
{
if (ekz == null) // Если корня нет
{(view. Compare_Enum
(str[2]) == true)
{= new
Node<Notebook>(new Notebook (str[0], str[1], str[2]));
}
{++;
}
}
{(view. Compare_Enum
(str[2]) == true)
{. Add (new Notebook
(str[0], str[1], str[2]));
{++;
}
}
}(Exception)
{++;
}
{= Read. ReadLine();
}
}. Loading (treeView1,
dataGridView1);(k > 0)
{. Show («Обнаруженно
некоректных записей:» + k. ToString(), «Открыть файл», MessageBoxButtons.OK,
MessageBoxIcon. Information);
}. Close();
}
}
}
{= MessageBox. Show
(«Сохранить текущий файл?», «Информация», MessageBoxButtons. YesNo,
MessageBoxIcon. Question);(DialogResult == DialogResult. Yes)
{. Preservation(Path);
}if (DialogResult ==
DialogResult. No)
{= 0;= null;
сохранитьToolStripMenuItem.
Visible = false;
Работа с
даннымиToolStripMenuItem. Visible = false;
сохранитьКакToolStripMenuItem.
Visible = false;. Rows. Clear();. Nodes. Clear();. Show («Текущая сессия
обнулена, теперь можете открыть новый файл», «Информация»,
MessageBoxButtons.OK, MessageBoxIcon. Information);
}
}
}
void
древовидностьToolStripMenuItem_Click (object sender, EventArgs e)
{. Visible = false;.
Visible = true;
}
void
таблицаToolStripMenuItem_Click (object sender, EventArgs e)
{. Visible = true;.
Visible = false;
}
void
сохранитьToolStripMenuItem_Click (object sender, EventArgs e)
{. Preservation(Path);
}void
изменитьToolStripMenuItem_Click (object sender, EventArgs e)
{f = new Form2 ();(f.
ShowDialog()==DialogResult.OK)
{. Sub (f.textBox1.
Text, f.textBox2. Text);. Loading (treeView1, dataGridView1);
}
}
void
удалениеToolStripMenuItem_Click (object sender, EventArgs e)
{f = new Form3 ();. Text
= «Удаление»;.label1. Text = «Введите значение для
удаления»;
f.button1. Text =
«Удалить»;(f. ShowDialog() == DialogResult.OK)
{. Removal (f.textBox1.
Text);. Loading (treeView1, dataGridView1);
}
}
void сохранитьКакToolStripMenuItem_Click
(object sender, EventArgs e)
{. Filter = «Текстовый
файл | *.txt»;(saveFileDialog1. ShowDialog() == DialogResult.OK)
{. Preservation
(saveFileDialog1. FileName);
}
}
void
вставкаToolStripMenuItem_Click (object sender, EventArgs e)
{view = new Notebook();f
= new Form4 ();(int i = 0; i < view.sports. Count(); i++)
{.comboBox1. Items. Add
(view.sports[i]);
}(f. ShowDialog() ==
DialogResult.OK)
{. Add (new Notebook
(f.textBox1. Text, f.textBox2. Text, f.comboBox1. Text));. Loading (treeView1,
dataGridView1);
}
}
void Form1_FormClosing
(object sender, FormClosingEventArgs e)
{(ekz!=null)
{= MessageBox. Show («Сохранить информацию?», «Информация», MessageBoxButtons. YesNoCancel, MessageBoxIcon. Question);(DialogResult ==
DialogResult. Yes)
{. Preservation(Path);
}if (DialogResult ==
DialogResult. No)
{();
}if (DialogResult ==
DialogResult. Cancel)
{();
}
}
}
void
поискЭлементаToolStripMenuItem_Click (object sender, EventArgs e)
{f = new Form3 ();. Text
= «Поиск»;.label1. Text = «Введите значение для
поиска»;
f.button1. Text =
«Поиск»;(f. ShowDialog() == DialogResult.OK)
{. Quest (f.textBox1.
Text, dataGridView1, treeView1);
}
}
static TreeNode[]
Coloor_Blue = null;
void
поискToolStripMenuItem1_Click (object sender, EventArgs e)
{<Notebook> Data =
ekz;= ekz. Top(Data);(ekz!= null) // Если корень
есть
{i = 0;Stop =
false;(dataGridView1. Rows. Count > i)
{(dataGridView1.
Rows[i].DefaultCellStyle. BackColor == Color. Blue)
{.
Rows[i].DefaultCellStyle. BackColor = Color. White;;
}
{++;
}
}(Coloor_Blue!=null)
{. SelectedNode =
Coloor_Blue[0];. SelectedNode. BackColor = Color. White;
}= 0;(Stop!= true)
{(dataGridView1 [0,
i].Value. ToString() == (Data. Value as Notebook).FIO_OutPut)
{.
Rows[i].DefaultCellStyle. BackColor = Color. Blue;[] Find = treeView1. Nodes.
Find((Data. Value as Notebook).FIO_OutPut, true);. SelectedNode = Find[0];.
SelectedNode. BackColor = Color. Blue;= true;
}
{++;
}
}. Show («Максимальный
элемент выделен синим цветом.\nДля снятия выделения цветом, кликните левой кнопкой
мыши в любом месте строки», «Информация», MessageBoxButtons.OK, MessageBoxIcon.
Information);
}
{. Show («Данного
контактного лица не существует», «Ошибка поиска максимального элемента»,
MessageBoxButtons.OK, MessageBoxIcon. Error);
}
}
void dataGridView1_CellClick
(object sender, DataGridViewCellEventArgs e)
{(dataGridView1.
CurrentRow. DefaultCellStyle. BackColor == Color. Green || dataGridView1.
CurrentRow. DefaultCellStyle. BackColor == Color. Blue)
{. CurrentRow.
DefaultCellStyle. BackColor = Color. White;
}
}
void treeView1_Click
(object sender, EventArgs e)
{(treeView1.
SelectedNode. BackColor == Color. Green || treeView1. SelectedNode. BackColor
== Color. Blue)
{. SelectedNode.
BackColor = Color. White;
}
}
void обАвтореToolStripMenuItem_Click
(object sender, EventArgs e)
{
MessageBox. Show («Выполнил Дробышевский Дмитрий Александрович ПО-32, 2014 г.\nОснованием для разработки курсового
проекта служит задание выданное преподавателем Ясоновым А.А.», «Об авторе», MessageBoxButtons.OK, MessageBoxIcon. Information);
}
void
справкаToolStripMenuItem_Click (object sender, EventArgs e)
{f = new Form5 ();.
ShowDialog();
}
}
}
Текст программы Form2.cs
System;System.
Collections. Generic;System. ComponentModel;System. Data;System.
Drawing;System. Linq;System. Text;System. Threading. Tasks;System. Windows.
Forms;Курсовая_работа
{partial class Form2:
Form
{Form2 ()
{();
}void button1_Click
(object sender, EventArgs e)
{(textBox1. Text!= «»
&& textBox2. Text!= «»)
{= DialogResult.OK;();}if
(textBox1. Text!= «» && textBox2. Text == «»)
{. Show («В поле \
«Новое значение\» отсутствует значение», «Информация», MessageBoxButtons.OK,
MessageBoxIcon. Information);
}if (textBox1. Text ==
«» && textBox2. Text!= «»)
{. Show («В поле \ «Старое
значение\» отсутствует значение», «Информация», MessageBoxButtons.OK,
MessageBoxIcon. Information);}
}void Form2_FormClosing
(object sender, FormClosingEventArgs e)
{if ((textBox1. Text!=»»
&& DialogResult!= DialogResult.OK) || (textBox2. Text!=»» &&
DialogResult!= DialogResult.OK))
{= MessageBox. Show («В
текстовом поле обнаружена информация, вы уверены что хотите выйти?»,
«Информация», MessageBoxButtons. YesNo, MessageBoxIcon. Question);(DialogResult
== DialogResult. Yes)
{Dispose();}
{();
}
}
}
}
}
Текст программы Form3.cs
System;System.
Collections. Generic;System. ComponentModel;System. Data;System.
Drawing;System. Linq;System. Text;System. Threading. Tasks;System. Windows.
Forms;
Курсовая_работа
{partial class Form3:
Form
{Form3 ()
{();
}void button1_Click
(object sender, EventArgs e)
{(textBox1. Text!= «»)
{= DialogResult.OK;();
}if (textBox1. Text ==
«»)
{. Show («В поле
\"» + label1. Text + «\» отсутствует значение», «Информация»,
MessageBoxButtons.OK, MessageBoxIcon. Information);
}
}void Form3_FormClosing
(object sender, FormClosingEventArgs e)
{(textBox1. Text!=»»
&& DialogResult!= DialogResult.OK)
{= MessageBox. Show («В текстовом поле обнаружена информация, вы уверены что хотите
выйти?», «Информация», MessageBoxButtons. YesNo,
MessageBoxIcon. Question);(DialogResult == DialogResult. Yes)
{();
}
{();
}
}
}
}
}
Текст программы Form4.cs
System;System.
Collections. Generic;System. ComponentModel;System. Data;System.
Drawing;System. Linq;System. Text;System. Threading. Tasks;System. Windows.
Forms;Курсовая_работа
{partial class Form4:
Form
{Form4 ()
{();
}void button1_Click
(object sender, EventArgs e)
{(textBox1. Text!= «»
&& textBox2. Text!= «» && textBox3. Text!= «» &&
comboBox1. Text!= null)
{= DialogResult.OK;();
}
{. Show («Не все поля
заполненны», «Информация», MessageBoxButtons.OK, MessageBoxIcon. Information);
}
}void Form4_FormClosing
(object sender, FormClosingEventArgs e)
{((textBox1. Text!= «»
&& DialogResult!= DialogResult.OK) || (textBox2. Text!= «» &&
DialogResult!= DialogResult.OK) || (textBox3. Text!= «» &&
DialogResult!= DialogResult.OK) || (comboBox1. Text!= «» &&
DialogResult!= DialogResult.OK))
{= MessageBox. Show («В
текстовом поле обнаружена информация, вы уверены что хотите выйти?»,
«Информация», MessageBoxButtons. YesNo, MessageBoxIcon. Question);(DialogResult
== DialogResult. Yes)
{Dispose();}
{();
}
}
}
}
}
Текст программы Form5.cs
System;System.
Collections. Generic;System. ComponentModel;System. Data;System.
Drawing;System. Linq;System. Text;System. Threading. Tasks;System. Windows.
Forms;
Курсовая_работа
{partial class Form5:
Form
{Form5 ()
{();