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]
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…
Bom, primeiro, o código postado não ia funcionar, pois o trecho
for(i = j; i < str.length(); i++) {
ch = str.charAt(i);
if(strSimb.indexOf(ch) == -1) // verificando se tem símbolos inválidos
v = -1;
}
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(i = j; i < str.length(); i++) {
ch = str.charAt(i);
if(strSimb.indexOf(ch) == -1) { // verificando se tem símbolos inválidos
v = -1;
break; // saindo do for quando um erro é detectado
}
}
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[] getTokens(String expression) {
// dividindo expression em tokens, usando os caracteres +, -, *, /, ( e )
// como delimitadores, que também serão tokens
StringTokenizer st = new StringTokenizer(expression, "+-*/()", true);
String[] answer = new String[st.countTokens()];
// jogando os tokens dentro do array de Strings
for(int i = 0; i < answer.length; i++) {
answer[i] = st.nextToken();
}
return answer;
}
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.