lunes, 18 de enero de 2010

Clases y objetos

Una clase es la descripción de un tipo de objetos. Por ejemplo, podemos definir la clase "Mesa" como la descripción de ese tipo de objetos. Todas las mesas tienen una serie de características en común que permiten definir las características de cada una de ellas. Podríamos utilizar como características que definen las mesas las siguientes: color, alto, ancho, largo, material, ubicación. Esas características se van a denominar atributos de la clase.
Clase Mesa:
  • color (cadena de caracteres)
  • alto (numérico entero)
  • ancho(numérico entero)
  • largo (numérico entero)
  • material (cadena de caracteres)
  • ubicación (cadena de caracteres)

De una determinada clase se pueden crear una serie de objetos, que serán instancias de esa clase. Objeto, instancia de clase o instancia son sinónimos. Siguiendo el ejemplo de la clase "Mesa", se pueden crear diversas mesas cada una de ellas con sus propios atributos, aunque pueden tener valores iguales en algunos casos. Cada objeto (mesa) creado tendrá un nombre exclusivo de lo identifica.
  • mesa01: "Blanco", 100, 120, 60, "Madera", "Aula1"
  • mesa02: "Verde", 100, 100, 50, "Plástico", "Aula1"
  • mesa03: "Blanco", 100, 120, 60, "Madera", "Aula2"
  • mesa04: "Rojo", 100, 120, 60, "Plástico", "Aula2"
  • mesa05: "Verde", 100, 100, 50, "Plástico", "Aula2

Cada clase tendrá definida una serie de operaciones que se pueden realizar sobre los objetos creados de esa clase. Esas operaciones se denomina métodos. Siempre habrá un método para crear los objetos de la clase que se denomina método constructor. En el ejemplo de la clase "Mesa" se tendrá un método para crear las mesas, y se pueden definir otros que permitan realizar una serie de operaciones, por ejemplo:
    • moverMesa: Permitiría cambiar la ubicación de una determinada mesa, por ejemplo, del Aula1 al Aula2.
    • PitarMesa: Permitiría cambiar el color de una determinada mesa, indicando el nuevo color que tendría.

Una aplicación en Java se compone de un conjunto de clases, de las que se crean objetos que interactúan entre sí. El programador puede instanciar (crear) objetos de las clases definidas por él o de las clases incluidas en el lenguaje.

Los nombres de las clases en Java empiezan, por convenio, en mayúscula, y los nombres de los objetos empiezan por minúscula.

Estructura básica de una clase en Java

/**
* Estructura básica de una clase en Java
*/

class NombreDeClase
{
    //Declaración de los atributos de la clase
    tipoDato atributo1;
    tipoDato atributo2;
    tipoDato atributo3;

    //Declaración de los métodos de la clase

    método1(argumentos)
    {
        //Declaración de las variables propias del método1

        //Sentencias de ejecución del método
    }

    método2(argumentos)
    {
        //Declaración de las variables propias del método2

        //Sentencias de ejecución del método
    }
}

Declaración y acceso a atributos de una clase

Los atributos son las características propias de cada clase. Cada objeto creado de una determinada clase tendrá una serie de valores asignados en dichos atributos, por tanto, permiten guardar información de cada objeto.

Ejemplo para la clase Alumno:

class Alumno
{
    String nombre;
    String apellidos;
    int añoDeNacimiento;
    int númeroPersonal;
    String grupo;
    String turnoHorario = "Mañana";

    //Declaración de los métodos
    ...
}

Como se puede observar en el atributo turnoHorario, se puede dar un valor inicial en la declaración de los atributos.

Desde otra parte del código se podrá acceder al valor que contiene un determinado atributo de un determinado objeto con el siguiente formato de sentencia:
    nombreObjeto.atributo

Por ejemplo:
System.out.println(“El nombre es: “+alumno1.nombre);

Declaración de métodos

Los métodos de una clase definen el comportamiento y los valores de los atributos de un determinado objeto de esa clase.

El formato básico de declaración de los métodos es:
valorRetorno nombreMétodo(tipoDato argumento1, tipoDato argumento2, ...)
{
    //Declaración de variables propias del método
    //Sentencias con las acciones que debe realizar el método
    return valorQueDebeRetornar;
}

Los métodos pueden retornar un valor tras ejecutar las sentencias que contiene, o bien no retornar nada.

Si va a retornar un valor, se debe especificar el tipo de dato en la declaración delante del nombre. El valor que vaya a ser devuelto se indica con la sentencia return, por ejemplo, para retornar un String:

