/SPBU_Homework_Sem2

Замашнее дозание на 2-ой семестр

Primary LanguageC#Apache License 2.0Apache-2.0

  • Домашняя работа 1. 15.02.19

    • Посчитать факториал

      Решение 1.1

    • Посчитать числа Фибоначчи

      Решение 1.2

    • Отсортировать массив какой-либо из сортировок

      Решение 1.3

    • Дан массив размерностью N x N, N - нечетное число. Вывести элементы массива при обходе его по спирали, начиная с центра

      Решение 1.4

    • Отсортировать столбцы матрицы по первым элементам

      Решение 1.5

  • Домашняя работа 2. 22.02.19

    • Написать связный список в виде класса. От списка хочется:

      • Добавлять/удалять элемент по произвольной позиции, задаваемой целым числом
      • Узнавать размер, проверять на пустоту
      • Получать или устанавливать значение элемента по позиции, задаваемой целым числом

      Решение 2.1

    • Написать хеш-таблицу в виде класса с использованием класса-списка из первой задачи. Должно быть можно добавлять значение в хеш-таблицу, удалять и проверять на принадлежность

      Решение 2.2

    • Реализовать стековый калькулятор (класс, реализующий выполнение операций +, -, *, / над арифметическим выражением в виде строки в постфиксной записи). Стек реализовать двумя способами (например, массивом или списком) в двух разных классах на основе одного интерфейса. Стековый калькулятор должен знать только про интерфейс стека.

      Решение 2.3

  • Домашняя работа 3. 01.03.19

    • Написать юнит-тесты к задаче 3 из предыдущего задания

      Решение 3.1

    • Модифицировать хеш-таблицу из задачи 2 предыдущей работы так, чтобы хеш-функцию можно было менять в зависимости от выбора пользователя, причём хеш-функцию должно быть можно передавать из использующего хеш-таблицу кода в виде объекта некоторого класса, реализующего некоторый интерфейс. Юнит-тесты и коментарии в формате XML Documentation обязательны.

      Решение 3.2

  • Домашняя работа 4. 15.03.19

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

      • Исходное условие:

      По дереву разбора арифметического выражения вычислить его значение. Дерево разбора хранится в файле в виде (<операция> <операнд1> <операнд2>), где <операнд1> и <операнд2> сами могут быть деревьями, либо числами. Например, выражение (1 + 1) * 2 представляется в виде (* (+ 1 1) 2). Должны поддерживаться операции +, -, , / и целые числа в качестве аргументов. Требуется построить дерево в явном виде, распечатать его (не обязательно так же, как в файле), и посчитать значение выражения обходом дерева. Может быть полезна функция ungetc (если не '(', возвращаем символ в поток и читаем число fscanf-ом). Можно считать, что входной файл корректен. Пример - по входному файлу ( (+ 1 1) 2) может печататься ( * ( + 1 1 ) 2 ) и выводиться 4.

      Решение 4.1

    • Унаследовавшись от класса список, реализовать класс UniqueList, который не содержит повторяющихся значений. Реализовать классы исключений, которые генерируются при попытке добавления в такой список уже существующего или при попытке удаления несуществующего элемента.

      Решение 4.2

  • Домашняя работа 5. 22.03.19

    • Настроить сборку на AppVeyor одной из предыдущих домашек. В качестве решения приложить ссылку на успешно собранный пуллреквест с appveyor.yml.

      Решение 5

  • Домашняя работа 6. 29.03.19

    • Реализовать функции Map, Filter и Fold:

      • Map принимает список и функцию, преобразующую элемент списка. Возвращаться должен список, полученный применением переданной функции к каждому элементу переданного списка. Например, Map(new List()<int> {1, 2, 3}, x => x * 2) должен возвращать список [2; 4; 6].
      • Filter принимает список и функцию, возвращающую булевое значение по элементу списка. Возвращаться должен список, составленный из тех элементов переданного списка, для которых переданная функция вернула true.
      • Fold принимает список, начальное значение и функцию, которая берёт текущее накопленное значение и текущий элемент списка, и возвращает следующее накопленное значение. Сама Fold возвращает накопленное значение, получившееся после всего прохода списка. Например, Fold(new List<int>() {1, 2, 3}, 1, (acc, elem) => acc * elem) работала бы так: сначала в acc клался бы 1, потом умножался бы на 1, потом результат (1) умножался бы на 2, потом результат (2) умножался бы на 3, потом результат (6) возвращался бы в качестве ответа

      Решение 6.1

    • На базе класса, генерирующего события по нажатию на клавиши управления курсором (EventLoop с пары), реализовать консольное приложение, позволяющее управлять персонажем, перемещающимся по карте. Карта состоит из свободного пространства и стен, и должна грузиться из файла. Приложение должно отображать карту и персонажа (символом @) в окне консоли, и позволять персонажу перемещаться по карте, реагируя на клавиши управления курсором. Будут полезны свойства Console.CursorLeft и Console.CursorTop.

      Решение 6.2.

  • Домашняя работа 7. 05.04.19

    • Написать калькулятор с пользовательским интерфейсом (по примеру стандартного виндового калькулятора)

      Решение 7.1

    • Сделать часы (приложение, показывающее текущее время). Здесь юнит-тесты можно не писать.

      Решение 7.2

  • Домашняя работа 8. 19.04.19

    • Переделать список на генерики. Список должен реализовывать интерфейс System.Collections.Generic.IList, в том числе иметь энумератор, чтобы можно было по нему ходить foreach.

      Решение 8.1

    • Создать генерик-класс, реализующий АТД "Множество". Множество должно реализовывать интерфейс System.Collections.Generic.ISet. Ожидается асимптотическая трудоёмкость основных операций не хуже в среднем логарифмической (то есть несбалансированное двоичное дерево тоже пойдёт).

      Решение 8.2