Программирование

244 группа

Тимофей Брыксин

Студент TODO №1 №2 №3 №4 №5 Тест 1 №6 №7 №8 №9 Тест 2
42 1 2 3 1 2 1 2 1 2 3 1 1 2 1 2 1 2 1 Зачёт
Африканов Александр 6
Барановский Дмитрий 19
Винник Екатерина
Голдов Иван 2
Дегтярев Иван 10
Киреев Илья
Крылова Евгения
Лямин Владимир 3
Степырев Даниил
Тетин Илья 2
Черников Артем
Черников Антон

Задачи

Тест 2. 10.05.19
  1. Зачёт

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

Домашняя работа 9. 29.04.19
Сети с сетевое программирование
Java NIO
  1. Доработать игру в крестики-нолики из ДЗ №6 так, чтобы в неё можно было играть по сети.

Домашняя работа 8. 20.04.19
Потоки в Java
Основные примитивы синхронизации
ForkJoin
  1. Реализовать многопоточный вариант быстрой сортировки, для решения использовать пул потоков или Fork/Join. Замерить время выполнения и сравнить с однопоточным вариантом.

  2. Реализовать следующий интерфейс, представляющий ленивое вычисление:

    public interface Lazy<T> {
      T get();
    }
    

    Объект Lazy создаётся на основе вычисления (представляемого объектом библиотечного класса Supplier). Первый вызов get() у объекта Lazy вызывает вычисление и возвращает результат. Повторные вызовы get() возвращают тот же объект, что и первый вызов. Вычисление get() у Supplier'a должно запускаться не более одного раза.

    Создавать объекты надо не вручную, а с помощью класса LazyFactory, который должен иметь два метода с сигнатурами вида public static <T> Lazy<T> create...Lazy(Supplier<T>), возвращающих две разные реализации Lazy<T>:
    - Простая версия с гарантией корректной работы в однопоточном режиме (без синхронизации)
    - Гарантия корректной работы в многопоточном режиме; вычисление не должно производиться более одного раза

    Ограничения на реализацию:
    - Ограничение по памяти на каждый Lazy-объект: не больше двух полей.
    - Supplier.get() вправе вернуть null.
    - Однопоточные тесты, на разные хорошие и плохие случаи
    - Многопоточные тесты, в том числе на наличие гонок

Домашняя работа 7. 13.04.19
Java Reflection API
Экосистема open source проектов (конспект)
Экосистема open source проектов (слайды)
  1. Реализовать бор (http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D0%BE%D1%80)
    Должны быть поддержаны следующие методы:

    • boolean add(String element); (возвращает true, если такой строки ещё не было, работает за O(|element|))
    • boolean contains(String element); (работает за O(|element|))
    • boolean remove(String element); (возвращает true, если элемент реально был в дереве, работает за O(|element|))
    • int size(); (работает за O(1))
    • int howManyStartWithPrefix(String prefix); (работает за O(|prefix|))

    Также бор должен реализовывать интерфейс с методами:

    • void serialize(OutputStream out) throws IOException;
    • void deserialize(InputStream in) throws IOException; (заменяет старое дерево данными из стрима)

    Стандартный сериализатор использовать нельзя.

  2. Реализуйте класс с методами printStructure() и diffClasses().

    Метод printStructure() должен принимать на вход объект someClass типа Class<?>, в результате его работы данного в текущем каталоге должен быть создан java файл c текстом данного класса:
    - Данный файл должен быть валидным, т.е. компилироваться.
    - В файле должен быть описан публичный класс с именем SomeClass.
    - В этом классе должны быть объявлены все поля, методы, внутренние, вложенные классы и интерфейсы.
    - У всех элементов класса должны быть проставлены модификаторы идентичные модификаторам исходного класса.
    - Тип возвращаемого значения у методов должен совпадать с оригинальным.
    - Generic методы и внутренние классы должны сохранить свою generic-сущность.

    Метод diffClasses() должен принимать на вход два класса и выводить на экран все различные поля и методы в этих классах. Должен также присутствовать тест, который получает на вход класс, создает по нему java-файл, компилирует этот файл, загружает полученный класс и сравнивает его с исходным.

    Некоторые замечания:
    - Уделите особое внимание использованию wildcard'ов (? super, ? extends).
    - Считайте, что внутри классов не встречаются enum и аннотации. Поддержка того или другого принесет вам по одному дополнительному баллу за каждое.
    - В метод printStructure() можно передавать только классы. Enum, интерфейсы, аннотации и т.д. можно не обрабатывать.
    - Обратите внимание на обработку примитивных типов, когда возвращаете значение.
    - При сравнении двух классов обратите внимание, что <E extends java.lang.Object> и <E> -- это одно и то же.

