Постфиксен калкулатор

Разгледайте проекта. Той представлява имплементация на постфиксен калкулатор. Проектът се състои от 5 класа:

  • org.elsys.postfix.MainClass - стартиращ клас на проекта, който създава инстанция на калкулатор и добавя в него операцията плюс;

  • org.elsys.postfix.Calculator - основен клас за проекта; четящ и изпълняващ операции от подаден поток и пишещ в подаден изход; операциите, които поддържа се добавят в конструктора му;

  • org.elsys.postfix.operations.Operation - интерфейс, който наследяват всички операции;

  • org.elsys.postfix.operations.AbstractOperation - абстрактен наследник на Operation, в който се съдържат общите свойства и методи за всички операции;

  • org.elsys.postfix.operations.Negate - имплементация на унарен минус;

Задачите е добре да се имплементират в реда, изброен тук.

Имплементация на операцията dup - 20 т.

Имплементирайте операция за дупликиране на последната стойност в стека.

Обърнете внимание дали в имплементацията на тази операция и имплементацията на операцията neg има еднакъв код. Ако да, помислете как да го избегнете.

Тестът DuplicateTest.java трябва да минава.

Имплементация на синус и косинус - 20 т.

Тестовете SinTest.java и CosTest.java минават.

Имплементирайте бинарните операции: събиране, изваждане, умножение и деление - 20 т.

Помислете какъв е общият код между всички бинарни операции и как можете да го изнесете на едно място.

Тестовете PlusTest.java, MinusTest.java, MultiplicationTest.java и DivisionTest.java минават.

Имплементация на тернарната операция \*-\* - 20 т.

\*-\*, която умножава три числа и връща резултата от умножението с обратен знак

Имлементация на операциите swap и rot3 - 10 т

  • Да се имплементира операцията swap, която разменя местата на последните два елемента на върха на стека.

  • Да се имплементира операцията rot3, коята ротира последните три елемента на на върха на стека.

Имплементация на композитна операция - 20 т.

Да се имплементира композитна операция CompositeOperation, която използва composite pattern за поддръжка на композиране на вече съществуващи операции. Класът CompositeOperation трябва да наследява AbstractOperation и да поддъжа добавяне на операции, а метода calculate() изпълнява последователно всяка от операциите в CompositeOperation.

Тестът CompositeOperationTest трябва да минава.

Имплементация на операция за дефиниране на макро операции \def - 20 т.

В метода run() на класа Calculator да се добави поддръжка за дефиниране на макро операции. Например следният фрагмент дефинира операцията square:

\square
dup *
def

Началото на макро дефиницията започва с обратна наклонена и името на дефинираният макрос square. Дефиницията на макроса продължава до срещането на думата def.

Тестът SquareMacroTest трябва да минава.

Поддръжка на константи в макро операции - 10 т.

Дефиницията на макро операции трябва да поддържа използване на константи. Например:

\add1
1 +
def

дефинира операцията add1, която добавя 1 към последният елемент в стека.