Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - funzione scanf
Forum - C/C++ - funzione scanf

Avatar
newbie-c (Normal User)
Newbie


Messaggi: 2
Iscritto: 05/09/2007

Segnala al moderatore
Postato alle 0:29
Mercoledì, 05/09/2007
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

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6109
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 0:04
Giovedì, 06/09/2007
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.


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM Quote
Avatar
newbie-c (Normal User)
Newbie


Messaggi: 2
Iscritto: 05/09/2007

Segnala al moderatore
Postato alle 10:33
Giovedì, 06/09/2007
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

PM Quote