miércoles, 21 de agosto de 2013

Calculo de raíces y potencias en Java


Se va a ver en este post cómo calcular raíces cuadradas, cúbicas y de mayor exponente así como obtener la potencia de un número (es decir, un número elevado a un determinado número). Lo primero va a ser la potencia. La clase Math (java.lang.Math) proporciona el método pow(double a, double b) que lo que hace es coger el primer número (a) y elevarlo b veces.

En el siguiente trozo de código se comprueba el cálculo de la potencia y se muestra el resultado de la ejecución:
        double a = 2.0;
        double b = 3.0;
        double c;
        
        c = Math.pow(a, b);
        System.out.println("Potencia: " + c);
        run:
        Potencia: 8.0

Lo siguiente son las raíces. Para el caso concreto de la raíz cuadrada la clase Math proporciona un método sqrt(double a) que realiza el cálculo de la raíz cuadrada del número que se pasa como argumento del método. Para las raíces en general se puede emplear el mismo método que para la potencia, el método pow. Si se quisiera calcula la raíz cúbica habría que colocar como segundo argumento de la función 1/3; si se quisiera calcula la raíz quinta el argumento sería 1/5, y así sucesivamente.

Se muestran ahora unos ejemplos que lo clarifican mejor, así como sus ejecuciones:
        double a = 81.0;
        double b = 4.0;
        double c;
        
        c = Math.sqrt(a);
        System.out.println("Raíz cuadrada: " + c);
        c = Math.pow(a, 1.0/b);
        System.out.println("Raíz cuarta: " + c);
        
        b = 6.0;
        c = Math.pow(a, 1.0/b);
        System.out.println("Raíz sexta: " + c);
        run:
        Raíz cuadrada: 9.0
        Raíz cuarta: 3.0
        Raíz sexta: 2.080083823051904

jueves, 8 de agosto de 2013

Consultar la fecha de un Timestamp en base de datos SQL

El tipo Timestamp permite mostrar la fecha (entendida como día, mes y año) así como la hora (hora, minutos, segundos, milisegundos). El problema puede surgir cuando en una base de datos tienes almacenados varios elementos así como sus Timestamps para saber su fecha y quieres obtener los datos comprendidos entre dos fechas.

Vamos a suponer que se tiene una tabla tabla en donde uno de los campos es fecha, campo que contiene el Timestamp, y que se quieren obtener todos los datos de la tabla entre el 1 de agosto y el 8 de agosto de 2013. La sentencia SQL sería la siguiente:
    SELECT * FROM tabla
    WHERE fecha BETWEEN '2013-08-01' AND '2013-08-08'

Realizando esta consulta se puede observar que devuelve los datos y que a priori está todo correcto, aunque al final se nota que no devuelve datos del día 8. ¿La razón? Al no especificar la hora se pone por defecto a 00:00:00 o lo que es lo mismo, justo al empezar el día. Una solución simple sería aumentar en uno el día y buscar hasta el día 9 y no hasta el 8. Otra manera sería indicando también la hora en la consulta, quedando como se vería en la siguiente sentencia SQL:
    SELECT * FROM tabla
    WHERE fecha BETWEEN '2013-08-01' AND '2013-08-08 23:59:59'

Al indicar la hora también ha tenido en cuenta el día 8 con lo cual ese problema estaría solucionado. Esto se puede utilizar también para consultar los datos de un día en concreto. Si se pusiera simplemente en la consulta un "WHERE fecha = '2013-08-08'" lo más probable sería no obtener ningún resultado, puesto que no estaría buscando los datos del día sino los de ese día a las 00:00:00. La solución sería como la anterior, establecer un período de tiempo desde las 00:00:00 de ese día hasta las 23:59:59.
    SELECT * FROM tabla
    WHERE fecha BETWEEN '2013-08-08' AND '2013-08-08 23:59:59'

viernes, 2 de agosto de 2013

Ventana de alerta en Java

Una pequeña ventana de alerta puede ser útil en casos como en los que un usuario deja campos sin cubrir en un formulario o los rellena de manera incorrecta.

Lo primero de todo es crear el JFrame correspondiente:
        JFrame alerta = new JFrame();

El siguiente paso es establecer las dimensiones de la ventana. Con el método setBounds se puede establecer el ancho y alto de la alerta, así como las posiciones en los ejes x e y. Con el método setPreferredSize se establece la dimensión preferida. Si se quiere que la alarma aparezca centrada en la pantalla se puede utilizar setLocationRelativeTo pasándole por parámetro null. El método setTitle indica la leyenda que llevará la ventana una vez se lance.
        alerta.setBounds(10, 10, 400, 150);
        alerta.setPreferredSize(new Dimension(400,150));
        alerta.setLocationRelativeTo(null);
        alerta.setTitle("Alerta");

Una vez que se tiene la ventana lo siguiente es ocuparse del contenido de la misma, en este caso será un simple texto. En el siguiente trozo de código se muestra cómo se crea el label de texto, su tamaño preferido, su visibilidad mediante setVisible con parámetro true para indicar que se quiere ver el texto, y su localización que en este caso es centrada.
        JLabel label = new JLabel("Esta es una alerta");
        label.setPreferredSize(new Dimension(200,70));
        label.setVisible(true);
        label.setHorizontalAlignment(JLabel.CENTER);
        label.setVerticalAlignment(JLabel.CENTER);

Se tiene la ventana, se tiene el texto. ¿Qué falta? Juntar ambas cosas, mediante el método add. El método pack permite a la ventana adaptarse lo máximo posible a los tamaños preferidos de cada uno de sus componentes. Con setVisible de nuevo con parámetro true se hace visible la ventana.
        alerta.add(label);
        alerta.pack();
        alerta.setVisible(true);

Por último solo queda ejecutar todo el código y esperar al lanzamiento de la ventana:

Código entero:
        JFrame alerta = new JFrame();
        alerta.setBounds(10, 10, 400, 150);
        alerta.setPreferredSize(new Dimension(400,150));
        alerta.setLocationRelativeTo(null);
        alerta.setTitle("Alerta");

        JLabel label = new JLabel("Esta es una alerta");
        label.setPreferredSize(new Dimension(200,70));
        label.setVisible(true);
        label.setHorizontalAlignment(JLabel.CENTER);
        label.setVerticalAlignment(JLabel.CENTER);

        alerta.add(label);
        alerta.pack();
        alerta.setVisible(true);

miércoles, 31 de julio de 2013

Obtener el código ascii de un caracter en Java

En ocasiones es necesario obtener el código ascii de un carácter en particular o de cada uno de los caracteres que conforman un String, por ejemplo para enviar en un mensaje y que este sea reconstruido en el receptor. Esto se puede solucionar mediante el siguiente trozo de código:
    
String cadena = "hola amigo";        
        
for(int i=0;i<cadena.length();i++){
     int ascii = cadena.charAt(i);
     System.out.println("Caracter: " + cadena.charAt(i) + " --- Código ascii: " + ascii);
}

Al imprimir se puede comprobar como cada carácter posee su propio código ascii:
Caracter: h --- Código ascii: 104
Caracter: o --- Código ascii: 111
Caracter: l --- Código ascii: 108
Caracter: a --- Código ascii: 97
Caracter:   --- Código ascii: 32
Caracter: a --- Código ascii: 97
Caracter: m --- Código ascii: 109
Caracter: i --- Código ascii: 105
Caracter: g --- Código ascii: 103
Caracter: o --- Código ascii: 111

martes, 30 de julio de 2013

Reducir el número de decimales en Java

Para empezar este blog dedicado a la informática y a la programación especialmente, nada mejor que con un ejemplo pequeño y simple pero que soluciona algún problema que pueda surgir por no saber hacerlo.

El problema es el de reducir el número de decimales de un número real en Java. Suele pasar que al realizar una operación en un determinado programa el resultado tenga una cantidad elevada de decimales, y que se desee eliminarlo. La solución es simple utilizando el método rint de la clase Math y se puede observar en el siguiente programa:
        double numero = 1.3949343092;
        double numeroRecortado;
        
        numeroRecortado = Math.rint(numero*100)/100;
        
        System.out.println("Número original: " + numero);
        System.out.println("Número recortado a dos decimales: " + numeroRecortado);

El resultado de la ejecución se puede ver a continuación, notando que se han reducido los decimales a solamente dos.
 
Número original: 1.3949343092
Número recortado a dos decimales: 1.39

Se pueden seleccionar los decimales que se quieran cambiando los valores que multiplican y dividen al número (los "100" en el caso de dos decimales). Para seleccionar el número que se desee de decimales habrá que añadir tantos ceros como decimales haya. Por ejemplo, en el caso de tres decimales:
 
        double numero = 1.3949343092;
        double numeroRecortado;          
        
        numeroRecortado = Math.rint(numero*1000)/1000;
        
        System.out.println("Número original: " + numero);
        System.out.println("Número recortado a tres decimales: " + numeroRecortado); 

El resultado de la ejecución se puede ver a continuación, notando que se han reducido los decimales a tres aplicando el redondeo necesario:
 
Número original: 1.3949343092
Número recortado a tres decimales: 1.395

En definitiva, una solución sencilla pero de mucha ayuda.