- BinarySearch
- Реализуйте итеративный и рекурсивный варианты бинарного поиска в массиве.
- На вход подается целое число x и массив целых чисел
a
, отсортированный по невозрастанию. Требуется найти минимальное значение индексаi
, при которомa[i] <= x
. - Для функций бинарного поиска и вспомогательных функций должны быть указаны, пред- и постусловия. Для реализаций методов должны быть приведены доказательства соблюдения контрактов в терминах троек Хоара.
- Интерфейс программы.
- Имя основного класса —
BinarySearch
. - Первый аргумент командной строки — число
x
. - Последующие аргументы командной строки — элементы массива
a
.
- Имя основного класса —
- Пример запуска:
java BinarySearch 3 5 4 3 2 1
. Ожидаемый результат:2
.
- ExpressionParser
- Разработайте классы
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
, который вычисляет значение выражения
x * x − 2 * x + 1
, дляx
, заданного в командной строке. - При выполнении задания следует обратить внимание на:
- Выделение общего интерфейса создаваемых классов.
- Выделение абстрактного базового класса для бинарных операций.
- Разработайте классы
- ExpressionParserAdvanced
- Доработайте предыдущее домашнее задание, так что бы выражение строилось по записи вида
x * (x - 2) * x + 1
- В записи выражения могут встречаться: умножение
*
, деление/
, сложение+
, вычитание-
, унарный минус-
, целочисленные константы (в десятичной системе счисления, которые помещаются в 32-битный знаковый целочисленный тип), круглые скобки, переменныеx
и произвольное число пробельных символов в любом месте (но не внутри констант). - Приоритет операторов, начиная с наивысшего
- унарный минус
- умножение и деление
- сложение и вычитание
- Разбор выражений рекомендуется производить методом рекурсивного спуска. Алгоритм должен работать за линейное время.
- Добавьте в программу вычисляющую выражения обработку ошибок, в том числе:
- ошибки разбора выражений>/li>
- ошибки вычисления выражений
- Для выражения
1000000 * x * x * x * x * x / (x - 1)
вывод программы должен иметь следующий вид: Результатx
f
0
0
1
division by zero
2
32000000
3
121500000
4
341333333
5
overflow
6
overflow
7
overflow
8
overflow
9
overflow
10
overflow
division by zero (overflow)
означает, что в процессе вычисления произошло деление на ноль (переполнение). - При выполнении задания следует обратить внимание на дизайн и обработку исключений.
- Человеко-читаемые сообщения об ошибках должны выводится на консоль.
- Программа не должна «вылетать» с исключениями (как стандартными, так и добавленными).
- Доработайте предыдущее домашнее задание, так что бы выражение строилось по записи вида
- GenericParser
- Добавьте в программу разбирающую и вычисляющую выражения поддержку различных типов.
Первым аргументом командной строки программа должна принимать указание на тип, в котором будут производится вычисления: Вторым аргументом командной строки программа должна принимать выражение для вычисления.Опция Тип -i
int
-d
double
-bi
BigInteger
- При выполнении задания следует обратить внимание на легкость добавления новых типов и операциий.
- Добавьте в программу разбирающую и вычисляющую выражения поддержку различных типов.
- MdParser
- Разработайте набор классов для текстовой разметки.
- Класс
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
- MdToHtmlParser
- Разработайте конвертер из Markdown-разметки в HTML.
- Конвертер должен поддерживать следующие возможности:
- Абзацы текста разделяются пустыми строками.
- Элементы строчной разметки: выделение (
*
или_
), сильное выделение (**
или__
), зачеркивание--
, код`
- Заголовки (
#
*
уровень заголовка)
- Конвертер должен называться Md2Html и принимать два аргумента: название входного файла с Markdown-разметкой и название выходного файла c HTML-разметкой. Оба файла должны иметь кодировку UTF-8.
- Пример
- MyScanner
- Реализуйте свой аналог класса
Scanner
на основеReader
. - Код, управляющий чтением должен быть общим.
- Код, выделяющий числа и слова должен быть общим.
- При реализации блочного чтения обратите внимание на слова/числа, пересекающие границы блоков, особенно — больше одного раза.
- Реализуйте свой аналог класса
- Queues
- Найдите инвариант структуры данных «очередь». Определите функции, которые необходимы для реализации очереди. Найдите их пред- и постусловия, при условии что очередь не содержит
null
. - Реализуйте класс
ArrayQueue
, представляющие циклическую очередь с применением массива.
Должны быть реализованы следующие функции (процедуры) / методы:enqueue
– добавить элемент в очередьelement
– первый элемент в очередиdequeue
– удалить и вернуть первый элемент в очередиsize
– текущий размер очередиisEmpty
– является ли очередь пустойclear
– удалить все элементы из очереди
Обратите внимание на инкапсуляцию данных и кода во всех трех реализациях. - Определите интерфейс очереди
Queue
и опишите его контракт. - Реализуйте класс
LinkedQueue
— очередь на связном списке. - Выделите общие части классов
LinkedQueue
иArrayQueue
в базовый классAbstractQueue
.
- Найдите инвариант структуры данных «очередь». Определите функции, которые необходимы для реализации очереди. Найдите их пред- и постусловия, при условии что очередь не содержит
- TicTacToe
- Реализуйте игру m, n, k.
- Добавьте обработку ошибок ввода пользователя.
- Проверку выигрыша нужно производить за O(k).
- Предотвратите жульничество: у игрока не должно быть возможности достать
Board
изPosition
.