Expressao Matematica(Java)

6 respostas
jhomara

OK, 'e o SEguinte, eu devo entrar com uma expressao via teclado , a tipo eval , vai reconhecer essa string e vai calcular …

ele ta fazendo isso, mas o lance 'e que ele nao esta pegando todos os tipos variados de expressao tipo essa (2+2)3(33)

se nao ter parenteses fechados aparecera uma mensagem na tela, isso ta fazendo tambem, mas o problemas que ele nao esta reconhecendo alguns tipos de strings e nao ta calculando,…

import javax.swing.JOptionPane; 


public class Calculadora {
	
	
    private String equacao;

    public static void main(String[] args) {
       Calculadora calc = new Calculadora();  
       Parentheses_check check = new Parentheses_check();
       
       calc.setEquacao(JOptionPane.showInputDialog("Expressão Numerica:"));  
	
       if(check.parentheses_valid(calc.getEquacao())) {
    	   System.out.println("Resultado desta Expressão: " + calc.eval(calc.getEquacao()));   
       } else {
    	   System.out.println("A expressão  digitada  "+ calc.getEquacao() +   "Não é VÁLIDA! Por Favor Digite Novamente !!");
       }
	}
	
    
	public static int eval(String expr) {
        int resultado = 0;
        char charI = expr.charAt(0);                
        if(charI == '(' ) {
                int indiceChaveFinal = expr.lastIndexOf(")");
                if(indiceChaveFinal == expr.length()-1 ) {
                	resultado = eval(expr.substring(1, expr.length()-1));
                } else {
             	   char operador = expr.charAt(indiceChaveFinal+1);
 
             	   if(operador == '*'){
         	    	   resultado = eval(expr.substring(1, indiceChaveFinal)) * eval(expr.substring(indiceChaveFinal + 2, expr.length()));
         	       }
         	       if(operador == '/'){
         	    	   resultado = eval(expr.substring(1, indiceChaveFinal)) / eval(expr.substring(indiceChaveFinal + 2, expr.length()));
         	       }
         	       if(operador == '+'){
                       resultado = eval(expr.substring(1, indiceChaveFinal)) + eval(expr.substring(indiceChaveFinal + 2, expr.length()));
                    }
         	       if(operador == '-'){
         	    	   resultado = eval(expr.substring(1, indiceChaveFinal)) - eval(expr.substring(indiceChaveFinal + 2, expr.length()));
         	       }              	       
                }	       
        } else {
                int indiceOperador = expr.indexOf("+");
                int indiceOperador1 = expr.indexOf("-");
                int indiceOperador2 = expr.indexOf("*");
                int indiceOperador3 = expr.indexOf("/");
                if(indiceOperador == -1 && indiceOperador1 == -1 && indiceOperador2 == -1 && indiceOperador3 == -1 ) {
                	resultado = Integer.parseInt(expr);
                } else {
              	   if(indiceOperador2 != -1) {
              		   resultado = eval(expr.substring(0, indiceOperador2)) * eval(expr.substring(indiceOperador2 + 1, expr.length()));
                   }
              	   if(indiceOperador3 != -1) {
              		   resultado = eval(expr.substring(0, indiceOperador3)) / eval(expr.substring(indiceOperador3 + 1, expr.length()));
                   }
             	   if(indiceOperador != -1) {
             		   resultado = eval(expr.substring(0, indiceOperador)) + eval(expr.substring(indiceOperador + 1, expr.length()));
                   }
              	   if(indiceOperador1 != -1) {
              		   resultado = eval(expr.substring(0, indiceOperador1)) - eval(expr.substring(indiceOperador1 + 1, expr.length()));
                   }
                }
                
        }
        return resultado;
   }

	
    public String getEquacao() {  
		return this.equacao;  
	}  
    public void setEquacao(String str) {  
    	this.equacao = str; 
    }    
       
 }
import java.util.Stack;

