Oppure

Loading
04/09/07 22:29
newbie-c
Ciao a tutti.
Ho un piccolo test da fare all'univ e ho un problema con questa funzione.
Devo leggere da standard input una sequenza di stringhe che possono essere numeri reali o operatori (la classica calcolatrice).

Negli hint il prof dice di usare la funzione scanf("%f",val) ma io mi chiedo perché "%f"? e quando trovo un operatore, ad esempio il "+"?

Io ho implementato già un sorgente funzionante con scanf("%s",val) ma ho fatto anche un'altra deroga alle specifiche del progetto: il prof non vuole che si usi un carattere di "fine calcolo" (ad esempio "=";) e mi trovo nella situazione di non riuscire a capire quando scanf("%s", val) ha finito di leggere gli operatori. In pratica se non ho un carattere di "escape" scanf("%s",val) mi ripropone lo standard input per inserire ancora dati.
Per essere ancora più chiari il prof ci ha detto che l'input deve essere nella notazione polacca inversa, es. 4 2 + e il risultato deve essere 6. Il mio codice funziona se metto 4 2 + = perché se metto 4 2 + non riesco a capire quando il "+" è l'ultimo carattere.

Grazie a tutti.

Newbie-c
aaa
05/09/07 22:04
pierotofy
Beh, se tu in un caso ipotetico inserisci 4 numeri su cui eseguire delle operazioni, sai in automatico che gli operatori saranno 3. Quindi per capire quando è arrivata la fine del calcolo nell'iterazione che legge gli operatori controlla che C (variabile contatore) sia <= N-1 (dove N è il numero di numeri inseriti).

Altrimenti postaci per intero il testo del problema del prof. perchè non saprei dove altro pensare.
Il mio blog: piero.dev
06/09/07 8:33
newbie-c
ok.
Allora il problema è semplicissimo, bisogna implementare una calcolatrice che acquisisce da standard input un espressione scritta in notazione polacca inversa e bisogna tirare fuori il risultato su standard output.
Esempi:
4.3 2.1 +
6.400

5 4 -
1.000

3 2 + 3 4 + *
35

(3+2)*(3+4) = 35

In più il prof ha chiesto altri operatori (seno, coseno, tangente, ecc.)

L'algoritmo è abbastanza semplice, stesso il prof ci ha dato una dritta durante il corso: la notazione polacca inversa ben si presta all'utilizzo di una pila (stack), quando troviamo un operando lo mettiamo nella pila, quando troviamo un operatore tiriamo fuori dalla pila gli operandi, calcoliamo il risultato e lo inseriamo nella pila (diventa quindi un operando anche lui per i prossimi calcoli); alla fine l'unico numero rimasto nella pila è il risultato finale.

Il mio problema è quello di determinare il momento "finale" :) il momento di stampare il risultato.

Per ovviare mi sono inventato un carattere di fine programma, cioè l'uguale "="
quindi il mio programma fa
4 2 + = (inserito dall'utente)
6 (stampato dal programma)

il mio main non fa altro che fare un

while (get_next_token())) {
...
}

stampa_risultato();

dove get_next_token è la funzione che legge da standard input.

All'interno del while c'è la gestione della pila, con uno switch per discriminare le funzioni da far fare ai vari operatori. All'esterno 2 funzioni push(val) e pop() per mettere e togliere dalla pila.

lo scanf("%s",val) è all'interno di get_next_token, l'idea era quella di capire quando il buffer di tastiera si esauriva per restituire un valore qualsiasi e far si che il ciclo while si interrompesse.
Ma non ci sono riuscito in nessun modo.

Grazie
aaa