Страница курса Язык CSharp и платформа .NET

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск

Практические задания по курсу "Язык CSharp и платформа .NET"

Практические задания по курсу "Язык C# и платформа .NET"

Задание 1 (начало)

1.1. Уметь компилировать сборки .exe и .dll с помощью csc.exe.

1.2. Уметь просматривать метаданные в сборках с помощью ILDasm

Задание 1а

1. Сравнить скорость работы вычислительного алгоритма на языках C#, C++, Java, PascalABC.NET

a) Σ(i,j=1..n)1/i/j, n - достаточно большое
б) Σ(i,j=1..n)1/a[i]/a[j], 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. Создать иерархию классов Person-Student-Teacher. Каждый класс – в своей сборке. В каждом классе должны быть свойства, а также переопределенная функция ToString(). Основная программа создает массив объектов Person или их наследников, после чего выдает его на экран. У каждого Teacher должен быть список Students, которыми он руководит, у каждого Student - Teacher, который им руководит.

2.2. Для классов Person-Student-Teacher реализовать ToString(), Equals(), ==, !=, GetHashCode(). С помощью is, as, GetType определить, сколько в контейнере персон, студентов и преподавателей и перевести всех студентов на следующий курс.

2.3. Для классов Person-Student-Teacher реализовать глубокое клонирование. Проиллюстрировать его на примере контейнера персон.

2.4. Используя метод GetType() класса Student и метод BaseType() класса Type, вывести всех предков класса Student (написать общий метод)

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#. Основы

  1. Найти НОД(a,b)
  2. Найти сумму квадратов чисел от 1 до n
  3. Найти сумму и произведение цифр целого числа
  4. Установить, является ли число простым
  5. Разложить на простые числа
  6. Найти 1!+2!+3!+...+n!

F#. Списки

  1. Слить 2 списка в один
  2. Выделить 1 элемент списка
  3. Выделить n-тый элемент списка
  4. Определить длину списка
  5. Выделить последний элемент списка
  6. Вернуть список без 1 элемента
  7. Инвертировать список
  8. Найти сумму элементов списка >5
  9. Найти СКАЛПР двух списков
  10. Упорядочен ли список по возрастанию
  11. Сформировать список, состоящий из элементов исходного <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. Продемонстрировать выполнение асинхронных операций ввода-вывода для задачи чтения из большого файла, используя:

а) модель ожидания
б) модель опроса
в) модель с обратным вызовом