(microsoft word - cap\355tulos 3.doc) -...

39
1 3 Estructuras Repetitivas 3.1 El concepto. Se denominan estructuras repetitivas a las estructuras que permiten incluir dentro de ellas un grupo de instrucciones que deben hacerse mientras una cierta condición sea válida, esto significa que dichas instrucciones pueden ejecutarse 0 o n veces. Una estructura repetitiva está compuesta de una instrucción de repetición, la condición y el bloque de instrucciones que deberá ejecutarse mientras la condición se cumpla. Java ofrece tres tipos de estructuras repetitivas, las cuales se presentarán en este capítulo. 3.2 Instrucción while (condición). Es una de las instrucciones repetitivas más utilizadas en los diferentes lenguajes de programación, prácticamente todos la implementan. La forma en la cual funciona es equivalente a mencionar, en una conversación casual, algo como: Mientras estés estudiando en la universidad, deberás llegar a casa antes de las 11 p.m. Es claro que mientras la persona no termine el semestre que está cursando es su obligación estar en la casa, a más tardar, a las 11 de la noche. Mientras el equipo siga ganando y no se presenten faltas por disciplina, se les seguirá entregando el premio. Para seguir obteniendo el premio, es necesario que el equipo siga ganando y no se presenten faltas contra la disciplina. Mientras consigues completar la plata para comprar un televisor para ti, o encuentras una promoción, deberás seguir viendo televisión con nosotros. Aquí es claro que mientras no se cumpla una, o ambas, condiciones la persona deberá ver televisión con la familia.

Upload: ngothien

Post on 12-Apr-2018

223 views

Category:

Documents


3 download

TRANSCRIPT

1

3 Estructuras Repetitivas

3.1 El concepto.

Se denominan estructuras repetitivas a las estructuras que permiten incluir dentro de ellas un grupo de instrucciones que deben hacerse mientras una cierta condición sea válida, esto significa que dichas instrucciones pueden ejecutarse 0 o n veces.

Una estructura repetitiva está compuesta de una instrucción de repetición, la condición y el bloque de instrucciones que deberá ejecutarse mientras la condición se cumpla. Java ofrece tres tipos de estructuras repetitivas, las cuales se presentarán en este capítulo.

3.2 Instrucción while (condición).

Es una de las instrucciones repetitivas más utilizadas en los diferentes lenguajes de programación, prácticamente todos la implementan. La forma en la cual funciona es equivalente a mencionar, en una conversación casual, algo como:• Mientras estés estudiando en la universidad, deberás llegar a casa antes de las

11 p.m. Es claro que mientras la persona no termine el semestre que está cursando es su obligación estar en la casa, a más tardar, a las 11 de la noche.

• Mientras el equipo siga ganando y no se presenten faltas por disciplina, se les seguirá entregando el premio. Para seguir obteniendo el premio, es necesario que el equipo siga ganando y no se presenten faltas contra la disciplina.

• Mientras consigues completar la plata para comprar un televisor para ti, o encuentras una promoción, deberás seguir viendo televisión con nosotros. Aquí es claro que mientras no se cumpla una, o ambas, condiciones la persona deberá ver televisión con la familia.

En java estas situaciones se manejan a través de la instrucción while (condición),cuya sintaxis se presenta a continuación:

while (condición) {/** En este espacio debe ir el bloque de código que se requiere se ejecute mientras la condición se cumpla. */

}

Del anterior bloque, se deben hacer las siguientes consideraciones:• la palabra reservada while es indispensable en el encabezado del bloque.• la condición debe ir entre paréntesis. Debe haber condición, o sea no es

posible dejar los paréntesis vacíos. La condición se maneja igual que en las estructuras selectivas, es decir puede ser simple o estar compuesta de varias condiciones unidas a través de operadores y (& - &&) u o (| - ||).

2

• si la condición no se cumple la primera vez que se llega al while, las instrucciones contenidas en él no se ejecutarán ni una vez.

• el que se requieran llaves o no, en este caso depende de la cantidad de instrucciones que estén sujetas al cumplimiento de la condición. Si es una instrucción no son necesarias, si son varias si lo son, pero es recomendable utilizarlas siempre. Sea que se utilicen o no llaves, debe ser claro que las instrucciones dentro del while forman un bloque de código, así que si se definen variables dentro de este bloque, dejaran de existir una vez se salga de él.

