Oppure

Loading
22/11/12 11:10
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 :D
aaa
22/11/12 14:08
Saik
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 en.wikipedia.org/wiki/…
aaa
22/11/12 15:12
Thejuster

 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();



mire.forumfree.it/ - Mire Engine
C# UI Designer
23/11/12 10:11
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 :D


Ciao,
puoi sfruttare la capacità del .NET Framawork di generare Assembly 'al volo' e richiamarli tramite Reflection.

Qui puoi trovare un esempio :
forum.masterdrive.it/visual-basic-net-18/vb2005-disegnare-funzione-18846/…

EDIT volendo potresti usare anche questo :
msdn.microsoft.com/en-us/library/…

HTH
Ultima modifica effettuata da sspintux 23/11/12 10:14
aaa
23/11/12 14:10
Thejuster
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 :D


Ciao,
puoi sfruttare la capacità del .NET Framawork di generare Assembly 'al volo' e richiamarli tramite Reflection.

Qui puoi trovare un esempio :
forum.masterdrive.it/visual-basic-net-18/vb2005-disegnare-funzione-18846/…

EDIT volendo potresti usare anche questo :
msdn.microsoft.com/en-us/library/…

HTH


Mi spieghi a che serve il tuo esempio per quello che ha richiesto LLawliet? :pat:

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 :_doubt:

se invece era per creare un semplice calcolatore bastavano 10 righe.

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;}
}

mire.forumfree.it/ - Mire Engine
C# UI Designer
23/11/12 14:41
sspintux
Postato originariamente da Thejuster:
....
quei link sono inutili :_doubt:
...


ignorali ed hai risolto il problema.
aaa
23/11/12 18:22
Thejuster
Postato originariamente da sspintux:

Postato originariamente da Thejuster:
....
quei link sono inutili :_doubt:
...


ignorali ed hai risolto il problema.


L'importante e non andare off e non confondere le idee a chi cerca una determinata cosa :k:
mire.forumfree.it/ - Mire Engine
C# UI Designer
23/11/12 19:15
sspintux
L'importante e non andare off e non confondere le idee a chi cerca una determinata cosa :k:


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
var res = (new DataTable()).Compute(@"1-2+3*(7-1)",string.Empty);

Ultima modifica effettuata da sspintux 23/11/12 21:19
aaa