Lunes 3 de Mayo

El tipo boolean y la instrucción break

Objetivos: Presentar nuevos elementos del lenguaje Java.

Temas:


El tipo boolean

Los tipos de datos int, double y String, permiten almacenar enteros, reales y secuencias de caracteres. La mayoría de los lenguajes posee un tipo de datos para almacenar valores de verdad. En Java este tipo de datos se llama boolean y puede almacenar unicamente dos valores: verdadero o falso.

Constantes:

Declaración de variables:

    boolean existe; // sin inicialización
    boolean terminar= false; // con inicialización
Aplicaciones:

Los operadores relacionales <, ==, >=, etc. permiten construir expresiones que producen valores de verdad. Estos valores pueden ser utilizados en condiciones en un while o un if, y también pueden ser asignados a variables:

    boolean mayor= a>b;
También existen funciones y métodos que producen valores de verdad: isInt(...) y lect.eofReached().

Ejemplo:

El programa que entrega la distancia de una ciudad a Santiago puede ser reescrito:

    print("Nombre ciudad ? ");
    String ciudadBusc= lower(readLine());
    TextReader lect= new TextReader("dist.txt");
    boolean existe= false;
    String linea= lect.readLine();
    while (!lect.eofReached && !existe) {
      FieldParser decod= new FieldParser(linea, ":");
      String ciudad= decod.readString();
      if (compare(lower(ciudad), ciudadBusc)==0) {
        println("La distancia entre Santiago y "+ciudad+" es "+
                decod.readInt()+" kilometros");
        existe= true; // (C)
      }
      else linea= lect.readLine();
    }
    if (lect.eofReached()) // o también if (!existe) ...
      println("La ciudad de "+ciudadBusc+" no se encuentra en mi "+
              "base de datos");
    lect.close();

La instrucción break

Se usa para salir rápidamente de un ciclo. Mientras se ejecuta una iteración de un ciclo, si se llega a ejecutar la instrucción break;, se abandona de inmediato esa iteración y se sale del ciclo. La próxima instrucción que será ejecutada será la que está inmediatamente después del ciclo.

El patrón de uso de esta instrucción consiste en un ciclo while que contiene un if, en donde se ejecuta la instrucción break:

    while ( ... ) {
      ... // (A)
      if ( ... ) { // (B)
        ... // (C)
        break;
        // (D)
      }
      ... // (E)
    }
    ... // (F)
Mientras la codición (B) sea falsa, el ciclo continuará realizando iteraciones de la manera usual. Esto significa que se ejecuta tanto (A) como (E). Pero si (B) resulta verdadera, se ejecutan las instrucciones de (C) y luego break que termina el ciclo. La próxima instrucción en ejecutarse será (F).

Esta secuencia de ejecución se observa más claramente en el siguiente diagrama:

Observaciones:


El patrón de lectura simplificado

La instrucción break se puede usar para simplificar el patrón de lectura:

    while (true) {
      lectura de un dato
      if ( se acabaron los datos ) break;
      ... procesar dato
    }
Ejemplo:

Modificar el programa que determina la distancia entre Santiago y otra ciudad de modo que ahora se acepten varias ciudades. El diálogo debe ser:

    Nombre de ciudad ? valparaiso
    La distancia entre Santiago y Valparaiso es 109 kilómetros
    Nombre de ciudad ? Mendoza
    La ciudad de Mendoza no se encuentra en mi base de datos
    Nombre de ciudad ? arica
    La distancia entre Santiago y Arica es 2030 kilómetros
Solución:

    while (true) { // ciclo externo
      print("Nombre ciudad ? ");
      String ciudadBusc= lower(readLine());
      if (compare(ciudadBusc,"fin")==0) break; // (A)
      TextReader lect= new TextReader("dist.txt");
      while (true) { // ciclo interno
        String linea= lect.readLine();
        if (lect.eofReached()) break; // (B)
        FieldParser decod= new FieldParser(linea, ":");
        String ciudad= decod.readString();
        if (compare(lower(ciudad), ciudadBusc)==0) {
          println("La distancia entre Santiago y "+ciudad+" es "+
                  decod.readInt()+" kilometros");
          break; // (C)
        }
      }
      if (lect.eofReached())
        println("La ciudad de "+ciudadBusc+" no se encuentra en mi "+
                "base de datos");
      lect.close();
    }
Observaciones:


Tarea:

Resuelva nuevamente el programa que determina si un número es primo utilizando la instrucción break para terminar el ciclo en el momento en que se encuentra el primer factor.