Ejercicio Resuelto:Problema: Suponga que se desea elaborar un programa que calcule e imprima los valores de la serie de Fibonnacci, menores al número cincuenta.An áli si s: • Salidas.

• Números, entre cero y cincuenta, que correspondan a la serie. Esta salida es repetitiva.

• Entradas.// Observe este es un caso en el cual ¡ no se requiere pedir nada !

• Procedimiento.• método main:

• +m a i n (String[ ]):void• salidas:• valor de retorno:• entradas:• parámetros:• procedimiento:

• llamar al método generarNúmeros()• método generarNúmeros:

• +g e ne r a r N ú m e r o s ():void• salidas: Los números entre 0 y 50 que correspondan a la serie.• valor de retorno:• entradas:• parámetros:• procedimiento:

• iniciar con 0 y 1, pues la serie, por definición, empieza con estos valores.• mientras (siguienteTérmino < 50)

• muestre siguienteTérmino.• temporal = siguienteTérmino.• siguienteTérmino += anterior.• anterior = temporal.

Cód i g o e n j a v a : import java.util.*;public class Fibonacci {

public static void main(String args[]) {generarNúmeros();

}public static void generarNúmeros(){

3

int anterior = 0, temporal = 0; int siguienteTérmino = 1; System.out.println(anterior); while (siguienteTérmino < 50) {

System.out.println(siguienteTérmino);temporal = siguienteTérmino; siguienteTérmino += anterior; anterior = temporal;

}}

}

Ejercicios Resueltos:Problema: Suponga que se desea elaborar un programa que calcule e imprima los valores de la serie de Fibonnacci, menores que cincuenta. Los números pares deben ir marcados con un asterisco.An á l i s i s : • Salidas.

• Números, entre cero y cincuenta, que correspondan a la serie. Los pares irán acompañado de un asterisco. Esta salida es repetitiva.

• Entradas.• Procedimiento.

• método main:• +m a i n (String[ ]):void• salidas:• valor de retorno:• entradas:• parámetros:• procedimiento:

• llamar al método generarNúmeros()• método generarNúmeros:

• +g e ne r a r N ú m e r o s ():void• salidas: Los números entre 0 y 50 que correspondan a la serie, los pares irán

marcados con un asterisco.• valor de retorno:• entradas:• parámetros:• procedimiento:

• iniciar con 0 y 1, pues la serie, por definición, empieza con estos valores• mientras (siguienteTérmino < 50)

• si (siguienteTérmino es par).• muestre siguienteTérmino + '*'.

• sino• muestre siguienteTérmino + ' '.

• temporal = siguienteTérmino.• siguienteTérmino += anterior.• anterior = temporal.

Cód i g o e n j a v a : import java.util.*;public class FibonacciConParesResaltados {

4

public static void main(String args[]) {generarNúmeros();

}public static void generarNúmeros(){

int anterior = 0, temporal = 0; int siguienteTérmino = 1; char signo = '*';System.out.println(anterior+" "+signo);while (siguienteTérmino < 50) {

signo = (siguienteTérmino % 2 == 0) ? '*' : ' '; System.out.println(siguienteTérmino+" "+signo); temporal = siguienteTérmino;siguienteTérmino += anterior;anterior = temporal;

}}

}

Problema: Se necesita saber el valor total de los libros que hay en una librería, se sabe que el valor de un libro se calcula multiplicando el número de páginas por 100. Si la edición no es nacional o el libro fue editado este año se le aplica un recargo, al valor obtenido, del 10%. No se sabe cuántos libros hay en la librería.An á l i s i s : • Salidas.

• mensaje que indique el valor total de los libros. Esta salida es única.• Entradas

• mientras (haya más libros) S La entrada es repetitiva.• el número de páginas del libro.• tipo de edición (nacional o extranjero).• si el libro fue editado este año o no.

• Procedimiento.• método main:

• +m a i n (String[ ]):void• salidas:• valor de retorno:• entradas:• parámetros:• procedimiento:

