Визуализация операций поиска и удаления по значению в отсортированном массиве

Заказать уникальную курсовую работу
Тип работы: Курсовая работа
Предмет: Программирование
  • 42 42 страницы
  • 11 + 11 источников
  • Добавлена 30.06.2024
1 496 руб.
  • Содержание
  • Часть работы
  • Список литературы
Содержание

Введение 3
Глава 1. Алгоритм решения задачи 4
Бинарный поиск 4
Удаление элемента из массива 4
Визуализируемые операции 5
Исходные требования к разработке объектно-ориентированного приложения (задание) 5
Глава 2. Руководство пользователя 8
Типовой сценарий работы 14
Глава 3. Руководство программиста 15
Заключение 25
Список литературы 26
Перечень графического материала 27
Приложение 28

Фрагмент для ознакомления

Width + 7.0f; } // Обводимэлементыпростойрамкой for (int i = 0; i < items.Length; i++) { g.DrawRectangle(PenBlack, starts[i] -1.5f, startY-1.5f, sizes[i].Width + 3.0f, maxHeight);} // Теперь рисуем контекстные детали String Header = null; // Заголовок отображенияswitch (st.getOperation()) { case Operation.initOperation:{Header = "Начальное состояние : ищем число " + st.getWhat().ToString(); break; } case Operation.findOperation: { Header = "Бинарный поиск : сравнение : ищем число " + st.getWhat().ToString();g.DrawRectangle(PenBlue, starts[st.getLeft()] - 1.5f, startY - 1.5f, sizes[st.getLeft()].Width + 3.0f, maxHeight); g.DrawRectangle(PenBlue, starts[st.getRight()] - 1.5f, startY - 1.5f, sizes[st.getRight()].Width + 3.0f, maxHeight); int C = (st.getRight() + st.getLeft()) / 2; g.DrawRectangle(PenRed, starts[C] - 1.5f, startY - 1.5f, sizes[C].Width + 3.0f, maxHeight); float x1 = starts[st.getLeft()] + 0.5f*sizes[st.getLeft()].Width; float x2 = starts[st.getRight()] + 0.5f * sizes[st.getRight()].Width; float xc1 = starts[C] - 1.5f; float xc2 = starts[C] + sizes[C].Width + 3.0f; float y = startY - 8.0f; if (st.getLeft() <= st.getRight()) { if (C != st.getLeft()) { g.DrawLine(PenBlue, x1, startY, x1, y); g.DrawLine(PenBlue, x1, y, xc1, y); } if (C != st.getRight()) { g.DrawLine(PenBlue, x2, startY, x2, y); g.DrawLine(PenBlue, x2, y, xc2, y); } } g.DrawString(st.getWhat().ToString(), F, B, xc1, y - 0.5f*maxHeight - 2.0f); break; } case Operation.moveOperation: { Header = "Перемещение : удаляемчисло " + st.getWhat().ToString(); g.DrawRectangle(PenRed, starts[st.getMoveIdx()+1] - 1.5f, startY - 1.5f, sizes[st.getMoveIdx() + 1].Width + 3.0f, maxHeight); float x1 = starts[st.getMoveIdx()] + 0.5f * sizes[st.getMoveIdx()].Width; float x2 = starts[st.getMoveIdx() + 1] + 0.5f * sizes[st.getMoveIdx() + 1].Width; float y = startY - 11.0f; g.DrawLine(PenRed, x1, startY - 1.5f, x1, y); g.DrawLine(PenRed, x1, y, x2, y); g.DrawLine(PenRed, x2, y, x2, startY); g.DrawLine(PenRed, x1, startY - 1.5f, x1 - 4.0f, startY - 5.0f); g.DrawLine(PenRed, x1, startY - 1.5f, x1 + 4.0f, startY - 5.0f); break; } case Operation.shrinkOperation: { Header = "Сокращениеразмерамассива"; g.DrawRectangle(PenRed, starts[starts.Length-1] - 1.5f, startY - 1.5f, sizes[starts.Length - 1].Width + 3.0f, maxHeight); float x = starts[starts.Length - 1] + 0.5f*sizes[starts.Length - 1].Width; g.DrawLine(PenRed, x, startY + maxHeight - 1.0f, x, startY + 3*maxHeight); g.DrawLine(PenRed, x, startY + 3 * maxHeight, x - 4.0f, startY + 3 * maxHeight - 5.0f); g.DrawLine(PenRed, x, startY + 3 * maxHeight, x + 4.0f, startY + 3 * maxHeight - 5.0f); break; } case Operation.stopOperation: { Header = "Операциязавершена"; break; } } // Выводимзаголовок SizeF szHeader = g.MeasureString(Header, F); g.DrawString(Header, F, B, (g.VisibleClipBounds.Width - szHeader.Width) / 2, g.VisibleClipBounds.Height / 6); } } public class Realizator // Класс-реализатор { private Parameter Param; // Переданныйпараметр private State St; // Текущеесостояние public Realizator(Parameter p) // Конструктор { Param = p; St = new State(p.getArray(), Operation.initOperation, p.getWhat(), 0, 0, 0);} public State getState() // Метод получения состояния{ return St; } public void setState(State state) // Методустановлениясостояния { St = state; } public bool Step() // Шагвыполненияработы. Возвращает true, если шаг возможен {if (St.getOperation() == Operation.stopOperation) // Еслиужедошлидоконца return false; switch (St.getOperation()) { case Operation.initOperation: { if (St.getArray().Length == 0) // Еслимассивпуст St = new State(St.getArray(), Operation.stopOperation, St.getWhat(), 0, 0, 0); else // Еслимассивнепуст St = new State(St.getArray(), Operation.findOperation, St.getWhat(), 0, St.getArray().Length - 1, 0); return true; } case Operation.findOperation: { int[] A = St.getArray(); int L = St.getLeft(); int R = St.getRight(); if (L > R) // Еслиненашли St = new State(St.getArray(), Operation.stopOperation, St.getWhat(), 0, 0, 0); else { int C = (L + R) / 2; // Центр if (A[C] == St.getWhat()) // Еслинашлиif (C == St.getArray().Length - 1) // Если это последний элемент -- shrink!St = new State(A, Operation.shrinkOperation, St.getWhat(), 0, 0, C);else // Если не последний элемент -- move!St = new State(A, Operation.moveOperation, St.getWhat(), 0, 0, C);else { if (L == R) // Если не нашлиSt = new State(St.getArray(), Operation.stopOperation, St.getWhat(), 0, 0, 0); else if (A[C] > St.getWhat()) St = new State(St.getArray(), Operation.findOperation, St.getWhat(), L, C - 1, 0); else St = new State(St.getArray(), Operation.findOperation, St.getWhat(), C + 1, R, 0); } } return true; } case Operation.moveOperation: { int[] A = new int[St.getArray().Length]; // Создаемкопиюмассива for (int i = 0; i < A.Length; i++) A[i] = St.getArray()[i]; A[St.getMoveIdx()] = A[St.getMoveIdx() + 1]; // Перемещаемэлемент if (St.getMoveIdx() == St.getArray().Length - 2) // Еслидошлидопоследнегоэлемента St = new State(A, Operation.shrinkOperation, St.getWhat(), 0, 0, St.getMoveIdx() + 1); else // Еслипродолжаемперемещать St = new State(A, Operation.moveOperation, St.getWhat(), 0, 0, St.getMoveIdx() + 1); return true; } case Operation.shrinkOperation:{ int[] A = new int[St.getArray().Length - 1]; // Создаем копию массива без последнего элементаfor (int i = 0; i < A.Length; i++) A[i] = St.getArray()[i]; St = new State(A, Operation.stopOperation, St.getWhat(), 0, 0, 0); return true; } default: return false; } } } public class Storage // Класс-хранилище { private List states = null;private int numState; // Номер текущего состояния private int lastDir; // Последнее направление перемещенияpublic Storage() // Конструктор { states = new List();RewindBegin(); } // Метод сохранения в файл с именем fNamepublic void save(String fName) { FileStream fs = new FileStream(fName, FileMode.Create); BinaryWriter sw = new BinaryWriter(fs); foreach (State s in states) s.save(sw); sw.Close(); fs.Close(); } public void load(String fName) { FileStream fs = new FileStream(fName, FileMode.Open); BinaryReader sr = new BinaryReader(fs); states.Clear(); RewindBegin(); State cur = null;// Пока удается загрузить очередное состояние while ((cur = State.load(sr)) != null) Add(cur); // Добавляем его в хранилище sr.Close(); fs.Close(); } // Метод "перемотки" в началоpublic void RewindBegin() { numState = 0; lastDir = +1;} // Метод "перемотки" в конец public void RewindEnd() { numState = states.Count - 1; lastDir = -1; } // Метод добавления состоянияpublic void Add(State st){ states.Add(st); } // Метод получения текущего состояния и перехода к следующемуpublic State Get() { if (lastDir >= 0) { lastDir = +1; if (numState >= states.Count) return null; else return states[numState++]; } else { lastDir = +1; if (numState + 2 >= states.Count) return null; else { numState += 2; return states[numState++];} } } // Метод получения текущего состояния и перехода к предыдущемуpublic State Prev() { if (lastDir < 0) { if (numState < 0) return null; else return states[numState--]; } else { lastDir = -1; if (numState - 2 < 0) return null;else { numState -= 2; return states[numState--]; } } } } public class Director // Класс-управленец { private Realizator R; // Реализатор public Director(Parameter p) // Конструктор{ R = new Realizator(p); } public Storage Run() // Метод, выполняющийоперацииивозвращающийхранилище{ Storage result = new Storage(); result.Add(R.getState()); // Запоминаемначальноесостояние// Выполняем алгоритм и запоминаем состояния while (R.Step())result.Add(R.getState()); return result;} }}Исходный код модуля окна задания начальных параметров Form2.csusing System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace vis{ public partial class Form2 : Form { public Form2() { InitializeComponent(); } // Делегат public delegate void AcceptHandler(Parameter p); // Событие public event AcceptHandler OnAccept = null; // Вызываетсяпринажатии OK private void btOK_Click(object sender, EventArgs e) { int N = Convert.ToInt32(nmN.Value); int[] a = new int[N]; Random rnd = new Random(); for (int i = 0; i < N; i++) a[i] = rnd.Next(0, 31); Array.Sort(a); // Вызываемделегатаизглавнойформы Parameter p = new Parameter(a, Convert.ToInt32(nmValue.Value)); if (OnAccept != null) OnAccept(p);} }}Исходный код модуля окна с информацией о программеForm3.csusing System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace vis{ public partial class Form3 : Form {public Form3() { InitializeComponent(); } }}

