Usuario:ManuelRomero/accion
De WikiEducator
AccionCalculadora
- Es la clase que implementa las acciones que ha de realizar la calculadora
- Tiene dos vías de comunicacione
- sirve para realizar las acciones que EstadoCalculadora le solicita
- VentanaCalculadora despues de cada entrada y de que estadoCalculadora indique de que modo hay que modificar el atributo resultado recoge este valor y lo almacena en la pantalla
- Lleva un atributo que representa el resultado en un momento dado de la calculadora que es lo que aparece en la pantalla
Código fuente
package calculadora; /* * Esta clase lo que hace es obtener calculo que es el string que se visualizará en un momento * dado en la calculadora * */ public class AccionCalculadora { private String resultado; private OperacionReal operacion = new OperacionReal(); private OperacionRacional operacionR = new OperacionRacional(); final int REAL =0; final int RACIONAL=1; public AccionCalculadora(){ resultado =""; } /** * Pone en resultado una cadena de caracteres que le pasamos como parámetro * Posteriormente la interfaz retomará este valor para visualizarlo por pantalla * @param e */ public void actualiza (String e){ resultado = e; //MRM Pendiente Quitar ceros inecesarios en cada operando } public String quitaCeros(String e){ return ""; } public void cambioSignoOp1(String e){ if (e.charAt(0)=='-') resultado = e.substring(1); else resultado = "-"+e; } public void cambiarSignoOp2(String e,int tipo){ int operador ; operador = getPosicionOperador (e,tipo); if (e.contains("(")) resultado=e.substring(0,e.indexOf('('))+e.substring(e.indexOf('(')+2,e.indexOf(')')); else resultado=e.substring(0,operador+1)+"(-"+e.substring(operador+1)+")"; } public void quitarCaracterOp1(String s){ int pos = s.length(); resultado = s.substring(0,pos-1); } public void quitarCaracterOp2(String s){ int pos = s.length(); if (s.contains("(")){ resultado = s.substring(0,pos-2)+")"; System.out.println("En quita Caracter "+resultado); }else { resultado = s.substring(0,pos-1); System.out.println("En quita Caracter "+resultado); } } public void quitarSignoOp2(String s){ // x + -(ss) ==> x+ss int inicio = s.indexOf('('); int fin = s.length(); resultado = s.substring(0,inicio)+s.substring(inicio+2,fin-1); System.out.println("en quitarSignoOp2 "+resultado); } /** * en un segundo parámetro si añadimos un número y hay paréntesis, añado el valor dentro del paréntesis * ej. p=8+(-87) e=5 retorno 8+(-875) * @param p el valor de la pantalla * @param e la entrada * @return la cadena actualizada */ public void actulizaRetrocesoConPosibleParentesis(String p){ int pos =p.length(); if (p.contains("(")) resultado = p.substring(0,pos-2)+")"; else resultado = p.substring(0,pos-1); } public void actualizaNumOp2Decimal(String p, char e){ int pos =p.length(); if (p.contains(")")) resultado = p.substring(0,pos-1)+e+")"; else resultado =p+e; } public void actualizarConPosibleParentesis(String p, String e){ int pos = p.length(); if (p.contains(")")){ resultado=(p.substring(0,pos-1)+e+")"); System.out.println("Resultado "+resultado); } else resultado = p+e; } /** * Toma un String que representa una operacion, * y cambia el signo del segundo operando * poniéndole un paréntesis. * * p = 76-52 ==> 76-(-52) * @param p ==> Es la expresión que contiene los valores sobre los que quiero actual * @param op ==> Indica el operando sobre el que quiero actual. */ public void actualizaCambioSigno(String p){ //Suponemos segundo operando if (p.contains(")")){//Estaba en segundo operando negativo y hay que pasar a positivo // 98 + (-85) ==> 98 + 85 o 9/6+(-8/7) o 9/6+(-8) o 9/6+(-8/) // 98 + (-85) ==> 98 + 85 o 9.6+(-8.7) o 9.6+(-8) o 96+(-0.) int pos; pos=p.indexOf('('); System.out.println("1 "+p.substring(0,pos)); System.out.println("21 "+p.substring(pos+1,p.length()-1)); resultado = p.substring(0,pos)+p.substring(pos+2,p.length()-1); } else{//Estaba en segundo operando positivo y //hay que pasarlo a negativo ==> paréntesis //95+89 ==> 95+(-89) int pos = getPosicionOperador(p,0); //System.out.println("Operacion "+p+"operador en posicion "+pos); resultado = p.substring(0,pos+1)+"(-"+p.substring(pos+1,p.length())+")"; //System.out.println("En accion "+resultado); } } /** * Retorna la posición donde se ubica un operando del array especificado * quitando el primer caracter por si el primer operando es 0 * -87.7-(-77.98) ==> Retorna 5 , ya que * el operador menos está en la posición 5 * @param operacion * @return * * * */ private int getPosicionOperador(String operacion, int tipo){ int p=0; p=operacion.indexOf('+'); if (p != -1) return p; p=operacion.indexOf('*'); if (p != -1) return p; p=operacion.indexOf('%'); if (p != -1) return p; p=operacion.indexOf(':'); if (p != -1) return p; if (tipo == REAL){ p=operacion.indexOf('/'); if (p != -1) return p; } //En caso de haber salido antes //Seguro que el operador es el - //Directamente quito el primer caracter por si es negativo en primer número p=operacion.substring(1).indexOf('-'); return p; } public void addResultado(char e){ resultado +=e; } public void calcula(String valorActual, int tipo){ if (tipo==REAL){ System.out.println("1En calcula con operacion "+valorActual); operacion.setOperacion(valorActual); resultado=operacion.resultado().toString(); }else{ System.out.println("2En calcula con operacion "+valorActual); operacionR.setOperacion(valorActual); resultado=operacionR.resultado().toString(); System.out.println("Valor de "+valorActual +"Resultado = "+resultado); } } public void actualizaCalculo(String c){ resultado+=c; System.out.println("Calculo"+resultado); } public String getResultado(){ return resultado; } public void limpiaPantalla(){ resultado=""; } //Implementar este método /** * Nos devuelve el número de caracteres del operador 2 * La idea es que si el op2 =0 o un sólo dígito me devuelva 0 caracteres, en otro caso 1 * * 0/ ==> 0 caracteres * (-0/) ==> 0 caracteres * * 0. ==> 0 caracteres * (-0.) ==> 0 caracteres * n ==> 0 * -(n) ==> 0 * Otra situación retorna 1 */ public int caracteresOp2(String s, int tipo){ int pos = getPosicionOperador(s,tipo); String op2 = s.substring(pos); if (tipo == RACIONAL){ if (op2.contains("(")){ System.out.println("Op2 negativo..."); if (op2.length()==3||(op2.length()==2& op2.charAt(2)==0)){ System.out.println("... negativo y con el 0"); return 0; } else{ System.out.println("... negativo y diferente del 0"); return (1); } } else if (op2.length()==2 &op2.charAt(0)=='0') return 0; else return op2.length()-2; }else //calculadora real if (op2.contains("(")){ if (op2.contains(".")) if (op2.length()==6) // +(-5.) return 0; //2º op con un sólo dígito else return 1; else if (op2.length()==5) // +(-6) return 0; //2º op con un sólo dígito else return 1; } else{ if (op2.contains(".")) if (op2.length()==3) // +5. return 0; //2º op con un sólo dígito else return 1; else if (op2.length()==2) // +6 return 0; //2º op con un sólo dígito else return 1; } } public void cambiaSignoResultado(){ String s= this.resultado; if (resultado.charAt(0)=='-') this.resultado = s.substring(1); else this.resultado = "-"+s; } }