/** * @(#)calculadora.java * * * @author * @version 1.00 2007/9/23 */
import java.awt.*; import java.lang.*;
class calculadora extends Frame { //Comienza la declaracion de variables globales //20 botones de la calculadora Button boton[] = new Button[20]; //declara e inicializa un boton para salir del programa Button boton_salir = new Button("Salir"); //Declara e inicializa las leyendas de los botones
String leyenda[] = { "7" , "8" , "9" , "/" , "4" , "5" , "6" , "*" , "1" , "2" , "3" , "-" , "0" , "." , "=" , "+" , "+/-","Raiz x" , "1/x" , "C" }; //Declara la zona delimitada de los botones
Panel zona_botones; //Ventana de edicion para desplegar el resultado de las operaciones
TextField resultado;
double primer_operando, resultado_operacion; //Bandera que indica se se trata del segundo operando //en una operacion binaria
//Bandera que indica si se espera el segundo operando //en una operacion binaria
boolean segundo_operando;
//cadena que contiene la operacion a realizar String operacion;
//Bandera de estado 0 -captura siguiente operando //1- captura operando actual int estado;
//Termina la declaracion de variables globale
public calculadora() { //Inicializacion de operandos y resultados primer_operando = resultado_operacion = 0; segundo_operando = false; operacion = ""; estado = 0; } //rutina que inicializa el programa void inicializa() { int i;//variable local //Se inicializa la pantalla de resultados resultado = new TextField("0"); //Inicializa el panel de visualizacion zona_botones = new Panel(); //Configura el panel de tipo cuadricula (GridLayout) //cada cuadro contiene un boton en 5 filas y 4 columnas //el espacio vertical entre los botones es de 8 pixeles //y el espacio horizontal entre estos es de 6 zona_botones.setLayout(new GridLayout(5,4,8,6)); //Inicializacion cada boton y lo agrega al panel de botones for(i = 0; i < 20; i++) { //Inicializa e incluye la leyenda para cada boton boton[i] = new Button(leyenda[i]); //Agrega el boton al panel de botones zona_botones.add(boton[i]); } //Inicializa la aplicacion con la configuracion de frontera //A diferencia del tipo de cuadricula, esta configuracion solo //tiene cinco zonas, llamadas North, West, East, Center, Sounth setLayout(new BorderLayout()); //Agrega la ventana de resultadis en la parte //superior de la aplicacion add("North",resultado); //Agrega en el centro el panel de botones add("Center",zona_botones); //Agrega abajo el boton de salir add("South",boton_salir); //Configura el tamaño de la aplicacion a 240 pixeles //de ancho por 280 de alto resize(240,280); setTitle("Calculadora"); //Muetra la apliacion show(); } //Rutina que realiza las acciones indicadas //dependiendo del evento que ocurra public boolean postEvent(Event evento) { if (evento.target == boton_salir) { System.exit(0); return false; } if (evento.target == boton[13]) //si el boton presionado es el "." { if (estado == 0) //si aun no se espera algun digito del primer operando { resultado.setText("0."); //Al cero se le agrega el punto estado = 1; } //si no encuentra otro punto decimal lo concatena //con lo que haya en la pantalla de la calculadora //La funcion indexOf devuelve el indice de la primera ocurrencia // de la subcadena dentro de una cadena; si no hay, devuelve -1 else if (resultado.getText().indexOf(".") == -1) resultado.setText(resultado.getText()+"."); } // Si el evento corresponde a un boton numerico if((evento.target == boton[0]) || (evento.target == boton[1]) || (evento.target == boton[2]) || (evento.target == boton[4]) || (evento.target == boton[5]) || (evento.target == boton[6]) || (evento.target == boton[8]) || (evento.target == boton[9]) || (evento.target == boton[10]) || (evento.target == boton[12])) { //la variable dbonton recibe el caracter del boton numerico String dboton = (String)evento.arg; if(estado == 0)//si aun espera algun digito del primer operando { resultado.setText("0"); estado = 1; } //si la pantalla contiene un cero o previamente hubo un error if((resultado.getText().equals("0")) || (resultado.getText().equals("Error"))) { //No se capturan ceros a la izquierda if(!dboton.trim().equals("0")) resultado.setText(dboton); } //Se concatena el numero con los anteriores else resultado.setText(resultado.getText()+dboton); } //Si el evento es una operacion binaria if((evento.target == boton[3]) || (evento.target == boton[7]) || (evento.target == boton[11]) || (evento.target == boton[15])) { //Convierte la cadena de la variable de la calculadora // a un flotante de doble precision Double d = new Double(resultado.getText()); //Si se estaba introduciendo el segundo operando, //se realiza la operacion anterior automaticamente if(segundo_operando) { if(operacion == "+") resultado_operacion = primer_operando + d.doubleValue(); if(operacion == "-") resultado_operacion = primer_operando - d.doubleValue(); if(operacion == "*") resultado_operacion = primer_operando * d.doubleValue(); if(operacion == "/") { if(d.doubleValue()!= 0) resultado_operacion = primer_operando / d.doubleValue(); else { resultado.setText("Error"); estado = 0; //Regresa el resultado para pedir el primer operando segundo_operando = false; return false; } } //Muestra el resultado de la operacion resultado.setText(String.valueOf(resultado_operacion)); } Double d1 = new Double(resultado.getText()); operacion = (String) evento.arg; //El resultado de la operacion se convierte en //el primer opernado de la siguente primer_operando = d1.doubleValue(); estado = 0; segundo_operando = true; } //Si el evento es "=" if(evento.target == boton[14]) { Double d = new Double(resultado.getText()); if(operacion == "+") resultado_operacion = primer_operando + d.doubleValue(); if(operacion == "-") resultado_operacion = primer_operando - d.doubleValue(); if(operacion == "*") resultado_operacion = primer_operando * d.doubleValue(); if(operacion == "/") { if(d.doubleValue()!= 0) resultado_operacion = primer_operando / d.doubleValue(); else { resultado.setText("Error"); estado = 0; //Regresa el resultado para pedir el primer operando segundo_operando = false; return false; } } //Despliega el resultado y espera el primer //operando del a siguiente operacion resultado.setText(String.valueOf(resultado_operacion)); estado = 0; segundo_operando = false; } //Si el evento es una operacion unitaria if((evento.target == boton[16]) || (evento.target == boton[17]) || (evento.target == boton[18])) { String nboton = (String)evento.arg; //La operacion unaria se realiza de inmediato if(nboton.equals("+/-")) { Double d = new Double(resultado.getText()); if(d.doubleValue() != 0) { resultado_operacion = -1 * d.doubleValue(); resultado.setText(String.valueOf(resultado_operacion)); } else resultado_operacion = 0; } if(nboton.equals("1/x")) { Double d = new Double(resultado.getText()); if(d.doubleValue() != 0) { resultado_operacion = 1 / d.doubleValue(); resultado.setText(String.valueOf(resultado_operacion)); } else resultado.setText("Error"); } if (nboton.equals("Raiz x")) { Double d = new Double(resultado.getText()); if(d.doubleValue() >= 0) { resultado_operacion = Math.sqrt(d.doubleValue()); resultado.setText(String.valueOf(resultado_operacion)); } else resultado.setText("Error"); } estado = 0; segundo_operando = false; } if(evento.target == boton[19]) //Si el boton es C { //Se reinicializa la calculadora y se borra lo que tenga en pantalla operacion = ""; primer_operando = resultado_operacion = 0; resultado.setText("0"); estado = 0; segundo_operando = false; } return true; } public static void main(String args[]) //Rutina principal del programa { calculadora calcu = new calculadora(); calcu.inicializa(); } }
|