Визуализация операций поиска и удаления по значению в отсортированном массиве
Заказать уникальную курсовую работу- 42 42 страницы
- 11 + 11 источников
- Добавлена 30.06.2024
- Содержание
- Часть работы
- Список литературы
Введение 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
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 с. : ил.