Час для вас реалізувати мою нову мову на основі стека! Це називається StackyMath. Це буде мова на основі стека з 8 операціями над стеком та способи додавання чисел до стеку.
Перелік операцій:
/
: Відділ. Виконується на верхніх 2 числах стека. Відсуває результат назад на стек.*
: Множення. Виконується на верхніх 2 числах стека. Відсуває результат назад на стек-
: Віднімання. Виконується на верхніх 2 числах стека. Відсуває результат назад на стек+
: Доповнення. Виконується на верхніх 2 числах стека. Відсуває результат назад на стек^
: Експоненція. Виконується на верхніх 2 числах стека. Відсуває результат назад на стек%
: Модуло. Виконується на верхніх 2 числах стека. Відсуває результат назад на стек!
: Факторський. Виконується на верхньому номері на стеку. Відсуває результат назад на стекD
: Дублюйте верхній номер у стеці
Операції, визначені псевдокодом:
/
:push(pop divided by pop)
*
:push(pop times pop)
-
:push(pop minus pop)
+
:push(pop plus pop)
^
:push(pop to the pop)
%
:push(pop mod pop)
!
:push(factorial pop)
D
:t = pop; push(t); push(t)
Як натиснути числа на стек:
Додавання чисел до стеку досить просто, просто покладіть необроблений номер у свою програму там, де вам це потрібно. Якщо вам потрібно помістити кілька стеків у стек, ви можете розділити їх комою ( ,
). Вашій програмі не потрібно буде обробляти -
цифри на вводі. Якщо користувач хоче одного, він повинен натиснути число, яке вони хочуть, заперечувати, нуль і-
. Числа у вході програми також обмежені додатними цілими числами.
Вхід:
Ваша програма повинна приймати дані в командному рядку або з std дюйма. Вхід буде складатися лише з цифр (без наукових позначень чи десяткових знаків), обмежених ,
необхідність, та операцій, визначених вище.
Вихід:
Ваша програма повинна надрукувати номер у верхній частині стека.
Випадки помилок:
- Якщо програма намагається перевернути стек, слід надрукувати
StackUnderflowException!!!
. - Якщо ви розділили нуль, надрукуйте
DivisionByZeroException!!!
- Якщо число, яке перевищує 64 біт, або під час виконання програми, або обробляючи номер на вводі, надрукуйте
NumberOverflowException!!!
- Якщо якимось чином ви отримаєте від’ємне число у верхній частині стека і вам потрібно зробити фактор, надрукуйте
NegativeFactorialException!!!
- Якщо у вас є номер із плаваючою комою на вершинах стека, і наступна операція є факторною, друкуйте
FloatingFactorialException!!!
- Якщо на стеку немає номерів, коли програма закінчується (тобто програма була порожньою), друкуйте
EmptyProgram!!!
Примітки:
- Усі вихідні помилки до повинні мати yo std помилку або найближчий еквівалент.
- Усі числа обмежені 64-бітовою плаваючою точкою.
Приклади програм:
50,47* -> 2350
50,47/ -> 0.94
100,8! -> 40320
100D* -> 10000
! -> StackUnderflowException!!!
5,2/! -> FloatingFactorialException!!!
4,3!2*/ -> 3
654,489,48,43/5*7D+-*% -> 77.68749999999909
-> EmptyProgram!!!
(Я можу додати більше, якщо потрібно)
654,489,48,43/5*7D+-*%
повинен повернутися 77.6875
. ( 43/48*5-(7+7)
повинен бути (7+7)-43/48*5
)
!
наF
).