Разработка автоматизированной информационной системы "Планета животных"

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

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

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

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

{

public partial class MainForm : Form

{

public MainForm()

{

InitializeComponent();

openToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.O;

}

RealPlanetTree tree = null;

/// <summary>

/// Списки

/// </summary>

public static List<Zoo> ZooList = new List<Zoo>();

public static List<Animal> AnimalsTree= new List<Animal>();

/// <summary>

/// Сериализация данных XML файла

/// </summary>

private void Serialize()

{

var file = new FileStream("ZooList.xml", FileMode.Create);

var ser = new XmlSerializer(typeof(List<Zoo>));

using (file) ser.Serialize(file, ZooList);

Desirealize();

Activate();

}

/// <summary>

/// Открытие (Запуск десерилизации)

/// </summary>

private void openToolStripMenuItem_Click(object sender, EventArgs e)

{

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

{

groupBox1.Visible = true;

groupBox2.Visible = true;

перегрузкиОператоровToolStripMenuItem.Enabled = true;

ZooToolStripMenuItem.Enabled = true;

Desirealize();

}

}

/// <summary>

/// Десерилизация данных из XML файла и обновление формы

/// </summary>

private void Desirealize()

{

ZooList.Clear();

AnimalsTree.Clear();

AnimData.RowCount = 0;

StreamReader file = new StreamReader(openFileDialog1.FileName);

var serializer = new XmlSerializer(typeof(List<Zoo>));

using (file)

{

var obj = serializer.Deserialize(file);

ZooList = obj as List<Zoo>;

}

foreach (Zoo zoo in ZooList)

{

foreach (var animal in zoo.Animal)

{ AnimalsTree.Add(animal); }

}

tree = new RealPlanetTree(AnimalsTree);

UpdateTree();

UpdateForm();

}

/// <summary>

/// Обновления содержимого формы

/// </summary>

private void UpdateForm()

{

int number = 0;

foreach (Zoo zoo in ZooList)

{

foreach (var animal in zoo.Animal)

{

AnimData.Rows.Add();

animal.WriteToTable(AnimData.Rows[number]);

AnimData[5, number].Value = zoo.ZName;

number++;

}

}

}

/// <summary>

/// Обновление дерева

/// </summary>

public void UpdateTree()

{

treeView1.Nodes.Clear();

TreeNode treeNode = tree.Root.ConvertToTreeNode();

treeView1.Nodes.Add(treeNode);

treeView1.ExpandAll();

}

/// <summary>

/// Добавление зоопарка и животного

/// </summary>

public void button1_Click(object sender, EventArgs e)

{

var f = new AddAnimalWindow();

f.Show();

f.Closed += (o, args) => Serialize();

}

/// <summary>

/// Двойной клик по животному в таблице

/// </summary>

private void AnimData_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)

{

var index = e.RowIndex;

var number = AnimData[0, index].Value;

foreach (var zoo in ZooList)

foreach(var animal in zoo.Animal)

if (animal.AnimName == (string)number)

{

var k = new AboutZoo(animal,zoo);

k.Show();

}

}

/// <summary>

/// Удаление животного

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void Delete_Click(object sender, EventArgs e)

{

var selectAnim = AnimData.SelectedRows[0];

var idAnim = Convert.ToInt32(selectAnim.Cells[3].Value);

var number = selectAnim.Cells[5].Value.ToString();

foreach (var zoo in ZooList)

{

if (zoo.ZName == number)

{

foreach (var animal in zoo.Animal)

if (animal.SizeOfPopul == idAnim)

{

zoo.Animal.Remove(animal);

AnimalsTree.Remove(animal);

tree.AnimalsTree.Remove(animal);

break;

}

break;

}

}

UpdateTree();

Serialize();

}

/// <summary>

/// Получение информации о зоопарках

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void InfZooToolStripMenuItem_Click(object sender, EventArgs e)

{

var m = new DelZooWindow();

m.Show();

m.Closed += (o, args) => Serialize();

}

/// <summary>

/// Замена животного

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void ReplaceButton_Click(object sender, EventArgs e)

{

var v = new ReplaceAnim();

v.Show();

v.Closed += (o, args) => Serialize();

}

/// <summary>

/// Выход

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void button1_Click_1(object sender, EventArgs e)

{

Close();

}

/// <summary>

/// Выход

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void exitToolStripMenuItem_Click(object sender, EventArgs e)

{

Close();

}

/// <summary>

/// Метод увеличения веса

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void ImproveWeight_Click(object sender, EventArgs e)

{

ChooseForm chooseForm = new ChooseForm();

chooseForm.SetAnimals(tree.AnimalsTree);

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

{

Animal animal = chooseForm.SelectedAnimal;

int index = tree.FindAnimalInList(animal.AnimName);

tree.Animals[index]++;

tree.Change(tree.Animals[index]);

UpdateForm();

}

}

/// <summary>

/// Метод уменьшение веса

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void LessWeight_Click(object sender, EventArgs e)

{

ChooseForm chooseForm = new ChooseForm();

chooseForm.SetAnimals(tree.Animals);

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

{

Animal animal = chooseForm.SelectedAnimal;

int index = tree.FindAnimalInList(animal.AnimName);

tree.Animals[index]--;

tree.Change(tree.Animals[index]);

UpdateForm();

}

}

/// <summary>

/// Перегрузка операторов отношения

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void Overload_Click(object sender, EventArgs e)

{

ReloadAtitudeOperator relodeOperator = new ReloadAtitudeOperator();

relodeOperator.SetAnimals(tree.Animals);

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

{

if (relodeOperator.F == 0)

MessageBox.Show("Вес первого животного больше веса второго!");

if (relodeOperator.F == 1)

MessageBox.Show("Вес второго животного больше веса первого!");

if(relodeOperator.F == 2)

MessageBox.Show("У животных одинаковый вес!");

}

}

/// <summary>

/// Нахождение животного с максимальным весом

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void MaxWeight_Click(object sender, EventArgs e)

{

int MaxIndex = 0;

AnimData.Rows[MaxIndex].Selected = false;

Animal Max = AnimalsTree[0];

for (int i = 1; i < AnimalsTree.Count; i++)

{

if (Max != AnimalsTree[i])

if (Max < AnimalsTree[i])

{

MaxIndex = i;

Max = AnimalsTree[i];

}

}

AnimData.Rows[MaxIndex].Selected = true;

AnimData.FirstDisplayedScrollingRowIndex = MaxIndex;

string message = "Животное: " + Max.AnimName + "\n" + "Вес: " + Max.Weight;

MessageBox.Show(message);

}

/// <summary>

/// Поиск животного по ключу

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void button2_Click(object sender, EventArgs e)

{

SearchEnter searchEnter = new SearchEnter();

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

{

Animal animal = tree.Search(searchEnter.NameAnimal);

if (searchEnter.NameAnimal != null && animal != null)

MessageBox.Show("Животное найдено: " + "\n" + " Наименование животного: " + animal.AnimName + "\n Вид животного: " + animal.AnimSpec + "\n Вес животного: " + animal.Weight + " \n Возраст: " + animal.Age + " \n Личный номер: " + animal.SizeOfPopul);

else

MessageBox.Show("Нет таких животных");

}

}

/// <summary>

/// Получение информации об авторе

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

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

{

AboutAthor about = new AboutAthor();

about.Show();

}

}

}