Домашняя работа 6. 05.04.19
Java stream API (слайды)
  1. Реализовать с помощью Java Stream API:
    - Методы в FirstPartTasks и SecondPartTasks
    - Тесты в SecondPartTasksTest
    Тесты в FirstPartTasksTest и SecondPartTasksTest должны успешно завершаться

  2. Разработать приложение, позволяющие пользователю играть с самим собой в крестики-нолики. На экранной форме должно быть 9 кнопок, расположенных в три столбца и три строки. При первоначальном нажатии на любую из кнопок на ней появляется знак «Х». При дальнейшем нажатии на другую кнопку, на ней появляется знак «O». Повторное нажатие на кнопку не должно менять ее знака.

Тест 1. 29.03.19
  1. Реализовать кодирование алгоритмом MTF строк английского алфавита. На вход программе подаётся строка, на выход — закодированная MTF последовательность чисел. Например, по строке banana должна выдаваться кодовая последовательность [1,1,13,1,1,1]. Также должен быть реализован раскодировщик.

Домашняя работа 5. 27.03.19
Отладка и защитное программирование (презентация)
Отладка и защитное программирование (конспект)
Java FX
  1. Создать графическое приложение с двумя виджетами — слайдером и прогрессбаром. Сделать так, чтобы при передвижении слайдера значение прогрессбара изменялось соответствующе.

  2. Релизовать программу-калькулятор со следующим графическим интерфейсом:

    картинка.

    При изменении значения аргумента или операции результат пересчитывается автоматически.

  3. Реализовать продвинутый кнопочный калькулятор по аналогии со стандартными калькулятором Windows или KCalc. Как минимум должны присутствовать 10 кнопок цифр и 4 кнопки операции.

Домашняя работа 4. 16.03.19
Контейнеры и генерики (презентация)
Контейнеры и генерики (конспект)
  1. Переделать один из реализованных в прошлой домашней работе список в виде generic'а. На основе него реализовать класс UniqueList, который не содержит повторяющихся значений. Реализовать классы исключений, которые генерируются при попытке добавления в такой список уже существующего или при попытке удаления несуществующего элемента.

  2. Реализовать AVL дерево, реализующее интерфейс Collection.

Домашняя работа 3. 16.03.19
SOLID (презентация)
SOLID (конспект)
Исключения и обработка ошибок (презентация)
Исключения и обработка ошибок (конспект)
  1. Реализовать класс для работы с хеш-таблицей (на списках). Общение с пользователем должно происходит в интерактивном режиме: добавить значение в хеш-таблицу, удалить значение из хеш-таблицы, поиск значения в хеш-таблице, показать статистику по хеш-таблице (общее число ячеек, load factor, число конфликтов, максимальная длина списка в конфликтных ячейках и т.п.), заполнить хеш-таблицу содержимым файла, выбрать хеш-функцию для подсчета хеша (из заранее заданных в коде). Смена хэш-функции должна происходить во время работы программы, в класс используемая хеш-функция должна передаваться из клиентского кода.

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

Домашняя работа 2. 25.02.19
Наследование и полиморфизм, презентация
Наследование и полиморфизм, конспект
Юнит-тестирование и системы сборки, презентация
Юнит-тестирование и системы сборки, конспект
  1. Создать интерфейс сортировщика, принимающего массив элементов и выполняющего над ним сортировку. На его основе создать несколько классов, реализующих произвольные (разные) алгоритмы сортировки.

  2. Разработать интерфейс, представляющий структуру данных "стек". На его основе реализовать стек двумя разными способами. С его помощью реализовать стековый калькулятор для подсчета арифметических выражений.

  3. Дан массив размерностью N x N, N - нечетное число. Вывести элементы массива при обходе его по спирали, начиная с центра. Для решения задачи разработать интерфейс Выводилка с методом вывести(), реализовать на его основе два класса, осуществляющих либо вывод на консоль либо в файл. Написать программу, которая по желанию пользователя выбирает реализацию Выводилки и выводит массив.

Домашняя работа 1. 18.02.19
Основы Java (презентация)
  1. Создать класс, реализующий функциональность стека.

  2. Создать класс, реализующий функциональность односвязного линейного списка.

© 2014-2019 HwProj