Лабораторные работы по курсу Объектно-ориентированное программирование: язык программирования - страница №6/9
Лабораторная работа 3. Варианты второго уровня
Универсальные типы. Классы-коллекции. Методы расширения класса System.Linq.Enumerable
Информация для всех вариантов
Во всех вариантах второго уровня требуется определить универсальный делегат
delegate System.Collections.Generic.KeyValuePair
GenerateElement(int j);
и универсальный класс TestCollections<TKey,TValue>, который содержит закрытые поля следующих типов
System.Collections.Generic.List;
System.Collections.Generic.List ;
System.Collections.Generic.Dictionary ;
System.Collections.Generic.Dictionary;
GenerateElement.
Конкретные значения типовых параметров TKey и TValue зависят от варианта.
В конструкторе класса TestCollections<TKey,TValue> создаются коллекции с заданным числом элементов. Надо сравнить время поиска элемента в коллекциях-списках List и время поиска элемента по ключу и элемента по значению в коллекциях-словарях Dictionary.
Для автоматической генерации элементов коллекций надо определить метод, который принимает один целочисленный параметр типа int и возвращает ссылку на объект типа KeyValuePair. Метод должен инициализировать объекты KeyValuePair так, чтобы соответствие между номером элемента и объектом TKey в паре ключ-значение было взаимно-однозначным.
Метод для автоматической генерации элементов коллекций передается в класс TestCollections через параметр конструктора класса. Для этого в классе TestCollections надо определить конструктор c двумя параметрами, имеющими тип int и GenerateElement. Через целочисленный параметр объектам класса передается число элементов в коллекциях, через экземпляр делегата GenerateElement – метод, который используется для автоматической генерации пары ключ-значение в виде объекта KeyValuePair.
Число элементов в коллекциях пользователь вводит в процессе работы приложения. Если при вводе была допущена ошибка, приложение должно обработать исключение, сообщить об ошибке ввода и повторить прием ввода до тех пор, пока не будет правильно введено целочисленное значение.
Для четырех разных элементов – первого, центрального, последнего и элемента, не входящего в коллекцию, – надо измерить время поиска
элемента в коллекциях List и List с помощью метода Contains;
элемента по ключу в коллекциях Dictionary< TKey, TValue> и Dictionary с помощью метода ContainsKey;
значения элемента в коллекции Dictionary< TKey, TValue > с помощью метода ContainsValue.
Так как статический метод для автоматической генерации элементов должен обеспечивать взаимно-однозначное соответствие между значением целочисленного параметра метода и объектами TKey, его можно использовать как при создании коллекций, так и для генерации элемента для поиска.
Вариант 1. Требования к программе
Определить новые версии классов
Exam и
Student из лабораторной работы 2.
В класс Exam добавить реализацию интерфейсов
System.IComparable для сравнения объектов типа Exam по названию предмета;
System.Collections.Generic.IComparer для сравнения объектов типа Exam по оценке.
Определить вспомогательный класс, реализующий интерфейс System.Collections.Generic.IComparer, который можно использовать для сравнения объектов типа Exam по дате экзамена.
В новой версии класса Student для списков зачетов и экзаменов использовать типы
System.Collections.Generic.List для списка зачетов;
System.Collections.Generic.List для списка экзаменов.
В новой версии класса Student сохранить все остальные поля, свойства и методы из предыдущей версии класса, внести необходимые исправления в код свойств и методов из-за изменения типов полей для списков.
В классе Student определить методы для сортировки списка экзаменов
по названию предмета;
по оценке;
по дате экзамена.
Определить универсальный делегат
delegate TKey KeySelector(Student st);
Определить универсальный класс StudentCollection, содержащий коллекцию объектов Student, в котором для хранения коллекции используется тип System.Collections.Generic.Dictionary. Типовой параметр TKey универсального класса StudentCollection определяет тип ключа в коллекции Dictionary.
Метод, который используется для вычисления ключа при добавлении элемента Student в коллекцию класса StudentCollection, отвечает делегату KeySelector и передается StudentCollection через параметр единственного конструктора класса.
Класс StudentCollection содержит
закрытое поле типа System.Collections.Generic.Dictionary;
закрытое поле типа KeySelector для хранения экземпляра делегата с методом, вычисляющим ключ для объекта Student;
конструктор c одним параметром типа KeySelector ;
метод void AddDefaults (), c помощью которого можно добавить некоторое число элементов типа Student для инициализации коллекции по умолчанию;
метод void AddStudents ( params Student[] ) для добавления элементов в коллекцию Dictionary;
перегруженную версию виртуального метода string ToString() для формирования строки, содержащей информацию обо всех элементах коллекции Dictionary, в том числе значения всех полей класса Student, включая список зачетов и экзаменов;
метод string ToShortString(), который формирует строку c информацией обо всех элементах коллекции Dictionary, состоящую из значений всех полей, среднего балла, числа зачетов и экзаменов для каждого элемента Student, но без списка зачетов и экзаменов.
В классе StudentCollection определить свойства и методы, выполняющие операции со словарем Dictionary с использованием методов расширения класса System.Linq.Enumerable и статические методы-селекторы, которые необходимы для выполнения соответствующих операций с коллекцией:
свойство типа double (только с методом get), возвращающее максимальное значение среднего балла для элементов Dictionary; если в коллекции нет элементов, свойство возвращает некоторое значение по умолчанию; для поиска максимального значения среднего балла надо использовать метод Max класса System.Linq.Enumerable;
метод IEnumerable>EducationForm(Education value), возвращающий подмножество элементов коллекции Dictionary с заданной формой обучения; для формирования подмножества использовать метод Where класса System.Linq.Enumerable;
свойство типа IEnumerable>> (только с методом get), выполняющее группировку элементов коллекции Dictionary в зависимости от формы обучения студента с помощью метода Group класса System.Linq.Enumerable.
В методе Main()
Создать объект Student и вызвать методы, выполняющие сортировку списка экзаменов List по разным критериям, после каждой сортировки вывести данные объекта. Выполнить сортировку
по названию предмета;
по оценке;
по дате экзамена.
55.Создать объект типа StudentCollection. Добавить в коллекцию несколько разных элементов типа Student и вывести объект StudentCollection.
56.Вызвать методы класса StudentCollection, выполняющие операции с коллекцией-словарем Dictionary, и после каждой операции вывести результат операции. Выполнить
вычисление максимального значения среднего балла для элементов коллекции; вывести максимальное значение;
вызвать метод EducationForm для выбора студентов с заданной формой обучения, вывести результат фильтрации;
вызвать свойство класса, выполняющее группировку элементов коллекции по форме обучения; вывести все группы элементов.
57.Создать объект типа TestCollection
. Ввести число элементов в коллекциях и вызвать метод для поиска первого, центрального, последнего и элемента, не входящего в коллекции. Вывести значения времени поиска для всех четырех случаев.
Вариант 2. Требования к программе
Определить новые версии классов
Article, Edition и
Magazine из лабораторной работы 2.
В класс Article добавить реализации интерфейсов
System.IComparable для сравнения объектов типа Article по названию статьи;
System.Collections.Generic.IComparer
для сравнения объектов типа Article по фамилии автора.
Определить вспомогательный класс, реализующий интерфейс System.Collections.Generic.IComparer
, который можно использовать для сравнения объектов типа Article по рейтингу статьи.
В новой версии класса Magazine использовать типы
System.Collections.Generic.List для списка редакторов журнала;
System.Collections.Generic.List
для списка статей в журнале.
В новых версиях Edition и Magazine сохранить все остальные поля, свойства и методы из предыдущей версии класса, внести необходимые исправления в код свойств и методов из-за изменения типов полей для списка редакторов журнала и списка статей.
В классе Magazine определить методы для сортировки списка статей
по названию статьи;
по фамилии автора;
по рейтингу статьи.
Определить универсальный делегат
delegate TKey KeySelector(Magazine mg);
Определить универсальный класс MagazineCollection, содержащий коллекцию объектов типа Magazine, в котором для хранения коллекции используется тип System.Collections.Generic.Dictionary. Типовой параметр TKey универсального класса MagazineCollection определяет тип ключа в коллекции Dictionary.
Метод, который используется для вычисления ключа при добавлении элемента Magazine в коллекцию класса MagazineCollection, отвечает делегату KeySelector и передается MagazineCollection через параметр единственного конструктора класса.
Класс MagazineCollection содержит
закрытое поле типа System.Collections.Generic.Dictionary;
закрытое поле типа KeySelector для хранения экземпляра делегата с методом, вычисляющим ключ для объекта Magazine;
конструктор c одним параметром типа KeySelector ;
метод void AddDefaults(), c помощью которого можно добавить некоторое число элементов типа Magazine для инициализации коллекции по умолчанию;
метод void AddMagazines ( params Magazine[] ) для добавления элементов в коллекцию Dictionary;
перегруженную версию виртуального метода string ToString() для формирования строки, содержащей информацию обо всех элементах коллекции Dictionary, в том числе значения всех полей, включая список редакторов издания и список статей в журнале для каждого элемента Magazine;
метод string ToShortString(), который формирует строку с информацией обо всех элементах коллекции Dictionary, содержащую значения всех полей, значение среднего рейтинга статей, число редакторов издания и число статей в журнале для каждого элемента Magazine, но без списков редакторов и статей.
В классе MagazineCollection<TKey> определить свойства и методы, выполняющие операции со словарем Dictionary с использованием методов расширения класса System.Linq.Enumerable и статические методы-селекторы, которые необходимы для выполнения соответствующих операций с коллекцией:
свойство типа double (только с методом get), возвращающее максимальное значение среднего рейтинга статей для элементов коллекции; если в коллекции нет элементов, свойство возвращает некоторое значение по умолчанию; для поиска максимального значения среднего рейтинга статей надо использовать метод Max класса System.Linq.Enumerable;
метод IEnumerable>FrequencyGroup(Frequency value), возвращающий подмножество элементов коллекции Dictionary с заданной периодичностью выхода журнала; для формирования подмножества использовать метод Where класса System.Linq.Enumerable;
свойство типа IEnumerable>> (только с методом get), выполняющее группировку элементов коллекции Dictionary в зависимости от периодичности выхода журнала с помощью метода Group класса System.Linq.Enumerable.
В методе Main()
-
Создать объект Magazine и вызвать методы, выполняющие сортировку списка List
статей в журнале по разным критериям, после каждой сортировки вывести данные объекта. Выполнить сортировку
по названию статьи;
по фамилии автора;
по рейтингу статьи.
58.Создать объект MagazineCollection. Добавить в коллекцию несколько разных элементов типа Magazine и вывести объект MagazineCollection.
59.Вызвать методы класса MagazineCollection, выполняющие операции с коллекцией-словарем Dictionary, и после каждой операции вывести результат операции. Выполнить
вычисление максимального значения среднего рейтинга статей для элементов коллекции;
вызвать метод FrequencyGroup для выбора журналов с заданной периодичностью выхода;
вызвать свойство класса, выполняющее группировку элементов коллекции по периодичности выхода; вывести все группы элементов.
60.Создать объект типа TestCollection. Ввести число элементов в коллекциях и вызвать метод для поиска первого, центрального, последнего и элемента, не входящего в коллекции. Вывести значения времени поиска для всех четырех случаев.
<< предыдущая страница следующая страница >>