Czas na wdrożenie mojego nowego języka opartego na stosie! Nazywa się StackyMath. Będzie to język oparty na stosie z 8 operacjami na stosie i sposobami dodawania liczb do stosu.
Lista operacji:
/
: Podział. Wykonywany na 2 najwyższych numerach stosu. Odkłada wynik z powrotem na stos.*
: Mnożenie. Wykonywany na 2 najwyższych numerach stosu. Odkłada wynik z powrotem na stos-
: Odejmowanie. Wykonywany na 2 najwyższych numerach stosu. Odkłada wynik z powrotem na stos+
: Dodawanie Wykonywany na 2 najwyższych numerach stosu. Odkłada wynik z powrotem na stos^
: Potęgowanie. Wykonywany na 2 najwyższych numerach stosu. Odkłada wynik z powrotem na stos%
: Modulo. Wykonywany na 2 najwyższych numerach stosu. Odkłada wynik z powrotem na stos!
: Factorial. Wykonywany na najwyższym numerze na stosie. Odkłada wynik z powrotem na stosD
: Zduplikuj najwyższy numer na stosie
Operacje zdefiniowane w pseudokodzie:
/
: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)
Jak wypychać liczby na stos:
Dodawanie liczb do stosu jest łatwe, wystarczy umieścić nieprzetworzoną liczbę w swoim programie tam, gdzie jest to potrzebne. Jeśli musisz umieścić wiele liczb na stosie, możesz oddzielić je przecinkiem ( ,
). Twój program nie będzie musiał przetwarzać -
liczb na wejściu. Jeśli użytkownik chce taki numer, powinien wypchnąć liczbę, którą chce zanegować, zero i -
. Liczby na wejściu programu są również ograniczone do dodatnich liczb całkowitych.
Wejście:
Twój program powinien pobierać dane z wiersza poleceń lub ze standardowego wejścia. Dane wejściowe będą się składały tylko z liczb (bez notacji naukowej lub miejsc po przecinku), rozdzielonych według ,
potrzeb i operacji zdefiniowanych powyżej.
Wynik:
Twój program powinien wydrukować liczbę na górze stosu.
Przypadki błędów:
- Jeśli program spróbuje przesłonić stos, powinieneś wydrukować
StackUnderflowException!!!
. - Jeśli masz dzielenie przez zero, wydrukuj
DivisionByZeroException!!!
- Jeśli liczba przekraczająca 64 bity, podczas wykonywania programu lub przetwarzania liczby na wejściu, drukuj
NumberOverflowException!!!
- Jeśli jakoś dostaniesz liczbę ujemną na górze stosu i musisz zrobić silnię, wydrukuj
NegativeFactorialException!!!
- Jeśli masz liczbę zmiennoprzecinkową na górze stosu, a następna operacja jest silna, wydrukuj
FloatingFactorialException!!!
- Jeśli na wyjściu programu nie ma żadnych liczb (tzn. Program był pusty), wydrukuj
EmptyProgram!!!
Uwagi:
- Wszystkie dane wyjściowe błędów powinny otrzymać yo std err lub najbliższy odpowiednik.
- Wszystkie liczby są ograniczone do 64-bitowej liczby zmiennoprzecinkowej.
Przykładowe programy:
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!!!
(W razie potrzeby mogę dodać więcej)
654,489,48,43/5*7D+-*%
powinien wrócić 77.6875
. ( 43/48*5-(7+7)
powinno być (7+7)-43/48*5
)
!
naF
).