String nombreMétodo()
{
    //Sentencias del método
    return valorQueDebeRetornar;
}

Hay que tener en cuenta que la sentencia return termina la ejecución del método, por lo que debe escribirse en el lugar donde no deba ejecutarse posteriormente ninguna otra sentencia.

Siguiendo el ejemplo de la clase Alumno, se puede declarar un método dameGrupo que obtenga el grupo en el que se encuentra un determinado alumno:

String dameGrupo()
{
    return grupo;
}

El valor retornado puede ser un atributo de la misma clase o cualquier otro dato, por ejemplo, un valor booelano que indique si el alumno es mayor de edad:

boolean esMayorEdad()
{
    int añoActual = 2010;

    if(añoActual - añoDeNacimiento >= 18)
       return true;
    else
       return false;
}

Si el método no va a retornar ningún valor, se debe indicar con la palabra void delante del nombre, y no se emplea la sentencia return:

void nombreMétodo()
{
    //Sentencias del método
}

Por ejemplo, se puede declarar un método que únicamente muestre por pantalla el grupo al que pertenece un alumno, sin que retorne ningún otro valor.

void muestraGrupo()
{
   System.out.println("El alumno: " + nombre + " " + apellidos);
   System.out.println("Pertenece al grupo: " + grupo);
}

En la declaración del método se debe informar de los parámetros que puede aceptar el método, indicando el tipo de dato y un nombre para dicho parámetro que se utilizará como una variable dentro del mismo. Se escriben después del nombre del método, entre paréntesis y separados por comas.

void asignaValores(String nom, String ape, int añoNac, int num, String gru, String turno)
{
    //Asignación de valores a los atributos de la clase
    nombre = nom;
    apellidos = ape;
    añoDeNacimiento = añoNac;
    númeroPersonal = num;
    grupo = gru;
    turnoHorario = turno;    
    //Mostrar mensaje informativo
    System.out.println("Valores asignados correctamente");
}

Creación de objetos

Teniendo una clase declarada, se pueden crear tantos objetos como se quiera de esa misma clase. En el ejemplo que seguimos, una vez declarada la clase Alumno, podemos declarar una serie de alumnos cuyas características serán los atributos de la clase Alumno, y sobre los que se podrán realizar las acciones indicadas en los métodos declarados en la misma clase Alumno.

A los objetos creados se les hace referencia a través de una variable cuyo tipo de dato será el nombre de la clase. Se debe declarar una variable por cada objeto que se vaya a crear, o bien un array que contenga varios objetos de la misma clase.

nombreClase nombreObjeto;

Por ejemplo:

Alumno alumno1;
Alumno alumno2;

La acción de declarar la variable que haga referencia al objeto no implica que se haya creado el objeto, tan sólo se ha declarado el nombre que hará referencia al objeto. Por tanto, se debe realizar además la creación del objeto utilizando la sentencia new seguido del nombre de la clase.

nombreObjeto = new nombreClase();

Por ejemplo:

alumno1 = new Alumno();

Se puede hacer la declaración de la variable y la creación del objeto en una misma línea:

Alumno alumno1 = new Alumno();

Se puede crear un array de objetos de una clase siguiendo el siguiente ejemplo:

//Crear el array de objetos
Alumno alumnos[] = new Alumno[3];
//Crear cada objeto
alumnos[0] = new Alumno();
alumnos[1] = new Alumno();
alumnos[2] = new Alumno();

Llamada a los métodos

Para que se ejecuten las sentencias contenidas en un método, se debe hacer una llamada al mismo. La llamada a un método de una determinada clase se realiza indicando el nombre del objeto (ojo, no el nombre de la clase) sobre el que se desea aplicar la ejecución del método seguido del nombre del método separado por un punto.

Si el método tiene declarados parámetros, en la llamada se deben indicar entre paréntesis los valores reales que se van a asignar a cada parámetro.

Además, si el método retorna un valor se debe asignar el resultado del método a una variable del mismo tipo.

nombreObjeto.nombreMétodo();
nombreObjeto.nombreMétodo(valor1, valor2, ...);
valorRetornado = nombreObjeto.nombreMétodo();
valorRetornado = nombreObjeto.nombreMétodo(valor1, valor2, ...);

Las llamadas a los métodos de una clase se puede hacer desde métodos de la misma clase o desde métodos de otra clase, por ejemplo, desde la clase Main.

Algunos ejemplos de llamadas a métodos de la clase Alumno:

//Crear un nuevo alumno
Alumno alumno1 = new Alumno();

//Llamada a un método con parámetros
alumno1.asignaValores("Luis", "Pérez", 1979, 1, "1DAI", "Tarde");

//Llamada a un método sin parámetros
alumno1.muestraGrupo();

//Llamada a un método con retorno de valor
boolean mayorEdad = alumno1.esMayorEdad();
if(mayorEdad)
    System.out.println("Es mayor de edad");
//También se podría emplear directamente la llamada al método:
//if(alumno1.esMayorEdad())
//    System.out.println("Es mayor de edad");

Creación de nueva clase en NetBeans

Dentro de un mismo archivo ".java" se pueden crear varias clases, aunque suele ser más claro y cómodo crear un nuevo archivo para cada clase.

Desde NetBeans se puede crear fácilmente una nueva clase Java desde el menú contextual del paquete de fuentes, o desde el menú "Archivo > Archivo Nuevo", seleccionado la opción "Clase Java".

clases01


Descargar proyecto de ejemplo de la clase Alumno

martes, 12 de enero de 2010

Matrices en Java (Ejemplo 2)

http://javiergarbedo.es/index.php/apuntes/31-arrays/127-ejemplos-de-matrices-en-java

Matrices en Java (Ejemplo 1)

http://javiergarbedo.es/index.php/apuntes/31-arrays/127-ejemplos-de-matrices-en-java

Limitar el número de decimales a mostrar

Cuando se muestra en pantalla un valor numérico real (double o float) aparece con un número elevado de decimales. En ocasiones es deseable que sólo se muestre un número concreto de decimales, por ejemplo, para mostrar un precio en Euros con dos decimales.

Para ello se puede utilizar el método format de la clase String siguiendo el siguiente ejemplo en el que se muestra en un campo de texto el valor de la variable num que es de tipo double:

        campoTexto.setText(String.format("%.2f", num));
En este ejemplo se mostrarán dos decimales. Si se desea obtener otro número de decimales, se deberá indicar dicha cantidad en el lugar del 2 que se encuentra dentro de la cadena de formato "%.2f".

En la API de Java se puede encontrar más información sobre la cadena de formato del método format.


lunes, 11 de enero de 2010

jueves, 26 de noviembre de 2009

Parámetros para feeds RSS

Parámetro
Descripción
Valores admitidos
Ejemplo
max-resultsLimita el número máximo de resultados. El valor por defecto es 25. El valor máximo es 100.
25, 1-100?max-results=25
start-indexSelecciona el primer resultado a mostrar.
1, valorNumérico?start-index=26
dateLimita los resultados al rango de fechas especificado
MMDDYYYY-MMDDYYYY?date=01011980-12311989
sortEspecifica el orden de los resultados
relevance, date_ascending, date_descending?sort=date_ascending
category
Limita los resultados a la categoría especificada
cualquierCategoría
?category=ejemplo
orderby
Ordena los resultados según la fecha de publicación o de actualización
published, updated
?orderby=updated
alt
Formato de salida
atom, rss, json, json-in-script
?alt=rss
published-min published-maxEstablece rango de resultados por fecha de publicación
Fecha en formato RFC3339
?published-max=2008-12-31
updated-min, updated-maxEstablece rango de resultados por fecha de actualizaciónFecha en formato RFC3339?updated-max=2008-12-31
callback
Usado con json-in-script para especificar el nombre de la función callback



Utilización:
http://blogname.blogspot.com/feeds/posts/default?....

Para obtener sólo los de una etiqueta:
http://blogname.blogspot.com/feeds/posts/default/-/labelname

Para obtener sólo los de varias etiquetas
http://blogname.blogspot.com/feeds/posts/default/-/labelname1/labelname2

Para obtener sólo los comentarios
http://blogname.blogspot.com/feeds/comments/default

Vectores

http://javiergarbedo.es/index.php/apuntes/31-arrays/124-vectores

Arrays

http://javiergarbedo.es/index.php/apuntes/31-arrays/123-arrays

lunes, 23 de noviembre de 2009

Depuración de programas con NetBeans

La depuración (debug) permite examinar las aplicaciones para buscar errores, ya que posibilita observar las líneas que se van ejecutando, así como los valores que van tomando las variables en cada paso.

