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

17 respostas
E

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}

17 Respostas

Alexandre_Saudate

Dê uma olhada no Design Pattern Interpreter.

[]´s

E

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.

E

cara é que a parte logica eu sei só nao sei implementar
s voces pudessem m ajudar
obrigado

E

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.

hugo.hlcxcx

Você poderia usar a Notação Polonesa Reversa para fazer isso.

Segue um exemplo: http://www.guj.com.br/posts/list/130684.java

E

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

E

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.

orlandocn

existe uma lib chamda jep que talvez lhe ajude

http://sourceforge.net/projects/jep/

Marky.Vasconcelos

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.

rockstorm

Você esta dizendo que não sabe implementar isso, você sabe por onde começar a desenvolver?
Você já programou em java?

E

cara sou iniciante sou estou pedindo uma ajuda

E

oq eu e meus amigos conseguimos foi isso
soh nao sei usar os colchetes e as chaves

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();  
          }  
	}
rockstorm

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.

E

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

E

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.

E

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

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

	    }

	}

	
	

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

}
}
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:"));
	}

}
C

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

    }
}
Criado 24 de junho de 2010
Ultima resposta 22 de jun. de 2012
Respostas 17
Participantes 8