Programar uma aplicação para resolver expressões aritméticas

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

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. :slight_smile:

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

    }
}