È 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).