You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 849f956
Browse filesBrowse the repository at this point in the historyBrowse files
Написать стековый калькулятор, который принимает в качестве аргумента командой строки имя файла, содержащего команды. Если аргумента нет, то использовать стандартный поток ввода для чтения команд. Использовать вещественные числа.
5
+
6
+
Реализовать следующий набор команд:
7
+
1.`#` - строка с комментарием.
8
+
2.`POP, PUSH` - снять/положить число со/на стек(а).
9
+
3.`+ , - , * , /, SQRT` - арифметические операции. Используют один или два верхних элемента стека, изымают их из стека, помещая результат назад.
5.`DEFINE` - задать значение параметра. В дальнейшем везде использовать вместо параметра это значение.
12
+
13
+
Пример (должно вывести 2):
14
+
```
15
+
DEFINE a 4
16
+
PUSH a
17
+
SQRT
18
+
PRINT
19
+
```
20
+
21
+
## Технические требования
22
+
23
+
1. Создание команд реализуйте с помощью шаблона проектирования [«фабричный метод»](https://ru.wikipedia.org/wiki/%D0%A4%D0%B0%D0%B1%D1%80%D0%B8%D1%87%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)). Реализация команд не зависит от остальной системы. Остальной код работает только с фабрикой команд и интерфейсами, про конкретные команды ничего не знает.
24
+
2. Разбор текстового файла с командами и их аргументами реализуйте отдельным классом, который не зависит от остальной системы.
25
+
3. Загрузку классов команд при создании в фабрике осуществляйте по полному квалифицированному имени класса (включая имя пакета) посредством `Class.forName()` с последующим созданием объектов команд методом `Class.newInstance()`. Фабрика конфигурируется с помощью файла содержащего соответствия между именами команд и классами, реализующими эти команды. Зависимости фабрики от конкретных классов команд (кроме корневого-абстрактного) быть не должно. Файл конфигурации должен храниться рядом с файлом класса-фабрики.
26
+
4. Содержимое стека и именованные параметры передавать команде в виде специального объекта - контекста исполнения. При желании, аргументы команды тоже можно брать из контекста.
27
+
5. Разработать иерархию исключений, которые будут выбрасывать команды при исполнении. В случае возникновения исключения — выводить информацию об ошибке
28
+
и продолжать исполнение программы (из файла или команд вводимых с консоли).
29
+
6. Напишите тесты с использованием JUnit (см. [шаблон проекта](https://github.com/dsavenko/nsu-oop-java-template/tree/master/testlab)).
0 commit comments