public class Parentheses_check
   {

   public static boolean is_open_parenthesis( char c )
      {
      if ( c=='(' || c=='[' || c=='{' )
         return true;
      else
         return false;
      }

   public static boolean is_closed_parenthesis( char c )
      {
      if ( c==')' || c==']' || c=='}' )
         return true;
      else
         return false;
      }

   private static boolean parentheses_match( char open, char closed )
      {
      if ( open=='(' && closed==')' )
         return true;
      else if ( open=='[' && closed==']' )
         return true;
      else if ( open=='{' && closed=='}' )
         return true;
      else
         return false;
      }

   public static boolean parentheses_valid( String exp )
      {
      Stack       s = new Stack();
      int         i;
      char        current_char;
      Character   c;
      char        c1;
      boolean     ret=true;

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

         current_char=exp.charAt( i );

         if ( is_open_parenthesis( current_char ) )
            {
            c=new Character( current_char );
            s.push( c );
            }
         else if ( is_closed_parenthesis( current_char ) )
            {
            if ( s.isEmpty() )
               {
               ret=false;
               break;
               }
            else
               {
               c=(Character)s.pop();
               c1=c.charValue();
               if ( !parentheses_match( c1, current_char ) )
                  {
                  ret=false;
                  break;
                  }
               }
            }
         }

      if ( !s.isEmpty() )
         ret=false;

      return ret;
      }
   }

6 Respostas

Hebert_Coelho

Olá jhomara, boa noite.

  1. Qual erro vc está tendo? Qual tipo de String ele não está lendo?
  2. Pq vc não faz a classe Parentheses_check uma classe abstrata? Assim vc não precisará de uma instância a cada momento.
  3. Vc não precisa criar uma instancia nova o calculadora basta fazer um this.
jhomara

jakefrog:
Olá jhomara, boa noite.

  1. Qual erro vc está tendo? Qual tipo de String ele não está lendo?
  2. Pq vc não faz a classe Parentheses_check uma classe abstrata? Assim vc não precisará de uma instância a cada momento.
  3. Vc não precisa criar uma instancia nova o calculadora basta fazer um this.

ola boa noite,

at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)

na verdade , eu apenas estou usando para expressao () ,a classe de validar colchetes e chaves nao estou precisando deles nao.
a class Parentheses_check esta verificando se os parenteses estao fechados , se nao estiver fechado ele dara uma mensagem …

“instância a cada momento” como assim ??

ele nao esta reconhecendo o operandor entre as duas expressoes…

como asssim

Hebert_Coelho

Acho que vc tem q dar uma estudada um pouco mais forte em OO.

Vc poderia fazer sua classe:

public absctract Parentheses_check

Vc pode simplesmente acessar seu método por: Parentheses_check.parentheses_vali();

Na verdade, se não quizer colocar tua classe como abstrata, vc ainda pode chamar o método como Parentheses_check.parentheses_vali(); pois você o declarou como static.

seu erro está em “at java.lang.Integer.parseInt(Unknown Source)” ou seja, tem algum valor String que não está chegando.

ViniGodoy

Se isso for um trabalho de faculdade, é melhor ler a página sobre notação polonesa:
http://www.ime.usp.br/~pf/algoritmos/aulas/pilha.html

Se não for, é melhor usar uma API pronta. Ou vc usa uma linguagem de script, ou essa API aqui do Mark:
http://code.google.com/p/markutils/wiki/Expression

jhomara

olá Vini, excelente material.
eu resolvi o probl, era o tratamente de strings que ele não tava fazendo o colega à cima, deu umas ideias tb… hehee =p

blza… !
=p :slight_smile: :slight_smile:

abraços …

jhomara

ok Vini, entendi.
crei agora minha conta, cometi algumas gafs…

blza =p
:stuck_out_tongue:

Criado 12 de setembro de 2010
Ultima resposta 14 de set. de 2010
Respostas 6
Participantes 3