• No se han encontrado resultados

El cic lo while

In document Programacion Orientada a Objetos Con Java (página 134-138)

Principales conce ptos que se abordan en este capítulo

4.5 Clases genéricas

4.8.2 El cic lo while

Un ciclo while es similar en su estructura y propósito que el ciclo for-each: con- siste en un encabezado de ciclo y un cuerpo, y el cuerpo puede ejecutarse repeti- 98 Capítulo 4  Agrupar objetos

damente. Sin embargo, los detalles son diferentes. Aquí está la estructura de un ciclo while:

while (condición del ciclo) {

cuerpo del ciclo }

Observamos que el ciclo while comienza con la palabra clave while, seguida de una condición. Este ciclo es más flexible que el ciclo for-each. En lugar de recorrer todos los elementos de una colección, puede recorrer un número variable de elementos de la colección, dependiendo de la condición del ciclo.

La condición es una expresión lógica que se usa para determinar si el cuerpo debe eje- cutarse por lo menos una vez. Si la condición se evalúa verdadera, se ejecuta el cuerpo del ciclo. Cada vez que se ejecuta el cuerpo del ciclo, la condición se vuelve a con- trolar nuevamente. Este proceso continúa repetidamente hasta que la condición resulta falsa, que es el punto en el que se salta del cuerpo del ciclo y la ejecución continúa con la sentencia que esté ubicada inmediatamente después del cuerpo.

Podemos escribir un ciclo whileque imprima todas las notas de nuestra lista, tal como

lo hemos hecho anteriormente mediante un ciclo for-each. La versión que usa un ciclo while se muestra en Código 4.4.

4.8 Procesar una colección completa 99

int indice = 0; while(indice < notas.size()) { System.out.println(notas.get(indice)); indice ++; } Código 4.4

Uso de un ciclo while

para mostrar todas las notas

Este ciclo while es equivalente al ciclo for-each que hemos discutido en la sección

anterior. Son relevantes algunas observaciones:

 En este ejemplo, el ciclo while resulta un poco más complicado. Tenemos que declarar fuera del ciclo una variable para el índice e iniciarlo por nuestros propios medios en 0 para acceder al primer elemento de la lista.

 Los elementos de la lista no son extraídos automáticamente de la colección y asig- nados a una variable. En cambio, tenemos que hacer esto nosotros mismos usando el método get del ArrayList. También tenemos que llevar nuestra propia cuenta (índice) para recordar la posición en que estábamos.

 Debemos recordar incrementar la variable contadora (índice) por nuestros propios medios.

La última sentencia del cuerpo del ciclo whileilustra un operador especial para incre- mentar una variable numérica en 1:

indice ++; esto es equivalente a:

index = index + 1;

Hasta ahora, el ciclo for-each es claramente bueno para nuestro objetivo, fue menos complicado de escribir y es más seguro porque garantiza que siempre llegará a un final.

En nuestra versión del ciclo whilees posible cometer errores que den por resultado un

ciclo infinito. Si nos olvidamos de incrementar la variable índice (la última línea del cuerpo del ciclo) la condición del ciclo nunca podría ser evaluada como falsa y el ciclo se repetiría indefinidamente. Este es un error típico de programación y hace que el programa continúe ejecutándose eternamente. En tal situación, si el ciclo no contiene una sentencia de corte, el programa aparecerá como «colgado»: parece que no está haciendo nada y no responde a ningún clic del ratón o a pulsar una tecla. En realidad, el programa está haciendo mucho: ejecuta el ciclo una y otra vez, pero no podemos ver ningún efecto de esto y parece que el programa hubiera muerto.

Por lo tanto, ¿cuáles son los beneficios de usar un ciclo whileen lugar de un ciclo for- each?

Existen dos fundamentos: primeramente, el ciclo whileno necesita estar relacionado con

una colección (podemos reciclar cualquier condición que necesitemos); en segundo lugar, aun si usáramos el ciclo para procesar la colección, no necesitamos procesar cada uno de sus elementos, en cambio, podríamos querer frenar el recorrido tempranamente. Veremos primero un ejemplo simple de un ciclo whileque no está relacionado con una

colección. El siguiente ciclo imprime en la pantalla todos los números pares hasta 30:

int numero = 0;

while (numero <= 30) {

System.out.println(numero); numero = numero + 2; }

Para poner a prueba su comprensión sobre los ciclos whileintente realizar los siguientes

ejercicios.

Ejercicio 4.16Escriba un ciclo while(por ejemplo, en un método de nombre

prueba) que muestre en la pantalla todos los múltiplos de 5 comprendidos entre 10 y 95.

Ejercicio 4.17Escriba un método de nombre sumar con un ciclo whileque

sume todos los números comprendidos entre dos números a y b. Los valores de a y b pueden ser pasados al método sumar como parámetros.

Ejercicio 4.18Desafío. Escriba un método esPrimo(int n) que devuelva el valor verdadero si el parámetro n es un número primo, y falso en caso con- trario. Para implementar el método puede escribir un ciclo while que divide n

por todos los números comprendidos entre 2 y (n-1) y controlar si el resultado de la división es un número entero. Puede escribir esta verificación usando el operador módulo (%) para controlar que el resto de la división entera sea 0 (véase la discusión sobre el operador módulo en la Sección 3.8.3).

Ahora podemos usar el ciclo whilepara escribir un ciclo que busque en nuestra colec- ción un elemento específico y se detenga cuando lo encuentre. Para ser precisos, que- remos un método de nombre buscar que tenga un parámetro String de nombre cadABuscar y luego imprima en pantalla la primer nota de la agenda que contenga la cadena de búsqueda. Se puede llevar a cabo esta tarea con la siguiente combinación del ciclo while con una sentencia condicional:

int indice = 0;

boolean encontrado = false;

while (indice < notas.size() && !encontrado) {

String nota = notas.get(indice); if (nota.contains(cadABuscar)) { encontrado = true; } else { indice++; } }

Estudie este fragmento de código hasta que logre comprenderlo (es importante). Verá que la condición está escrita de tal manera que el ciclo se detiene bajo cualquiera de estas dos condiciones: si efectivamente se encuentra la cadena buscada, o cuando hemos controlado todos los elementos y no se encontró la cadena buscada.

Este código necesita completarse para agregar la salida del método. Lo hacemos en el siguiente ejercicio.

Ejercicio 4.19Implemente el método buscar en la clase Agenda tal como

se describió anteriormente. El código que se muestra en el ejemplo anterior es parte de este método, pero no está completo. Necesita agregar código a con- tinuación del ciclo para mostrar si se encontró la nota o bien la cadena «No se encontró el elemento buscado». Asegúrese de controlar su método dos veces como mínimo, buscando una cadena que sabe que está en la lista y una que sabe que no está.

Ejercicio 4.20 Modifique el método imprimirNotas de modo que muestre al comienzo de cada nota un número que corresponda a su índice en el Array- List.Por ejemplo:

0: Comprar pan.

1: Recargar teléfono. 2: 11:30: Ver a Juan.

Este listado hace que sea mucho más fácil ingresar el índice correcto en el momento de eliminar una nota de la agenda.

Ejercicio 4.21 En una ejecución del método buscar, se le pregunta repeti- damente a la colección notas cuántas notas contiene actualmente. Se lleva a cabo cada vez que se evalúa la condición del ciclo. ¿Varía el valor que retorna

size en cada verificación? Si considera que la respuesta es no, escriba el método buscar de modo que el tamaño de la colección notas se determine una única vez y se almacene en una variable local, antes de la ejecución del ciclo. Luego utilice la variable local en la condición del ciclo en lugar de una invocación a size. Pruebe que esta versión produce el mismo resultado que la versión anterior. Si tiene problemas al completar este ejercicio, intente usar el depurador para detectar cuáles son los errores.

Ejercicio 4.22 Modifique su agenda de modo que las notas se numeren a partir de 1 y no de 0. Recuerde que el objeto ArrayList continuará usando el índice a partir de cero, pero usted puede presentar las notas numeradas a partir de 1 en su listado. Asegúrese de modificar adecuadamente los métodos

mostrarNota y eliminarNota.

4.8 Procesar una colección completa 101

In document Programacion Orientada a Objetos Con Java (página 134-138)