Все решения реализованы на языке программирования Java (версия 11).
В решениях реализованы сложные модификации (38-39 группы). К каждой задаче предоставлены тесты на корректность исполнения программы.).
Описание программы и принципов взаимодействия с пользователем указаны на странице условия домашних заданий.
Для тестирования программы требуется запустить соответсвующий каждому домашнему заданию исполняющий файл из тестов. Для каждого тестового файла указан его usage. Все тесты следует запускать с параметром enable asserts.
- Реализуйте свой аналог класса
Scannerна основеReader. - Примените разработанный
Scannerдля решения задания «Реверс». - Примените разработанный
Scannerдля решения задания «Статистика слов». - Код, управляющий чтением должен быть общим.
- Сложный вариант. Код, выделяющий числа и слова должен быть общим.
- При реализации блочного чтения обратите внимание на слова/числа, пересекающие границы блоков, особенно — больше одного раза.
- Разработайте класс
WordStatIndex, который будет подсчитывать статистику встречаемости слов во входном файле. - Словом называется непрерывная последовательность букв, апострофов и тире (Unicode category Punctuation, Dash). Для подсчета статистики, слова приводятся к нижнему регистру.
- Выходной файл должен содержать все различные слова, встречающиеся во входном файле, в порядке их появления. Для каждого слова должна быть выведена одна строка, содержащая слово, число его вхождений во входной файл и номера вхождений этого слова среди всех слов во входном файле.
- Имена входного и выходного файла задаются в качестве аргументов командной строки. Кодировка файлов: UTF-8.
- Программа должна работать за линейное от размера входного файла время.
- Для реализации программы используйте Collections Framework.
- Сложный вариант. Реализуйте и примените класс
IntList, компактно хранящий список целых чисел.
-
Разработайте набор классов для текстовой разметки.
-
Класс Paragraph может содержать произвольное число других элементов разметки и текстовых элементов.
-
Класс Text – текстовый элемент.
-
Классы разметки 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.toMakdown(new StringBuilder()) должен заполнять переданный StringBuilder следующим содержимым:
__1~2*34*5~6__ -
Разработанные классы должны находиться в пакете markup.
- Реализуйте игру m,n,k.
- Добавьте обработку ошибок ввода пользователя.
- Простая версия. Проверку выигрыша можно производить за O(nmk).
- Сложная версия.
- Проверку выигрыша нужно производить за O(k).
- Предотвратите жульничество: у игрока не должно быть возможности достать
BoardизPosition.
- Бонусная версия. Реализуйте
Winner— игрок, который выигрывает всегда, когда это возможно (против любого соперника).
-
Разработайте классы
Const,Variable,Add,Subtract,Multiply,Divideдля вычисления выражений с одной переменной в типеint. -
Классы должны позволять составлять выражения вида
new Subtract( new Multiply( new Const(2), new Variable("x") ), new Const(3) ).evaluate(5)
При вычислении такого выражения вместо каждой переменной подставляется значение, переданное в качестве параметра методу
evaluate(на данном этапе имена переменных игнорируются). Таким образом, результатом вычисления приведенного примера должно стать число 7. -
Метод
toStringдолжен выдавать запись выражения в полноскобочной форме. Напримерnew Subtract( new Multiply( new Const(2), new Variable("x") ), new Const(3) ).toString()
должен выдавать
((2 * x) - 3). -
Сложный вариант. Метод
toMiniStringдолжен выдавать выражение с минимальным числом скобок. Напримерnew Subtract( new Multiply( new Const(2), new Variable("x") ), new Const(3) ).toMiniString()
должен выдавать
2 * x - 3. -
Реализуйте метод
equals, проверяющий, что два выражения совпадают. Например,new Multiply(new Const(2), new Variable("x")) .equals(new Multiply(new Const(2), new Variable("x")))
должно выдавать
true, аnew Multiply(new Const(2), new Variable("x")) .equals(new Multiply(new Variable("x"), new Const(2)))
должно выдавать
false. -
Для тестирования программы должен быть создан класс
Main, который вычисляет значение выраженияx2−2x+1, дляx, заданного в командной строке. -
При выполнении задания следует обратить внимание на:
- Выделение общего интерфейса создаваемых классов.
- Выделение абстрактного базового класса для бинарных операций.
-
Доработайте предыдущее домашнее задание, так что бы выражение строилось по записи вида
x * (x - 2)*x + 1
-
В записи выражения могут встречаться: умножение
*, деление/, сложение+, вычитание-, унарный минус-, целочисленные константы (в десятичной системе счисления, которые помещаются в 32-битный знаковый целочисленный тип), круглые скобки, переменные (x) и произвольное число пробельных символов в любом месте (но не внутри констант). -
Приоритет операторов, начиная с наивысшего
- унарный минус;
- умножение и деление;
- сложение и вычитание.
-
Разбор выражений рекомендуется производить методом рекурсивного спуска. Алгоритм должен работать за линейное время.
- Добавьте в программу вычисляющую выражения обработку ошибок, в том числе:
- ошибки разбора выражений;
- ошибки вычисления выражений.
- При выполнении задания следует обратить внимание на дизайн и обработку исключений.
- Человеко-читаемые сообщения об ошибках должны выводится на консоль.
- Программа не должна «вылетать» с исключениями (как стандартными, так и добавленными)