Отладка кода C#. Курсовой проект (работа) по дисциплине Технологии программирования наименование дисциплины Тема курсового проекта (работы)
Скачать 172.18 Kb.
|
Институт кибербезопасности и цифровых технологий Кафедра КБ-14 «Цифровые технологии обработки данных» КУРСОВОЙ ПРОЕКТ (РАБОТА) по дисциплине «Технологии программирования» наименование дисциплины Тема курсового проекта (работы) Отладка кода C# Студент группы БСБО-11-21 Маханько Д.В. (учебная группа) Фамилия И.О. Руководитель курсового проекта (работы) Сачков В.Е. доцент, к.т.н. Фамилия И.О. Работа представлена к защите «__»______ 20__г. подпись студента Допущен к защите «__»______ 20__г. подпись руководителя Москва 2022 г. Содержание1. Описание System.Collections 4 1.1 Использование простой коллекции 6 1.1.1 Установка начальной емкости списка 7 1.1.2 Обращение к элементам списка 8 1.1.3 Длина списка 8 1.1.4 Перебор списка 8 1.1.5 Методы списка 8 1.2 Двухсвязный список LinkedList 2. LinkedList 11 2.1 Свойства LinkedList 11 2.2 Методы LinkedList 11 3. Очередь Queue 13 3.1 Создание очереди 13 3.2 Методы Queue 13 4. Коллекция Dictionary 4.1 Создания и инициализация словаря 15 4.2 KeyValuePair 15 4.3 Перебор словаря 16 4.4 Получение элементов 16 4.5 Методы и свойства Dictionary 16 Заключение 18 Список источников 19 Введение Во многих приложениях требуется создавать группы связанных объектов и управлять ими. Существует два способа группировки объектов: создать массив объектов и создать коллекцию. Массивы удобнее всего использовать для создания фиксированного числа строго типизированных объектов и работы с ними. Информацию о массивах см. в разделе Массивы. Коллекции предоставляют более гибкий способ работы с группами объектов. В отличие от массивов, коллекция, с которой вы работаете, может расти или уменьшаться динамически при необходимости. Некоторые коллекции допускают назначение ключа любому объекту, который добавляется в коллекцию, чтобы в дальнейшем можно было быстро извлечь связанный с ключом объект из коллекции. Коллекция является классом, поэтому необходимо объявить экземпляр класса перед добавлением в коллекцию элементов. Если коллекция содержит элементы только одного типа данных, можно использовать один из классов в пространстве имен System.Collections.Generic. Универсальная коллекция обеспечивает строгую типизацию, так что в нее нельзя добавить другие типы данных. При извлечении элемента из универсальной коллекции не нужно определять или преобразовывать его тип данных. 1. Описание System.CollectionsВ C# для хранения набора однотипных данных можно использовать массивы. Но с ними не всегда удобно работать потому, что они имеют фиксированный размер и часто бывает сложно угадать, какого размера нужен массив. Для решения этих задач в C# есть коллекции. Они позволяют динамически изменять свой размер. Также они удобны тем что некоторые из них представляют из себя готовые реализации стандартных структур данных, таких как список, хеш таблица, стек, очередь. Все коллекции лежат в нескольких пространствах имен: System.Collections — простые необобщенные коллекции. System.Collections.Generic — обобщенные коллекции. System.Collections.Specialized — специальные коллекции. System.Collections.Concurrent — коллекции для работы в многопоточной среде. Только интерфейсы обобщенных коллекций отличаются от необобщеных двойников не только наличием универсального параметра T, но и самой функциональностью. Рассмотрим основные интерфейсы обобщенных коллекций: IEnumerable .Реализация данного интерфейса позволяет перебирать элементы коллекции с помощью цикла foreach; IEnumerator ICollection IList IComparer IDictionary IEqualityComparer Эти интерфейсы реализуются следующими классами коллекций в пространстве имен System.Collections.Generic: List Dictionary LinkedList Queue SortedSet SortedList SortedDictionary Stack Большинство обобщенных классов коллекций дублируют необобщенные классы коллекций. Но если вам не надо хранить объекты разных типов, то предпочтительнее использовать обобщенные коллекции. Алгоритмическая сложность коллекций представлена на рис. 1. Рис. 1.1 – Алгоритмическая сложность коллекций 1.1 Использование простой коллекцииХотя в языке C# есть массивы, которые хранят в себе наборы однотипных объектов, но работать с ними не всегда удобно. Например, массив хранит фиксированное количество объектов, однако что если мы заранее не знаем, сколько нам потребуется объектов. И в этом случае намного удобнее применять коллекции. Еще один плюс коллекций состоит в том, что некоторые из них реализует стандартные структуры данных, например, стек, очередь, словарь, которые могут пригодиться для решения различных специальных задач. Большая часть классов коллекций содержится в пространстве имен System.Collections.Generic. Класс List В приведенном ниже листинге 1.1 создается список строк, а затем выполняется перебор строк с помощью оператора foreach. Листинг 1.1 – Пример работы с классом List // Create a list of strings. var salmons = new List salmons.Add("chinook"); salmons.Add("coho"); salmons.Add("pink"); salmons.Add("sockeye"); // Iterate through the list. foreach (var salmon in salmons) { Console.Write(salmon + " "); } // Output: chinook coho pink sockeye Если содержимое коллекции известно заранее, для ее инициализации можно использовать инициализатор коллекции. Следующий пример аналогичен предыдущему за исключением того, что для добавления элементов в коллекцию используется инициализатор коллекции. Для перебора коллекции можно использовать оператор for вместо оператора foreach. Для этого доступ к элементам коллекции осуществляется по позиции индекса. Индекс элементов начинается с 0 и заканчивается числом, равным количеству элементов минус 1. Для типа элементов в List 1.1.1 Установка начальной емкости спискаУказание начальной емкости списка позволяет в будущем увеличить производительность и уменьшить издержки на выделение памяти при добавлении элементов. Поскольку динамическое добавление в список может приводить на низком уровне к дополнительному выделению памяти, что снижает производительность. Если же мы знаем, что список не будет превышать некоторый размер, то мы можем передать этот размер в качестве емкости списка и избежать дополнительных выделений памяти. Также начальную емкость можно установить с помощью свойства Capacity, которое имеется у класса List. 1.1.2 Обращение к элементам спискаКак и массивы, списки поддерживают индексы, с помощью которых можно обратиться к определенным элементам. 1.1.3 Длина спискаС помощью свойства Count можно получить длину списка. 1.1.4 Перебор спискаC# позволяет осуществить перебор списка с помощью стандартного цикла foreach. 1.1.5 Методы спискаСреди его методов можно выделить следующие: void Add(T item): добавление нового элемента в список; void AddRange(IEnumerable int BinarySearch(T item): бинарный поиск элемента в списке. Если элемент найден, то метод возвращает индекс этого элемента в коллекции. При этом список должен быть отсортирован; void CopyTo(T[] array): копирует список в массив array; void CopyTo(int index, T[] array, int arrayIndex, int count): копирует из списка начиная с индекса index элементы, количество которых равно count, и вставляет их в массив array начиная с индекса arrayIndex bool Contains(T item): возвращает true, если элемент item есть в списке; void Clear(): удаляет из списка все элементы; bool Exists(Predicate T? Find(Predicate T? FindLast(Predicate List int IndexOf(T item): возвращает индекс первого вхождения элемента в списке; int LastIndexOf(T item): возвращает индекс последнего вхождения элемента в списке; List void Insert(int index, T item): вставляет элемент item в список по индексу index. Если такого индекса в списке нет, то генерируется исключение; void InsertRange(int index, collection): вставляет коллекцию элементов collection в текущий список начиная с индекса index. Если такого индекса в списке нет, то генерируется исключение; bool Remove(T item): удаляет элемент item из списка, и если удаление прошло успешно, то возвращает true. Если в списке несколько одинаковых элементов, то удаляется только первый из них; void RemoveAt(int index): удаление элемента по указанному индексу index. Если такого индекса в списке нет, то генерируется исключение; void RemoveRange(int index, int count): параметр index задает индекс, с которого надо удалить элементы, а параметр count задает количество удаляемых элементов; int RemoveAll((Predicate void Reverse(): изменяет порядок элементов; void Reverse(int index, int count): изменяет порядок на обратный для элементов, количество которых равно count, начиная с индекса index; void Sort(): сортировка списка; void Sort(IComparer Пример поиска и проверка элемента представлен в листинге 1.1. Листинг 1.1 – Пример поиска и проверка элемента var people = new List var containsBob = people.Contains("Bob"); // true var containsBill = people.Contains("Bill"); // false // проверяем, есть ли в списке строки с длиной 3 символа var existsLength3 = people.Exists(p => p.Length == 3); // true // проверяем, есть ли в списке строки с длиной 7 символов var existsLength7 = people.Exists(p => p.Length == 7); // false // получаем первый элемент с длиной в 3 символа var firstWithLength3 = people.Find(p => p.Length == 3); // Tom // получаем последний элемент с длиной в 3 символа var lastWithLength3 = people.FindLast(p => p.Length == 3); // Sam // получаем все элементы с длиной в 3 символа в виде списка List // peopleWithLength3 { "Tom", "Bob", "Sam"} 1.2 Двухсвязный список LinkedList Класс LinkedList Если в простом списке List Класс LinkedListNode имеет следующие свойства: Value: возвращает или устанавливает само значение узла, представленное типом T; Next: возвращает ссылку на следующий элемент типа LinkedListNode Previous: возвращает ссылку предыдущий элемент типа LinkedListNode 2. LinkedList2.1 Свойства LinkedListКласс LinkedList определяет следующие свойства: Count: количество элементов в связанном списке; First: первый узел в списке в виде объекта LinkedListNode Last: последний узел в списке в виде объекта LinkedListNode 2.2 Методы LinkedListИспользуя методы класса LinkedList AddAfter(LinkedListNode AddAfter(LinkedListNode AddBefore(LinkedListNode AddBefore(LinkedListNode AddFirst(LinkedListNode AddFirst(T value): вставляет новый узел со значением value в начало списка. AddLast(LinkedListNode AddLast(T value): вставляет новый узел со значением value в конец списка. RemoveFirst(): удаляет первый узел из списка. После этого новым первым узлом становится узел, следующий за удаленным. RemoveLast(): удаляет последний узел из списка. Примеры применения некоторые из этих методов представлено в листинге 1.2. Листинг 1.2 – Пример применения некоторых методов var people = new LinkedList people.AddLast("Tom"); // вставляем узел со значением Tom на последнее место //так как в списке нет узлов, то последнее будет также и первым people.AddFirst("Bob"); // вставляем узел со значением Bob на первое место // вставляем после первого узла новый узел со значением Mike if (people.First != null) people.AddAfter(people.First, "Mike"); // теперь у нас список имеет следующую последовательность: Bob Mike Tom foreach (var person in people) Console.WriteLine(person); 3. Очередь QueueКласс Queue 3.1 Создание очередиДля создания очереди можно использовать один из трех ее конструкторов. Прежде всего можно создать пустую очередь. При создании пустой очереди можно указать емкость очереди. Также можно инициализировать очередь элементами из другой коллекции или массивом. Для перебора очереди можно использовать стандартный цикл foreach. Для получения количества элементов в очереди в классе определено свойство Count. 3.2 Методы QueueУ класса Queue void Clear(): очищает очередь; bool Contains(T item): возвращает true, если элемент item имеется в очереди; T Dequeue(): извлекает и возвращает первый элемент очереди; void Enqueue(T item): добавляет элемент в конец очереди; T Peek(): просто возвращает первый элемент из начала очереди без его удаления. Очереди - довольно часто встречаемая структура в реальной жизни. Например, очередь пациентов на прием к врачу. Реализуем данную ситуацию в листинге 1.3. Листинг 1.3 – Пример применения очереди var patients = new Queue (); patients.Enqueue(new Person("Tom")); patients.Enqueue(new Person("Bob")); patients.Enqueue(new Person("Sam")); var practitioner = new Doctor(); practitioner.TakePatients(patients); class Person { public string Name { get; } public Person(string name) => Name = name; } class Doctor { public void TakePatients(Queue patients) { while(patients.Count > 0) { var patient = patients.Dequeue(); Console.WriteLine($"Осмотр пациента {patient.Name}"); } Console.WriteLine("Доктор закончил осматривать пациентов"); } } Здесь класс врача - класс Doctor в методе TakePatients принимает очередь пациентов в виде объектов Person. И пока в очереди есть объекты извлекает по одному объекту. Консольный вывод представлен на рис. 3.1. Рис. 3.1 – Алгоритмическая сложность коллекций 4. Коллекция Dictionary Еще один распространенный тип коллекции представляют словари. Словарь хранит объекты, которые представляют пару ключ-значение. Класс словаря Dictionary 4.1 Создания и инициализация словаряКласс Dictionary предоставляет ряд конструкторов для создания словаря. Например, мы можем создать пустой словарь. При определении словаря его сразу же можно инициализировать значениями. При инициализации применяется инициализитор - в фигурных скобках после вызова конструктора объекту передаются начальные данные. В случае со словаем мы можем передать в инициализаторе набор элементов, где каждый элемент заключается в фигурные скобки. Каждый элемент представляет два значения: первое значение представляет ключ, а второе значение - собственно значение элемента. Поскольку при объявлении словаря people для ключей указан тип int, а для значений - тип string, то в элементе словаря сначала указывается число int, а затем строка. То есть в случае выше элемент имеет ключ 5, а значение - "Tom". Затем по ключу элемента мы сможем получить его значение. 4.2 KeyValuePairСтоит отметить, что каждый элемент в словаре представляет структуру KeyValuePair Конструктор типа KeyValuePair принимает два параметра - ключ элемента и его значения. То есть в данном случае создается один такой элемент - mike с ключом 56 и значением "Mike". И этот элемент добавляется в список employees, которым затем инициализируется словарь. Можно совместить оба способа инициализации. 4.3 Перебор словаряДля перебора словаря можно применять цикл foreach. При переборе каждый элемент будет помещаться в переменную, которая представляет тип KeyValuePair, соответственно с помощью свойств Key и Value мы сможем получить ключ и значение элемента. 4.4 Получение элементовДля обращения к элементам из словаря применяется их ключ, который передается в квадратных скобках. Таким образом мы можем получить и изменить элементы словаря. Более того, таким образом мы можем также добавить новый элемент в словарь. При установке значения по ключу, если элемент с таким ключом уже есть в словаре, то значение переустанавливается. Если же элемента с подобным ключом нет в словаре, то элемент добавляется. 4.5 Методы и свойства DictionaryСреди методов класса Dictionary можно выделить следующие: void Add(K key, V value): добавляет новый элемент в словарь; void Clear(): очищает словарь; bool ContainsKey(K key): проверяет наличие элемента с определенным ключом и возвращает true при его наличии в словаре; bool ContainsValue(V value): проверяет наличие элемента с определенным значением и возвращает true при его наличии в словаре; bool Remove(K key): удаляет по ключу элемент из словаря; Другая версия этого метода позволяет получить удленный элемент в выходной параметр: bool Remove(K key, out V value); bool TryGetValue(K key, out V value): получает из словаря элемент по ключу key. При успешном получении передает значение элемента в выходной параметр value и возвращает true; bool TryAdd(K key, V value): добавляет в словарь элемент с ключом key и значением value. При успешном добавлении возвращает true. Из свойств следует отметить свойство Count, которое возвращает количество элементов в словаре. ЗаключениеКоллекции предоставляют более гибкий способ работы с группами объектов. В отличие от массивов, коллекция, с которой вы работаете, может расти или уменьшаться динамически при необходимости. Некоторые коллекции допускают назначение ключа любому объекту, который добавляется в коллекцию, чтобы в дальнейшем можно было быстро извлечь связанный с ключом объект из коллекции. Коллекция является классом, поэтому необходимо объявить экземпляр класса перед добавлением в коллекцию элементов. Список источниковАгуров, Павел C#. Сборник рецептов / Павел Агуров. - М.: "БХВ-Петербург", 2012. - 432 c. Альфред, В. Ахо Компиляторы. Принципы, технологии и инструментарий / Альфред В. Ахо и др. - М.: Вильямс, 2015. - 266 c. Бишоп, Дж. C# в кратком изложении / Дж. Бишоп, Н. Хорспул. - М.: Бином. Лаборатория знаний, 2013. - 472 c. Вагнер, Билл С# Эффективное программирование / Билл Вагнер. - М.: ЛОРИ, 2013. - 320 c. Зиборов, В.В. Visual C# 2012 на примерах / В.В. Зиборов. - М.: БХВ-Петербург, 2013. - 480 c. Зиборов, Виктор Visual C# 2010 на примерах / Виктор Зиборов. - М.: "БХВ-Петербург", 2011. - 432 c. Культин. Н. Основы программирования в VicrosoftVisual С# 2010. – СПб.: БХВ-Петербург, 2011. – 368 с.: ил. + CD-ROM – (Самоучитель). Лабор В.В. Си Шарп: Создание приложений для Windows / В.В.Лабор – Мн.:Харвест, 2003.-384с. Прайс Д. Visual C#.NET Полное руководство / Д. Прайс, М.Гандерлой – К.: ВЕК+.СПб.:Коронапринт, К: НТИ. М.:Энтроп, 2008.- 2008.-960с. Фленов. М. Библия C#. – 2-е изд., перераб. и доп. – СПб.: БХВ-Петербург, 2011. – 560 с.: ил. + CD_ROM. Троелсен, Эндрю Язык программирования C# 5.0 и платформа .NET 4.5 / Эндрю Троелсен. - М.: Вильямс, 2015. - 486 c. Троелсен, Эндрю Язык программирования С# 2008 и платформа .NET 3.5 / Эндрю Троелсен. - М.: Вильямс, 2010. - 370 c. Фримен, Адам ASP.NET MVC 3 Framework с примерами на C# для профессионалов / Адам Фримен , Стивен Сандерсон. - М.: Вильямс, 2011. - 672 c. |