expressao matematica que calcule todas as operacoes

Java

16/09/2010

ola pessoal, estou com um codigo que esta funcionando, ele dev funcionar assim, calcular as expressoes  mas todas entre parenteses, respeitando a regra  e matematica,


 me ajudem ,helppppppppppppppppp

[CODE]

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: " + calc.eval(calc.getEquacao()));  
       } else {
           System.out.println("A expressão "+ calc.getEquacao() + "não é válida!");
       }
    }
   
   
    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;
    }   
      
 }
[CODE]


[CODE]

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

[CODE]


 

Jhow

Jhow

Curtidas 0

Respostas

Jhow

Jhow

16/09/2010

estou colocando  novamente, pois nao sai legal esse primeiro.

[CODE]
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: " + calc.eval(calc.getEquacao()));  
       } else {
           System.out.println("A expressão "+ calc.getEquacao() + "não é válida!");
       }
    }
   
   
    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;
      }
   }


[CODE]
GOSTEI 0
Davi Costa

Davi Costa

16/09/2010

Jhow, cara de ante mão, começa refatorando esse código, deixa ele mais limpo tem métodos muito grandes. Existe um que tem um for c vários if/else entre eles. Acho que o primeiro passo que vc deve tomar é enxugar esses métodos e qdo vc refatorar é só usar alguns nomes bem descritivos que vai ajudar bastante para quem pegar esse código. Tenta usar os princípios do SOLID: S Single responsibility principle O Open/closed principle L Liskov substitution principle I Interface segregation principle D Dependency inversion principle   Vai ficar bem mais fácil se vc usar esses principios, se possível tenta fazer isso e posta o código até para facilitar a nossa ajuda.   Att Davi
GOSTEI 0
Jhow

Jhow

16/09/2010

ola  bom  dia,      entendi, sou  muitoo inciante em  programação ainda tenho  muito aprender msm, verdade;      meu  codigo  esta  funcionando  eu esqueçi de explicar melhor, ele ta calculando as expressoes matematicas , mas nao todos os tipos, que sao aceitas entre parenteses.     tipo essa aqui ele calcula: (((5*7)7*3)-2) , outra tb (8-6)*1    agora esses tipo aqui e outras , ele nao ta calculando  ((8+1)-(2*4))   entende?!!     nao estou conseguindo fazer ele calcular ... essas que ele nao esta reconhecendo ...       a classe que valida parenteses,  ta validando tudo, mas na verdade estou usando apenas algumas funcoes dela, como por exemplo verificar se os parenteses estao fechados corretamente , para ele calcular corretamente...      valewwwwww =p
GOSTEI 0
Dyego Carmo

Dyego Carmo

16/09/2010

Se eu fosse voce eu utilizaria um MOTOR PRONTO...

use o motor do JavaScript que já tem dentro do java...

um simples ".eval" vai calcular o que voce quiser :)

GOSTEI 0
POSTAR