• llamar al método gestiónLibros()• método gestiónLibros:

• +g e s ti ó nL i b r o s ():void• salidas: Mensaje que indique el valor total de los libros.• valor de retorno:• entradas: para cada libro: páginas, edición, año.• parámetros:• procedimiento:

• mientras (haya más libros)• leer las entradas.• valor = calcularBase(páginas)• si la edición es extranjera o si el libro fue editado este año

• valor += recargo(valor)• total += valor.

5

• preguntar si hay más libros.• mostrar “El valor total de los libros es: “+total.

• método calcularBase:• +ca l c u l a r B a s e (int):double• salidas:• valor de retorno: valor base del libro• entradas:• parámetros: número de páginas del libro.• procedimiento:

• retorne páginas * 100• método recargo:

• +r ec a r g o (double):double• salidas:• valor de retorno: valor del recargo• entradas:• parámetros: valor base del libro.• procedimiento:

• retorne valor * 0.1Cód i g o e n j a v a : import java.util.Scanner.*;public class ValorDelLibro {

public static void main (String arg[] ) {gestiónLibros();

}public static void gestiónLibros(){

Scanner lector = new Scanner(System.in);char respuesta = 's';double valorTotal = 0;while ((respuesta == 's') || (respuesta == 'S')){

double valor = 0;System.out.println("Digite la cantidad de páginas");int númeroDePáginas = lector.nextInt ();System.out.println("Digite (1) si es edición nacional \n(2) si es extranjera");int nacional = lector.nextInt ();System.out.println("Digite (1) si es edición de este año \n(2) si es de otro año");int año = lector.nextInt ();valor = calcularBase(númeroDePáginas);if ((nacional == 2) || (año == 1)) {

valor += recargo(valor);}valorTotal += valorDelLibro; System.out.println("¿ Hay más libros ?"); respuesta =lector.nexLine ().charAt(0);

}System.out.println ("El valor total de los libros es "+valorTotal);

}public static double calcularBase(int páginas){

return páginas * 100;}public static double recargo(double base){

return base* 0.1;}

}

6

Problema: Se necesita sumar los números pares entre un valor cualquiera, digitado por el usuario, y 100.An á l i s i s : • Salidas.

• total obtenido al realizar la suma.• Entradas

• valor inicial.• Procedimiento.

• método main:• +m a i n (String[ ]):void• salidas:• valor de retorno:• entradas:• parámetros:• procedimiento:

• llamar al método sumar()• método sumar:

• +s u m a r ():void• salidas: El resultado de la suma.• valor de retorno:• entradas: El número a partir del cual se debe sumar• parámetros:• procedimiento:

• pedir el número a partir del cual se debe sumar• si (el residuo de dividir tope entre 2 es 1)

• sume 1 a tope.• mientras (tope <= 100)

• acumulador += tope• tope += 2

• si acumulador quedó con un valor diferente a 0• mostrar el valor acumulado

• sino• mostrar que tope inferior fue mayor que 100.

Cód i g o e n j a v a : import java.util.Scanner.*;public class Pares {

public static void main(String args[]) {sumar();

}public static void sumar(){

Scanner lector = new Scanner(System.in);System.out.println("Digite el número con el que se inicia la suma: ");int topeInferior = lector.nextInt();if (topeInferior %2 == 1){

topeInferior++; } double acumulador = 0; while (topeInferior <= 100) {

acumulador += topeInferior;topeInferior += 2;

}if (acumulador > 0) {

System.out.println("La suma dio: " + acumulador);

7

} else {System.out.println("¡El tope inferior fue mayor que 100!");

}}

}

Ejercicios Propuestos.1. Se le ha pedido que haga un programa que permita calcular el combinatorio de dos

números naturales, siempre y cuando el primero sea mayor o igual al segundo. La forma de calcular el combinatorio de dos números naturales es: númeroUnoCnúmeroDos = númeroUno! / ((númeroUno-númeroDos)! * númeroDos!) Tenga en cuenta:• El signo de admiración a la derecha de un número indica que se trata de su factorial.

El factorial de un número se calcula multiplicando desde 1 hasta el número, incluido. Por ejemplo: 3! = 1 * 2 * 3 = 6• El factorial de cero es 1, por definición.

