Пора вам реализовать мой новый язык на основе стека! Это называется 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)
Как поместить числа в стек:
Добавить цифры в стек просто, просто поместите необработанный номер в свою программу там, где он вам нужен. Если вам нужно поместить несколько чисел в стек, вы можете разделить их запятой ( ,
). Ваша программа не должна будет обрабатывать -
числа во входных данных. Если пользователь хочет один, он должен нажать на число, которое он хочет отрицать, ноль и -
. Числа на входе программы также ограничены положительными целыми числами.
Входные данные:
Ваша программа должна принимать данные из командной строки или из стандартного ввода. Ввод будет состоять только из чисел (без научных обозначений или десятичных дробей), разделенных ,
необходимости, и из операций, определенных выше.
Выход:
Ваша программа должна напечатать число на вершине стека.
Случаи ошибки:
- Если программа пытается перегрузить стек, вы должны распечатать
StackUnderflowException!!!
. - Если у вас деление на ноль, выведите
DivisionByZeroException!!!
- Если число превышает 64 бита, либо во время выполнения программы, либо при обработке числа на входе, выведите
NumberOverflowException!!!
- Если каким-то образом вы получили отрицательное число на вершине стека, и вам нужно сделать факториал, выведите
NegativeFactorialException!!!
- Если у вас есть число с плавающей запятой на вершинах стека, и следующая операция будет факториальной, выведите
FloatingFactorialException!!!
- Если при выходе из программы в стеке нет чисел (т. Е. Программа была пуста), выведите
EmptyProgram!!!
Примечания:
- Все выходные данные об ошибках должны получить либо ошибку, либо ближайший эквивалент.
- Все числа ограничены 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
).