sábado, 20 de febrero de 2016

/*
Jesus Alejandro Flores Hernandez
Clase para la evaluación de expresiones en notación polca inversa
Revisado en Dic 07 a parti del curso de POO del seg sem 2006
Evalua funciones en polaca inversa es usada por la clse Graficadora
*/
import java.util.StringTokenizer;
import java.util.Stack;
import java.util.EmptyStackException;
public class calcPolaca{
public double resultado;
boolean operador = false;  
  boolean funcion = false;
Stack p;
calcPolaca(String cad){
    StringTokenizer cadena = new StringTokenizer(cad,",");
p = new Stack();
      while (cadena.hasMoreTokens()){
            String token = cadena.nextToken();
if (token=="=")break;
            p.push(token);
            if (func(token)){
               calcularfunc();
            }else{
               if (oper(  token   )){
                  calcularop();
               }
            }  
      }
      resultado = Double.parseDouble((String)(p.pop()));
   }
   private void calcularfunc(){
    String token = (String)(p.pop());
      String x = (String)(p.pop());
      switch (token.charAt(0)){
            case 'S':
               p.push( String.valueOf( Math.sin( Double.parseDouble(x)  )));
               break;
            case 'C':
               p.push( String.valueOf( Math.cos( Double.parseDouble(x) )));
               break;
            case 'T':
               p.push( String.valueOf( Math.tan( Double.parseDouble(x) )));
               break;
            case 'L':
               try {
                  p.push( String.valueOf( Math.log(Double.parseDouble(x))));
                  break;
               }catch (Exception e){
                     System.out.println("error");
               }
            case 'A':
               p.push( String.valueOf( Math.abs( Double.parseDouble(x) )));
               break;
            default :
               System.out.println("incorrecto");
         }
      }
      public boolean func(String ffun){
         switch (ffun.charAt(0)){
            case 'S':
               funcion = true;
               break;
            case 'C':
               funcion = true;
               break;
            case 'A':
               funcion = true;
               break;
            case 'L':
               funcion = true;
               break;
            case 'T':
               funcion = true;
               break;
            default:
               funcion = false;
         }
         return(funcion);
      }
    private void calcularop(){
         String operador = (String)(p.pop());
         String op1 = (String)(p.pop());
         String op2 = (String)(p.pop());
         switch (operador.charAt(0)){
            case '+':
               p.push( String.valueOf (Double.parseDouble(op2)+ Double.parseDouble(op1)) );
               break;
            case '-':
               p.push( String.valueOf (Double.parseDouble(op2) - Double.parseDouble(op1)) );
               break;
            case '*':
               p.push( String.valueOf (Double.parseDouble(op2) * Double.parseDouble(op1)) );
               break;
            case '/':
               p.push( String.valueOf (Double.parseDouble(op2) / Double.parseDouble(op1)) );
               break;
            case '^':
               p.push( String.valueOf (Math.pow (Double.parseDouble(op2),Double.parseDouble(op1))) );
               break;
            default :
               System.out.println("incorrecto");
         }
      }
    public boolean oper(String opr){
         if (opr.length() == 1 ){
            char x = opr.charAt(0);
            switch (x){
               case '+':
                  operador = true;
                  break;
               case '-':
                  operador = true;
                  break;
               case '*':
                  operador = true;
                  break;
               case '/':
                  operador = true;
                  break;
               case '^':
                  operador = true;
                  break;
               default :
                  operador = false;
            }
         }else
            operador = false;
         return(operador);
      }//fin de oper
public static void main(String[] args){
calcPolaca aux = new calcPolaca("10,2,^     ".trim());
         double valor = aux.resultado;
System.out.println(valor);
}
}//fin de la clase polaca

No hay comentarios: