galera nao consigo começar a fazer por favor ajudem
sou iniciante
Programar uma aplicação para resolver expressões aritméticas, utilizando uma estrutura de dados que melhor se aplicar.
O programa deve ser capaz de receber as 3 operações: adição (+), subtração (-) e multiplicação (*) (lembrando que a multiplicação tem precedência sobre as outras duas). Também deve ser capaz de resolver os operadores de precedência: parênteses (), colchetes [] e chaves{}.
Exemplo:
Entrada de dados: {4+3+[7 - 2 + ( 3+16 * 2) +1] - 2}
Dê uma olhada no Design Pattern Interpreter.
[]´s
Você já ouviu falar de pilhas? Vai precisar disso para resolver sua lição de casa.
É bom você tentar resolver isso manualmente, e depois pôr a mão na massa.
Não custa nada você dar uma olhada em algum livro de escola que tenha esse exercício resolvido (mesmo que em outra linguagem), que é o intuito de seu aprendizado.
cara é que a parte logica eu sei só nao sei implementar
s voces pudessem m ajudar
obrigado
Você consegue, pelo menos, escrever a parte lógica da coisa em português mesmo? Escreva aqui, e o pessoal talvez até implemente para você ver como é que se faz.
Você poderia usar a Notação Polonesa Reversa para fazer isso.
Segue um exemplo: http://www.guj.com.br/posts/list/130684.java
cara eu penso em usar uma pilha por que primero resolve a equaçao que está entre parenteses que esta no topo e guarda este valor. dpois pega este valor e calcula os valores + o valor do calculo dos parenteses e guarda em uma variaveldo calculo dos colchetes . e filnalmente calcula o resultado do calculo dos colchetes + calculo dos numeros que formam as chaves.
soh nao sei implementar isso
valeu
Ainda está complicado.
Primeiramente, alguém já deve ter lhe falado que parênteses, colchetes e chaves são exatamente a mesma coisa, você pode tratar tudo como parênteses normais.
Depois, o correto é você fazer um caso bem simples (pegue lápis e papel), e veja como é que você resolveria passo a passo.
Tente resolver os casos, nesta ordem:
3 + 4
3 + 4 + 5
3 * 4 + 5
3 + 4 * 5
(3 + 4)
3 + (4 + 5)
Se conseguir resolver isso, vai começar a entender o que deve ser feito.
existe uma lib chamda jep que talvez lhe ajude
http://sourceforge.net/projects/jep/
Bem… pra te adiantar alguma coisa.
http://code.google.com/p/markutils/wiki/Expression
Uma classe que fiz que faz quase exatamente o que voce quer.
Só não considera os ‘{[]}’ ele trabalha só com parenteses.
Voce pode baixar o código fonte e trabalhar em cima disso.
Se seu unico problema é como implementar acredito ser facil modificar com essas condições. E depois de terminar mande o resultado devolta para mim que eu atualizo no projeto 
E essa classe usa o conceito de recursividade para trabalhar com o que esta dentro dos parenteses.
Você esta dizendo que não sabe implementar isso, você sabe por onde começar a desenvolver?
Você já programou em java?
cara sou iniciante sou estou pedindo uma ajuda
oq eu e meus amigos conseguimos foi isso
soh nao sei usar os colchetes e as chaves
[code]public void calcula(String result){
try {
char[] operadores = { '+', '-', '/', '*' };
char operadorSelecionado = 0;
String x = result;
String y = "";
for (int i = 0; i < operadores.length; i++) {
if (x.indexOf(operadores[i]) != -1) {
operadorSelecionado = operadores[i];
break;
}
}
String parte1 = x.substring(0, x.indexOf(operadorSelecionado));
String parte2 = x.substring(x.indexOf(operadorSelecionado) + 1);
switch (operadorSelecionado) {
case '+' :
y =
String.valueOf(
Double.parseDouble(parte1)
+ Double.parseDouble(parte2));
break;
case '-' :
y =
String.valueOf(
Double.parseDouble(parte1)
- Double.parseDouble(parte2));
break;
case '/' :
y =
String.valueOf(
Double.parseDouble(parte1)
/ Double.parseDouble(parte2));
break;
case '*' :
y =
String.valueOf(
Double.parseDouble(parte1)
* Double.parseDouble(parte2));
break;
default :
System.out.println("Operador desconhecido");
break;
}
System.out.println("y = " + y);
} catch (Exception ex) {
ex.printStackTrace();
}
}
[/code]
Estamos aqui para ajudar você, só nos ajude passando do que realmente precisa… Web, desktop, etc…
Minha pergunta sobre você saber programar em java é devido a diversas dicas que recebeu…
Os amigos acima já deram uma força indicando exemplos e literatura que já podem te ajudar a iniciar… o hugo.hlcxcx deu a idéia de Notação Polonesa Reversa que acho muito legal.
O que posso garantir é que o pessoal não vai colocar o código pronto aqui no fórum. Começe a fazer alguma coisa e poste suas duvidas assim que elas forem surgindo.
mas pelo que percebi aquela notaçao soh usa operadores e nno chaves e nao colchetes e chaves que eh o que eu preciso fazer
vlw
Tio, faça o favor de ler a resposta do ViniGodoy. Em particular, leia o PDF que ele gentilmente teve o cuidado de achar na Internet.
Lá tem até o pseudo-código, que é uma coisa que você não estava conseguindo escrever aqui (e é por isso que eu lhe perguntei se você sabia o que fazer).
Vou postar de novo o link:
http://www.sergio.pro.br/trabalhos/17_avaliacao_de_expressoes_em_estrutura_de_dados.pdf
Com esse pseudo-código, escrever o programa em Java será muito, muito fácil. É só você pegar seus colegas e entender direitinho o PDF que o professor Sérgio teve a boa vontade de escrever.
E não volte aqui enquanto não tiver lido o PDF.
fiz u programa usando estrutura de dados de pilha para calcular uma expresao aritmetica e esta dando erro na classe calculo nao consigo converter uma string para fazer o calculo queria saber s posso usar char e como separar colchetes e chaves
obgrado
[code]package trabalho;
public class Calculo {
String expressao;
Calculo proximo;
public Calculo(String expr) {
this.expressao = expr;
this.proximo = null;
}
public void calcularExpressao(String expressao){
boolean space = true;
String numero = "";
expressao = expressao.replaceAll("[^0-9 /+*-]", "").trim();
for(int i = 0; i< expressao.length(); i++){
char atual = expressao.charAt(i);
if(atual == ' ' && space == true) continue;
//SE FOR UM OPERADOR ADICIONA ELE NA LISTA
if(atual == '+' || atual == '-' || atual == '/' || atual == '*'){
adicionaOperador(atual);
continue;
}
//SE FOR UM ESPACO FINALIZA O NUMERO ATUAL
if(atual == ' '){
adicionaOperando(Integer.parseInt(numero));
numero = "";
space = true;
continue;
}else{//SENAO CONTINUA NORMAL
space = false;
numero += expressao.charAt(i);
}
}
System.out.println("O resultado final eh: " + this.operandos.removeTopo());
}
public void adicionaOperando(int i){
this.operandos.insereTopo(i);
}
public void adicionaOperador(Character op){
this.operadores.insereTopo(op);
efetuaCalculo();
}
public void efetuaCalculo(){
int result = 0;
int numero1;
int numero2;
char operador;
numero2 = this.operandos.removeTopo();
numero1 = this.operandos.removeTopo();
operador = this.operadores.removeTopo();
switch(operador){
case '+':
result = numero1 + numero2;
break;
case '-':
result = numero1 - numero2;
break;
case '/':
result = numero1 / numero2;
break;
case '*':
result = numero1 * numero2;
break;
}
this.operandos.insereTopo(result);
}
}
}
[/code]
[code]package trabalho;
public class Pilha {
private Calculo topo;
public boolean estaVazio(){
return topo == null;
}
public void insereTopo(String expr){
Calculo novo = new Calculo(expr);
if(estaVazio())
topo = novo;
else{
novo.proximo = topo;
topo = novo;
}
}
public String removeTopo(){
String expr = topo.expressao;
topo = topo.proximo;
return expr;
}
public int tamanho(){
int tamanho = 0;
if( ! estaVazio()){
Calculo aux = topo;
while (aux != null){
tamanho ++;
aux = aux.proximo;
}
}
return tamanho;
}
public String topo(){
return topo.expressao;
}
}
[/code]
[code]package trabalho;
import javax.swing.JOptionPane;
public class Principal {
public static void main(String[] args) {
Pilha p = new Pilha();
p.insereTopo(JOptionPane.showInputDialog(“Digite a Expressao MAtemática:”));
}
}
[/code]
Segue uma solução recursiva para o seu problema…A solução abaixo aceita somente parênteses, mas para resolver a expressão: {4+3+[7 - 2 + ( 3+16 * 2) +1] - 2} basta no método main dá um replaceAll em { e [ por parênteses que dá certo…espero ter contribuido. 
import java.util.Scanner;
public class ExprRecursiva {
public static double calcExp(String exp) {
if (exp.contains("(")) {
String exp_aux = exp.substring(0, exp.indexOf("("));
exp_aux += String.valueOf(calcExp(exp.substring(exp.indexOf("(") + 1, exp.lastIndexOf(")"))));
if ((exp_aux.contains("+")) || (exp_aux.contains("-")) || (exp_aux.contains("*")) || (exp_aux.contains("/"))) {
return calcula(exp_aux);
} else {
return Double.parseDouble(exp_aux);
}
} else {
return calcula(exp);
}
}
public static double calcula(String result) {
String y = "";
char[] operadores = {'+', '-', '/', '*'};
char operadorSelecionado = 0;
String x = result;
y = "";
for (int i = 0; i < operadores.length; i++) {
if (x.indexOf(operadores[i]) != -1) {
operadorSelecionado = operadores[i];
break;
}
}
String parte1 = x.substring(0, x.indexOf(operadorSelecionado));
String parte2 = x.substring(x.indexOf(operadorSelecionado) + 1);
switch (operadorSelecionado) {
case '+':
y =
String.valueOf(
Double.parseDouble(parte1)
+ Double.parseDouble(parte2));
break;
case '-':
y =
String.valueOf(
Double.parseDouble(parte1)
- Double.parseDouble(parte2));
break;
case '/':
y =
String.valueOf(
Double.parseDouble(parte1)
/ Double.parseDouble(parte2));
break;
case '*':
y =
String.valueOf(
Double.parseDouble(parte1)
* Double.parseDouble(parte2));
break;
default:
System.out.println("Operador desconhecido");
break;
}
return Double.parseDouble(y);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Informe uma expressão: ");
String exp = sc.next();
System.out.println("O resultado é: " + calcExp(exp));
}
}