Г.2 RealPlanetNode.cs

namespace CourseProjektKovaleva

{

class RealPlanetNode

{

/// <summary>

/// Поля класса RealPlanetNode

/// </summary>

private string key;// ключ узла

private Animal nodeValue;//значение узла

private RealPlanetNode parent;//родитель

private RealPlanetNode left;

private RealPlanetNode right;

public bool visited = false;

/// <summary>

/// Конструктор с параметрами

/// </summary>

/// <param name="animal"></param>

public RealPlanetNode(Animal animal)

{

this.key = animal.AnimName;

this.nodeValue = animal;

this.parent = null;

this.left = null;

this.right = null;

}

/// <summary>

/// Преобразуем дерево RealPlanetNode в TreeNode для отображения в treeview1 на форме

/// </summary>

/// <returns></returns>

public TreeNode ConvertToTreeNode()

{

TreeNode root = new TreeNode("Real Planet");

BuildTreeNode(this, ref root);

return root;

}

/// <summary>

/// Строим дерево

/// </summary>

/// <param name="node"></param>

/// <param name="parent"></param>

private void BuildTreeNode(RealPlanetNode node, ref TreeNode parent)

{

TreeNode treeNode = new TreeNode(node.Key);

parent.Nodes.Add(treeNode);

if (node.LeftNode != null)

{

BuildTreeNode(node.LeftNode, ref treeNode);

}

if (node.RightNode != null)

{

BuildTreeNode(node.RightNode, ref treeNode);

}

}

/// <summary>

/// Свойства для доступа к key

/// </summary>

public string Key

{

get { return key; }

set { key = value; }

}

/// <summary>

/// Свойства для доступа к nodeValue

/// </summary>

public Animal Value

{

get { return nodeValue; }

set { nodeValue = value; }

}

/// <summary>

/// Свойства для доступа parent

/// </summary>

public RealPlanetNode ParentNode

{

get { return parent; }

set { parent = value; }

}

/// <summary>

/// Свойства для доступа left

/// </summary>

public RealPlanetNode LeftNode

{

get { return left; }

set { left = value; }

}

/// <summary>

/// Свойства для доступа right

/// </summary>

public RealPlanetNode RightNode

{

get { return right; }

set { right = value; }

}

/// <summary>

/// Перегрузка оператора отношения

/// </summary>

/// <param name="node1"></param>

/// <param name="node2"></param>

/// <returns></returns>

public static bool operator >(RealPlanetNode node1, RealPlanetNode node2)

{

int key1 = node1.Key.GetHashCode();

int key2 = node2.Key.GetHashCode();

if (key1 > key2)

return true;

else

return false;

}

/// <summary>

/// Перегрузка оператора отношения

/// </summary>

/// <param name="node1"></param>

/// <param name="node2"></param>

/// <returns></returns>

public static bool operator <(RealPlanetNode node1, RealPlanetNode node2)

{

int key1 = node1.Key.GetHashCode();

int key2 = node2.Key.GetHashCode();

if (key1 < key2)

return true;

else

return false;

}

}

}

