Resolução de equação obedecendo ordem de parenteses

3 respostas
rafaelvannucci

Olá a todos,

Sou novo por aqui e como é meu primeiro post… li sobre as regras do forum e as dicas de formatação… não encontrei nenhum post relacionado ao assunto que eu gostaria de discutir, pois bem segue minha dúvida…

Estou desenvolvendo um trabalho para faculdade, uma calculadora logica… bom preciso tratar a entrada de dados da equação e na resolução obedecer a hierarquia dos parenteses… consegui fazer a validação dos parenteses, mas nao consigo fazer a resolução de dentro dos parenteses para fora… abaixo segue meu código… espero que possam me ajudar…

package interdisciplinar;

import javax.swing.JOptionPane;

public class CalculadoraLogica {

    public String getEquacao() {
        return equacao;
    }

    public void setEquacao(String equacao) {
        this.equacao = equacao;
        this.tamanho = equacao.length();
    }

    public int getTamanho() {
        return tamanho;
    }
    private String equacao;
    private int tamanho;
    private String abreP;
    private String fechaP;

    public boolean valida() {
        char c;
        int a = 0;
        String abre = "";
        String fecha = "";
        boolean resultado;

        System.out.println("eq " + equacao);
        for (int i = 0; i < tamanho; i++) {//percorre a string verificando se todos os parenteses abertos sao fechados
            c = equacao.charAt(i);
            if (c == 40) {
                a += 1;
                abre += i + ",";
            }
            if (c == 41) {
                a -= 1;
                fecha += i + ",";
            }
            System.out.println("a= " + a + "   c= " + c);

        }


        if (a == 0) {
            resultado = true;//se a=0 os parenteses estao corretos se nao... ta errado
        } else {
            resultado = false;
        }
        System.out.println("abre: " + abre);
        abreP = abre;
        System.out.println("fech: " + fecha);
        fechaP = fecha;

        return resultado;
    }

    public String montaEq() {// aqui mora a duvida, nao consigo montar uma pilha com os itens a serem resolvidos na ordem
        String a = "";
        Pilha p = new Pilha(equacao.length());

        for (int i = 0; i < equacao.length(); i++) {

            while (equacao.charAt(i) != 40 || equacao.charAt(i) != 41) {
                a += equacao.charAt(i);
                i++;
            }
            p.empilhar(a);
            a = "";

        }


        System.out.println("monta: " + a);
        return a;
    }

    static public void main(String args[]) {

        CalculadoraLogica calc = new CalculadoraLogica();

        do {
            calc.setEquacao(JOptionPane.showInputDialog("equação"));
            if (!calc.valida()) {
                JOptionPane.showMessageDialog(null, "erro de formatação");
            }
        } while (!calc.valida());
        calc.montaEq();

    }
}

3 Respostas

rafaelvannucci

esqueci um detalhe… esta classe montaEq, esta retornando um erro : Exception in thread “main” java.lang.StringIndexOutOfBoundsException: String index out of range: 2
para aumentar minha frustração!!!

CrOnNoS

Dica 1: Edite seu poste ao invés de postar outro logo em baixo hehe
Dica 2: Declare suas variáveis com escopo da classe/objeto antes das declarações dos métodos
Dica 3: Você tá fazendo 2 processamentos do método calc.valida() atoa no main. Faça uma variável boolean receber o resultado desse método e ultilize essa variável para fazer uma chamada a menos.
Dica 4: Não use números nas suas comparações como em “c == 40”, cria uma constante que identifica esse número (boa prática de programação) por exemplo “private finalint ABRIR_PARENTESES = 40;” (imagino que esse 40 é isso mesmo).
Dica 5: (outra boa prática) Dê nomes as variáveis com um certo sentido para ficar fácil de identifica-las como “verificador_de_parenteses” por exemplo no lugar de “a”.

Sobre o problema, posta a classe Pilha que também está sendo ultilizada no problema.
Sua pilha não tem tamanho “equação.length” e sim tamanho = número de parênteses abertos + 1, provavelmente é por isso que dá erro de indexOutOfBound.
De resto, é preciso ver a solução da sua pilha pra ajuda-lo. Deu pra entender sua intenção mas a parte importante da implementação vai estar no seu objeto pilha pelo que vi.

Marky.Vasconcelos

Voce pode dar uma olhada no código fonte para ver como fiz.
Mas praticamente resolvi da seguinte forma
ex:
5+8+(5-9*(1-9+15))
chega no parenteses manda resolver só o de dentro e coloca o resultado no lugar
fica
5-9*(1-9+15)
Ainda com parenteses manda resolver aquilo
1-9+15
=7

Volta ao passo anterior substituindo
5-9*7
=58

volta substituindo
5+8+58
=71

Criado 30 de setembro de 2009
Ultima resposta 1 de out. de 2009
Respostas 3
Participantes 3