Homework 3: realizzazione di una calcolatrice in notazione polacca inversa

Si deve realizzare un programma che simuli una calcolatrice in Wikipedia:Reverse_Polish_notation, (notazione polacca inversa) ovvero una calcolatrice che:

  • usa una stack (di dimensioni non definite) per mantenere i risultati parziali delle operazioni
  • tutte le operazioni da svolgere prendono gli argomenti dalla stack e mettono il risultato sulla stack

Il programma deve permettere i seguenti input, su righe diverse (ovvero separati da accapo):

  • un numero intero, che verrà inserito sulla stack (push implicito)
  • oppure una lettera che indica una operazione da svolgere. Le operazioni ammesse sono:
    • P: (print) stampa tutti gli elementi della stack dal top al bottom separati da uno spazio (oppure "EMPTY" se non ci sono elementi nella stack). NON elimina gli elementi dalla stack.
    • D: (dup) aggiunge in cima alla stack una copia dell'elemento top (oppure non fa nulla se non ci sono elementi nella stack)
    • d: (drop) elimina l'elemento in cima alla stack (oppure non fa nulla se non ci sono elementi nella stack)
    • una operazione aritmetica a due argomenti: toglie i due elementi in cima, svolge l'operazione e mette il risultato sulla stack (non fa nulla se non ci sono almeno 2 elementi). Le operazioni da realizzare sono indicate dai caratteri "+*-". La differenza toglie il valore dell'elemento top da quello che gli sta sotto.
    • q: (quoziente/resto) toglie i due elementi in cima alla stack e ne calcola quoziente e resto, che rimette su stack (oppure non fa nulla se non ci sono almeno 2 elementi nella stack). Il quoziente viene calcolato dividento per l'elemento top il secondo elemento. I risultati vengono messi sulla stack in modo che il top sia il quoziente e che il resto sia il secondo elemento.
    • una operazione aritmetica a un solo argomento: toglie l'elemento in cima, svolge l'operazione e mette il risultato sulla stack (non fa nulla se la stack è vuota). L'unica operazione da realizzare è l'opposto, indicato dal carattere "n"
    • Q: (quit) termina il programma

NOTE

  • per non complicare troppo la gestione degli overflow/underflow assumete che nei test non avvengano mai
  • per non complicare troppo l'input assumete che i valori inseriti siano sempre non negativi
    • va da sè che è possibile inserire un numero negativo facendolo segure dall'operatore n
    • quindi le operazioni con valori negativi possono capitare
    • per il resto va bene il risultato dato dalla istruzione div, che torna un resto dello stesso segno del dividendo

Esempio

Se la sequenza di operazioni da svolgere fosse quella indicata nella prima colonna, la stack mano a mano conterrebbe i valori indicati nella seconda colonna (con il top a sinistra) e verrebbero stampate le righe mostrate nella terza colonna:
InputSorted ascending Stack Output Operazione svolta
* 200   prodotto
10 10   inserimento di 10
20 20 10   inserimento di 20
7 7 200 200   inserimento di 7
D 200 200   dup
P empty EMPTY stampa
P 20 10 20 10 stampa
P 200 200 stampa
P 28 4 200 28 4 200 stampa
q 28 4 200   quoziente e resto di 200/7
Q     quit

Test

Ho publicato i file che userò per i test. Chi ha già consegnato trova i risultati dei test così può correggere il programma

  • i primi testano separatamente ciascun operatore
  • poi ce ne sono 10 generati a caso
  • più l'esempio pubblicato sopra
Se il sistema capisce che tipo di errore è accaduto, viene scritto un commento nella casella del test

Per testare il programma con i file usate il comando:

  • java -jar Mars4_5.jar me nc sm ic VostroFile.asm < test.in > test.output
  • poi confrontate il file test.output prodotto con l'output atteso (file test.out)

Consegna entro le ore 24 del 7 Maggio

Usate la pagina di consegna

-- AndreaSterbini - 27 Apr 2015

Edit | Attach | Watch | Print version | History: r7 < r6 < r5 < r4 < r3 | Backlinks | Raw View | Raw edit | More topic actions
Topic revision: r7 - 2015-05-07 - AndreaSterbini






 
Questo sito usa cookies, usandolo ne accettate la presenza. (CookiePolicy)
Torna al Dipartimento di Informatica
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback