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