|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
[C++] Trasformare una string in...una expression
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. |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Jan 2009
Messaggi: 30
|
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 |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Jul 2009
Città: Milano
Messaggi: 270
|
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 Codice:
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;
__________________
AMD PII x4 955 BE | Sapphire HD4850 Vapor-X 1 GB | Samsung SpinPoint F1 500GB | Samsung EcoGreen F4 2TB Gigabyte GA-MA790FXT-UD5P | Fractal Design Define R3 USB3.0 Titanium Grey | CORSAIR 650W CMPSU-650TX Noctua U12P SE2 | 2 x 2GB Kingston 1333 MHz | Samsung SyncMaster P2450 | Samsung SyncMaster T200 Ultima modifica di __ZERO_UNO__ : 11-02-2012 alle 18:02. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:03.


