An áli si s: • Salidas.

• Entradas.

• Procedimiento.

8

Cód ig o en j av a:

2. Se le ha encomendado la labor de elaborar un programa que le permita a un niño estudiar las tablas de multiplicar. Las condiciones que se le han puesto son:• se le debe preguntar la tabla de qué número va a estudiar.• las tablas van desde uno (1) hasta doce (12).• si el niño se equivoca debe dársele una nueva oportunidad, si vuelve a fallar se le

debe mostrar el resultado correcto.3. En un teatro se ha decidido que la entrada sea controlada por una máquina, y a usted

se le ha pedido que haga el programa que diga si una persona puede ingresar o no. Al iniciar labores se debe indicar cuál es la censura de la película (para todos, mayores de12 años o mayores de 18 años), además el valor de la entrada. Una persona puede ingresar si no han entrado más de 30 personas, que es la capacidad máxima del teatro, si la persona tiene la edad requerida y si la boleta que compró cumple con el valor de la entrada. Entran personas hasta que se llene el teatro o hasta que la edad de la persona sea cero. Al terminar la máquina debe mostrar un mensaje que indique cuántas personas ingresaron y cuál fue la edad promedio de los espectadores.

9

3.3 Instrucción do – while (condición).

Esta instrucción indica que un bloque de instrucciones debe ejecutarse mínimo una vez y mientras que la condición siga siendo válida. Equivaldría a comentar en una conversación casual algo como:• Ponle tantas capas de pintura a esa pared como sea necesario para que

desaparezca ese color. Es claro que debe aplicarse como mínimo una capa de pintura y después de eso, tantas como se requiera para que el antiguo color desaparezca.

• Él comerá pasteles hasta que se acaben o encuentre el premiado. Aquí se indica que se comerá al menos un pastel, y se detendrá si es el premiado, o si termina con todos los pasteles existentes.

En java se cuenta con la instrucción do – while (condición), cuya sintaxis se presenta a continuación:

do {/** En este espacio debe ir el bloque de código que se requiere se ejecute, al menos una vez, y siga ejecutándose mientras la condición se cumpla. */

} while (condición);

Del anterior bloque, se deben hacer las siguientes consideraciones:• la palabra reservada do es indispensable en el encabezado del bloque.• el que se requieran llaves o no, también depende de la cantidad de

instrucciones que se quiera incluir en la instrucción. Sigue siendo válido el que las instrucciones contenidas en esta instrucción conforman un bloque de código, y su comportamiento es idéntico a los casos ya mencionados.

• la condición debe ir entre paréntesis, después del while, e inmediatamente después de la última de las instrucciones que conforman el bloque a repetir. Aquí también se requiere condición, o sea no es posible dejar los paréntesis vacíos. La condición se maneja exactamente igual que en los casos anteriores.

• si la condición no se cumple cuando se llega al do, las instrucciones contenidas en el bloque se ejecutarán una vez, puesto que la condición se verifica DESPUÉS de la primera ejecución del bloque.

Los bloques de código, en java, están delimitados por las llaves, así que si se define una variable dentro del bloque de código demarcado por la instrucción do – while (condición), esta variable NO puede utilizarse en la condición, pues la condición se encuentra por fuera del bloque de código.

Ejercicios Resueltos:Problema: Se necesita un programa que muestre, por pantalla, los primeros 100 números pares. Además se necesita que cumpla con el siguiente formato:• si además de par es múltiplo de cuatro, al lado del número debe aparecer la palabra

'cuatro'.

10

• si es par y múltiplo de cinco, al lado del número debe aparecer la palabra 'cinco'.• si es par y múltiplo de cuatro y de cinco, al lado del número debe aparecer la palabra

'ambos'. An á l i s i s : • Salidas.

• Mensaje que muestre los números. Esta salida es repetitiva.• Entradas• Procedimiento.

• método main:• +m a i n (String[ ]):void• salidas:• valor de retorno:• entradas:• parámetros:• procedimiento:

• llamar al método números()• método números:

• +n ú m e r os ():void• salidas: los números, con el símbolo que corresponda• valor de retorno:• entradas:• parámetros:• procedimiento:

• asignar al contador 1 como valor inicial• hacer

• nuevoPar = contador++ * 2.• mensaje = asignaMensaje(nuevoPar)

• Mostrar nuevoPar y mensaje• mientras (contador < 100)• método asignaMensaje:

• +as i g na Me n s a j e (int):String• salidas:• valor de retorno: el mensaje que debe mostrarse junto al número• entradas:• parámetros: el número que define el mensaje a mostrar• procedimiento:

• si el residuo de dividir el número entre 4 es 0 y el residuo de dividir el número entre 5 es 0• retorne “ambos”

• si el residuo de dividir el número entre 4 es 0• retorne “cuatro”

• si el residuo de dividir el número entre 5 es 0• retorne “cinco”

• retorne “ ” Cód i g o e n j a v a : import java.util.Scanner.*;public class ParesConMensaje {

public static void main(String arg[]) {

11

numeros();}public static numeros(){

int contador = 1;int nuevoPar;do {

nuevoPar = contador++ * 2;String mensaje = asignaMensaje(nuevoPar); System.out.println(nuevoPar + " " + mensaje);

} while (contador < 100);}public static String asignaMensaje(int par){

if (par % 4 == 0 && par % 5 == 0) {return “ambos”;

if (par % 4 == 0) {return “cuatro”;

if (par % 5 == 0) {return “cinco”;

return “ ”;}

}

Problema: Se necesita un programa que genere números en forma aleatoria. Los números deben estar entre 1 y 10. El usuario jugará a adivinar el número, y cuando lo logre, el programa deberá decirle cuántos intentos necesitó.An á l i s i s : • Salidas:

• Mensaje que muestre cuántos intentos hizo.• Entradas

• Los números. Esta entrada es repetitiva.• Procedimiento.

• método main:• +m a i n (String[ ]):void• salidas:• valor de retorno:• entradas:• parámetros:• procedimiento:

• generar el número en forma aleatoria• llamar al método jugar(número)

• método jugar:• +j u g a r (int):void• salidas: el número de intentos que el usuario requirió para adivinar el número.• valor de retorno:• entradas:• parámetros: el número que debe adivinar• procedimiento:

• hacer• pedir un nuevoNúmero;• contar intento• si nuevoNúmero es igual a número

• mostrar el mensaje.

12

• mientras (número != nuevoNúmero) Cód i g o e n j a v a : import java.util.Scanner.*;import java.util.*;public class Adivine {

public static void main(java.lang.String[] args) {// Las dos siguientes instrucciones permiten obtener un número en forma aleatoria. Random generador = new Random();int número = generador.nextInt(10000);número %= 10; número++; jugar(número);

}public static void jugar(int número){

int contador = 0, nuevoNúmero; do {

contador++;System.out.println("Digita un número entre 1 y 10");nuevoNúmero = lector.nextInt();if (nuevoNúmero = número) {

System.out.println("Lo lograste, al " + contador + " intento"); }} while (número != nuevoNúmero);

}}

Problema: Se necesita un programa que defina si una palabra es palíndromo1 o no. An á l i s i s : • Salidas.

• mensaje que indique si la palabra es o no palíndromo.• Entradas

• la palabra a evaluar.• Procedimiento.

• método main:• +m a i n (String[ ]):void• salidas:• valor de retorno:• entradas:• parámetros:• procedimiento:

• pedir la palabra a evaluar• es = palíndromo(palabra)• si es palíndromo

• mostrar mensaje “La palabra es palíndromo”• sino

• mostrar mensaje “La palabra NO es palíndromo”• método palíndromo:

• +p a lí nd r o mo (String):boolean• salidas:• valor de retorno: valor boolean que indica si la palabra es o no palíndromo• entradas:

1 “Palabra o frase que se lee igual de izquierda a derecha, que de derecha a izquierda”. Según el Diccionario de la Lengua Española. Vigésima segunda edición.

13

• parámetros: la palabra a evaluar• procedimiento:

• contadorUno = 0, contadorDos = longitud de la palabra – 1.• hacer

• si la letra que indica contadorUno no es igual a la letra que indica el contadorDos• retornar falso

• contadorUno = contadorDos + 1.• Incrementar contadorUno• Decrementar contadorDos.

• mientras (contadorUno < contadorDos )• retornar verdadero

Cód i g o e n j a v a : import java.util.Scanner.*;public class Palíndromo {

public static void main(java.lang.String[] args) { Scanner lector = new Scanner(System.in); System.out.println("Digite la palabra a evaluar: "); String palabra = lector.nexLine();boolean es = palíndromo(palabra);if (es) {

System.out.println(“La palabra es palíndromo”);} else {

System.out.println(“La palabra NO es palíndromo”);}public static boolean palíndromo(String palabra){

int contadorUno = 0;

// ¡¡ debe investigar que hace length() !!

int contadorDos = palabra.length() - 1;boolean palíndromo = true;do {

// ¡ debe investigar que hacer charAt(valor entero) !

if (palabra.charAt(contadorUno) != palabra.charAt(contadorDos)) { System.out.println("No es palíndromo");palíndromo = false;

} contadorUno++; contadorDos--;

} while (contadorUno < contadorDos && palíndromo);return true;

}}

Ejercicios Propuestos:1. Haga un programa que le permita guardar en un arreglo de n posiciones los factoriales

de los n primeros números primos.

14

An á l i s i s : • Salidas.

• Entradas.

• Procedimiento.

Cód i g o e n j a v a :

15

2. Un equipo de fútbol está en problemas, así que sus dueños han decidido que seguirán sosteniéndolo si el promedio de las calificaciones de sus jugadores, después de cada partido es superior a 6, y le han contratado para que elabore un programa que pida las calificaciones individuales y devuelva el promedio de ellas. Recuerde que juegan once jugadores y que puede haber hasta tres cambios, así que mínimo debe pedir once calificaciones y máximo 14.

3. Los dueños del mismo equipo de fútbol le han pedido un nuevo programa, que lespermita decidir si un jugador sigue en el equipo o no. Al terminar cada torneo se evalúa el desempeño de los jugadores teniendo en cuenta el promedio de sus calificaciones en los partidos que jugó, el número de tarjetas amarillas y rojas que recibió y la cantidad de partidos en que jugó como titular. Y los requisitos para que continúe en el equipo son:

• El promedio de sus calificaciones debe ser superior a 5.5• Las tarjetas amarillas no pueden ser más de 5 y las rojas no pueden ser más de 2.• debe haber jugado como titular, al menos el 35% de los partidos jugados por el

equipo.• Los jugadores a evaluar son 18 y la información se digitará partido a partido.

3.4 Instrucción for (inicialización ; condición ; incremento).

Esta instrucción es ligeramente diferente a las otras, en el sentido de que no se limita a dar una condición, sino que permite dar un valor inicial, y una forma de incremento, con lo cual se simplifica la programación. Dado que combina tres acciones en un solo paso, no es fácil pensar en una situación de la vida real que pueda ser asociada a ella.• Empieza con la tabla del uno, sigue hasta la del 10, aprendiendo cada día una.

Aquí se da el punto de partida, debe empezar con la tabla del uno, y seguir estudiando hasta que se sepa todas hasta la del 10, además es claro que cada día debe aprender la del siguiente número.

En java se cuenta con la instrucción for(inicialización ; condición ; incremento),cuya sintaxis se presenta a continuación:

for (inicialización ; condición ; incremento) {/** En este espacio debe ir el bloque de código que se requiere se ejecute mientras la condición se cumpla. */

}

Del anterior bloque, se deben hacer las siguientes consideraciones:• la palabra reservada for es indispensable en el encabezado del bloque.• si se decide utilizar la parte de inicialización, debe tenerse en cuenta que

puede trabajar con cualquiera de los tipos de datos numéricos, incluidos los reales. Además puede hacerse la definición de la variable y su inicialización o puede sólo hacerse la inicialización.

Es decir que los siguientes bloques de código son correctos:• declara e inicializa :

for (int contador = 0 ; ... ; ... ) {

. . .

16

}• sólo inicializa :

double contador;. . .for (contador = 0 ; ... ; ... ) {. . .}

• también es importante tener presente que no se está limitado a una variable, pueden definirse e inicializarse tantas como se requiera, la única restricción es que a todas debe hacérseles lo mismo: o todas se declaran, del mismo tipo, e inicializan o todas se han declarado previamente, y pueden ser de tipos diferentes, y sólo se inicializan.

Es decir que los siguientes bloques de código son correctos:• declara e inicializa :

for (int contador = 0, número = 8 ; ... ; ... ) {/** ni contador, ni número pueden haber sido declaradas por fuera de este bloque, pues generará error diciendo que esas variables ya existen.*/. . .}

• sólo inicializa : double contador; int número;. . .for (contador = 0, número = 8 ; ... ; ... ) {. . .}

• si se decide utilizar la parte de la condición, deben tenerse en cuenta que la condición puede estar asociada a la variable o variables que se manejaron en la parte de la inicialización. Sin embargo esto NO es necesario. En otras palabras la condición puede estar construida a partir de valores completamente independientes a los trabajados en la parte de inicialización. Igualmente la condición puede ser simple o compleja, o sea puede ser una condición, o varias unidas con los operadores y (& &&) y o (| ||)

Es decir que los siguientes bloques de código son correctos:• tiene condición, pero omite la inicialización;

boolean cierto = true;. . .for (; cierto ; ...) {// seguirá en el ciclo mientras la variable cierto no cambie de valor.. . .}

• utiliza la parte de inicialización, pero no tiene en cuenta esa variable en la condición :

boolean cierto = true;

. . .

17

for (int contador = 0 ; cierto ; ...) {. . .}

• utiliza la parte de inicialización, y trabaja con esa variable en la condición:for (int contador = 0 ; contador < 10 ; ...) {. . .}

• si se decide utilizar la parte de incremento, debe tenerse en cuenta que los valores que se incrementen pueden estar relacionados con los dos bloques anteriores, pero que NO tienen que estarlo.

Es decir que los siguientes bloques de código son correctos:• completamente independiente :

boolean cierto = true;double número = 0;. . .for (int contador = 0 ; cierto ; número += 2 ) {. . .}

• relación con lo que se inicializó :boolean cierto = true;. . .for (int contador = 0 ; cierto ; contador++ ) {. . .}

• relación con lo que se inicializó y con la condición:double contador;. . .for (contador = 0 ; contador < 10 ; contador++ ) {. . .}

• al iniciar la ejecución del for, y su bloque de código asociado, se realiza lo que aparezca en la parte de inicialización, después se evalúa la condición y se pasa a ejecutar las instrucciones contenidas en el bloque de código. Una vez se ha concluido la ejecución del bloque, se ejecuta lo que corresponde a la parte del incremento e inmediatamente después se evalúa, de nuevo, la condición. Se continúa así mientras la condición se siga cumpliendo. Así podemos concluir que la inicialización se ejecuta una sola vez, la revisión de la condición y el incremento se continúan realizando mientras la condición siga siendo cierta.

• Si la primera vez que se llega al for, al evaluar la condición esta no se cumple, las instrucciones contenidas en él no se ejecutarán ni una vez.

• nuevamente el uso de las llaves depende de la cantidad de instrucciones que se quiera incluir en él.

18

• en este caso sigue siendo válido el concepto de bloque de código, es decir que las variables definidas en este bloque, serán desconocidas fuera de él, incluidas las que sean definidas en la parte de inicialización.

• la inicialización, condición e incremento que van entre paréntesis y separados con punto y coma, son opcionales tal como se ha visto hasta ahora. O sea que es posible dejar que los paréntesis contengan únicamente los signos de punto y coma, que si son obligatorios.

Es decir que la siguiente sintaxis es correcta:for (; ;) {. . .}

Ejercicios Resueltos.Problema: Se necesita un programa que genere un número, en forma aleatoria, entre 1 y10. El usuario jugará a adivinarlo, pero sólo tiene 5 oportunidades, ni una más. An á l i s i s : • Salidas.

• Si el usuario adivinó, un mensaje que lo indique y muestre cuántos intentos hizo; de lo contrario un mensaje que muestre que perdió.

• Entradas• El número, esta entrada puede repetirse hasta cinco veces.

• Procedimiento.• método main:

• +m a i n (String[ ]):void• salidas:• valor de retorno:• entradas:• parámetros:• procedimiento:

• generar el número en forma aleatoria• llamar al método jugar(número)

• método jugar:• +j u g a r (int):void• salidas: el número de intentos que el usuario requirió para adivinar el número.• valor de retorno:• entradas:• parámetros: el número que debe adivinar• procedimiento:

• encontró = falso• desde 1, hasta cinco o hasta que lo encuentre, aumentando de uno en uno

• pedir nuevoNúmero.• si nuevoNúmero es igual a número

• muestre mensaje: “Lo encontró al “+ contador+ “ intento”.• encontró = verdadero

• si no lo encontró• mostrar mensaje indicando que perdió.

19

Cód i g o e n j a v a : import java.util.Scanner.*;import java.util.*;public class Adivine {

public static void main(java.lang.String[] args) { Random generador = new Random();int número = generador.nextInt(10000);número %= 10; número++; jugar(número);

}public static void jugar(int número){

Scanner lector = new Scanner(System.in);boolean encontró = false;int contador, nuevoNúmero;for (contador = 0;(contador < 5 && !encontró); contador++) {

System.out.println("Digita un número entre 1 y 10"); nuevoNúmero = lector.nextInt();if (nuevoNúmero == número) {

System.out.println("Lo lograste, al " + (contador + 1) + " intento");encontró = true;

}}if (!encontró) {

System.out.println("¡ Perdiste !.\nEl número era: "+número);}

}}

Problema: El cuadrado de un número se obtiene al sumar tantos números impares como indique el número. La suma debe empezar con el uno (1). Así:

El cuadrado de 1 :1 = 1

El cuadrado de 2 :1 + 3 = 4

El cuadrado de 3:1 + 3 + 5 = 9

Se debe desarrollar un programa que utilice este método para calcular el cuadrado de cualquier número entero que el usuario digite.An á l i s i s : • Salidas.

• El cuadrado del número.• Entradas

• El número.• Procedimiento.

• método main:• +m a i n (String[ ]):void• salidas:• valor de retorno:• entradas:• parámetros:• procedimiento:

• leer la entrada.• si el número es menor que 0

20

• multiplíquelo por -1.• llamar al método cuadrado(número)

• método cuadrado:• +cu a d r a do (int):void• salidas: el cuadrado del número• valor de retorno:• entradas: el número• parámetros:• procedimiento:

• desde 1 hasta número, aumentando contador de uno en uno e impar de dos en dos• acumular el impar calculado.

• mostrar el valor que obtuvo. Cód i g o e n j a v a : import java.util.Scanner.*;public class Cuadrado {

public static void main(String[] args) { Scanner lector = new Scanner(System.in);System.out.println("¿A qué número desea encontrarle el cuadrado?");int número;int unNúmero = lector.nextInt();if (unNúmero < 0) {

unNúmero *= -1;}cuadrado(unNúmero);

}public static void cuadrado (int número) {

int acumulador, impar, contador;for (contador=1, acumulador=0, impar=1; contador<=número; contador++, impar+= 2) {

acumulador += impar;}System.out.println("El cuadrado de " + unNúmero + " es: " + acumulador);

}}

Ejercicios Propuestos:1. Se le ha pedido que elabore un programa que pida cadenas de caracteres hasta que

ocurra alguna de estas cosas:• La cadena contenga uno de estos signos " # $ % ".• La longitud de la cadena sea superior a 35.• La cadena contenga alguna vocal tildada.• La cadena sea palíndromo. Se debe revisar omitiendo espacios en blanco y las

tildes; por ejemplo, “dábale arroz a la zorra el abad”, debe convertirse en “dabale arroz a la zorra el abad” y esta cadena es la que debe evaluarse.

2. Se le ha pedido que elabore un programa que genere una serie conformada por cuatronúmeros diferentes, comprendidos entre uno y cincuenta. Un usuario intentará adivinarlos y tendrá seis oportunidades para cada número, pero si hace los seis intentos y no acierta el número, el programa debe terminar e informarle que perdió. Los números de la serie deben ser generados por su programa en forma aleatoria, y no es necesario que el usuario los adivine en orden.

21