|
|
Строка 1: |
Строка 1: |
− | ===Практические задания по курсу "Язык C# и платформа .NET"===
| |
| | | |
− | ====Задание 1 (начало)====
| |
− |
| |
− | 1.1. Уметь компилировать сборки .exe и .dll с помощью csc.exe.
| |
− |
| |
− | 1.2. Уметь просматривать метаданные в сборках с помощью ILDasm
| |
− |
| |
− | ====Задание 1а====
| |
− | 1. Сравнить скорость работы вычислительного алгоритма на языках C#, C++, Java, PascalABC.NET
| |
− | :a) <tt>Σ(i,j=1..n)1/i/j</tt>, n - достаточно большое
| |
− | :б) <tt>Σ(i,j=1..n)1/a[i]/a[j]</tt>, n - достаточно большое
| |
− |
| |
− | 2. Создать сборку, содержащую статический класс MyArray со статическими функциями, реализующими алгоритмы работы с одномерными и двумерными массивами произвольного типа T. Функции должны описываться в виде
| |
− |
| |
− | static type Name<T>(T[] arr, anotherparams)
| |
− |
| |
− | Для одномерных массивов:
| |
− | FillRandom
| |
− | Print
| |
− | Insert
| |
− | Delete
| |
− | CycleShiftLeft
| |
− | CycleShiftRight
| |
− | Concat - конкатенация двух массивов в один
| |
− | Compare - сравнение двух массивов
| |
− | Find - поиск
| |
− |
| |
− | Для двумерных массивов:
| |
− | FillRandom
| |
− | Print
| |
− | Transpose
| |
− | DeleteRow
| |
− | DeleteCol
| |
− | Find - поиск
| |
− | Submatrix - вырезание подматрицы
| |
− |
| |
− | Написать программу, тестирующую все указанные функции.
| |
− |
| |
− | ====Задание 2 на наследование и полиморфизм====
| |
− |
| |
− | 2.1. Создать иерархию классов <code>Person-Student-Teacher</code>. Каждый класс – в своей сборке. В каждом классе должны быть свойства, а также переопределенная функция <code>ToString()</code>. Основная программа создает массив объектов Person или их наследников, после чего выдает его на экран.
| |
− | У каждого Teacher должен быть список <code>Students</code>, которыми он руководит, у каждого <code>Student - Teacher</code>, который им руководит.
| |
− |
| |
− | 2.2. Для классов <code>Person-Student-Teacher</code> реализовать <code>ToString(), Equals(), ==, !=, GetHashCode()</code>. С помощью <code>is</code>, <code>as</code>, <code>GetType</code> определить, сколько в контейнере персон, студентов и преподавателей и перевести всех студентов на следующий курс.
| |
− |
| |
− | 2.3. Для классов <code>Person-Student-Teacher</code> реализовать глубокое клонирование. Проиллюстрировать его на примере контейнера персон.
| |
− |
| |
− | 2.4. Используя метод <code>GetType()</code> класса <code>Student</code> и метод <code>BaseType()</code> класса <code>Type</code>, вывести всех предков класса <code>Student</code> (написать общий метод)
| |
− |
| |
− | 2.5. Проиллюстрировать использование полиморфизма для модификации некоторого кода в будущем. Виртуальные методы должны выполнять роль сменных блоков, действие которых будет в будущем переопределено.
| |
− |
| |
− | ====F#. Начало====
| |
− | Ознакомиться с основными конструкциями F#
| |
− |
| |
− | ====Задание 3 на перегрузку операторов====
| |
− |
| |
− | 3.1. Создать структуру Complex с перегруженными операциями, а также с возможностью приведения типа double->complex. Должны быть реализованы также ToString(), Equals(), ==, !=
| |
− |
| |
− | 3.2. Создать класс Frac с перегруженными операциями + - * / , а также с возможностью приведения типа Frac->double. Должны быть реализованы также ToString(), Equals(), ==, !=. Вычислить значение полинома в точке. Все коэффициенты и x должны иметь тип Frac.
| |
− |
| |
− | ====Задание 4 на индексаторы====
| |
− |
| |
− | 4.1. Создать класс, реализующий битовый массив на основе обычного, используя индексные свойства.
| |
− |
| |
− | *4.2. Создать класс RGB, реализующий индексное свойство, возвращающее по строке с именем цвета цвет System.Drawing.Color.
| |
− |
| |
− | 4.3. Создать класс ассоциативного массива, используя два списка.
| |
− |
| |
− | ====Задание 5 на строки====
| |
− |
| |
− | 5.1. Проверить механизм интернирования строк
| |
− |
| |
− | 5.2. Дана строка слов. Убрать лишние пробелы и упорядочить слова по алфавиту
| |
− |
| |
− | 5.3. Вводятся вещественные числа, конец ввода - 0. На одной строке может быть несколько вещественных чисел. Используя StringBuilder, сформировать строку, в которой эти вещественные числа разделены одним пробелом, и количество цифр в дробной части равно 1.
| |
− |
| |
− | 5.4. Дана строка, состоящая из чисел, разделенных пробелами. Найти их сумму.
| |
− |
| |
− | 5.5. Дано полное имя файла. Расщепить его на путь, имя и расширение.
| |
− |
| |
− | ====Задание 6 на интерфейсы====
| |
− |
| |
− | 6.1. Проверить, как работает явная и неявная реализация методов интерфейса.
| |
− |
| |
− | 6.2. В классе Student реализовыать интерфейс IComparable. Воспользовавшись Array.Sort, отсортировать массив студентов.
| |
− |
| |
− | 6.3. Реализовать интерфейс IComparer в классе StudentComparer, вложенном в Student. Параметром его конструктора должен выступать критерий сортировки. Воспользовавшись второй формой Array.Sort, отсортировать массив студентов по разным критериям.
| |
− |
| |
− | 6.4. Реализовать в классах Person-Student-Teacher интерфейс ICloneable и проиллюстрировать его использование.
| |
− |
| |
− | 6.5. Реализовать интерфейс IDisposable и убедиться в корректности его работы в операторе using
| |
− |
| |
− | 6.6. Создать контейнер Students, который можно было бы использовать в foreach. Реализовать интерфейс IEnumerator<Student> двумя способами: самим классом Students и вложенным приватным классом StudentsEnumerator.
| |
− |
| |
− | ====F#. Основы====
| |
− | # Найти НОД(a,b)
| |
− | # Найти сумму квадратов чисел от 1 до n
| |
− | # Найти сумму и произведение цифр целого числа
| |
− | # Установить, является ли число простым
| |
− | # Разложить на простые числа
| |
− | # Найти 1!+2!+3!+...+n!
| |
− |
| |
− | ====F#. Списки====
| |
− | # Слить 2 списка в один
| |
− | # Выделить 1 элемент списка
| |
− | # Выделить n-тый элемент списка
| |
− | # Определить длину списка
| |
− | # Выделить последний элемент списка
| |
− | # Вернуть список без 1 элемента
| |
− | # Инвертировать список
| |
− | # Найти сумму элементов списка >5
| |
− | # Найти СКАЛПР двух списков
| |
− | # Упорядочен ли список по возрастанию
| |
− | # Сформировать список, состоящий из элементов исходного <10
| |
− |
| |
− | ====Задание 7 на контейнерные классы и методы расширения====
| |
− |
| |
− | 7.1. Сравнить производительность ArrayList и List<int>
| |
− |
| |
− | 7.2. Для словаря, состоящего из пар (строка, число), сравнить производительность HashTable, SortedList, SortedDictionary<K,T>, Dictionary<K,T> на больших объемах данных.
| |
− |
| |
− | 7.3. Дан файл слов. Создать частотный словарь слов, используя SortedDictionary<K,T>. Вывести слова, упорядоченные по алфавиту и по повторяемости.
| |
− |
| |
− | 7.4. Разработать метод расширения для IEnumerable<T> - вывод на экран, разделяя разделителем, переданным в качестве параметра.
| |
− |
| |
− | 7.5. Разработать методы расширения для IEnumerable<T> - сдвиг влево на k, сдвиг вправо на k
| |
− |
| |
− | 7.6. Разработать метод расширения для IEnumerable<T>, записывающий значения, удовлетворяющие предикату, в один IEnumerable<T>, а не удовлетворяющие - в другой.
| |
− |
| |
− | 7.7. Разработать метод расширения для IEnumerable<T>, применяющий функцию Func<T,T1>(T t) к каждому элементу
| |
− |
| |
− | 7.8. Разработать метод расширения для IEnumerable<T>, переставляющий четные и нечетные элементы местами.
| |
− |
| |
− | ====Задание 8 на LINQ====
| |
− |
| |
− | Даны коллекции студентов, кафедр, предметов, и коллекция, задающая связь (Idпредмета, Idстудента, дата записи на курс)
| |
− |
| |
− | 8.1. Вывести 10 первых студентов с максимальным рейтингом
| |
− |
| |
− | 8.2. Вывести количество различающихся рейтингов студентов
| |
− |
| |
− | 8.3. Вывести все предметы, которые посещает данный студент
| |
− |
| |
− | 8.4. Вывести всех студентов, сгруппированных по кафедрам
| |
− |
| |
− | 8.5. Вывести всех студентов, сгруппированных по среднему баллу: от 5 до 4.5, от 4.5 до 4, от 4 до 3 и все остальные
| |
− |
| |
− | 8.6. Вывести все пары (студент,курс). Реализовать подзапрос
| |
− |
| |
− | ====Задание 9 на файлы и потоки====
| |
− |
| |
− | 9.1. В текстовом файле записаны вещественные числа (на каждой строчке - несколько, разделены несколькими пробелами) и что-то ещё. Найти сумму чисел, игнорируя неверные лексемы.
| |
− |
| |
− | *9.2. Создать типизированный файл целых, затем модифицировать его, возведя все элементы в квадрат.
| |
− |
| |
− | 9.3. Для данной директории рекурсивно выдать список её файлов и поддиректорий.
| |
− |
| |
− | ====Задание 10 на сериализацию====
| |
− |
| |
− | 10.1. Используя BinaryFormatter и атрибут [Serializable], сериализовать на диск в бинарном формате объекты классов Student и Teacher, после чего десериализовать. Добавить в Student список оценок List<int> и ссылку на преподавателя Teacher. Убедиться, что сериализация работает корректно.
| |
− |
| |
− | 10.2. Используя DataContractSerializer, его методы ReadObject и WriteObject и атрибуты [DataContract] для класса и [DataMember] для открытых полей или свойств, сериализовать на диск в XML-формате объекты класса Student. Вызвав конструктор DataContractSerializer в виде new DataContractSerializer (typeof (Student), new Type[ ]{typeof (SeniorStudent)}), сериализовать-десериализовать также потомков Student типа SeniorStudent.
| |
− |
| |
− | 10.3. Используя класс XMLSerializer, сериализовать-десериализовать объекты класса Student в XML-формате. Понять ограничения этого сериализатора.
| |
− |
| |
− | ====Задание 11 на события====
| |
− |
| |
− | 11.1. Реализовать механизм обмена сообщениями. В программе должна быть организована "переписка" между как минимум тремя объектами как минимум двух различных классов. Количество типов событий - также не менее трех.
| |
− |
| |
− | ====Задание 12 на рефлексию====
| |
− |
| |
− | *12.1. Используя механизм отражения, "расшифровать" все классы, содержащиеся в dll. Создать объект класса, вызвать его метод, свойство (на чтение и запись).
| |
− |
| |
− | *12.2. Для данного типа вывести цепочку всех его предков и интерфейсов, ими реализуемых.
| |
− |
| |
− | *12.3. Создать программу автоподключения плагинов к программе. Плагин представляет собой dll, содержащую класс, удовлетворяющий некоторому интерфейсу. Программа должна анализировать все классы в dll, отбирать те, которые реализуют интерфейс, создавать по одному объекту каждого такого класса и вызывать методы интерфейса для этого объекта.
| |
− |
| |
− | ====Задание 13 на потоки (Threads)====
| |
− |
| |
− | 13.1. Создать несколько потоков, выводящих на консоль в цикле свой hashcode. Посмотреть порядок вывода.
| |
− | Добавить Sleep(1), Sleep(10), Sleep(0). Посмотреть изменения в порядке вывода.
| |
− | Закоментировать Sleep() и установить приоритеты потокам. Посмотреть изменения в порядке вывода.
| |
− |
| |
− | 13.2. Написать программу, демонстрирующую работу Join(): основной поток должен дожидаться окончания работы (не менее) 2-х потоков, потом продолжать работу. Конструктивно: дополнительные потоки должны предоставлять данные, необходимые для дальнейшей работы основного потока.
| |
− |
| |
− | 13.3. Продемонстрировать работу критических секций на примере банкомата.
| |
− |
| |
− | 13.4. Используя критические секции, реализовать потокобезопасный класс Стек. Операции Push и Pop должны блокироваться одним объектом. Проиллюстрировать корректность работы стека, выполняя операции Push и Pop случайным образом в разных потоках. Продемонстрировать, что обычный класс стека не является потокобезопасным.
| |
− |
| |
− | 13.5. Продемонстрировать ситуацию с возникновением DeadLock.
| |
− |
| |
− | 13.6. Продемонстрировать работу Monitor'ов (Monitor.Wait, Monitor.Pulse, Monitor.PulseAll). Продемонстрировать отличия Monitor.Pulse и Monitor.PulseAll. Проверить работу Monitor.Wait, Monitor.Pulse для работы с очередью посетителей (один поток генерирует клиентов через разные промежутки времени, второй их обслуживает)
| |
− |
| |
− | ====Задание 14 на асинхронное программирование====
| |
− |
| |
− | 14.1. Продемонстрировать асинхронную работу методов с использованием пула потоков. Операции для пула потоков должны быть достаточно длительными.
| |
− |
| |
− | 14.2а) Продемонстрировать работу именованного семафора для синхронизации действий между несколькими процессами.
| |
− |
| |
− | 14.2б) Продемонстрировать работу именованного мьютекса для синхронизации действий между несколькими процессами.
| |
− |
| |
− | 14.2в) Продемонстрировать работу ManualResetEvent в ситуации когда несколько потоков дожидаются возникновения события.
| |
− |
| |
− | 14.3. Продемонстрировать выполнение асинхронных вычислительных операций с использованием методов BeginInvoke и EndInvoke для делегатов.
| |
− |
| |
− | 14.4. Продемонстрировать выполнение асинхронных операций ввода-вывода для задачи чтения из большого файла, используя:
| |
− |
| |
− | :а) модель ожидания
| |
− |
| |
− | :б) модель опроса
| |
− |
| |
− | :в) модель с обратным вызовом
| |