Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Универсальные коллекции языка С#. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
Продолжение таблицы
Наименование
операции
Описание
Выход n – целое число – степень одночлена Постусловия Нет
Degree
Записать
Вход n – целое число – степень одночлена Предусловия Нет Процесс Записывает степень n одночлена в поле Degree
Выход Нет Постусловия Поле Degree = n
Coef
Взять
Вход Нет Предусловия Нет Процесс Возвращает коэффициент c одночлена полинома (содер-
жимое поля Coef). Например:
a = (1x^2), a. Степень = 2 Выход n – целое число – степень одночлена. Постусловия Нет.
Coef
Записать
Вход c – целое число – коэффициент одночлена Предусловия Нет Процесс Записывает коэффициент одночлена с в поле Coeff
Выход Нет Постусловия Поле FCoeff = c
Equel Равно
Вход q – одночлен Предусловия Нет Процесс Сравнивает одночлен this с одночленом q на равенство.
Возвращает значение True, если одночлены равны, т. е.
имеют одинаковые коэффициенты и степени, и значение
False – в противном случае Выход Булевское значение
101
Окончание таблицы
–
Наименование
операции
Описание
Постусловия Нет
Diff Дифференцировать
Вход Нет Предусловия Нет Процесс Создает одночлен, являющийся производной одночлена
this, и возвращает его.
Например:
3
a= (x
), a. Дифференцировать = 3x
2
Выход Одночлен Постусловия Нет
Eval Вычислить
Вход x
действительное число Предусловия Нет Процесс Вычисляет значение одночлена в точке x и возвращает его.
Например:
2
a= (1x
), а. Вычислить(2) = 4
Выход Действительное число Постусловия Нет
ToString ОдночленВСтроку
Вход Нет Предусловия Нет Процесс Формирует строковое представление одночлена Выход Строка Постусловия Нет
end Member
3. Члены полинома храните в коллекции C#. Проанализируйте опе-
рации вашего контейнера и выберите способ организации полинома.
4. Для реализации одночленного полинома (одночлена) создайте класс Tmember, в который вынесите все операции на членах полинома. После выполнения каждой операции приводите полином к нормализо­ванному виду: упорядочить, привести подобные, удалить нулевые чле­ны (члены
с нулевыми коэффициентами).
5. Тип данных реализуйте в отдельном модуле UPoly.
102
Пример построения пользовательского класса
на основе контейнера через отношение наследования
Класс MySortedList<Tkey, Tvalue> построен как наследник класса контейнера SortedList<Tkey, Tvalue>. В нем определен конструктор без параметров, который резервирует память по 20 элементов, и переопре­делен метод ToString, унаследованный от класса Object.
classMySortedList<Tkey,Tvalue>:SortedList<Tkey,Tvalue> { publicMySortedList() { Capacity=20;//Емкость. } publicoverridestringToString() { stringresult=""; foreach(varelinthis) result+=el.ToString()+","; returnresult==""?"Списокпуст!":result; } } staticvoidMain(string[]args) { MySortedList<string,int>lst0=newMySortedList<string,int>(); Console.WriteLine($"Списокlst0.Емкость={lst0.Capacity},элементов– {lst0.Count}"); Console.WriteLine(lst0.ToString());  MySortedList<string,int>lst=newMySortedList<string,int> { {"word",5}, {"world",2}, {"country",7} }; Console.WriteLine($"Списокlst.Емкость={lst.Capacity},элементов‐{lst.Count}"); Console.WriteLine(lst.ToString()); } Результатработыпримера: Списокlst0.Емкость=20,элементов‐0 Списокпуст! Списокlst.Емкость=20,элементов‐3 [country,7],[word,5],[world,2],
103
Пример построения пользовательского класса
на основе контейнера через отношение композиции
Класс MySortedList<Tkey, Tvalue> построен как класс, объекты ко­торого содержат в себе объекты контейнера SortedList<Tkey, Tvalue>. В нем определен конструктор без параметров, который резервирует память по 20 элементов, переопределен метод ToString, унаследован­ный от класса Object, и определены два свойства для чтения Capacity и
Count.
classMySortedList<Tkey,Tvalue> { SortedList<Tkey,Tvalue>lst; publicMySortedList() { lst=newSortedList<Tkey,Tvalue>(20);//Емкость. } publicintCapacity{get{returnlst.Capacity;}}//Емкость. publicintCount{get{returnlst.Count;}}//Элементов. publicoverridestringToString() { stringresult=""; foreach(varelinlst) result+=el.ToString()+","; returnresult==""?"Списокпуст!":result; } publicvoidAdd(Tuple<Tkey,Tvalue>tuple) { lst.Add(tuple.Item1,tuple.Item2); } }  staticvoidMain(string[]args) { MySortedList<string,int>lst0=new Console.WriteLine($"Списокlst0.Емкость={lst0.Capacity},элементов– {lst0.Count}"); Console.WriteLine(lst0.ToString()); MySortedList<string,int>lst=newMySortedList<string,int>(); lst.Add(newTuple<string,int>("word",5)); lst.Add(newTuple<string,int>("world",2)); lst.Add(newTuple<string,int>("country",7));
MySortedList<string,int>();
104
Console.WriteLine($"Списокlst.Емкость={lst.Capacity},элементов‐{lst.Count}"); Console.WriteLine(lst.ToString()); }  Результатработыпримера: Списокlst0.Емкость=20,элементов‐0 Списокпуст! Списокlst.Емкость=20,элементов‐3 [country,7],[word,5],[world,2],
ПОРЯДОК ВЫПОЛНЕНИЯ
В режиме консольного приложения:
опишите класс TMember, реализуйте класс и протестируйте каж- дый метод;
опишите класс TPoly, реализуйте класс и протестируйте каждый метод.
Тестовые наборы поместите в таблицу следующего вида.
Тестовый набор для тестирования операции «Умножить»
Номер
теста
1 0*X^0 0*X^0 0*X^0 0*X^0
2 0*X^0 1*X^0 0*X^0 1*X^0
3 1*X^0 1*X^0 1*X^0 1*X^0
4 1*X^0 2*X^1 2*X^1 2*X^1
5 1*X^0 2*X^1+3*X^2 2*X^1+3*X^2 2*X^1+3*X^2
6 1*X^0+1*X^1 1*X^0-1*X^1 1*X^0-1*X^2 1*X^0-1*X^1
Исходные данные Ожидаемый результат
вход полином
возвращаемое
значение
полином
СОДЕРЖАНИЕ ОТЧЕТА
1. Задание.
2. Текст программы на C#.
3. Тестовые наборы данных для тестирования типа данных.
105
КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Чем определяется размер памяти, выделяемой под экземпляр
класса?
2. Что такое отношение «обобщение» и как оно реализуется в C#?
3. Что такое отношение «композиции» и как оно реализуется в C#?
4. Что такое свойство и для чего оно предназначено?
5. Что такое индексатор и когда он необходим?
6. Что такое
7. Что такое униврсальные коллекции и для чего они предназначены?
interface и для чего они используются?
106
ГЛОССАРИЙ
Агрегация представляет собой форму ассоциации – более сильный
тип связи между целым (составным) объектом и его частями (компо­нентными объектами).
Анонимный метод – метод, который можно преобразовать в тип делегата, т. е. в переменной типа делегат можно сохранить анонимный метод.
Ассоциация – это семантическая связь между классами.
Временная сложность алгоритма в информатике определяется
как функция от длины строки, представляющей входные данные, рав­ная времени работы алгоритма на данном входе. Временная сложность алгоритма обычно выражается с использованием нотации «O» боль­шое, которая учитывает только слагаемое самого высокого порядка, а также не учитывает константные множители, т. е. коэффициенты. Если сложность выражена таким способом, говорят об асимптотиче­ском описании временной сложности, т. е. при стремлении размера входа к бесконечности. Например, если существует число n время работы алгоритма для всех входов длины n > n
3
5*n
+ 3*n, то временную сложность такого алгоритма можно асимпто-
тически оценить как O(n
3
)
Делегат (delegate) – это тип, который представляет ссылки на ме-
тоды с определенным списком параметров и типом возвращаемого значения. При создании экземпляра делегата этот экземпляр можно связать с любым методом с совместимой сигнатурой и типом возвра­щаемого значения. Метод можно вызвать (активировать) с помощью экземпляра делегата.
Деструкторы предназначены для выполнения действий, которые необходимо выполнить перед уничтожением объекта.
, такое, что
0
не превосходит
0
107
Индексаторы обеспечивают возможность доступа к элементам класса по их порядковому номеру (индексу).
Интефейс в C# – ссылочный тип данных, который определяет кон­тракт. Любой class или struct, реализующий этот контракт, должен предоставлять реализацию для членов, определенных в интерфейсе. Начиная с C# 8.0 интерфейс может определять реализацию по умолча­нию для членов. Он может также определять члены static,
чтобы обес­печить единую реализацию для общих функциональных возможно­стей.
Интерфейс на уровне проекта – совокупность операций, опреде-
ляющих набор услуг класса или компонента. Интерфейс не определяет внутреннюю структуру, все его операции имеют открытую видимость.
Итератор – включает оператор цикла foreach и метод итератора,
который должен возвращать значение одного из следующих типов: IEnumerable, IEnumerable<T>, IEnumerator или IEnumerator<T>. Методом итератора может быть метод доступа get.
Класс в C# – это ссылочный тип данных, определяемый пользова-
телем, средство объектно-ориентированного программирования.
Коллекция в C# – это объединение произвольного количества свя-
занных объектов, возможно, различного типа.
Композиция – это сильная форма агрегации. В композиции со-
ставной объект может физически содержать компонентные объекты. Компонентный объект может принадлежать
только одному составному
объекту.
Компаратор – метод, обеспечивающий сравнение двух объектов
одного типа на больше, меньше или равно.
Константы класса – средство для хранения неизменяемых значе-
ний, связанных с классом.
Конструкторы предназначены для инициализации объектов клас-
са или класса в целом.
Лямбда-выражение, лямбда-оператор – это анонимная функция,
которая может быть присвоена
делегату.
Методы – средство для выполнения вычислений или действий,
выполняемых классом или объектом класса.
Обобщение – связь «тип-подтип» реализует механизм наследования. Операция – это услуга, которую можно запросить у любого объек-
та данного класса. Воздействие одного объекта на другой с целью вы­звать соответствующую реакцию.
108
Описание класса содержит ключевое слово class, за которым сле-
дует его имя, а далее в фигурных скобках – тело класса, т. е. список его элементов.
Полиморфизм – способность скрывать множество различных реа-
лизаций под единственным общим интерфейсом.
Предикат в C# – представляет метод, определяющий набор крите-
риев и соответствие указанного объекта этим критериям.
Свойство – средство
включая методы для их чтения и записи.
Сериализация – это процесс преобразования объекта в поток байт
для сохранения или передачи в память, базу данных или файл.
Спецификаторы – средства, предназначенные для определения
свойства класса, а также доступности класса для других элементов программы.
Список инициализаторов – список значений, которыми при
здании будет инициализирована коллекция.
определения характеристик объектов класса,
со-
109
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
Основной
1. Павловская Т. А. C#. Программирование на языке высокого уровня: учебник для вузов / Т. А. Павловская. – Санкт-Петербург : Питер, 2014. – 432 с.: ил. – (Серия «Учебник для вузов»).
Дополнительный
2. Пахомов Б. И. C# для начинающих / Б. И. Пахомов. – Санкт­Петербург : БХВ-Петербург, 2014. – 432 с.: ил.
3. Microsoft Docs. Документация по C#. – URL: https://docs.microsoft. com/ru-ru/dotnet/csharp/ (дата обращения: 14.10.2021).
4. Professor Web. Уроки по C# и платформе .NET Framework. – URL: https://professorweb.ru (дата обращения: 14.10.2021).
5. Сайт о программировании METANIT.COM. С#. – URL: https://metanit. com/sharp/tutorial/4.1.php (дата обращения: 14.10.2021).
110
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]