Calculo de expressões matematicas!

Ae galera susse???

meu problema eh o seguinte, tenho que criar um programa em java para calcular a expressão matematica que o usuario digitar, entao no programa eu tenho que verificar a equação e pa! isso eu consigo, ms o problema eh como resolver essa equação digitada…

olha o programa

[quote]import java.io.*;
public class ExpresaoMath
{
public static void main (String[] args)
{
/*PROGRAMA PARA VALIDACAO DE EXPRESSAO MATEMATICA
*E RESOLUÇAO DELA
/
String str = Console.readString("\n Digite a expressão matematica desejada\n ");
// A CONSOLE.READSTRING, EH UMA CLASSE SEPARADA!
int j=0, i=0, v=0;
double result=0;
String strSimb = "0123456789±
/() ";
char ch;
while(str.charAt(j) == ’ ')
j++;
for (i=j; i < str.length();i++)
{
ch=str.charAt(i);
if(strSimb.indexOf(ch) == -1)
v=-1;
}
if(v==-1)
{
System.out.println(“Equacao invalida, favor reinicie o programa”);
System.exit(1);
}
else
{
System.out.println(“Equação valida”);
// E AGORA COMO RESOLVER A EQUAÇAO???
}
}
}[/quote]

[quote=“corvao”]Ae galera susse???

meu problema eh o seguinte, tenho que criar um programa em java para calcular a expressão matematica que o usuario digitar, entao no programa eu tenho que verificar a equação e pa! isso eu consigo, ms o problema eh como resolver essa equação digitada…

olha o programa

[quote]import java.io.*;
public class ExpresaoMath
{
public static void main (String[] args)
{
/*PROGRAMA PARA VALIDACAO DE EXPRESSAO MATEMATICA
*E RESOLUÇAO DELA
/
String str = Console.readString("\n Digite a expressão matematica desejada\n ");
// A CONSOLE.READSTRING, EH UMA CLASSE SEPARADA!
int j=0, i=0, v=0;
double result=0;
String strSimb = "0123456789±
/() ";
char ch;
while(str.charAt(j) == ’ ')
j++;
for (i=j; i < str.length();i++)
{
ch=str.charAt(i);
if(strSimb.indexOf(ch) == -1)
v=-1;
}
if(v==-1)
{
System.out.println(“Equacao invalida, favor reinicie o programa”);
System.exit(1);
}
else
{
System.out.println(“Equação valida”);
// E AGORA COMO RESOLVER A EQUAÇAO???
}
}
}[/quote][/quote]

O java acho que tem uma classe pra isso, mas não é dificil tambem fazer…

Separa os dados por Espacos em um array

2 * (2 + 1)

Depois sai executando da esquerda pra direita (do 0 até o length) em ordem de prioridade ( { e [ …depois executa tudo de novo por ordem de prioridade dos sinais…e buenas…

if(chr == “*”)

Etc

Bom, primeiro, o código postado não ia funcionar, pois o trecho

for&#40;i = j; i &lt; str.length&#40;&#41;; i++&#41; &#123;
    ch = str.charAt&#40;i&#41;;
    if&#40;strSimb.indexOf&#40;ch&#41; == -1&#41; // verificando se tem símbolos inválidos
        v = -1;
&#125; 

só iria encontrar um símbolo inválido se ele fosse o último da expressão. Para consertar isso, use o código abaixo:

for&#40;i = j; i &lt; str.length&#40;&#41;; i++&#41; &#123;
    ch = str.charAt&#40;i&#41;;
    if&#40;strSimb.indexOf&#40;ch&#41; == -1&#41; &#123; // verificando se tem símbolos inválidos
        v = -1;
        break; // saindo do for quando um erro é detectado
    &#125;
&#125; 

Para dividir a expressão em unidades adequadas, ou seja, números e símbolos, pode-se usar o String.split(), disponível a partir do Java 1.4, e o java.util.StringTokenizer, disponível desde o 1.0. Usando o StringTokenizer:

public String&#91;&#93; getTokens&#40;String expression&#41; &#123;
    // dividindo expression em tokens, usando os caracteres +, -, *, /, &#40; e &#41;
    // como delimitadores, que também serão tokens
    StringTokenizer st = new StringTokenizer&#40;expression, &quot;+-*/&#40;&#41;&quot;, true&#41;;
    String&#91;&#93; answer = new String&#91;st.countTokens&#40;&#41;&#93;;

    // jogando os tokens dentro do array de Strings
    for&#40;int i = 0; i &lt; answer.length; i++&#41; &#123;
        answer&#91;i&#93; = st.nextToken&#40;&#41;;
    &#125;

    return answer;
&#125;

Pelo que sei, tradicionalmente expressões matemáticas em programação são resolvidas primeiro escrevendo a expressão em notação polonesa reversa (pós-fixa) e depois lendo e calculando o valor. A notação pós-fixa é muito útil porque para resolver a expressão é só ir lendo e calculando da esquerda para a direita. Não me recordo completamente do algoritmo agora, mas é só fazer uma procura no Google por “algoritmo polonesa pós fixa” que você deve achar.