Skip to content

Latest commit

 

History

History
130 lines (128 loc) · 9.62 KB

README.md

File metadata and controls

130 lines (128 loc) · 9.62 KB

Лабораторные работы по дисциплине "ООП. Java"

1-й семестр 2-го курса СПбПУ ИКНТ ПИ (2021-2022 уч. г.)


Лабораторная №1.

В компьютерной игре герой (класс Hero) может перемещаться между двумя точками (метод move) различными способами: идти пешком, ехать на лошади, лететь и т. п. Реализовать классы, позволяющие выбирать и менять в ходе выполнения программы способ перемещения героя, используя паттерн “стратегия” (strategy). Продемонстрировать работу реализованных классов.


Лабораторная №2.

Написать консольное приложение, которое:

  1. Считывает из текстового файл размерность матрицы N*N.
  2. Создаёт и заполняет матрицу случайными числами от -N до N.
  3. Последовательно поворачивает матрицу на 90, 180 и 270 градусов против часовой стрелки и делит каждый элемент на сумму соседних.
  4. Каждую из трёх получившихся матриц вывести в общий файл.

Требования к обработке исключительных ситуаций:

  1. Контролировать состояние потоков ввода/вывода (отсутствие записи в файле, недопустимые значения, etc).
  2. Генерировать и обрабатывать исключение при некорректных математических операциях.
  3. Выбрасывать исключение при нехватке памяти.
  4. Реализовать собственные классы исключений для случаев:
    • деление на 0;
    • файл не существует;
    • N > 1_000_000.

Лабораторная №3.

Создайте иерархию животного царства на свое усмотрение:

выбираем один тип (простейшие/губки/хордовые и т.д.), а далее наследуйте классы, отряды, семейства, роды и виды) - должна получиться иерархия в 6 уровней, выбор животных на ваш вкус, особо много создавать не нужно.

Затем, для получившейся иерархии, выполняем следующее:

  1. Создаем обобщенный класс Queue, представляющий из себя очередь фиксированного размера со стандартными методами очереди - add и get.
  2. Создаем методы produce и consume:
    • Produce должен возвращать upper bound generic очередь (например, наследники позвоночных) из n животных, которая будет генерироваться на ваше усмотрение и подаваться во второй метод.
    • Consume будет их распределять в 2 или более lower bound очереди - например, родители кошек и родители змей, выбор типов также остаётся за вами.
  3. Демонстрируем работу всех методов на конкретных собственных кейсах.

Лабораторная №4.

Написать аннотацию с целочисленным параметром.

  1. Создать класс, содержащий только приватные методы (3–4 шт.).
  2. Аннотировать любые из них.
  3. Вызвать из другого класса все аннотированные методы столько раз, сколько указано в параметре аннотации.

Лабораторная №5.

С использованием StreamAPI реализовать следующие методы:

  1. Метод, возвращающий среднее значение списка целых чисел.
  2. Метод, приводящий все строки в списке в верхний регистр и добавляющий к ним префикс «new».
  3. Метод, возвращающий список квадратов всех встречающихся только один раз элементов списка.
  4. Метод, принимающий на вход коллекцию строк и возвращающий все строки, начинающиеся с заданной буквы, отсортированные по алфавиту.
  5. Метод, принимающий на вход коллекцию и возвращающий её последний элемент или кидающий исключение, если коллекция пуста.
  6. Метод, принимающий на вход массив целых чисел, возвращающий сумму чётных чисел или 0, если чётных чисел нет.
  7. Метод, преобразовывающий все строки в списке в Map, где первый символ – ключ, оставшиеся – значение.

Лабораторная №6.

  • Создать супервизор (управляющую программу), которая контролирует исполнение абстрактной программы.
  • Абстрактная программа работает в отдельном потоке и является классом с полем перечисляемого типа, который отражает ее состояние (UNKNOWN, STOPPING, RUNNING, FATAL ERROR) и имеет потокдемон случайного состояния, который в заданном интервале меняет её состояние на случайное.
  • У супервизора должны быть методы остановки и запуска абстрактной программы, которые меняют ее состояние.
  • Супервизор является потоком, который циклически опрашивает абстрактную программу, и если ее состояние UNKNOWN или STOPPING, то перезапускает ее.
  • Если состояние FATAL ERROR, то работа абстрактной программы завершается супервизором.
  • Все изменения состояний должны сопровождаться соответствующими сообщениями в консоли.
  • Использовать конструкции с wait/notify.

Лабораторная №7.

  • Создать очередь сообщений, в которую пишут N потоков (количество потоков задается через args), и читают N потоков, использовать только пакет java.util.concurrent.
  • Имена потоков должны быть осмыслены.
  • Использовать конструкции с wait/notify запрещено.

Дополнительное задание.

Разработайте набор классов для текстовой разметки:

  1. Класс Paragraph может содержать произвольное число других элементов разметки и текстовых элементов.
  2. Класс Text – текстовый элемент.
  3. Классы разметки Emphasis, Strong, Strikeout – выделение, сильное выделение и зачеркивание.

Элементы разметки могут содержать произвольное число других элементов разметки и текстовых элементов.

Все классы должны реализовывать метод toMarkdown(StringBuilder), который должен генерировать Markdown-разметку по следующим правилам:

  • текстовые элементы выводятся как есть;
  • выделенный текст окружается символами '*';
  • сильно выделенный текст окружается символами '__';
  • зачеркнутый текст окружается символами '~'.

Следующий код должен успешно компилироваться:

Paragraph paragraph = new Paragraph(List.of(
    new Strong(List.of(
        new Text("1"),
        new Strikeout(List.of(
            new Text("2"),
            new Emphasis(List.of(
                new Text("3"),
                new Text("4")
            )),
            new Text("5")
        )),
        new Text("6")
    ))
));

Вызов paragraph.toMarkdown(new StringBuilder()) должен заполнять переданный StringBuilder следующим содержимым:

__1~2*34*5~6__