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# / VB.NET - [ C# ]Trasformare il testo in una textbox in un espressione matematica
Forum - C# / VB.NET - [ C# ]Trasformare il testo in una textbox in un espressione matematica

Avatar
LLawliet (Normal User)
Newbie


Messaggi: 17
Iscritto: 26/06/2012

Segnala al moderatore
Postato alle 12:10
Giovedì, 22/11/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 :D


Lawliet
PM Quote
Avatar
Saik (Normal User)
Pro


Messaggi: 117
Iscritto: 07/08/2011

Segnala al moderatore
Postato alle 15:08
Giovedì, 22/11/2012
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


Vivi e lascia vivere
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 16:12
Giovedì, 22/11/2012
Codice sorgente - presumibilmente C#

  1. public static double EvalExpression(char[] expr)
  2.         {
  3.             return parseSummands(expr, 0);
  4.         }
  5.  
  6.         private static double parseSummands(char[] expr, int index)
  7.         {
  8.             double x = parseFactors(expr, ref index);
  9.             while (true)
  10.             {
  11.                 char op = expr[index];
  12.                 if (op != '+' && op != '-')
  13.                     return x;
  14.                 index++;
  15.                 double y = parseFactors(expr, ref index);
  16.                 if (op == '+')
  17.                     x += y;
  18.                 else
  19.                     x -= y;
  20.             }
  21.         }
  22.  
  23.         private static double parseFactors(char[] expr, ref int index)
  24.         {
  25.             double x = GetDouble(expr, ref index);
  26.             while (true)
  27.             {
  28.                 char op = expr[index];
  29.                 if (op != '/' && op != '*')
  30.                     return x;
  31.                 index++;
  32.                 double y = GetDouble(expr, ref index);
  33.                 if (op == '/')
  34.                     x /= y;
  35.                 else
  36.                     x *= y;
  37.             }
  38.         }
  39.  
  40.         private static double GetDouble(char[] expr, ref int index)
  41.         {
  42.             string dbl = "";
  43.             while (((int)expr[index] >= 48 && (int)expr[index] <= 57) || expr[index] == 46)
  44.             {
  45.                 dbl = dbl + expr[index].ToString();
  46.                 index++;
  47.                 if (index == expr.Length)
  48.                 {
  49.                     index--;
  50.                     break;
  51.                 }
  52.             }
  53.             return double.Parse(dbl);
  54.         }
  55.  
  56.  
  57. textBox1.Text = EvalExpression(textBox1.Text.ToCharArray()).ToString();





PM Quote
Avatar
sspintux (Normal User)
Newbie


Messaggi: 8
Iscritto: 22/07/2009

Segnala al moderatore
Postato alle 11:11
Venerdì, 23/11/2012
Testo quotato

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 :
http://forum.masterdrive.it/visual-basic-net-18/vb2005-dis ...

EDIT volendo potresti usare anche questo :
http://msdn.microsoft.com/en-us/library/system.data.datata ...

HTH

Ultima modifica effettuata da sspintux il 23/11/2012 alle 11:14


Ciao sspintux

Volevamo cambiare il mondo! ... peccato che abbiamo perso lo scontrino
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 15:10
Venerdì, 23/11/2012
Testo quotato

Postato originariamente da sspintux:

Testo quotato

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 :
http://forum.masterdrive.it/visual-basic-net-18/vb2005-dis ...

EDIT volendo potresti usare anche questo :
http://msdn.microsoft.com/en-us/library/system.data.datata ...

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.

Codice sorgente - presumibilmente C++

  1. int calcola(string r) {
  2.         try {
  3.         string[] cal;
  4.         int[] calc = new int[4];
  5.         cal = r.Split();
  6.         calc[0] = Convert.ToInt16(cal[0]);             
  7.         calc[2] =Convert.ToInt16( cal[2]);                     
  8.         return cal[1] == "+" ? calc[0] + calc[2] :
  9.                    cal[1] == "-" ? calc[0] - calc[2] :
  10.                    cal[1] == "*" ? calc[0] * calc[2] :
  11.                    cal[1] == "/" ? calc[0] / calc[2] : 0;
  12.         }
  13.         catch {return 0;}
  14. }




PM Quote
Avatar
sspintux (Normal User)
Newbie


Messaggi: 8
Iscritto: 22/07/2009

Segnala al moderatore
Postato alle 15:41
Venerdì, 23/11/2012
Testo quotato

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



ignorali ed hai risolto il problema.


Ciao sspintux

Volevamo cambiare il mondo! ... peccato che abbiamo perso lo scontrino
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 19:22
Venerdì, 23/11/2012
Testo quotato

Postato originariamente da sspintux:

Testo quotato

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:


PM Quote
Avatar
sspintux (Normal User)
Newbie


Messaggi: 8
Iscritto: 22/07/2009

Segnala al moderatore
Postato alle 20:15
Venerdì, 23/11/2012
Testo quotato


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
Codice sorgente - presumibilmente C# / VB.NET

  1. var res = (new DataTable()).Compute(@"1-2+3*(7-1)",string.Empty);



Ultima modifica effettuata da sspintux il 23/11/2012 alle 22:19


Ciao sspintux

Volevamo cambiare il mondo! ... peccato che abbiamo perso lo scontrino
PM Quote