Главная страница
Навигация по странице:

  • «МИРЭА – Российский технологический университет» РТУ МИРЭА

  • КУРСОВОЙ ПРОЕКТ (РАБОТА) по дисциплине «Технологии программирования» наименование дисциплиныТема курсового проекта (работы)

  • Содержание

  • 2. LinkedList 11 2.1 Свойства LinkedList 112.2 Методы LinkedList 113. Очередь Queue 13

  • Заключение 18 Список источников 19 Введение

  • Отладка кода C#. Курсовой проект (работа) по дисциплине Технологии программирования наименование дисциплины Тема курсового проекта (работы)


    Скачать 172.18 Kb.
    НазваниеКурсовой проект (работа) по дисциплине Технологии программирования наименование дисциплины Тема курсового проекта (работы)
    АнкорОтладка кода C
    Дата19.10.2022
    Размер172.18 Kb.
    Формат файлаdocx
    Имя файла1.docx
    ТипКурсовой проект
    #743052



    МИНОБРНАУКИ РОССИИ

    Федеральное государственное бюджетное образовательное учреждение

    высшего образования

    «МИРЭА – Российский технологический университет»

    РТУ МИРЭА


    Институт кибербезопасности и цифровых технологий

    Кафедра КБ-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 10

    2. LinkedList 11

    2.1 Свойства LinkedList 11

    2.2 Методы LinkedList 11

    3. Очередь Queue 13

    3.1 Создание очереди 13

    3.2 Методы Queue 13

    4. Коллекция Dictionary 15

    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: определяет метод GetEnumerator, с помощью которого можно получать элементы любой коллекции;

    • .Реализация данного интерфейса позволяет перебирать элементы коллекции с помощью цикла foreach;

    • IEnumerator: определяет методы, с помощью которых потом можно получить содержимое коллекции по очереди;

    • ICollection: представляет ряд общих свойств и методов для всех обобщенных коллекций (например, методы CopyTo, Add, Remove, Contains, свойство Count);

    • IList: предоставляет функционал для создания последовательных списков;

    • IComparer: определяет метод Compare для сравнения двух однотипных объектов;

    • IDictionary: определяет поведение коллекции, при котором она должна хранить объекты в виде пар ключ-значение: для каждого объекта определяется уникальный ключ типа, указанного в параметре TKey, и этому ключу соответствует определенное значение, имеющее тип, указанный в параметре TValue;

    • IEqualityComparer: определяет методы, с помощью которых два однотипных объекта сравниваются на предмет равенства.

    Эти интерфейсы реализуются следующими классами коллекций в пространстве имен System.Collections.Generic:

    • List: класс, представляющий последовательный список. Реализует интерфейсы IList, ICollection, IEnumerable;

    • Dictionary: класс коллекции, хранящей наборы пар "ключ-значение". Реализует интерфейсы ICollection, IEnumerable, IDictionary;

    • LinkedList: класс двухсвязанного списка. Реализует интерфейсы ICollection и IEnumerable;

    • Queue: класс очереди объектов, работающей по алгоритму FIFO("первый вошел -первый вышел"). Реализует интерфейсы ICollection, IEnumerable;

    • SortedSet: класс отсортированной коллекции однотипных объектов. Реализует интерфейсы ICollection, ISet, IEnumerable;

    • SortedList: класс коллекции, хранящей наборы пар "ключ-значение", отсортированных по ключу. Реализует интерфейсы ICollection, IEnumerable, IDictionary;

    • SortedDictionary: класс коллекции, хранящей наборы пар "ключ-значение", отсортированных по ключу. В общем похож на класс SortedList, основные отличия состоят лишь в использовании памяти и в скорости вставки и удаления;

    • Stack: класс стека однотипных объектов. Реализует интерфейсы ICollection, IReadOnlyCollection и IEnumerable.

    Большинство обобщенных классов коллекций дублируют необобщенные классы коллекций. Но если вам не надо хранить объекты разных типов, то предпочтительнее использовать обобщенные коллекции.

    Алгоритмическая сложность коллекций представлена на рис. 1.



    Рис. 1.1 – Алгоритмическая сложность коллекций

    1.1 Использование простой коллекции


    Хотя в языке C# есть массивы, которые хранят в себе наборы однотипных объектов, но работать с ними не всегда удобно. Например, массив хранит фиксированное количество объектов, однако что если мы заранее не знаем, сколько нам потребуется объектов. И в этом случае намного удобнее применять коллекции. Еще один плюс коллекций состоит в том, что некоторые из них реализует стандартные структуры данных, например, стек, очередь, словарь, которые могут пригодиться для решения различных специальных задач. Большая часть классов коллекций содержится в пространстве имен System.Collections.Generic.

    Класс List из пространства имен 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 можно также определить собственный класс. В приведенном ниже примере класс Galaxy, который используется объектом 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 collection): добавление в список коллекции или массива;

    • 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 match): возвращает true, если в списке есть элемент, который соответствует делегату match;

    • T? Find(Predicate match): возвращает первый элемент, который соответствует делегату match. Если элемент не найден, возвращается null;

    • T? FindLast(Predicate match): возвращает последний элемент, который соответствует делегату match. Если элемент не найден, возвращается null;

    • List FindAll(Predicate match): возвращает список элементов, которые соответствуют делегату match;

    • int IndexOf(T item): возвращает индекс первого вхождения элемента в списке;

    • int LastIndexOf(T item): возвращает индекс последнего вхождения элемента в списке;

    • List GetRange(int index, int count): возвращает список элементов, количество которых равно count, начиная с индекса index.

    • 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 match)): удаляет все элементы, которые соответствуют делегату match. Возвращает количество удаленных элементов;

    • void Reverse(): изменяет порядок элементов;

    • void Reverse(int index, int count): изменяет порядок на обратный для элементов, количество которых равно count, начиная с индекса index;

    • void Sort(): сортировка списка;

    • void Sort(IComparer? comparer): сортировка списка с помощью объекта comparer, который передается в качестве параметра.

    Пример поиска и проверка элемента представлен в листинге 1.1.

    Листинг 1.1 – Пример поиска и проверка элемента

    var people = new List () { "Eugene", "Mike", "Kate", "Tom", "Bob", "Sam" };

     

    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 = people.FindAll(p => p.Length == 3);

    // peopleWithLength3 { "Tom", "Bob", "Sam"}

    1.2 Двухсвязный список LinkedList


    Класс LinkedList представляет двухсвязный список, в котором каждый элемент хранит ссылку одновременно на следующий и на предыдущий элемент.

    Если в простом списке List каждый элемент представляет объект типа T, то в LinkedList каждый узел представляет объект класса LinkedListNode. А добавляемые в связанный список элементы T фактически обертываются в объект LinkedListNode.

    Класс LinkedListNode имеет следующие свойства:

    • Value: возвращает или устанавливает само значение узла, представленное типом T;

    • Next: возвращает ссылку на следующий элемент типа LinkedListNode в списке. Если следующий элемент отсутствует, то имеет значение null;

    • Previous: возвращает ссылку предыдущий элемент типа LinkedListNode в списке. Если предыдущий элемент отсутствует, то имеет значение null.

    2. LinkedList

    2.1 Свойства LinkedList


    Класс LinkedList определяет следующие свойства:

    2.2 Методы LinkedList


    Используя методы класса LinkedList, можно обращаться к различным элементам, как в конце, так и в начале списка:

    • AddAfter(LinkedListNode node, LinkedListNode newNode): вставляет узел newNode в список после узла node.

    • AddAfter(LinkedListNode node, T value): вставляет в список новый узел со значением value после узла node.

    • AddBefore(LinkedListNode node, LinkedListNode newNode): вставляет в список узел newNode перед узлом node.

    • AddBefore(LinkedListNode node, T value): вставляет в список новый узел со значением value перед узлом node.

    • AddFirst(LinkedListNode node): вставляет новый узел в начало списка.

    • AddFirst(T value): вставляет новый узел со значением value в начало списка.

    • AddLast(LinkedListNode node): вставляет новый узел в конец списка.

    • 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 представляет обычную очередь, которая работает по алгоритму FIFO ("первый вошел - первый вышел").

    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 типизируется двумя типами: параметр K представляет тип ключей, а параметр V предоставляет тип значений.

    4.1 Создания и инициализация словаря


    Класс Dictionary предоставляет ряд конструкторов для создания словаря. Например, мы можем создать пустой словарь.

    При определении словаря его сразу же можно инициализировать значениями.

    При инициализации применяется инициализитор - в фигурных скобках после вызова конструктора объекту передаются начальные данные. В случае со словаем мы можем передать в инициализаторе набор элементов, где каждый элемент заключается в фигурные скобки.

    Каждый элемент представляет два значения: первое значение представляет ключ, а второе значение - собственно значение элемента. Поскольку при объявлении словаря people для ключей указан тип int, а для значений - тип string, то в элементе словаря сначала указывается число int, а затем строка. То есть в случае выше элемент имеет ключ 5, а значение - "Tom". Затем по ключу элемента мы сможем получить его значение.

    4.2 KeyValuePair


    Стоит отметить, что каждый элемент в словаре представляет структуру KeyValuePair, где параметр TKey представляет тип ключа, а параметр TValue - тип значений элементов. Эта структура предоставляет свойства Key и Value, с помощью которых можно получить соответственно ключ и значение элемента в словаре. И одна из версий конструктора Dictionary позволяет инициализировать словарь коллекцией объектов 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, которое возвращает количество элементов в словаре.

    Заключение


    Коллекции предоставляют более гибкий способ работы с группами объектов. В отличие от массивов, коллекция, с которой вы работаете, может расти или уменьшаться динамически при необходимости. Некоторые коллекции допускают назначение ключа любому объекту, который добавляется в коллекцию, чтобы в дальнейшем можно было быстро извлечь связанный с ключом объект из коллекции.

    Коллекция является классом, поэтому необходимо объявить экземпляр класса перед добавлением в коллекцию элементов.

    Список источников


    1. Агуров, Павел C#. Сборник рецептов / Павел Агуров. - М.: "БХВ-Петербург", 2012. - 432 c.

    2. Альфред, В. Ахо Компиляторы. Принципы, технологии и инструментарий / Альфред В. Ахо и др. - М.: Вильямс, 2015. - 266 c.

    3. Бишоп, Дж. C# в кратком изложении / Дж. Бишоп, Н. Хорспул. - М.: Бином. Лаборатория знаний, 2013. - 472 c.

    4. Вагнер, Билл С# Эффективное программирование / Билл Вагнер. - М.: ЛОРИ, 2013. - 320 c.

    5. Зиборов, В.В. Visual C# 2012 на примерах / В.В. Зиборов. - М.: БХВ-Петербург, 2013. - 480 c.

    6. Зиборов, Виктор Visual C# 2010 на примерах / Виктор Зиборов. - М.: "БХВ-Петербург", 2011. - 432 c.

    7. Культин. Н. Основы программирования в VicrosoftVisual С# 2010. – СПб.: БХВ-Петербург, 2011. – 368 с.: ил. + CD-ROM – (Самоучитель).

    8. Лабор В.В. Си Шарп: Создание приложений для Windows / В.В.Лабор – Мн.:Харвест, 2003.-384с.

    9. Прайс Д. Visual C#.NET Полное руководство / Д. Прайс, М.Гандерлой – К.: ВЕК+.СПб.:Коронапринт, К: НТИ. М.:Энтроп, 2008.- 2008.-960с.

    10. Фленов. М. Библия C#. – 2-е изд., перераб. и доп. – СПб.: БХВ-Петербург, 2011. – 560 с.: ил. + CD_ROM.

    11. Троелсен, Эндрю Язык программирования C# 5.0 и платформа .NET 4.5 / Эндрю Троелсен. - М.: Вильямс, 2015. - 486 c.

    12. Троелсен, Эндрю Язык программирования С# 2008 и платформа .NET 3.5 / Эндрю Троелсен. - М.: Вильямс, 2010. - 370 c.

    13. Фримен, Адам ASP.NET MVC 3 Framework с примерами на C# для профессионалов / Адам Фримен , Стивен Сандерсон. - М.: Вильямс, 2011. - 672 c.



    написать администратору сайта