È il momento di implementare il mio nuovo linguaggio basato su stack! Si chiama StackyMath. Questo sarà un linguaggio basato sullo stack con 8 operazioni nello stack e modi per aggiungere numeri allo stack.
Elenco delle operazioni:
/
: Divisione. Eseguito sui primi 2 numeri dello stack. Rimette il risultato in pila.*
: Moltiplicazione. Eseguito sui primi 2 numeri dello stack. Rimette il risultato in pila-
: Sottrazione. Eseguito sui primi 2 numeri dello stack. Rimette il risultato in pila+
: Aggiunta. Eseguito sui primi 2 numeri dello stack. Rimette il risultato in pila^
: Esponenziazione. Eseguito sui primi 2 numeri dello stack. Rimette il risultato in pila%
: Modulo. Eseguito sui primi 2 numeri dello stack. Rimette il risultato in pila!
: Fattoriale. Eseguito sul numero in cima allo stack. Rimette il risultato in pilaD
: Duplica il numero in cima allo stack
Operazioni definite in pseudo codice:
/
: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)
Come spingere i numeri nello stack:
Aggiungere numeri allo stack è semplice, basta inserire il numero grezzo nel programma dove serve. Se devi mettere più numeri nello stack puoi separarli con una virgola ( ,
). Non è necessario che il programma elabori i -
numeri nell'input. Se l'utente ne desidera uno, deve inviare il numero che desidera negato, zero e -
. Anche i numeri nell'input del programma sono vincolati a numeri interi positivi.
Ingresso:
Il tuo programma dovrebbe prendere l'input dalla riga di comando o da std in. L'input consisterà solo di numeri (nessuna notazione scientifica o decimali) delimitati da ,
come necessario e le operazioni sopra definite.
Produzione:
Il programma dovrebbe stampare il numero in cima alla pila.
Casi di errore:
- Se il programma tenta di sovrascrivere lo stack, è necessario stampare
StackUnderflowException!!!
. - Se hai divisione per zero, stampa
DivisionByZeroException!!!
- Se un numero che supera i 64 bit, durante l'esecuzione del programma o l'elaborazione di un numero nell'input, stampa
NumberOverflowException!!!
- Se in qualche modo ottieni un numero negativo nella parte superiore della pila e devi fare un fattoriale, stampa
NegativeFactorialException!!!
- Se nella parte superiore della pila è presente un numero in virgola mobile e l'operazione successiva è fattoriale, stampare
FloatingFactorialException!!!
- Se non ci sono numeri in pila quando il programma esce (ovvero il programma era vuoto), stampare
EmptyProgram!!!
Appunti:
- Tutto l'output dell'errore su dovrebbe avere lo std err o l'equivalente più vicino.
- Tutti i numeri sono vincolati a virgola mobile a 64 bit.
Programmi di esempio:
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!!!
(Posso aggiungere altro se necessario)
654,489,48,43/5*7D+-*%
dovrebbe tornare 77.6875
. ( 43/48*5-(7+7)
dovrebbe essere (7+7)-43/48*5
)
!
inF
).