Г.3 RealPlanetTree.cs

namespace CourseProjektKovaleva

{

class RealPlanetTree

{

public List<Animal> AnimalsTree;//список значений(животные)

public RealPlanetNode root;//корневой узел(дерево)

/// <summary>

/// Конструктор с параметрами

/// </summary>

/// <param name="animals"></param>

public RealPlanetTree(List<Animal> animals)

{

AnimalsTree = animals;

root = new RealPlanetNode(AnimalsTree[0]);

for (int i = 1; i < AnimalsTree.Count; i++)

Insert(AnimalsTree[i]);

}

/// <summary>

/// Свойства для доступа к полю AnimalsTree

/// </summary>

public List<Animal> Animals

{

get { return AnimalsTree; }

}

/// <summary>

/// Свойства для доступа к полю root

/// </summary>

public RealPlanetNode Root

{

get { return root; }

}

/// <summary>

/// Поиск индекса животного в списке

/// </summary>

/// <param name="key"></param>

/// <returns></returns>

public int FindAnimalInList(string key)

{

for (int i = 1; i < AnimalsTree.Count; i++)

if (AnimalsTree[i].AnimName == key)

{

return i;

}

return 0;

}

/// <summary>

///

/// </summary>

/// <param name="node"></param>

private void SetFalseVisited(RealPlanetNode node)

{

node.visited = false;

if (node.LeftNode != null) SetFalseVisited(node.LeftNode);

if (node.RightNode != null) SetFalseVisited(node.RightNode);

}

/// <summary>

/// Вставка узла в дерево

/// </summary>

/// <param name="animal"></param>

public void Insert(Animal animal)

{

RealPlanetNode newNode = new RealPlanetNode(animal);//узел, который нужно вставить в дерево

Stack<RealPlanetNode> stack = new Stack<RealPlanetNode>();//пустой стек

SetFalseVisited(root);

bool isInserted = false;

stack.Push(root);//записываем корневой узел в стек

while (stack.Count != 0 && isInserted == false)

{

RealPlanetNode currNode = stack.Peek();//берем из стека(не удаляем)

if (currNode.LeftNode != null && currNode.LeftNode.visited == false)//спускаемся влево

{

stack.Push(currNode.LeftNode);

}

else

{

if (currNode.RightNode != null && currNode.RightNode.visited == false)//спускаемся вправо

{

stack.Push(currNode.RightNode);

}

else

{

//поднимаемся по дереву

currNode.visited = true;

stack.Pop();//удаляем из стека текущий узел

if (newNode > currNode && currNode.RightNode == null)//вставляем узел вправо

{

if (currNode.ParentNode == null || (currNode.ParentNode != null && currNode == currNode.ParentNode.LeftNode && currNode.ParentNode > newNode))//в левой ветке

isInserted = InsertRight(currNode, newNode);

else

if (currNode.ParentNode == null || (currNode.ParentNode != null && currNode == currNode.ParentNode.RightNode && currNode.ParentNode < newNode))//в правой ветке

isInserted = InsertRight(currNode, newNode);

}

if (newNode < currNode && currNode.LeftNode == null && isInserted == false)//вставляем узел влево

{

if (currNode.ParentNode == null || (currNode.ParentNode != null && currNode == currNode.ParentNode.LeftNode && currNode.ParentNode > newNode))//в левой ветке

isInserted = InsertLeft(currNode, newNode);

else

if (currNode.ParentNode == null || (currNode.ParentNode != null && currNode == currNode.ParentNode.RightNode && currNode.ParentNode < newNode))//в правой ветке

isInserted = InsertLeft(currNode, newNode);

}

}

}

}

}

/// <summary>

/// Вставка левое поддерево

/// </summary>

/// <param name="node"></param>

/// <param name="newNode"></param>

/// <returns></returns>

private bool InsertLeft(RealPlanetNode node, RealPlanetNode newNode)

{

node.LeftNode = newNode;

newNode.ParentNode = node;

return true;

}

/// <summary>

/// Вставка правое поддерево

/// </summary>

/// <param name="node"></param>

/// <param name="newNode"></param>

/// <returns></returns>

private bool InsertRight(RealPlanetNode node, RealPlanetNode newNode)

{

node.RightNode = newNode;

newNode.ParentNode = node;

return true;

}

/// <summary>

/// Изменение узла дерева

/// </summary>

/// <param name="animal"></param>

public void Change(Animal animal)

{

RealPlanetNode changeNode = new RealPlanetNode(animal);

Stack<RealPlanetNode> stack = new Stack<RealPlanetNode>();

SetFalseVisited(root);

bool isChanged = false;

stack.Push(root);

while (stack.Count != 0 && isChanged == false)

{

RealPlanetNode currNode = stack.Peek();

if (currNode.LeftNode != null && currNode.LeftNode.visited == false)//спускаемся влево

{

stack.Push(currNode.LeftNode);

}

else

{

if (currNode.RightNode != null && currNode.RightNode.visited == false)//спускаемся вправо

{

stack.Push(currNode.RightNode);

}

else

{

//поднимаемся по дереву

currNode.visited = true;

stack.Pop();

if (currNode.Key == changeNode.Key)//нашли узел

{

currNode = changeNode;//изменили узел

isChanged = true;

}

}

}

}

}

/// <summary>

/// Удаление узла дерева

/// </summary>

/// <param name="animal"></param>

public void Remove(Animal animal)

{

RealPlanetNode newNode = new RealPlanetNode(animal);

Stack<RealPlanetNode> stack = new Stack<RealPlanetNode>();

SetFalseVisited(root);

bool isRemoved = false;

stack.Push(root);

while (stack.Count != 0 && isRemoved == false)

{

RealPlanetNode currNode = stack.Peek();

if (currNode.LeftNode != null && currNode.LeftNode.visited == false)//спускаемся влево(заполняем стек)

{

stack.Push(currNode.LeftNode);

}

else

{

if (currNode.RightNode != null && currNode.RightNode.visited == false)//спускаемся вправо(заполняем стек)

{

stack.Push(currNode.RightNode);

}

else

{

//поднимаемся

currNode.visited = true;

stack.Pop();

if (currNode.Key == newNode.Key) //нашли нужный узел

{

if (currNode.LeftNode == null && currNode.RightNode == null && currNode.ParentNode != null)//если нет потомков

{

if (currNode == currNode.ParentNode.LeftNode)

currNode.ParentNode.LeftNode = null;

else

currNode.ParentNode.RightNode = null;

isRemoved = true;

}

else

{

if (currNode.LeftNode != null && currNode.RightNode == null && currNode.ParentNode != null)//если есть только левый потомок

{

if (currNode == currNode.ParentNode.LeftNode)

currNode.ParentNode.LeftNode = currNode.LeftNode;

else

currNode.ParentNode.RightNode = currNode.LeftNode;

isRemoved = true;

}

else

{

if (currNode.LeftNode == null && currNode.RightNode != null && currNode.ParentNode != null)//если есть только правый потомок

{

if (currNode == currNode.ParentNode.LeftNode)

currNode.ParentNode.LeftNode = currNode.RightNode;

else

currNode.ParentNode.RightNode = currNode.RightNode;

isRemoved = true;

}

else

{

if (currNode.LeftNode != null && currNode.RightNode != null && currNode.ParentNode != null)//если есть 2 потомка

{

if (currNode == currNode.ParentNode.LeftNode)

{

RealPlanetNode rightNode = currNode.RightNode;

currNode.ParentNode.LeftNode = currNode.LeftNode;

RealPlanetNode node = GetEndRightNode(currNode.ParentNode.LeftNode);

node.RightNode = rightNode;

}

else

{

RealPlanetNode rightNode = currNode.RightNode;

currNode.ParentNode.RightNode = currNode.LeftNode;

RealPlanetNode node = GetEndRightNode(currNode.ParentNode.RightNode);

node.RightNode = rightNode;

}

isRemoved = true;

}

}

}

}

}

}

}

}

}

/// <summary>

/// Находим самый правый узел

/// </summary>

/// <param name="node"></param>

/// <returns></returns>

private RealPlanetNode GetEndRightNode(RealPlanetNode node)

{

if (node.RightNode != null)

return GetEndRightNode(node.RightNode);

else

return node;

}

/// <summary>

/// Поиск по ключу

/// </summary>

/// <param name="name"></param>

/// <returns></returns>

public Animal Search(string name)

{

Stack<RealPlanetNode> stack = new Stack<RealPlanetNode>();

SetFalseVisited(root);

bool isChanged = false;

stack.Push(root);

while (stack.Count != 0 && isChanged == false)

{

RealPlanetNode currNode = stack.Peek();

if (currNode.LeftNode != null && currNode.LeftNode.visited == false)//спускаемся влево

{

stack.Push(currNode.LeftNode);

}

else

{

if (currNode.RightNode != null && currNode.RightNode.visited == false)//спускаемся вправо

{

stack.Push(currNode.RightNode);

}

else

{

//поднимаемся по дереву

currNode.visited = true;

stack.Pop();

if (currNode.Key.StartsWith(name) == true)//нашли узел

{

return currNode.Value;

}

}

}

}

return null;

}

}

}

