Создание класса и разработка приложения "Бинарное дерево поиска"
Описание структуры бинарного дерева поиска на языке C# среды Visual Studio. Требования к интерфейсу пользователя, структуре данных и программным средствам. Компоненты программных средств, результаты тестирования, диаграммы вариантов использования классов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 26.01.2013 |
Размер файла | 968,2 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Реферат
Отчет содержит 30 листов, 21 рисунков, 2 приложения и 3 источника.
БИНАРНОЕ ДЕРЕВО ПОИСКА, ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ, ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ, C#
Предмет разработки - программа для работы с бинарным деревом поиска. Пользователь может добавлять, удалять, искать элементы.
Цель работы - создание класса и разработка приложения "Бинарное дерево поиска".
Результат разработки - приложение Windows "Бинарное дерево поиска".
Содержание
- Введение
- 1. Создание класса и разработка приложения "Бинарное дерево поиска"
- 1.1Анализ предметной области
- 1.2Анализ требований
- 1.2.1 Требования к интерфейсу пользователя
- 1.2.2 Требования к структуре данных
- 1.2.3 Требования к программным средствам
- 1.3 Технология разработки
- 2. Проектирование
- 2.1 Проектирование интерфейса пользователя
- 2.2 Проектирование структуры данных
- 2.3 Структура программных средств
- 2.4 Пример блок-схемы
- 3. Реализация
- 3.1 Кодирование
- 3.2 Тестирование
- Заключение
- Список литературы
- Приложение
Введение
Объектом разработки в курсовой работе является структура данных - бинарное дерево поиска.
Целью работы является изучение данной структуры, а затем разработка приложения на языке программирования C# с её реализацией в виде класса.
В ходе курсовой работы был создан на языке C# среды Visual Studio 2010 класс, описывающий структуру бинарного дерева поиска и позволяющий выполнять с ним основные операции (например, добавления, удаления и поиска).
В пояснительной записке разобраны основные понятия, связанные с бинарными деревьями. Также рассмотрены требования к интерфейсу пользователя. В разделах проектирования и реализации приведены структура и компоненты программных средств и результаты тестирования, а также диаграммы вариантов использования и иерархии классов.
1. Создание класса и разработка приложения "Бинарное дерево поиска"
1.1 Анализ предметной области
Организация данных с помощью бинарных деревьев часто позволяет значительно сократить время поиска нужного элемента. Поиск элемента в линейных структурах данных обычно осуществляется путем последовательного перебора всех элементов, присутствующих в данной структуре. Поиск по дереву не требует перебора всех элементов, поэтому занимает значительно меньше времени. Максимальное число шагов при поиске по дереву равно высоте данного дерева, т.е. количеству уровней в иерархической структуре дерева.
Бинарное дерево - это упорядоченное дерево, каждая вершина которого имеет не более двух поддеревьев, причем для каждого узла выполняется правило: в левом поддереве содержатся только ключи, имеющие значения, меньшие, чем значение данного узла, а в правом поддереве содержатся только ключи, имеющие значения, большие, чем значение данного узла.
Узлы дерева, не имеющие потомков, называются листьями.
Схематичное изображение бинарного дерева представлено на рисунке 1:
Рисунок 1.
1.2 Анализ требований
1.2.1 Требования к интерфейсу пользователя
Все возможности, предоставляемые Пользователю при работе с приложением, основываются на основных операциях, осуществляемых над бинарными деревьями поиска:
2 создание дерева;
3 добавление нового узла в дерево;
4 поиск элемента в дереве;
5 удаление узла из дерева;
6 удаление дерева;
7 обход (просмотр) дерева.
1.2.2 Требования к структуре данных
Каждая вершина бинарного дерева имеет следующую структуру (рисунок 2) [1. стр. 63]:
PLP |
INF |
PRP |
Рисунок 2 - Структура вершины бинарного дерева
· INF - значение элемента;
· PLP- указатель на левого потомка;
· PRP - указатель на правого потомка;
1.2.3 Требования к программным средствам
Основные функции, выполняемые разрабатываемые программными средствами приведены в диаграмме вариантов использования (рисунок 3).
Рисунок 3. Диаграмма вариантов использования.
1.3 Технология разработки
В курсовой работе используется технология объектно-ориентированного программирования C# среды Visual Studio 2010.
В ООП данные и подпрограммы непосредственно связаны, что позволяет разрабатывать программу постепенно (создавая модули и компоненты), поэтому такой подход способствует реализации приложения в короткие сроки и быстрому произведению их отладки.
Также стоит отметить, что данная технология не уменьшает размер кода и не упрощает его.
2. Проектирование
2.1 Проектирование интерфейса пользователя
На рисунке 4 изображен интерфейс программы.
Рисунок 4, 5. Визуальные компоненты интерфейса пользователя
бинарный дерево интерфейс программный
1. button_add_Click - Кнопка "Добавить элемент"
2. button_search_Click - Кнопка "найти элемент "
3. button_clear_Click - Кнопка "удалить элемент"
4. button1_Click - Кнопка "об авторе"
5. button_clear_history_Click - Кнопка "очистить историю"
6. button_clear_all_Click - Кнопка "удалить дерево"
7. textBoxVN_TextChanged - поле для просмотра "обход сверху вниз"
8. textBoxLP_TextChanged - поле для просмотра "обход слева направо"
9. textBoxNV_TextChanged - поле для просмотра "обход справа налево"
10. textBox_add_TextChanged - поле для ввода значения для добавления
11. textBox_search_TextChanged - поле для ввода значения для поиска
12. textBox_clear_TextChanged - поле для ввода значения для удаления
13. listBox1_SelectedIndexChanged - поле для вывода истории
14. - Форма "о проекте"
2.2 Проектирование структуры данных
Ниже приведена структура и описание разработанной структуры данных.
public class Tree
{
public string Z; // значение узла
public Tree left, right; // указатели на потомков
2.3 Структура программных средств
Для проектирования данного приложения была разработана структура собственных классов: Tree (таблица 1), FormTree (таблица 2).
Член класса |
Описание |
|
public string Z |
Значение узла |
|
public Tree left |
Указатель на левого потомка |
|
public Tree right |
Указатель на правого потомка |
|
public bool Insert(string value) |
Функция добавления элемента |
|
public Tree Search(string value) |
Функция поиска элемента |
|
public string DisplayVN(Tree t) |
Функция обхода дерева сверху вниз |
|
public string DisplayLP(Tree t) |
Функция обхода дерева слева направо |
|
public string DisplayNV(Tree t) |
Функция обхода дерева справа налево |
|
public bool IsEmpty() |
Функция проверки на пустоту |
|
public bool Delete(string value) |
Функция удаления элемента |
|
public void Dispose() |
Функция удаления дерева |
Член класса |
Описание |
|
Tree t |
Элемент, предназначенный для работы с деревом |
|
public FormTree() |
Конструктор |
|
private void button_add_Click(object sender, EventArgs e) |
Обработчик нажатия на кнопку button_add |
|
private void button_clear_Click(object sender, EventArgs e) |
Обработчик нажатия на кнопку button_clear |
|
private void button_search_Click(object sender, EventArgs e) |
Обработчик нажатия на кнопку button_search |
|
private void button_clear_history_Click(object sender, EventArgs e) |
Обработчик нажатия на кнопку button_clear_history |
|
public void Display() |
Функция обработки дерева |
|
private void button_clear_all_Click(object sender, EventArgs e) |
Обработчик нажатия на кнопку button_clear_all_Click |
|
private void button_info_Click(object sender, EventArgs e) |
Обработчик нажатия на кнопку button_info_Click |
|
private void textBoxVN_KeyPress(object sender, KeyPressEventArgs e) |
Обработчик события KeyPress текстового поля textBoxVN |
|
private void textBoxLP_KeyPress(object sender, KeyPressEventArgs e) |
Обработчик события KeyPress текстового поля textBoxLP |
|
private void textBoxNV_KeyPress(object sender, KeyPressEventArgs e) |
Обработчик события KeyPress текстового поля textBoxNV |
|
private void textBox_add_KeyPress(object sender, KeyPressEventArgs e) |
Обработчик события KeyPress текстового поля textBox_add |
|
private void textBox_clear_KeyPress(object sender, KeyPressEventArgs e) |
Обработчик события KeyPress текстового поля textBox_clear |
|
private void textBox_search_KeyPress(object sender, KeyPressEventArgs e) |
Обработчик события KeyPress текстового поля textBox_search |
|
private void button1_Click(object sender, EventArgs e) |
Обработчик события KeyPress MessageBox |
Иерархия классов приведена на рисунке 6
Рисунок 6 - Иерархия классов
2.4 Пример блок-схемы
Блок-схема операции "Поиск элемента" приведена на рисунке 7.
Рисунок 7 - Блок-схема "Поиск элемента"
3. Реализация
3.1 Кодирование
Текст программы приведен в Приложении А
3.2 Тестирование
План функционального тестирования приведен в таблице 3.
Вариантыиспользования |
Тесты |
Результат |
|
Запуск программы |
Открываем приложение Tree.exe |
Приложение открылось, все текстовые поля пусты. |
|
Добавление элемента |
Добавляем элемент в пустое дерево. |
Элемент добавился в корень дерева, в текстовом поле истории появилось сообщение об этом, обновились поля с выводом дерева (Приложение Б, рис.1). |
|
Добавляем элемент, несуществующий в дереве. |
Элемент встал на свое место в дереве, в текстовом поле истории появилось сообщение об этом, обновились поля с выводом дерева (Приложение Б, рис.2). |
||
Добавляем элемент, уже существующий в дереве |
Элемент не добавляется в дерево, в текстовом поле истории появляется сообщение о недопустимости добавления, поля с выводом дерева не изменяются (Приложение Б, рис.3). |
||
Удаление элемента |
Удаляем элемент, существующий в дереве, у которого нет потомков. |
Элемент удалился, в текстовом поле истории появилось сообщение о выполненной операции, поля с выводом дерева обновились (Приложение Б, рис.4). |
|
Удаляем элемент, существующий в дереве, у которого есть один левый потомок. |
Элемент удалился, на его место встал левый потомок, в текстовом поле истории появилось сообщение о выполненной операции, поля с выводом дерева обновились (Приложение Б, рис.5). |
||
Удаляем элемент, существующий в дереве, у которого есть один правый потомок. |
Элемент удалился, на его место встал правый потомок, в текстовом поле истории появилось сообщение о выполненной операции, поля с выводом дерева обновились (Приложение Б, рис.6). |
||
Удаляем элемент, существующий в дереве, у которого есть два потомка. |
Элемент удалился, на его место встал либо правый потомок (если у правого потомка не было левого узла), либо самый левый узел правого потомка (если он существовал). В текстовом поле истории появилось сообщение о выполненной операции, поля с выводом дерева обновились (Приложение Б, рис.7 - до выполнения операции, Приложение Б, рис.8 - после выполнения операции). |
||
Удаляем элемент, несуществующий в дереве |
Элемент не удаляется, в текстовом поле истории появляется сообщение об ошибке, поля с выводом дерева не обновляются (Приложение Б, рис.9). |
||
Удаление дерева |
Нажимаем на кнопку "Удалить дерево", если дерево не пустое. |
Дерево удалено, в текстовом поле истории появляется сообщение о выполненной операции, поля с выводом дерева становятся пустыми (Приложение Б, рис.10). |
|
Нажимаем на кнопку "Удалить дерево", если дерево пустое. |
Дерево не удаляется, в текстовом поле истории появляется сообщение о невыполненной операции (Приложение Б, рис.11). |
||
Поиск элемента |
Поиск элемента при условии, что элемент существует в дереве |
Элемент находится, в текстовом поле истории появляется сообщение, что элемент найден (Приложение Б, рис.12). |
|
Поиск элемента при условии, что элемент не существует в дереве |
Элемент не находится, в текстовом поле истории появляется сообщение, что элемент не существует в дереве (Приложение Б, рис.13). |
||
Очистка поля с историей |
Нажимаем на кнопку "Очистить историю" |
Поле истории становится пустым, появляется сообщение, что история очищена (Приложение Б, рис.14). |
|
Просмотр информации о программе |
Нажатие на кнопку "?" |
Появляется новая форма с информацией о программе (Приложение Б, рис.15). |
|
Закрытие программы |
Нажатие на кнопку |
Закрытие программы происходит без ошибок. |
Все рисунки, сделанные при тестировании, находятся в Приложение Б.
Заключение
В данном отчете выполнены анализ требований, проектирование и реализация программных средств, которые являются необходимыми этапами разработки программного обеспечения.
Для реализации бинарного дерева поиска были созданы собственные классы Tree, FormTree. В итоге разработано приложение Tree.exe, предназначенное для работы с бинарным деревом поиска.
Результаты тестирования показали, что приложение работает корректно, соблюдены все правила работы с бинарным деревом поиска.
Список литературы
1. И.А. Казакова, С.В. Самуйлов "Структуры данных" Учебное пособие. Пенза 2011г.
2. http://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0#.D0.A3.D0.B4.D0.B0.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D1.83.D0.B7.D0.BB.D0.B0_.28REMOVE.29
3. http://rflinux.blogspot.ru/2011/10/blog-post.html
Приложение А
Исходный код программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Tree
{
public partial class FormTree : Form
{
Tree t = new Tree();
public FormTree()
{
InitializeComponent();
}
#region button
// Обработка кнопки "Добавить элемент"
private void button_add_Click(object sender, EventArgs e)
{
if (textBox_add.Text != "")
{
if (t.Insert(textBox_add.Text))
{
listBox1.Items.Add("Элемент " + textBox_add.Text + " добавлен");
Display();
}
else
listBox1.Items.Add("Элемент " + textBox_add.Text + " уже существует");
textBox_add.Text = "";
}
else MessageBox.Show("Введите элемент");
}
// Обработка кнопки "Удалить элемент"
private void button_clear_Click(object sender, EventArgs e)
{
if (textBox_clear.Text != "")
{
if (t.Delete(textBox_clear.Text))
{
listBox1.Items.Add("Элемент " + textBox_clear.Text + " удален");
Display();
}
else
listBox1.Items.Add("Элемента " + textBox_clear.Text + " нет в дереве");
textBox_clear.Text = "";
}
else MessageBox.Show("Введите элемент");
}
// Обработка кнопки "Найти элемент"
private void button_search_Click(object sender, EventArgs e)
{
if (textBox_search.Text != "")
{
if (t.Search(textBox_search.Text) != null)
listBox1.Items.Add("Элемент " + t.Search(textBox_search.Text).Z + " найден");
else
listBox1.Items.Add("Элемент " + textBox_search.Text + " не найден");
textBox_clear.Text = "";
textBox_search.Text = "";
}
else MessageBox.Show("Введите элемент");
}
// Обработка кнопки "Очистить историю"
private void button_clear_history_Click(object sender, EventArgs e)
{
listBox1.Items.Clear(); // очищаем значения в текстовом поле
MessageBox.Show("История очищена");
}
// Функция, отвечающая за вывод в строку разных
// дерева при различных обходах
public void Display()
{
textBoxVN.Text = t.DisplayVN(t);
textBoxLP.Text = t.DisplayLP(t);
textBoxNV.Text = t.DisplayNV(t);
}
// Очистка дерева
private void button_clear_all_Click(object sender, EventArgs e)
{
if (!t.IsEmpty()) // если дерево пустое, не выполнять действий
{
t.Dispose();
listBox1.Items.Add("Дерево очищено");
Display();
}
else
listBox1.Items.Add("Дерево пустое, очистка не нужна");
}
#endregion button
#region KeyPress
private void textBoxVN_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = true;
}
private void textBoxLP_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = true;
}
private void textBoxNV_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = true;
}
private void textBox_add_KeyPress(object sender, KeyPressEventArgs e)
{
// Разрешаю ввод десятичных цифр:
if (char.IsDigit(e.KeyChar) == true) return;
// Разрешаю ввод <BackSpace>:
if (e.KeyChar == (char)Keys.Back) return;
e.Handled = true;
}
private void textBox_clear_KeyPress(object sender, KeyPressEventArgs e)
{
// Разрешаю ввод десятичных цифр:
if (char.IsDigit(e.KeyChar) == true) return;
// Разрешаю ввод <BackSpace>:
if (e.KeyChar == (char)Keys.Back) return;
e.Handled = true;
}
private void textBox_search_KeyPress(object sender, KeyPressEventArgs e)
{
// Разрешаю ввод десятичных цифр:
if (char.IsDigit(e.KeyChar) == true) return;
// Разрешаю ввод <BackSpace>:
if (e.KeyChar == (char)Keys.Back) return;
e.Handled = true;
}
#endregion KeyPress
private void textBox_search_TextChanged(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("Курсовой проект: БИНАРНОЕ ДЕРЕВО ПОИСКА\nВыполнил студент группы 10ВП2\nОсипов Владимир");
}
private void textBoxVN_TextChanged(object sender, EventArgs e)
{
}
private void textBoxLP_TextChanged(object sender, EventArgs e)
{
}
private void textBoxNV_TextChanged(object sender, EventArgs e)
{
}
private void textBox_add_TextChanged(object sender, EventArgs e)
{
}
private void textBox_clear_TextChanged(object sender, EventArgs e)
{
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
}
#region Tree
public class Tree
{
public string Z; // значение узла
public Tree left, right; // указатели на потомков
// добавление строки
public bool Insert(string value)
{
if (this.Z == null)
{
this.Z = value;
return true;
}
else
if (int.Parse(this.Z).CompareTo(int.Parse(value)) == 1)
{
if (left == null)
this.left = new Tree();
return left.Insert(value);
}
else
if (int.Parse(this.Z).CompareTo(int.Parse(value)) == -1)
{
if (right == null)
this.right = new Tree();
return right.Insert(value);
}
else
return false;
}
// поиск
public Tree Search(string value)
{
if (!IsEmpty())
if (int.Parse(this.Z).CompareTo(int.Parse(value)) == 1)
if (left != null)
return this.left.Search(value);
else
return (null);
else
if (int.Parse(this.Z).CompareTo(int.Parse(value)) == -1)
if (right != null)
return this.right.Search(value);
else
return (null);
else return this;
else
return (null);
}
#region Отображение в строку
public string DisplayVN(Tree t) // Сверху вниз
{
string result = "";
result += t.Z + " ";
if (t.left != null)
result += DisplayVN(t.left);
if (t.right != null)
result += DisplayVN(t.right);
return result;
}
public string DisplayLP(Tree t) // Слева направо
{
string result = "";
if (t.left != null)
result += DisplayLP(t.left);
result += t.Z + " ";
if (t.right != null)
result += DisplayLP(t.right);
return result;
}
public string DisplayNV(Tree t) // Справа налево
{
string result = "";
if (t.right != null)
result += DisplayNV(t.right);
result += t.Z + " ";
if (t.left != null)
result += DisplayNV(t.left);
return result;
}
#endregion Отображение в строку
// проверка пустоты
public bool IsEmpty()
{
if (this.Z == null)
return true;
else
return false;
}
// удаление элемента
public bool Delete(string value)
{
Tree q = new Tree();
if (Search(value) != null)
if (this.Z != null)
if (int.Parse(this.Z).CompareTo(int.Parse(value)) == 1 && left != null) // <
return left.Delete(value);
else
if (int.Parse(this.Z).CompareTo(int.Parse(value)) == -1 && right != null) // >
return right.Delete(value);
else // =
{
if (left == null && right == null)
this.Z = null;
else
if (left != null)
if (right == null)
{
q = this.left;
this.Z = q.Z;
left = q.left;
right = q.right;
}
else
{
q = right;
if (q.left != null)
{
while (q.left.left != null)
q = q.left;
this.Z = q.left.Z;
if (q.left.right == null)
q.left = null;
else
q.left = q.left.right;
}
else
{
this.Z = q.Z;
this.right = q.right;
}
}
else
{
q = right;
this.Z = q.Z;
left = q.left;
right = q.right;
}
return true;
}
else return false;
else return false;
}
// Очистка памяти, занимаемой деревом
public void Dispose()
{
if (this.Z != null)
{
if (left != null)
left.Dispose();
if (right != null)
right.Dispose();
this.left = null;
this.right = null;
this.Z = null;
}
}
}
#endregion Tree
}
Приложение Б
Результаты тестирования
Рисунок 1
Рисунок 2
Рисунок 3
Рисунок 4
Рисунок 5
Рисунок 6
Рисунок 7
Рисунок 8
Рисунок 9
Рисунок 10
Рисунок 11
Рисунок 12
Рисунок 13
Рисунок 14
Рисунок 15Размещено на Allbest.ru
Подобные документы
Разработка программы на языке С#, которая будет заниматься построением бинарного дерева для исходных данных и их редактированием, поиском информации о товарах по заданному ключу. Графические схемы алгоритмов поиска и удаления элемента бинарного дерева.
курсовая работа [796,9 K], добавлен 22.02.2016Рассмотрение нелинейных динамических структур данных в виде бинарного дерева. Построение дерева двоичного поиска. Реализация трех обходов дерева, выведение обходов на экран компьютера. Разработка текста программы. Симметричноправая прошивка дерева.
контрольная работа [81,6 K], добавлен 14.12.2011Описание процедуры выбора структуры хранения данных. Программная реализация одномерного неоднородного массива. Представление бинарного дерева в виде динамической структуры данных. Изучение способов поиска в упорядоченном дереве. Содержание базы данных.
практическая работа [850,0 K], добавлен 16.04.2015Древовидная структура – "Бинарное дерево поиска", его структура и взаимосвязь основных компонентов, исследование в глубину. Описание разработанного программного продукта. Главные функции редактирования исходных данных и принципы работы с файлами.
курсовая работа [1,6 M], добавлен 13.06.2014Требования к MS Office 2007. Набор средств разработки Visual Studio Tools for Office как альтернатива VBA. Разработка СУБД на базе MS Access. Разработка надстройки "Электронные компоненты" для PowerPoint на языке C# в среде MS Visual Studio 2010.
дипломная работа [5,2 M], добавлен 03.05.2013Обоснование выбора языка и среды программирования. Обзор и анализ существующих программных решений. Разработка графического и пользовательского интерфейса. Алгоритм бинарного поиска. Методы добавления, удаления элемента из дерева и вывода на экран.
курсовая работа [1,3 M], добавлен 31.05.2016Разработка программного комплекса, позволяющего проиллюстрировать работу с иерархическими структурами данных. Способы изображения древовидной структуры. Двоичное (бинарное) дерево поиска. Описание алгоритмов, которые используются в программном комплексе.
курсовая работа [747,2 K], добавлен 09.06.2013Организация данных с помощью бинарных деревьев. Определение бинарного дерева. Упорядоченное двоичное дерево поиска и его свойства. Программная реализация добавления данных в упорядоченное двоичное дерево с использованием динамических структур данных.
курсовая работа [459,0 K], добавлен 09.08.2012Создание приложения Windows Forms в среде Microsoft Visual Studio 2008. Разработка программы "Курсовой" для организации работы по учёту курсовых работ в учебных заведениях с возможностью добавления, удаления, редактирования и поиска информации.
курсовая работа [2,2 M], добавлен 28.06.2011Описание входной и выходной информации. Требования к комплексу технических средств и к интерфейсу конечного пользователя. Разработка форм представления входных и выходных данных. Проектирование программных модулей. Руководство пользователя и программиста.
курсовая работа [421,6 K], добавлен 27.06.2015