PDA

View Full Version : [C++] Trasformare una string in...una expression


vendettaaaaa
06-02-2012, 20:16
Ciao,
più che una domanda su come si fa, la mia è una richiesta che sospetto essere impossibile...
Ho studiato un poco e ho sempre visto in tutti gli esempi che ho visionato che per realizzare una calcolatrice bisogna fare il parsing dell'input in modo ricorsivo (o iterativo, ma di solito ho visto usata la ricorsione).
Tutto questo perchè, a quanto mi par di capire, non è possibile trasformare una stringa inputtata dall'utente in un'espressione, altrimenti potrei prendere di peso l'input, mettiamo
userInput = "1 + 2*(5-14)" e darlo in pasto come fosse
double result = turnIntoExpression("userInput");
E' così quindi, non c'è una funzione intrinseca in alcuna implementazione che faccia così? Cioè...so già che è così, lo sento, ma non ho trovato la conferma definitiva da nessuna parte.

Dr. Cox
11-02-2012, 12:47
Allora, tu hai una stringa s che contiene l'espressione.
Prova a fare così:

prima definisci due vettori di stringhe:
vector<string> cifre;
vector<string> operazioni;

Nella tua stringa di partenza, fai una ricerca carattere per carattere..
ad esempio:

if((s[i] == 0) || (s[i] == 1) || (s[i] == 2) ......)
cifre.push_back(s[i]);
if(s[i] == '+') ...
operazioni.push_back(s[i]);

eccetera..
in modo da ottenere tante stringhe, ciascuna delle quali contiene un numero
(nell'esempio ho diviso cifra per cifra, ma sarebbe meglio fare una ricerca più approfondita, ad esempio con un while(il carattere è una cifra), così da avere in ogni stringa un numero, int o double o quello che è)
e tante stringhe che raccolgono le operazioni da fare.

Una volta che hai ciò, fai un'analisi del tipo:
if(operazioni[i] == '+'
risultatoparziale = cifra[i] + cifra[i+1];

eccetera...

questo è per darti l'idea del procedimento.
Se non ti viene, ti trascrivo tutto il codice che lo fa funzionare

__ZERO_UNO__
11-02-2012, 16:42
Se vuoi una calcolatrice che spacca e sei su Unix puoi fare una system call e utilizzare il comando bc. Prima devi redirigere lo standard output dove vuoi in modo da poter leggere il risultato delle chiamate, oppure aprire uno stream in input dallo stdout. Non ho guardato i dettagli ma sono poche righe.
Una soluzione veloce ma poco elegante sarebbe

system("echo \"2^10 + 78/4 - sqrt(20)\" | bc > tmp.calc"); // non l'ho provata
std::fstream file("tmp.calc", std::fstream::in);
std::string result;
file >> result;


Se al posti di bc > tmp.calc metti bc >> tmp.calc ottieni anche un file di log :D (Per dire).