Г.4 Zoo.cs

namespace CourseProjektKovaleva

{

[Serializable]

public class Zoo

{

/// <summary>

/// Поля класса Zoo

/// </summary>

public string ZName { get; set; }

public int ZSquare { get; set; }

public string ZTown { get; set; }

public string ZCountry { get; set; }

/// <summary>

/// Список

/// </summary>

public List<Animal> Animal = new List<Animal>();

/// <summary>

/// Метод для вывода данных в таблицу

/// </summary>

/// <param name="data"></param>

/// <param name="number"></param>

public void WriteToTable(DataGridViewRow data, bool number)

{

data.Cells[0].Value = ZName;

data.Cells[1].Value = ZSquare;

data.Cells[2].Value = ZTown;

data.Cells[3].Value = ZCountry;

if (number)

data.Cells[4].Value = Animal.Count;

}

}

}

Г.5 Animal.cs

namespace CourseProjektKovaleva

{

[Serializable]

public class Animal

{

/// <summary>

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

/// </summary>

public enum Species

{

Млекопитающее,

Птицы,

Рыбы,

Пресмыкающиеся,

Земноводные,

Паукообразные,

Членистоногие

};

/// <summary>

/// Поля класса Animal

/// </summary>

public string AnimName { get; set; }

public Species AnimSpec { get; set; }

public int Weight { get; set; }

public int SizeOfPopul { get; set; }

public int Age { get; set; }

/// <summary>

/// Метод для записи в значений в таблицу

/// </summary>

/// <param name="data"></param>

public void WriteToTable(DataGridViewRow data)

{

data.Cells[0].Value = AnimName;

data.Cells[1].Value = Age;

data.Cells[2].Value = Weight;

data.Cells[3].Value = SizeOfPopul;

data.Cells[4].Value = AnimSpec;

}

/// <summary>

/// Инкремент веса

/// </summary>

/// <param name="animal"></param>

/// <returns></returns>

public static Animal operator ++(Animal animal)

{

animal.Weight++;

return animal;

}

/// <summary>

/// Декремент веса

/// </summary>

/// <param name="animal"></param>

/// <returns></returns>

public static Animal operator --(Animal animal)

{

animal.Weight--;

return animal;

}

/// <summary>

/// Перегрузка операторов отношения

/// </summary>

/// <param name="animal1"></param>

/// <param name="animal2"></param>

/// <returns></returns>

public static bool operator >(Animal animal1, Animal animal2)

{

if (animal1.Weight > animal2.Weight)

return true;

else

return false;

}

/// <summary>

/// Перегрузка операторов отношения

/// </summary>

/// <param name="animal1"></param>

/// <param name="animal2"></param>

/// <returns></returns>

public static bool operator <(Animal animal1, Animal animal2)

{

if (animal1.Weight < animal2.Weight)

return true;

else

return false;

}

}

}

Размещено на Allbest.ru


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

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