Para realizar la depuración de un programa, se debe establecer en primer lugar un punto de interrupción donde debe pararse la ejecución de la aplicación. Esto se consigue con alguna de las siguientes acciones sobre la línea de código en la que se desee establecer el punto de interrupción:
  • Clic en el margen izquierdo
  • Menú contextual > "Ocultar/Mostrar línea de punto de interrupción"
  • Pulsando la combinación de teclas: Ctrl + F8
  • Menú "Depurar > Ocultar/Mostrar línea de punto de interrupción"
Al realizar alguna de esas acciones, se marca en color rosado la línea que se ha convertido en un punto de interrupción, y se muestra un pequeño cuadrado en el margen izquierdo.

debug01
Una vez establecido al menos un punto de interrupción, se debe ejecutar la aplicación en modo depuración. Esto se puede llevar a cabo sobre el proyecto o sólo sobre el archivo actual:
  • Depurar archivo actual:
    • Menú contextual > "Debug nombreArchivo"
    • Menú "Depurar > Debug nombreArchivo"
    • Pulsando la combinación de teclas: Ctrl + Mayúsculas + F5
  • Depurar proyecto:
    • Menú "Depurar > Debug Main Project"
    • Icono "Debug Main Project"
      debug02
Al llegar la ejecución de la aplicación al punto de interrupción establecido, se destaca en color verde la línea de código en la que se encuentre la ejecución.

debug03
En la parte inferior se muestra la ventana de observación de las variables locales, en la que se puede comprobar el valor que va tomando cada variable.

A partir del momento en que se para la ejecución del programa se puede continuar con la ejecución línea a línea utilizando la opción "Continuar ejecución":
  • Pulsando la tecla F8
  • Menú "Depurar > Continuar ejecución"
  • Icono "Continuar ejecución"
    debug04
Así se va mostrando en verde la línea que se va ejecutando en cada momento, y se van actualizando en la ventana inferior los valores que van tomando las variables locales.

debug05
En caso de que se desea que el programa continúe la ejecución sin más paradas, se dispone de la opción "Continuar":
  • Pulsando la tecla F5
  • Menú "Depurar > Continuar"
  • Icono "Continuar"
    debug06

jueves, 19 de noviembre de 2009

Control de excepciones

Una excepción es un evento que ocurre durante la ejecución de un programa y detiene el flujo normal de la secuencia de instrucciones del programa.

El control de dichas excepciones se utiliza para la detección y corrección de errores. Si hay un error, la aplicación no debería "morirse".

Para manejar las excepciones en Java, se actúa de la siguiente manera:
  • Se intenta (try) ejecutar la sentencia o bloque de sentencias que pueden producir algún error.
  • Se captura (catch) las posibles excepciones que se hayan podido producir, ejecutando una serie de sentencias que informen o intenten resolver el error.
  • Finalmente (finally) se puede ejecutar una serie de sentencias tanto si se ha producido un error como si todo ha ido bien.
Se debe utilizar el siguiente formato:

    try
    {
        Sentencias que pueden producir error
    }
    catch(ClaseExcepción variableRecogeExcepción)
    {
        Sentencias que informan o procuran solucionar el error.
        Puede haber varios catch.
        La variable no se tiene declarar antes.
    }
    finally
    {
        Sentencias que deben ejecutarse en cualquier caso (opcional)
    }
El elemento ClaseExcepción que aparece junto a catch, debe ser una de las clases de excepción que utiliza Java. Al generarse el error durante la ejecución podemos comprobar qué clase de excepción se ha producido. De forma general, la clase Exception recoge todos los tipos de excepciones. Si se desea un control más exhaustivo del tipo de error que se produce, se debe concretar más la clase de excepción correspondiente.

Por ejemplo, cuando se intenta convertir al tipo de dato numérico entero un dato introducido por el usuario en un campo de texto se utiliza una sentencia como:
    int num = Integer.valueOf(campoNúmero.getText());
Si el valor introducido no es numérico, sino una cadena de caracteres, la llamada a Integer.valueOf produce una excepción, como se puede apreciar en la salida estándar:

try01
Se puede apreciar que se produce una excepción del tipo NumberFormatException, por tanto se debería captura esa excepción para controlar el error.

        try
        {
            int num = Integer.valueOf(campoNúmero.getText());
        }
        catch(NumberFormatException e)
        {
            System.out.println("Error: El valor indicado no es un número");
        }
Si no se tiene claro el tipo de excepción que se quiere controlar, o se quiere controlar cualquier tipo de excepción que se pueda producir, se puede indicar en el catch la clase Exception que es genérica para todas las excepciones, tal como se ha indicado anteriormente.
        try
        {
            int num = Integer.valueOf(campoNúmero.getText());
        }
        catch(Exception e)
        {
            System.out.println("Se ha detectado un error");
        }
Si se desea mostrar qué tipo de error se ha producido se puede utilizar el método toString:

            System.out.println(e.toString);



lunes, 9 de noviembre de 2009

Sentencia for

La sentencia for se caracteriza porque permite repetir un bloque de instrucciones un número de veces fijado de antemano.

Utiliza una variable contador que parte de un valor inicial, se incrementa un según un valor de incremento establecido, y al superar un valor final prefijado se finalizará la ejecución del bucle.

Se debe utilizar el siguiente formato:

    for (Inicialización; Condición; Incremento)
    {

        BloqueDeSentencias;
    }

Donde se utilizan los siguientes elementos:
  • Inicialización: Una sentencia de asignación (o varias separadas por comas) donde la variable de control del bucle toma un valor inicial.
  • Condición: Mientras esta expresión condicional valga true se repetirá el bucle. Se evaluará al inicio de cada repetición del bucle.
  • Incremento: Sentencia (o sentencias) que actualiza la variable de control incrementándola o decrementándola.
El orden de ejecución de una sentencia for es la siguiente:
  1. Inicializar la variable de control del bucle.
  2. Evaluar la condición.
    • Si el resultado es true:
      • Ejecutar BloqueDeSentencias.
      • Incrementar o decrementar la variable de control según la instrucción indicada en Incremento.
      • Volver al punto 2.
    • Si el resultado es false:
      • Ir al punto 3.
  3. Continuar la ejecución del programa.
Ejemplo: Mostrar los 10 primeros números múltiplos de 7.

public class EjemploFor {

    public static void main(String[] args) {
        for(int i=1; i<=10; i++)
            System.out.println(i*7);
    }

}
La instrucción for es una forma compacta de representar un bucle while, siendo la estructura equivalente a la anterior, la presentada a continuación:

        int i=1;
        while(i<=10)
        {
            System.out.println(i*7);
            i++;
        }

Sentencia do-while

La sentencia do-while se caracteriza porque permite repetir un bloque de instrucciones varias veces, ejecutándose obligatoriamente al menos 1 vez. Por lo que se puede ver que es muy similiar a la sentencia while, con la diferencia del número mínimo de veces que se ejecuta el bloque de instrucciones que contiene.

La condición que se establece se evalúa después de ejecutar el bloque de instrucciones que contiene la instrucción do-while.

Se debe utilizar el siguiente formato:

    do
    {
       BloqueDeSentencias;
    } while (condición);
Como siempre, si el bloque de sentencias está formado por una única sentencia, se puede prescindir de las llaves, y hay que destacar que termina con un punto y coma, a diferencia de la sentencia while.

El orden de ejecución de una sentencia do-while es la siguiente:
  1. Ejecutar el bloque de sentencias.
  2. Evaluar la condición.
    • Si el resultado es true, volver al punto 1.
    • Si el resultado es false ir al punto 3.
  3. Continuar la ejecución del programa.
Ejemplo: Generar la secuencia de números siguiente: 1 2 4 7 11 16 22 etc. En ella, se va incrementando cada vez una unidad más respecto a la anterior. La secuencia se debe generar hasta que se alcance el valor máximo que indique el usuario:

ejemploWhile
public class EjemploDoWhile extends javax.swing.JFrame
{

    public EjemploDoWhile()
    {
        initComponents();
    }

    /* Código generado automáticamente no mostrado */

    private void botónGenerarActionPerformed(java.awt.event.ActionEvent evt)                                            
    {                                                
        int numMax = Integer.valueOf(campoMáximo.getText());
        int numActual = 1;
        int incremento = 1;
       
        areaMensajes.setText("");
        do
        {
            areaMensajes.append(String.valueOf(numActual) + " ");
            numActual+=incremento;
            incremento++;
        }while (numActual <= numMax);
    }                                            

    public static void main(String args[])
    {
        java.awt.EventQueue.invokeLater(new Runnable()
        {

            public void run()
            {
                new EjemploDoWhile().setVisible(true);
            }
        });
    }

    private javax.swing.JTextArea areaMensajes;
    private javax.swing.JButton botónGenerar;
    private javax.swing.JTextField campoMáximo;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane1;
}
En este ejemplo conviene observar que si el usuario introduce el valor 0 o cualquier valor negativo, el programa entrará una vez en el bloque de sentencias de la instrucción do-while, mostrando el valor 1.

jueves, 29 de octubre de 2009

Sentencia while

La sentencia while permite la ejecución de un bloque de sentencias de forma repetitiva. El bloque de sentencias se ejecutará repetidamente mientras se cumpla una determinada condición, la cual será una expresión booleana. Si al evaluar la condición resulta true, el bloque se sentencias se ejecutará, y se repetirá su ejecución hasta que la condición resulte false.

Este tipo de sentencias, que permiten la repetición de un bloque de sentencias, reciben también el nombre de bucles.

Es importante tener controlada la salida del bucle, de forma que si entra en él, debe cumplirse en algún momento que la condición resulte false para que termine el bucle. Si no ocurriera esto, el bucle sería infinito y el programa dejaría de responder.

La sentencia while se caracteriza porque permite repetir un bloque de instrucciones de 0 a varias veces. La condición que se establece se evalúa antes de ejecutar el bloque de instrucciones que contiene la instrucción Mientras. Si el resultado de la expresión resulta Falso el bloque de instrucciones no se ejecutará ninguna vez.

Se debe utilizar el siguiente formato:

    while (condición)
    {
       BloqueDeSentencias;
    }
Como siempre, si el bloque de sentencias está formado por una única sentencia, se puede prescindir de las llaves.

El orden de ejecución de una sentencia while es la siguiente:
  1. Evaluar la condición.
    • Si el resultado es true, ejecutar el bloque de sentencias de la estructura while y volver al punto 1.
    • Si el resultado es false ir al punto 2.
  2. Continuar la ejecución del programa.

Las expresiones condicionales que se indican en los paréntesis del while suelen ser expresiones relacionales que resultan valores lógicos (true o false) o cualquier otra expresión que también resulte un valor booleano, por ejemplo:
  • while (num > 0)
  • while (letra == 'N' || letra == 'n')
  • while (num >= 0 && num <=100)
  • while (!cadena.equalsIgnoreCase("fin"))

Ejemplo: Generar la secuencia de números siguiente: 1 2 4 7 11 16 22 etc. En ella, se va incrementando cada vez una unidad más respecto a la anterior. La secuencia se debe generar hasta que se alcance el valor máximo que indique el usuario:

ejemploWhile

public class EjemploWhile extends javax.swing.JFrame
{

    public EjemploWhile()
    {
        initComponents();
    }

    /* Código generado automáticamente no mostrado */

    private void botónGenerarActionPerformed(java.awt.event.ActionEvent evt)
    {
        int numMax = Integer.valueOf(campoMáximo.getText());
        int numActual = 1;
        int incremento = 1;
        while (numActual <= numMax)
        {
            areaMensajes.append(String.valueOf(numActual) + " ");
            numActual+=incremento;
            incremento++;
        }
    }

    public static void main(String args[])
    {
        java.awt.EventQueue.invokeLater(new Runnable()
        {

            public void run()
            {
                new EjemploWhile().setVisible(true);
            }
        });
    }

    private javax.swing.JTextArea areaMensajes;
    private javax.swing.JTextField campoMáximo;
    private javax.swing.JButton botónGenerar;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane1;
}
En este ejemplo conviene observar que si el usuario introduce el valor 0 o cualquier valor negativo, el programa no entrará ninguna vez en el bloque de sentencias de la instrucción while.

martes, 27 de octubre de 2009

Sentencia switch

La sentencia switch permite la ejecución de un determinado bloque de código según el valor que tome una variable o expresión que se indique.

El formato de utilización es el siguiente:

    switch(expresión)
    {
        case valorLiteral1:
            BloqueSentencias1;
            break;
        case valorLiteral2:
            BloqueSentencias2;
            break;
        case valorLiteralN:
            BloqueSentenciasN;
            break;
        default:
            BloqueSentenciasDefault;
    }
La secuencia de ejecución es la siguiente:
  1. Obtener el resultado de la expresión.
  2. Comparar el resultado obtenido con valorLiteral1.
           • Si son iguales:
                 • Ejecutar BloqueSentencias1.
                 • Saltar al paso 5.
  3. Comparar el resultado obtenido con valorLiteral2.
           • Si son iguales:
                 • Ejecutar BloqueSentencias2.
                 • Saltar al paso 5.
    ...
  4. Comparar el resultado obtenido con valorLiteralN.
           • Si son iguales:
                 • Ejecutar BloqueSentenciasN.
                 • Saltar al paso 5.
           • En caso contrario:
                 • Ejecutar BloqueSentenciasDefault
  5. Continuar con la ejecución del programa.
Hay que tener en cuenta que el resultado de la expresión debe ser uno de los tipos de datos básicos (byte, short, int, long float, double, char y boolean), por lo que no se puede utilizar, por ejemplo, con cadenas de caracteres String.

Ejemplo de uso para obtener el nombre del día de la semana según el número de orden del día de la semana (1 a 7):

        String textoDíaSemana;

        //Obtener el número de día de la semana escrito por el usuario
        int numDía = Integer.valueOf(campoDía.getText());

        switch(numDía)
        {
            case 1:
                textoDíaSemana = "Lunes";
                break;
            case 2:
                textoDíaSemana = "Martes";
                break;
            case 3:
                textoDíaSemana = "Miércoles";
                break;
            case 4:
                textoDíaSemana = "Jueves";
                break;
            case 5:
                textoDíaSemana = "Viernes";
                break;
            case 6:
                textoDíaSemana = "Sábado";
                break;
            case 7:
                textoDíaSemana = "Domingo";
                break;
            default:
                textoDíaSemana = "Incorrecto";
        }
       
        //Mostrar el nombre del día en un campo de texto
        campoNombreDía.setText(textoDíaSemana);
La instrucción break; impide que, tras ejecutar las sentencias de un determinado bloque, se ejecuten seguidamente las sentencias del bloque siguiente.

Por ejemplo, observemos el siguiente trozo de código:

        int num = 1;
        switch(letra)
        {
            case 'A':
                num += 1;
            case 'B':
                num += 2;
                break;
            case 'C':
                num += 3;
        }
En ese ejemplo, si la letra es 'A' el resultado de num es 4, porque se inicializa al valor 1, al coincidir la letra con 'A' se le suma 1 y al no encontrase un break continúa sumándole 2. En cambio, si la letra es 'B', el resultado de num es 3, ya que parte del valor 1 y sólo se le suma 2, no sumándole el 3 de la letra 'C' por encontrar un break.

Si se desea que un mismo bloque de código se ejecute para varios valores literales, se utilizará un case para cada valor, escribiendo el bloque de código detrás del último case:

        switch(letra)
        {
            case 'a':
            case 'e':
            case 'i':
            case 'o':
            case 'u':
                textoMensaje = "Vocal minúscula";
                break;
            case 'A':
            case 'E':
            case 'I':
            case 'O':
            case 'U':
                textoMensaje = "Vocal mayúscula";
        }
Hay que destacar que la sección del valor default es opcional, como se ha podido ver también en los ejemplos anteriores.

Portales de descarga de software libre

  • Open Source Living (Organizado por categorías)
  • Open Source Alternative (Alternativas al software comercial organizado por categorías y nombres de aplicaciones comerciales)
  • AlternativeTo (Buscardor de alternativas a cualquier aplicación. Secciones de Windows, Linux, Mac y Online)

Sitios de descarga de versiones antiguas de software

Hay ocasiones en que una versión antigua de un determinado programa puede funcionar mejor que las últimas actualizaciones. Esto puede ocurrir con datos guardados en esas versiones anteriores, porque nuestro ordenador no soporta nuevos requisitos, etc.

Ahí va una serie de sitios donde se pueden conseguir versiones antiguas. El inconveniente es que están en Inglés.

lunes, 26 de octubre de 2009

Sentencia if y sentencia if-else

La sentencia if permite ejecutar un bloque de instrucciones si se cumple una determinada condición.

El orden de ejecución de una sentencia if es el siguiente:
  1. Evaluar la condición que es una expresión condicional o booleana (resultando Verdadero o Falso).
  2. Si el resultado es Verdadero:
    • Ejecutar la sentencia o bloque de sentencias incluidas dentro de esta estructura.
  3. Continuar la ejecución del programa a partir de la siguiente instrucción que se encuentra fuera de la estructura de la sentencia if.

El formato de utilización es el siguiente:

    if(expresiónCondicional)
    {
        sentencia1;
        sentencia2;
        ...
        sentenciaN;

    }
La expresiónCondicional es una expresión cuyo resultado debe ser un valor boolean, es decir, true ó false. Por ejemplo:
  • num > 0
  • sexo=='H' && edad > 18

El conjunto de sentencias que se encuentran entre las llaves (sentencia1, sentencia2, ..., sentenciaN) es una serie de instrucciones que pueden ser cualquiera de las que pueden ser utilizadas en otro lugar del código fuente (asignar valores a variables, llamar a métodos como mostrar datos u obtener datos del teclado, otras sentencias if, etc). Esas sentencias sólo se ejecutarán en caso de que la expresiónCondicional valga true en el momento en que es evaluada.

Ejemplo:
    //Obtener un número por teclado
    num = Integer.valueOf(campoDato.getText());

    //Comprobar si el número introducido es distinto de cero
    if(num != 0)
    {
        //Las siguientes instrucciones sólo se ejecutan
        //   si el valor de la variable num no es cero
        areaMensajes.append("El número introducido no es cero");
        resultado = valor / num;
        campoResultado = setText(String.valueOf(resultado));
    }

    //A partir de aquí, las siguientes instrucciones se ejecutan siempre
    areaMensajes.append("Fin del programa");

En caso de que el bloque de sentencias que se encuentre dentro de la sentencia if sólo esté formado por una solo sentencia, no es necesaria la utilización de las llaves.

    if(expresiónCondicional)
         sentenciaSiEsTrue;
Ejemplo:
    num = Integer.valueOf(campoDato.getText());

    if(num != 0)
        areaMensajes.append("El número introducido no es cero");

    //A partir de aquí, las siguientes instrucciones se ejecutan siempre
    areaMensajes.append("Fin del programa");

También es posible especificar además un bloque de sentencias que debe ejecutarse en el caso contrario, es decir, cuando el resultado de evaluar la expresiónCondicional es false. Para ello debe usarse la estructura if-else, cuyo formato es el siguiente:

    if(expresiónCondicional)
    {
        bloqueSentencias1;
    }
    else
    {

        bloqueSentencias2;
    }
El bloque de sentencias llamado bloqueSentencias1 sólo se ejecutará si el resultado de evaluar la expresiónCondicional es true, y el bloqueSentencias2 sólo se ejecutará si el resultado de evaluar la expresiónCondicional es false.

Por tanto, el orden de ejecución de una sentencia if-else es el siguiente:
  1. Evaluar la condición que es una expresión condicional o booleana (resultando Verdadero o Falso).
  2. Si el resultado es Verdadero:
    • Ejecutar el primer bloque de sentencias incluidas dentro de esta estructura.
  3. Si el resultado es Falso:
    • Ejecutar el segundo bloque de sentencias, detrás del else.
  4. Continuar la ejecución del programa a partir de la siguiente instrucción que se encuentra fuera de la estructura de la sentencia if-else.

Al igual que en la estructura anterior, si alguno de los bloques de sentencias sólo está formado por una instrucción, se puede prescindir de las llaves en ese bloque.

Ejemplo:
    //Obtener un número por teclado
    num = Integer.valueOf(campoDato.getText());

    //Comprobar si el número es positivo o negativo
    if(num < 0)
    {
        //Instrucciones que se ejecutan si num < 0
        areaMensajes.append("El número introducido es negativo");
    }
    else
    {
        //Instrucciones que se ejecutan si NO se cumple num < 0
        areaMensajes.append("El número introducido es positivo");
    }

    //A partir de aquí, las siguientes instrucciones se ejecutan siempre
    areaMensajes.append("Fin del programa");

Dentro de cada bloque de sentencias asociadas al if o al else también pueden aparecer otras estructuras if o if-else. El problema con el que nos podemos encontrar en este tipo de estructuras, es en el momento de anidar varias sentencias if o if-else, pues resulta difícil saber qué else está asociado con qué if, por ello hay que tener en cuenta la siguiente regla: Una sentencia else siempre está asociada con el if precedente más próximo, siempre que no tenga ya asociada otra sentencia else.

Ejemplos de if-else anidados:
//EJEMPLO 1
    if (a > b)
        System.out.println(a);
    if (c > a)
        System.out.println(c);
    else  //Corresponde a if(c>a)
        System.out.println(b);

//EJEMPLO 2
    if (a > b)
    {
        System.out.println(a);
    if (c > a)
        System.out.println(c);
    }
    else  //Corresponde a if(a>b)
        System.out.println(b);

//Este mismo ejemplo 2 queda mucho más claro si se usa adecuadamente el sangrado:
    if (a > b)
    {
        System.out.println(a);
        if (c > a)
            System.out.println(c);
    }
    else  //Corresponde a if(a>b)
        System.out.println(b);
En estos ejemplos hay que observar que las estructuras son prácticamente idénticas, pero el bloque asociado al else se ejecuta en distintas situaciones en cada caso, como se puede observar en los comentarios.

 

Contador de visitas