
LLawliet (Normal User)
Newbie
    
Messaggi: 17
Iscritto: 26/06/2012
|
Salve a tutti, io ho una textbox dove, durante l' esecuzione del programma verrà scritta un'espressione del tipo 5+3-7+9. Vorrei sapere, dato che quest'espressione è una stringa, come posso fare per farla svolgere dal computer? Grazie in anticipo
|
|

Saik (Normal User)
Pro
    
Messaggi: 117
Iscritto: 07/08/2011
|
Ho avuto anch'io questa difficoltà. Ho risolto trasformando l'espressione in notazione postfissa(anche detta notazione polacca inversa) e poi svolgendo i calcoli.
Purtroppo non c'è un metodo diretto per trasformare la stringa in una seria di numeri .
P.S. : puoi trovare del materiale interessante sulla notazione postfissa qui http://en.wikipedia.org/wiki/Reverse_Polish_notation
|
|

Thejuster (Admin)
Guru^2
    
Messaggi: 2031
Iscritto: 04/05/2008
|
Codice sorgente - presumibilmente C# |
public static double EvalExpression(char[] expr) { return parseSummands(expr, 0); } private static double parseSummands(char[] expr, int index) { double x = parseFactors(expr, ref index); while (true) { char op = expr[index]; if (op != '+' && op != '-') return x; index++; double y = parseFactors(expr, ref index); if (op == '+') x += y; else x -= y; } } private static double parseFactors(char[] expr, ref int index) { double x = GetDouble(expr, ref index); while (true) { char op = expr[index]; if (op != '/' && op != '*') return x; index++; double y = GetDouble(expr, ref index); if (op == '/') x /= y; else x *= y; } } private static double GetDouble(char[] expr, ref int index) { string dbl = ""; while (((int)expr[index] >= 48 && (int)expr[index] <= 57) || expr[index] == 46) { dbl = dbl + expr[index].ToString(); index++; if (index == expr.Length) { index--; break; } } return double.Parse(dbl); } textBox1.Text = EvalExpression(textBox1.Text.ToCharArray()).ToString();
|
|
|

sspintux (Normal User)
Newbie
    
Messaggi: 8
Iscritto: 22/07/2009
|
Postato originariamente da LLawliet:
Salve a tutti, io ho una textbox dove, durante l' esecuzione del programma verrà scritta un'espressione del tipo 5+3-7+9. Vorrei sapere, dato che quest'espressione è una stringa, come posso fare per farla svolgere dal computer? Grazie in anticipo |
Ultima modifica effettuata da sspintux il 23/11/2012 alle 11:14 |
|

Thejuster (Admin)
Guru^2
    
Messaggi: 2031
Iscritto: 04/05/2008
|
Postato originariamente da sspintux:
Postato originariamente da LLawliet:
Salve a tutti, io ho una textbox dove, durante l' esecuzione del programma verrà scritta un'espressione del tipo 5+3-7+9. Vorrei sapere, dato che quest'espressione è una stringa, come posso fare per farla svolgere dal computer? Grazie in anticipo |
|
Mi spieghi a che serve il tuo esempio per quello che ha richiesto LLawliet?
Non gli interessa il CodeCom. ma semplicemente calcolare una stringa facendo un parsing su di essa estrapolando i simboli matematici e calcolando il resto.
quei link sono inutili
se invece era per creare un semplice calcolatore bastavano 10 righe.
Codice sorgente - presumibilmente C++ |
int calcola(string r) { try { string[] cal; int[] calc = new int[4]; cal = r.Split(); calc[0] = Convert.ToInt16(cal[0]); calc[2] =Convert.ToInt16( cal[2]); return cal[1] == "+" ? calc[0] + calc[2] : cal[1] == "-" ? calc[0] - calc[2] : cal[1] == "*" ? calc[0] * calc[2] : cal[1] == "/" ? calc[0] / calc[2] : 0; } catch {return 0;} }
|
|
|

sspintux (Normal User)
Newbie
    
Messaggi: 8
Iscritto: 22/07/2009
|
Postato originariamente da Thejuster:
....
quei link sono inutili
...
|
ignorali ed hai risolto il problema. |
|

Thejuster (Admin)
Guru^2
    
Messaggi: 2031
Iscritto: 04/05/2008
|
Postato originariamente da sspintux:
Postato originariamente da Thejuster:
....
quei link sono inutili
...
|
ignorali ed hai risolto il problema. |
L'importante e non andare off e non confondere le idee a chi cerca una determinata cosa
|
|

sspintux (Normal User)
Newbie
    
Messaggi: 8
Iscritto: 22/07/2009
|
L'importante e non andare off e non confondere le idee a chi cerca una determinata cosa |
a mio parere il primo link suggerisce un metodo per casi complessi e generici
mentre il secondo link porta ad una soluzione meno potente
ma che fornisce il risultato con 1 riga di codice (conversione del risultato a parte)
senza bisogno di reinventarsi l'acqua calda
Codice sorgente - presumibilmente C# / VB.NET |
var res = (new DataTable()).Compute(@"1-2+3*(7-1)",string.Empty);
|
Ultima modifica effettuata da sspintux il 23/11/2012 alle 22:19 |
|