Список литературы
1. Белик, А. Г. Проектирование и архитектура программных систем : учебное пособие / А. Г. Белик, В. Н. Цыганенко. – Омск :ОмГТУ, 2016. – 96 с.
2. Вигерс, К. Разработка требований к программному обеспечению : [практические приёмы сбора требований и управления ими при разработке программных продуктов : пер. с англ.] / К. Вигерс, Д. Битти. – 3-е изд., доп. – Санкт-Петербург : BHV, 2020. – 736 с.
3. C# documentation. URL: https://learn.microsoft.com/en-us/dotnet/csharp/ (Дата обращения: 01.05.2024)
4. Албахари Б., Албахари Дж. C# 7.0. Справочник. Полное описание языка. М.: Диалектика; СПб.: Альфа-книга, 2018. – 1023 с.
5. Вагнер Б. Эффективное программирование на C# : 50 способов улучшения кода: [рассматривается C# 6.0]. – М. [и др.] : Диалектика, 2018. – 224 с.
6. Горелов, С. В. Современные технологии программирования: разработка Windows-приложений на языке С#. В 2 томах. Т.I: учебник / С.В. Горелов; под ред. П.Б. Лукьянова. – М.: Прометей, 2019. – 362 c.
7. Троелсен Э., Джепикс Ф. Язык программирования C# 7 и платформы .NET и .NET Core. СПб: ООО «Диалектика», 2018. – 1328 с.
8. Герберт Шилдт. С# 3.0. Полное руководство. – Изд. Вильямс, 2010.
9. Нейгел К., Ивьен Б. и др. С# 2008 и платформа NET 3.5 для профессионалов. – Изд. Диалектика, 2008.
10. Трей Нэш. C# 2010. Ускоренный курс для профессионалов. – Изд. Вильямс, 2010.
11. Стиллмен Э., Грин Дж. Изучаем C# [пер. с англ. И. Рузмайкина]. – 2-е изд. - Москва: Питер, 2012. – 694 с. : ил.