Выполнение тестов производится с помощью Makefile. Все тесты, используемые в
- Добавьте в программу вычисляющую выражения обработку ошибок, в том числе:
- ошибки разбора выражений;
- ошибки вычисления выражений.
- Для выражения
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) означает, что в процессе вычисления произошло деление на ноль (переполнение).
- При выполнении задания следует обратить внимание на дизайн и обработку исключений.
- Человеко-читаемые сообщения об ошибках должны выводится на консоль.
- Программа не должна «вылетать» с исключениями (как стандартными, так и добавленными).
Модификации
- Базовая
- Класс
ExpressionParserдолжен реализовывать интерфейсParser - Классы
CheckedAdd,CheckedSubtract,CheckedMultiply,CheckedDivideиCheckedNegateдолжны реализовывать интерфейсTripleExpression - Нельзя использовать типы
longиdouble - Нельзя использовать методы классов
MathиStrictMath
- Класс
- Простая
- Дополнительно реализовать унарные операции:
log2— логарифм по уснованию 2,log2 10равно 3;pow2— два в степени,pow2 4равно 16.
- Дополнительно реализовать унарные операции:
- Простая
- Дополнительно реализовать унарные операции:
abs— модуль числа,abs -5равно 5;sqrt— квадратный корень,sqrt 24равно 4.
- Дополнительно реализовать унарные операции:
- Сложная
- Реализовать операции простой модификации.
- Дополнительно реализовать бинарные операции (минимальный приоритет):
min— минимум,2 min 3равно 2;max— максимум,2 max 3равно 3.
-
Доработайте предыдущее домашнее задание, так что бы выражение строилось по записи вида:
x * (x - 2)*x + 1 -
В записи выражения могут встречаться: умножение
*, деление/, сложение+, вычитание-, унарный минус-, целочисленные константы (в десятичной системе счисления, которые помещаются в 32-битный знаковый целочисленный тип), круглые скобки, переменные (x) и произвольное число пробельных символов в любом месте (но не внутри констант). -
Приоритет операторов, начиная с наивысшего
- унарный минус;
- умножение и деление;
- сложение и вычитание.
-
Разбор выражений рекомендуется производить методом рекурсивного спуска. Алгоритм должен работать за линейное время.
Модификации
- Базовая
- Класс
ExpressionParserдолжен реализовывать интерфейсParser - Результат разбора должен реализовывать интерфейс
TripleExpression
- Класс
- Простая
- Дополнительно реализовать бинарные операции:
<<— сдвиг влево, минимальный приоритет (1 << 5 + 3равно1 << (5 + 3)равно 256);>>— сдвиг вправо, минимальный приоритет (1024 >> 5 + 3равно1024 >> (5 + 3)равно 4);
- Дополнительно реализовать бинарные операции:
- Сложная
- Дополнительно реализовать унарные операции (приоритет как у унарного минуса):
- Дополнительно реализовать бинарные операции:
&— побитное И, приоритет меньше чем у+(6 & 1 + 2равно6 & (1 + 2)равно 2);^— побитный XOR, приоритет меньше чем у&(6 ^ 1 + 2равно6 ^ (1 + 2)равно 5);|— побитное ИЛИ, приоритет меньше чем у^(6 | 1 + 2равно6 | (1 + 2)равно 7);~— побитное отрицание,~-5равно 4;count— число установленных битов,count -5равно 31.
- Дополнительно реализовать унарные операции (приоритет как у унарного минуса):
- 39 группа
- Дополнительно реализовать операции из простой и сложной модификации.
- Разработайте классы Const, Variable, Add, Subtract, Multiply, Divide для вычисления выражений с одной переменной.
- Классы должны позволять составлять выражения вида
new Subtract(
new Multiply(
new Const(2),
new Variable("x")
),
new Const(3)
).evaluate(5)
- При вычислении такого выражения вместо каждой переменной подставляется значение, переданное в качестве параметра методу evaluate (на данном этапе имена переменных игнорируются). Таким образом, результатом вычисления приведенного примера должно стать число 7.
- Для тестирования программы должен быть создан класс Main, который вычисляет значение выражения x2−2x+1, для x, заданного в командной строке.
- При выполнение задания следует обратить внимание на:
- Выделение общего интерфейса создаваемых классов.
- Выделение абстрактного базового класса для бинарных операций. Модификации
- Базовая
- Реализовать интерфейс
Expression
- Реализовать интерфейс
- Простая
- Реализовать интерфейс
DoubleExpression
- Реализовать интерфейс
- Сложная
- Реализовать интерфейсы
DoubleExpressionиTripleExpression
- Реализовать интерфейсы
- Определите интерфейс очереди Queue и опишите его контракт.
- Реализуйте класс LinkedQueue — очередь на связном списке.
- Выделите общие части классов LinkedQueue и ArrayQueue в базовый класс AbstractQueue.
Модификации
- Базовая
- Простая
- Добавить в интерфейс очереди и реализовать метод
toArray, возвращающий массив, содержащий элементы, лежащие в очереди в порядке от головы к хвосту - Исходная очередь должна оставаться неизменной
- Дублирования кода быть не должно
- Добавить в интерфейс очереди и реализовать метод
- Сложная
- Добавить в интерфейс очереди и реализовать методы
- Исходная очередь должна остаться неизменной
- Тип возвращаемой очереди должен соответствовать типу исходной очереди
- Взаимный порядок элементов должен сохраняться
- Дублирования кода быть не должно
- Найдите инвариант структуры данных «очередь». Определите функции, которые необходимы для реализации очереди. Найдите их пред- и постусловия.
- Реализуйте классы, представляющие циклическую очередь с применением массива.
- Класс ArrayQueueModule должен реализовывать один экземпляр очереди с использованием переменных класса.
- Класс ArrayQueueADT должен реализовывать очередь в виде абстрактного типа данных (с явной передачей ссылки на экземпляр очереди).
- Класс ArrayQueue должен реализовывать очередь в виде класса (с неявной передачей ссылки на экземпляр очереди).
- Должны быть реализованы следующие функции (процедуры) / методы:
- enqueue – добавить элемент в очередь;
- element – первый элемент в очереди;
- dequeue – удалить и вернуть первый элемент в очереди;
- size – текущий размер очереди;
- isEmpty – является ли очередь пустой;
- clear – удалить все элементы из очереди.
- Инвариант, пред- и постусловия записываются в исходном коде в виде комментариев.
- Обратите внимание на инкапсуляцию данных и кода во всех трех реализациях.
- Напишите тесты реализованным классам.
Модификации
- Базовая
- Классы должны находиться в пакете
queue
- Классы должны находиться в пакете
- Простая
- Реализовать метод
toArray, возвращающий массив, содержащий элементы, лежащие в очереди в порядке от головы к хвосту. - Исходная очередь должна остаться неизменной
- Дублирования кода быть не должно
- Реализовать метод
- Сложная
- Реализовать методы
push– добавить элемент в начало очередиpeek– вернуть последний элемент в очередиremove– вернуть и удалить последний элемент из очереди
- Реализовать методы
- Реализуйте итеративный и рекурсивный варианты бинарного поиска в массиве.
- На вход подается целое число x и массив целых чисел a, отсортированный по невозрастанию. Требуется найти минимальное значение индекса i, при котором a[i] <= x.
- Для функций бинарного поиска и вспомогательных функций должны быть указаны, пред- и постусловия. Для реализаций методов должны быть приведены доказательства соблюдения контрактов в терминах троек Хоара.
- Интерфейс программы.
- Имя основного класса —
BinarySearch. - Первый аргумент командной строки — число x.
- Последующие аргументы командной строки — элементы массива a.
- Имя основного класса —
- Пример запуска:
java BinarySearch 3 5 4 3 2 1. Ожидаемый результат: 2.
Модификации
- Базовая
- Класс
BinarySearchдолжен находиться в пакетеsearch
- Класс
- Простая
- Если в массиве
aотсутствует элемент, равныйx, то требуется вывести индекс вставки в формате, определенном вArrays.binarySearch. - Класс должен иметь имя
BinarySearchMissing
- Если в массиве
- Сложная
- Требуется вывести два числа: начало и длину диапазона элементов,
равных
x. Если таких элементов нет, то следует вывести пустой диапазон, у которого левая граница совпадает с местом вставки элементаx. - Не допускается использование типов
longиBigInteger. - Класс должен иметь имя
BinarySearchSpan
- Требуется вывести два числа: начало и длину диапазона элементов,
равных
- Для всех групп нужно использовать самописный
Scanner - Группам 36-37 можно использовать по символьное чтение
- Группам 38-39 нужно использовать побайтовое считывание
Модификации
- LineIndex
- В выходном файле слова должны быть упорядочены в лексикографическом порядке
- Вместо номеров вхождений во всем файле надо указывать
<номер строки>:<номер в строке> - Класс должен иметь имя
WordStatLineIndex
- Разработайте класс
WordStatIndex, который будет подсчитывать статистику встречаемости слов во входном файле. - Словом называется неперывная последовательность букв, апострофов и тире (Unicode category Punctuation, Dash). Для подсчета статистики, слова приводятся к нижнему регистру.
- Выходной файл должен содержать все различные слова, встречающиеся во входном файле, в порядке их появения. Для каждого слова должна быть выведена одна строка, содежащая слово, число его вхождений во входной файл и номера вхождений этого слова среди всех слов во входном файле.
- Имена входного и выходного файла задаются в качестве аргументов командной строки. Кодировка файлов: UTF-8.
- Программа должна работать за линейное от размера входного файлам время.
- Для реализации программы используйте
Collections Framework. - Примеры работы программы:
Входной файл:
To be, or not to be, that is the question:
Выходной файл:
to 2 1 5
be 2 2 6
or 1 3
not 1 4
that 1 7
is 1 8
the 1 9
question 1 10
Входной файл:
Monday's child is fair of face.
Tuesday's child is full of grace.
Выходной файл:
monday's 1 1
child 2 2 8
is 2 3 9
fair 1 4
of 2 5 11
face 1 6
tuesday's 1 7
full 1 10
grace 1 12
Входной файл:
Шалтай-Болтай
Сидел на стене.
Шалтай-Болтай
Свалился во сне.
Выходной файл:
шалтай-болтай 2 1 5
сидел 1 2
на 1 3
стене 1 4
свалился 1 6
во 1 7
сне 1 8
- Для групп 36-39 надо написать
Scannerиспользуя побайтовое считывание, то есть нельзя использоватьBufferedReaderи аналоги! - Для групп 38-39 запрешено использовать регулярные выражения, функцию
split, классStringTokenizerи аналоги.
Модификации
- Минимум
- Рассмотрим входные данные как (не полностью определенную) матрицу, вместо каждого числа выведите минимум из чисел в его столбце и строке.
- Сравнить время работы вашего сканера и встроенного в java
- Класс должен иметь имя
ReverseMin
- Сумма
- Рассмотрим входные данные как (не полностью определенную) матрицу, вместо каждого числа выведите сумму чисел в его столбце и строке.
- Класс должен иметь имя
ReverseSum
- Реализуйте свой аналог класса
Scanner. Разработайте класс Reverse, читающий числа из стандартного входа, и выводящий их на стандартный вывод в обратном порядке. - Примените разработанный
Scannerдля решения задания "Реверc". - Модифицируйте решени задания "Реверc" так, что бы оно работало за линейное время.
Модификации
- Words
- В выходном файле слова должны быть упорядочены в лексикографическом порядке
- Класс должен иметь имя
WordStatWords
- Разработайте класс
WordStatInput, который будет подсчитывать статистику встречаемости слов во входном файле. - Словом называется неперывная последовательность букв, апострофов и тире (Unicode category Punctuation, Dash). Для подсчета статистики, слова приводятся к нижнему регистру.
- Выходной файл должен содержать все различные слова, встречающиеся во входном файле, в порядке их появения. Для каждого слова должна быть выведена одна строка, содежащая слово и число его вхождений во входной файл.
- Имена входного и выходного файла задаются в качестве аргументов командной строки. Кодировка файлов: UTF-8.
- Примеры работы программы:
Входной файл:
To be, or not to be, that is the question:
Выходной файл:
to 2
be 2
or 1
not 1
that 1
is 1
the 1
question 1
Входной файл:
Monday's child is fair of face.
Tuesday's child is full of grace.
Выходной файл:
monday's 1
child 2
is 2
fair 1
of 2
face 1
tuesday's 1
full 1
grace 1
Входной файл:
Шалтай-Болтай
Сидел на стене.
Шалтай-Болтай
Свалился во сне.
Выходной файл:
шалтай-болтай 2
сидел 1
на 1
стене 1
свалился 1
во 1
сне 1
Модификации
- Abc
- На вход подаются числа, представленные буквами.
Нулю соответствует буква
a, единице –bи так далее - Ввод регистронезависим
- Класс должен иметь имя
SumAbcFile
- На вход подаются числа, представленные буквами.
Нулю соответствует буква
- Hex
- На вход подаются десятичные и шестнадцатеричные числа
- Шестнадцатеричные числа имеют префикс
0x - Ввод регистронезависим
- Класс должен иметь имя
SumHexFile
- Разработайте класс
SumFile, записывающий сумму чисел из входного файла в выходной файл. - Числа во входном файле разделены переводами строк и/или пробельными символами.
- Имена входного и выходного файла задаются в качестве аргументов командной строки.
- Примеры работы программы:
Входной файл:
1 2 3
Выходной файл:
6
Входной файл:
1 2 -3
Выходной файл:
0
Входной файл:
1 2
3
Выходной файл:
6
- При выполнении задания можно считать что для представления входных данных и промежуточных результатов достаточен тип
int. - В этом и последующих домашних заданиях, метод main не должен выбрасывать никаких исключений при любых (в том числе некорректных) входных данных.
- В этом и последующих домашних заданиях, все ресурсы должны закрываться при любых (в том числе некорректных) входных данных.
Модификации
- Транспозиция
- Рассмотрим входные данные как (не полностью определенную) матрицу, выведите ее в транспонированном виде
- Класс должен иметь имя
ReverseTranspose
- Максимум
- Рассмотрим входные данные как (не полностью определенную) матрицу, вместо каждого числа выведите максимум из чисел в его столбце и строке.
- Класс должен иметь имя
ReverseMax
- Разработайте класс
Reverse, читающий числа из стандартного входа, и выводящий их на стандартный вывод в обратном порядке. - В каждой строке входа содержится некоторое количество целых чисел (может быть 0). Числа разделены пробелами. Каждое число помещается в тип
int. - Порядок строк в выходе должен быть обратным по сравнению с порядком строк во входе. Порядок чисел в каждой строки так же должен быть обратным к порядку чисел во входе.
- Примеры работы программы:
Вход: 1 2 3 Выход: 3 2 1 Вход: 1 2 -3 Выход: -3 2 1
-
SumHex
- Входные данные помещаются в тип
intлибо десятичные, либо шестнадцатиричное начинается с0x - Класс должен иметь имя
SumHex - Нельзя использоваться классы
LongиBigInteger
- Входные данные помещаются в тип
-
BigIntegerDigit
- Входные данные помещаются в тип BigInteger
- Класс должен иметь имя
SumBigInteger - Числа имеют вид
[знак]цифры
- Разработайте класс
Sum, который при запуске из командной строки будет складывать переданные в качестве аргументов целые числа и выводить их сумму на консоль. - Примеры запуска программы:
Аргументы могут содержать цифры и произвольные пробельные символы.
java Sum 1 2 3 Результат: 6 java Sum 1 2 -3 Результат: 0 java Sum "1 2 3" Результат: 6 java Sum "1 2" " 3" Результат: 6 - При выполнении задания можно считать что для представления входных данных и промежуточных результатов достаточен тип
int. - При выполнении задания полезно ознакомиться с документацией к классам String и Integer.
Для того, чтобы протестировать исходную программу:
- Скачайте откомпилированные тесты (SumTest.jar)
- Откомпилируйте
Sum.java - Проверьте, что создался
Sum.class - В каталоге, в котором находится
Sum.classвыполните командуjava -jar <путь к SumTest.jar>- Например, если
SumTest.jarнаходится в текущем каталоге, выполните команду
java -jar SumTest.jar - Например, если