Парадигмы программирования
Java
Домашнее задание 1. Хэширование
- Разработайте Java-программу
CalcMD5, которая подсчитывает MD5-хэши файлов.- Программа должна принимать один аргумент командной строки — имя файла, в котором содержатся имена файлов, для которых требуется подсчитать хэши. Файлы перечислены по одному на строке.
- Программа должна выдать на стандартный вывод MD5-хэши файлов в порядке их перечисления во входном файле. Хэши должны выдаваться в виде 32-значных шестнадцатеричных чисел.
- Например, если файл
input.txtсодержит толькоinput.txt(9 символов), то при запускеjava CalcMD5 input.txt, на консоль должно быть выведеноA8546347050ADC932FBEC189DC9FD50D. - Примечания.
- Стандартная библиотека Java содержит реализацию алгоритма MD5.
- Вы можете рассчитывать, что все файлы помещаются в память.
- Можно написать решение, состоящее из четырех содержательных строк.
Решение
Домашнее задание 2. Бинарный поиск
- Реализуйте итеративный и рекурсивный варианты бинарного поиска в массиве.
- На вход подается целое число x и массив целых чисел a, отсортированный по невозрастанию. Требуется найти минимальное значение индекса
i, при которомa[i] <= x. - Для функций бинарного поиска и вспомогательных функций должны быть указаны, пред- и постусловия. Для циклов должны быть указаны инварианты.
- Интерфейс программы.
- Имя основного класса —
BinarySearch. - Первый аргумент командной строки — число
x. - Последующие аргументы командной строки — элементы массива
a. * Пример запуска:java BinarySearch 3 5 4 3 2 1. Ожидаемый результат:2.
- На вход подается целое число x и массив целых чисел a, отсортированный по невозрастанию. Требуется найти минимальное значение индекса
Решение
Домашнее задание 3. Очередь на массиве
- Найдите инвариант структуры данных очередь. Определите функции, которые необходимы для реализации очереди. Найдите их пред- и постусловия.
- Реализуйте классы, представляющие циклическую очередь с применением массива.
- Класс
ArrayQueueModuleдолжен реализовывать один экземпляр очереди с использованием переменных класса. - Класс
ArrayQueueADTдолжен реализовывать очередь в виде абстрактного типа данных (с явной передачей ссылки на экземпляр очереди). - Класс
ArrayQueueдолжен реализовывать очередь в виде класса (с неявной передачей ссылки на экземпляр очереди). - Должны быть реализованы следующие функции(процедуры) / методы:
enqueue– добавить элемент в очередь;element– первый элемент в очереди;dequeue– удалить и вернуть первый элемент в очереди;size– текущий размер очереди;isEmpty– является ли очередь пустой;clear– удалить все элементы из очереди.
- Инвариант, пред- и постусловия записываются в исходном коде в виде комментариев.
- Обратите внимание на инкапсуляцию данных и кода во всех трех реализациях. * Напишите тесты реализованным классам.
Решение
Домашнее задание 4. Очередь на связном списке
- Определите интерфейс очереди
Queueи опишите его контракт.- Реализуйте класс
LinkedQueue— очередь на связном списке. - Выделите общие части классов
LinkedQueueиArrayQueueв базовый классAbstractQueue.
- Реализуйте класс
Решение
Домашнее задание 5. Вычисление выражений
- Разработайте классы
Const,Variable,Add,Subtract,Multiply,Divideдля вычисления выражений с одной переменной.- Классы должны позволять составлять выражения вида
```
new Subtract( new Multiply( new Const(2), new Variable(“x”) ), new Const(3) ).evaluate(5)
```
При вычислении такого выражения вместо каждой переменной подставляется значение, переданное в качестве параметра методуevaluate(на данном этапе имена переменных игнорируются). Таким образом, результатом вычисления приведенного примера должно стать число7. * Для тестирования программы должен быть создан классMathlog.src.Main, который вычисляет значение выраженияx2−2x+1, для x`, заданного в командной строке. * При выполнение задания следует обратить внимание на: * Выделение общего интерфейса создаваемых классов. * Выделение абстрактного базового класса для бинарных операций. - Классы должны позволять составлять выражения вида
```
Решение
Домашнее задание 6. Разбор выражений и обработка ошибок
- Доработайте предыдущее домашнее задание, так что бы выражение строилось по записи вида
x * (y - 2)*z + 1 - Для этого реализуйте класс
ExpressionParserс методомTripleExpression parse(String).- В записи выражения могут встречаться:
- умножение
* - деление
/ - сложение
+ - вычитание
- - унарный минус
- - целочисленные константы (в десятичной системе счисления, которые помещаются в 32-битный знаковый целочисленный тип)
- круглые скобки
- переменные (
x,yиz) - произвольное число пробельных символов в любом месте (но не внутри констант). * Приоритет операторов, начиная с наивысшего
- унарный минус;
- умножение и деление;
- сложение и вычитание.
* Для выражения
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)означает, что в процессе вычисления произошло деление на ноль (переполнение). * Разбор выражений рекомендуется производить методом рекурсивного спуска. Алгоритм должен работать за линейное время. * При выполнении задания следует обратить внимание на дизайн и обработку исключений. * Человеко-читаемые сообщения об ошибках должны выводится на консоль. * Программа не должна «вылетать» с исключениями (как стандартными, так и добавленными).
Решение
Домашнее задание 7. Вычисление в различных типах
- Добавьте в программу вычисляющую выражения поддержку различных типов.
- Первым аргументом командной строки программа должна принимать указание на тип, в котором будут производится вычисления:
- -i int
- -d double
- -bi BigInteger
- Реализация не должна содержать непроверяемых преобразований типов.
- Реализация не должна использовать аннотацию @SuppressWarnings. * При выполнении задания следует обратить внимание на легкость добавления новых типов и операциий.
- Первым аргументом командной строки программа должна принимать указание на тип, в котором будут производится вычисления:
Решение
Javascript
Домашнее задание 8. Функциональные выражения на JavaScript
- Разработайте функции
cnst,variable,add,subtract,multiply,divideдля вычисления выражений с одной переменной.- Функции должны позволять производить вычисления вида: ``` var expr = subtract( multiply( cnst(2), variable(“x”) ), cnst(3) ); println(expr(5));
При вычислении такого выражения вместо каждой переменной подставляется значение, переданное в качестве параметра функции `expr` (на данном этапе имена переменных игнорируются). Таким образом, результатом вычисления приведенного примера должно стать число `7`. * Тестовая программа должна вычислять выражение `x2−2x+1`, для `x` от `0` до `10`. * **Усложненный вариант.** Требуется написать функцию parse, осуществляющую разбор выражений, записанных в [обратной польской записи.](https://en.wikipedia.org/wiki/Reverse_Polish_notation) Например, результатомparse("x x 2 - * x * 1 +")(5)``` должно быть число
76. * При выполнение задания следует обратить внимание на:- Применение функций высшего порядка.
- Выделение общего кода для бинарных операций.
Решение
Домашнее задание 9. Объектные выражения на JavaScript
- Разработайте классы
Const,Variable,Add,Subtract,Multiply,Divideдля представления выражений с одной переменной.- Пример описания выражения
2x-3:var expr = new Subtract( new Multiply( new Const(2), new Variable("x") ), new Const(3) );* Метод `evaluate(x)` должен производить вычисления вида: При вычислении такого выражения вместо каждой переменной подставляется значение `x`, переданное в качестве параметра функции `evaluate` (на данном этапе имена переменных игнорируются). Таким образом, результатом вычисления приведенного примера должно стать число `7.` * Метод `toString()` должен выдавать запись выражения в [обратной польской записи.](https://en.wikipedia.org/wiki/Reverse_Polish_notation) Например, `expr.toString()` должен выдавать `2 x * 3 -`. * **Усложненный вариант.** Метод `diff("x")` должен возвращать выражение, представляющее производную исходного выражения по переменной `x`. Например, `expr.diff("x")` должен возвращать выражение, эквивалентное `new Const(2)` (выражения `new Subtract(new Const(2), new Const(0)`) и ``` new Subtract( new Add( new Multiply(new Const(0), new Variable("x")), new Multiply(new Const(2), new Const(1)) ) new Const(0) )
так же будут считаться правильным ответом ) * **Бонусный вариант.** Требуется написать метод `simplify()`, производящий вычисления константных выражений. Например,parse("x x 2 - * 1 *").diff("x").simplify().toString()``` должно возвращать
x x 2 - +. * При выполнение задания следует обратить внимание на:- Применение инкапсуляции.
- Выделение общего кода для бинарных операций.
- Пример описания выражения
Решение
Домашнее задание 10. Обработка ошибок на JavaScript
- Добавьте в предыдущее домашнее задание функцию
parsePrefix(string), разбирающую выражения, задаваемые записью вида(- (* 2 x) 3).Если разбираемое выражение некорректно, методparsePrefixдолжен бросать человеко-читаемое сообщение об ошибке.- Добавьте в предыдущее домашнее задание метод
prefix(), выдающий выражение в формате, ожидаемом функциейparsePrefix. - При выполнение задания следует обратить внимание на:
- Применение инкапсуляции.
- Выделение общего кода для бинарных операций.
- Обаботку ошибок.
- Минимизацию необходимой памяти.
- Добавьте в предыдущее домашнее задание метод
Решение
Clojure
Домашнее задание 11. Выражения на Clojure
Условия задачи
- Разработайте функции
constant,variable,add,subtract,multiplyиdivideдля представления арифметических выражений.- Пример описания выражения
2x-3:(def expr (subtract (multiply (constant 2) (variable "x")) (constant 3))) - Выражение должно быть функцией, возвращающей значение выражение при подстановке элементов, заданных отображением. Например,
(expr {"x" 2})должно быть равно1. * Разработайте разборщик выражений, читающий выражения в стандартной для Clojure форме. Например, ``` (parseFunction “(- (* 2 x) 3)”)
- Пример описания выражения
должно быть эквивалентно expr.
* **Усложненный вариант.** Функции `add`, `subtract`, `multiply` и должны принимать произвольное число аргументов. Разборщик так же должен допускать произвольное число аргументов для `+`, `-`, `*`.
* При выполнение задания следует обратить внимание на:
* Выделение общего кода для операций.
### [Решение](/Ifmo-code/Paradigm/clojure/expression.clj)
Домашнее задание 12. Объектные выражения на Clojure
---
1. Разработайте конструкторы `Constant`, `Variable`, `Add`, `Subtract`, `Multiply` и `Divide` для представления выражений с одной переменной.
1. Пример описания выражения `2x-3`:
```
(def expr
(Subtract
(Multiply
(Constant 2)
(Variable "x"))
(Const 3)))
```
* Функция `(evaluate expression vars)` должна производить вычисление выражения `expression` для значений переменных, заданных отображением `vars`. Например, `(evaluate expr {"x" 2})` должно быть равно `1`.
* Функция `(toString expression)` должна выдавать запись выражения в стандартной для Clojure форме.
* Функция `(parseObject "expression")` должна разбирать выражения, записанные в стандартной для Clojure форме. Например,
```
(parseObject "(- (* 2 x) 3)")
```
должно быть эквивалентно expr.
* Функция `(diff expression "variable")` должена возвращать выражение, представляющее производную исходного выражения по заданой пермененной. Например, `(diff expression "x")` должен возвращать выражение, эквивалентное `(Constant 2)`, при этом выражения `(Subtract (Const 2) (Const 0))` и
```
(Subtract
(Add
(Multiply (Const 0) (Variable "x"))
(Multiply (Const 2) (Const 1)))
(Const 0))
```
так же будут считаться правильным ответом.
* **Усложненный вариант.** Функция `(parseObjectInfix "expression")` должна разбирать выражения, записанные в инфиксной форме. Например,
(parseObjectInfix "2 * x - 3")
```
должно быть эквивалентно expr.
- При выполнение задания можно использовать любой способ преставления объектов.