Está en la página 1de 24

3 3.

Estructuras Repetitivas 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 condicin sea vlida, esto significa que dichas instrucciones pueden ejecutarse 0 o n veces. Una estructura repetitiva est compuesta de una instruccin de repeticin, la condicin y el bloque de instrucciones que deber ejecutarse mientras la condicin se cumpla. Java ofrece tres tipos de estructuras repetitivas, las cuales se presentarn en este captulo. 3.2 Instruccin while (condicin).

Es una de las instrucciones repetitivas ms utilizadas en los diferentes lenguajes de programacin, prcticamente todos la implementan. La forma en la cual funciona es equivalente a mencionar, en una conversacin casual, algo como: Mientras ests estudiando en la universidad, debers llegar a casa antes de las 11 p.m. Es claro que mientras la persona no termine el semestre que est cursando es su obligacin estar en la casa, a ms 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 promocin, debers seguir viendo televisin con nosotros. Aqu es claro que mientras no se cumpla una, o ambas, condiciones la persona deber ver televisin con la familia. En java estas situaciones se manejan a travs de la instruccin while (condicin), cuya sintaxis se presenta a continuacin: while (condicin) { /** En este espacio debe ir el bloque de cdigo que se requiere se ejecute mientras la condicin se cumpla. */ } Del anterior bloque, se deben hacer las siguientes consideraciones: la palabra reservada while es indispensable en el encabezado del bloque. la condicin debe ir entre parntesis. Debe haber condicin, o sea no es posible dejar los parntesis vacos. La condicin se maneja igual que en las estructuras selectivas, es decir puede ser simple o estar compuesta de varias condiciones unidas a travs de operadores y (& - &&) u o (| - ||).

si la condicin no se cumple la primera vez que se llega al while, las instrucciones contenidas en l no se ejecutarn ni una vez. el que se requieran llaves o no, en este caso depende de la cantidad de instrucciones que estn sujetas al cumplimiento de la condicin. Si es una instruccin 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 cdigo, 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 nmero cincuenta. Anlisis: Salidas. Nmeros, 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. mtodo main: +main(String[ ]):void salidas: valor de retorno: entradas: parmetros: procedimiento: llamar al mtodo generarNmeros() mtodo generarNmeros: +generarNmeros():void salidas: Los nmeros entre 0 y 50 que correspondan a la serie. valor de retorno: entradas: parmetros: procedimiento: iniciar con 0 y 1, pues la serie, por definicin, empieza con estos valores. mientras (siguienteTrmino < 50) muestre siguienteTrmino. temporal = siguienteTrmino. siguienteTrmino += anterior. anterior = temporal. Cdigo en java:
import java.util.*; public class Fibonacci { public static void main(String args[]) { generarNmeros(); } public static void generarNmeros(){

int anterior = 0, temporal = 0; int siguienteTrmino = 1; System.out.println(anterior); while (siguienteTrmino < 50) { System.out.println(siguienteTrmino); temporal = siguienteTrmino; siguienteTrmino += anterior; anterior = temporal; } } }

Problema: Suponga que se desea elaborar un programa que calcule e imprima los valores de la serie de Fibonnacci, menores que cincuenta. Los nmeros pares deben ir marcados con un asterisco. Anlisis: Salidas. Nmeros, entre cero y cincuenta, que correspondan a la serie. Los pares irn acompaado de un asterisco. Esta salida es repetitiva. Entradas. Procedimiento. mtodo main: +main(String[ ]):void salidas: valor de retorno: entradas: parmetros: procedimiento: llamar al mtodo generarNmeros() mtodo generarNmeros: +generarNmeros():void salidas: Los nmeros entre 0 y 50 que correspondan a la serie, los pares irn marcados con un asterisco. valor de retorno: entradas: parmetros: procedimiento: iniciar con 0 y 1, pues la serie, por definicin, empieza con estos valores mientras (siguienteTrmino < 50) si (siguienteTrmino es par). muestre siguienteTrmino + '*'. sino muestre siguienteTrmino + ' '. temporal = siguienteTrmino. siguienteTrmino += anterior. anterior = temporal. Cdigo en java:
import java.util.*; public class FibonacciConParesResaltados {

Ejercicios Resueltos:

public static void main(String args[]) { generarNmeros(); } public static void generarNmeros(){ int anterior = 0, temporal = 0; int siguienteTrmino = 1; char signo = '*'; System.out.println(anterior+" "+signo); while (siguienteTrmino < 50) { signo = (siguienteTrmino % 2 == 0) ? '*' : ' '; System.out.println(siguienteTrmino+" "+signo); temporal = siguienteTrmino; siguienteTrmino += anterior; anterior = temporal; } } }

Problema: Se necesita saber el valor total de los libros que hay en una librera, se sabe que el valor de un libro se calcula multiplicando el nmero de pginas por 100. Si la edicin no es nacional o el libro fue editado este ao se le aplica un recargo, al valor obtenido, del 10%. No se sabe cuntos libros hay en la librera. Anlisis: Salidas. mensaje que indique el valor total de los libros. Esta salida es nica. Entradas mientras (haya ms libros) La entrada es repetitiva. el nmero de pginas del libro. tipo de edicin (nacional o extranjero). si el libro fue editado este ao o no. Procedimiento. mtodo main: +main(String[ ]):void salidas: valor de retorno: entradas: parmetros: procedimiento: llamar al mtodo gestinLibros() mtodo gestinLibros: +gestinLibros():void salidas: Mensaje que indique el valor total de los libros. valor de retorno: entradas: para cada libro: pginas, edicin, ao. parmetros: procedimiento: mientras (haya ms libros) leer las entradas. valor = calcularBase(pginas) si la edicin es extranjera o si el libro fue editado este ao valor += recargo(valor) total += valor.
4

preguntar si hay ms libros. mostrar El valor total de los libros es: +total. mtodo calcularBase: +calcularBase(int):double salidas: valor de retorno: valor base del libro entradas: parmetros: nmero de pginas del libro. procedimiento: retorne pginas * 100 mtodo recargo: +recargo(double):double salidas: valor de retorno: valor del recargo entradas: parmetros: valor base del libro. procedimiento: retorne valor * 0.1 Cdigo en java:

import java.util.Scanner.*; public class ValorDelLibro { public static void main (String arg[] ) { gestinLibros(); } public static void gestinLibros(){ 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 pginas"); int nmeroDePginas = lector.nextInt (); System.out.println("Digite (1) si es edicin nacional \n(2) si es extranjera"); int nacional = lector.nextInt (); System.out.println("Digite (1) si es edicin de este ao \n(2) si es de otro ao"); int ao = lector.nextInt (); valor = calcularBase(nmeroDePginas); if ((nacional == 2) || (ao == 1)) { valor += recargo(valor); } valorTotal += valorDelLibro; System.out.println(" Hay ms libros ?"); respuesta =lector.nexLine ().charAt(0); } System.out.println ("El valor total de los libros es "+valorTotal); } public static double calcularBase(int pginas){ return pginas * 100; } public static double recargo(double base){ return base* 0.1; } }

Problema: Se necesita sumar los nmeros pares entre un valor cualquiera, digitado por el usuario, y 100. Anlisis: Salidas. total obtenido al realizar la suma. Entradas valor inicial. Procedimiento. mtodo main: +main(String[ ]):void salidas: valor de retorno: entradas: parmetros: procedimiento: llamar al mtodo sumar() mtodo sumar: +sumar():void salidas: El resultado de la suma. valor de retorno: entradas: El nmero a partir del cual se debe sumar parmetros: procedimiento: pedir el nmero 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. Cdigo en java:
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 nmero 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);

} 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

nmeros naturales, siempre y cuando el primero sea mayor o igual al segundo. La forma de calcular el combinatorio de dos nmeros naturales es: nmeroUnoCnmeroDos = nmeroUno! / ((nmeroUno-nmeroDos)! * nmeroDos!) Tenga en cuenta: El signo de admiracin a la derecha de un nmero indica que se trata de su factorial. El factorial de un nmero se calcula multiplicando desde 1 hasta el nmero, incluido. Por ejemplo: 3! = 1 * 2 * 3 = 6 El factorial de cero es 1, por definicin.

Anlisis: Salidas.

Entradas.

Procedimiento.

Cdigo en java:

2. Se le ha encomendado la labor de elaborar un programa que le permita a un nio

estudiar las tablas de multiplicar. Las condiciones que se le han puesto son: se le debe preguntar la tabla de qu nmero va a estudiar. las tablas van desde uno (1) hasta doce (12). si el nio se equivoca debe drsele 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 mquina, 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 cul es la censura de la pelcula (para todos, mayores de 12 aos o mayores de 18 aos), adems el valor de la entrada. Una persona puede ingresar si no han entrado ms de 30 personas, que es la capacidad mxima 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 mquina debe mostrar un mensaje que indique cuntas personas ingresaron y cul fue la edad promedio de los espectadores.

3.3

Instruccin do while (condicin).

Esta instruccin indica que un bloque de instrucciones debe ejecutarse mnimo una vez y mientras que la condicin siga siendo vlida. Equivaldra a comentar en una conversacin 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 mnimo una capa de pintura y despus 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 instruccin do while (condicin), cuya sintaxis se presenta a continuacin: do { /** En este espacio debe ir el bloque de cdigo que se requiere se ejecute, al menos una vez, y siga ejecutndose mientras la condicin se cumpla. */ } while (condicin); 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, tambin depende de la cantidad de instrucciones que se quiera incluir en la instruccin. Sigue siendo vlido el que las instrucciones contenidas en esta instruccin conforman un bloque de cdigo, y su comportamiento es idntico a los casos ya mencionados. la condicin debe ir entre parntesis, despus del while, e inmediatamente despus de la ltima de las instrucciones que conforman el bloque a repetir. Aqu tambin se requiere condicin, o sea no es posible dejar los parntesis vacos. La condicin se maneja exactamente igual que en los casos anteriores. si la condicin no se cumple cuando se llega al do, las instrucciones contenidas en el bloque se ejecutarn una vez, puesto que la condicin se verifica DESPUS de la primera ejecucin del bloque.
Los bloques de cdigo, en java, estn delimitados por las llaves, as que si se define una variable dentro del bloque de cdigo demarcado por la instruccin do while (condicin), esta variable NO puede utilizarse en la condicin, pues la condicin se encuentra por fuera del bloque de cdigo.

Problema: Se necesita un programa que muestre, por pantalla, los primeros 100 nmeros pares. Adems se necesita que cumpla con el siguiente formato: si adems de par es mltiplo de cuatro, al lado del nmero debe aparecer la palabra 'cuatro'.

Ejercicios Resueltos:

si es par y mltiplo de cinco, al lado del nmero debe aparecer la palabra 'cinco'. si es par y mltiplo de cuatro y de cinco, al lado del nmero debe aparecer la palabra 'ambos'. Anlisis: Salidas. Mensaje que muestre los nmeros. Esta salida es repetitiva. Entradas Procedimiento. mtodo main: +main(String[ ]):void salidas: valor de retorno: entradas: parmetros: procedimiento: llamar al mtodo nmeros() mtodo nmeros: +nmeros():void salidas: los nmeros, con el smbolo que corresponda valor de retorno: entradas: parmetros: procedimiento: asignar al contador 1 como valor inicial hacer nuevoPar = contador++ * 2. mensaje = asignaMensaje(nuevoPar) Mostrar nuevoPar y mensaje mientras (contador < 100) mtodo asignaMensaje: +asignaMensaje(int):String salidas: valor de retorno: el mensaje que debe mostrarse junto al nmero entradas: parmetros: el nmero que define el mensaje a mostrar procedimiento: si el residuo de dividir el nmero entre 4 es 0 y el residuo de dividir el nmero entre 5 es 0 retorne ambos si el residuo de dividir el nmero entre 4 es 0 retorne cuatro si el residuo de dividir el nmero entre 5 es 0 retorne cinco retorne Cdigo en java:

import java.util.Scanner.*; public class ParesConMensaje { public static void main(String arg[]) {

10

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 nmeros en forma aleatoria. Los nmeros deben estar entre 1 y 10. El usuario jugar a adivinar el nmero, y cuando lo logre, el programa deber decirle cuntos intentos necesit. Anlisis: Salidas: Mensaje que muestre cuntos intentos hizo. Entradas Los nmeros. Esta entrada es repetitiva. Procedimiento. mtodo main: +main(String[ ]):void salidas: valor de retorno: entradas: parmetros: procedimiento: generar el nmero en forma aleatoria llamar al mtodo jugar(nmero) mtodo jugar: +jugar(int):void salidas: el nmero de intentos que el usuario requiri para adivinar el nmero. valor de retorno: entradas: parmetros: el nmero que debe adivinar procedimiento: hacer pedir un nuevoNmero; contar intento si nuevoNmero es igual a nmero mostrar el mensaje.

11

mientras (nmero != nuevoNmero) Cdigo en java:


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 nmero en forma aleatoria. Random generador = new Random(); int nmero = generador.nextInt(10000); nmero %= 10; nmero++; jugar(nmero); } public static void jugar(int nmero){ int contador = 0, nuevoNmero; do { contador++; System.out.println("Digita un nmero entre 1 y 10"); nuevoNmero = lector.nextInt(); if (nuevoNmero = nmero) { System.out.println("Lo lograste, al " + contador + " intento"); } } while (nmero != nuevoNmero); } }

Problema: Se necesita un programa que defina si una palabra es palndromo1 o no. Anlisis: Salidas. mensaje que indique si la palabra es o no palndromo. Entradas la palabra a evaluar. Procedimiento. mtodo main: +main(String[ ]):void salidas: valor de retorno: entradas: parmetros: procedimiento: pedir la palabra a evaluar es = palndromo(palabra) si es palndromo mostrar mensaje La palabra es palndromo sino mostrar mensaje La palabra NO es palndromo mtodo palndromo: +palndromo(String):boolean salidas: valor de retorno: valor boolean que indica si la palabra es o no palndromo entradas:
1

Palabra o frase que se lee igual de izquierda a derecha, que de derecha a izquierda. Segn el Diccionario de la Lengua Espaola. Vigsima segunda edicin. 12

parmetros: 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 Cdigo en java:
import java.util.Scanner.*; public class Palndromo { 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 = palndromo(palabra); if (es) { System.out.println(La palabra es palndromo); } else { System.out.println(La palabra NO es palndromo); } public static boolean palndromo(String palabra){ int contadorUno = 0; // debe investigar que hace length() !!

int contadorDos = palabra.length() - 1; boolean palndromo = true; do { // debe investigar que hacer charAt(valor entero) !

if (palabra.charAt(contadorUno) != palabra.charAt(contadorDos)) { System.out.println("No es palndromo"); palndromo = false; } contadorUno++; contadorDos--; } while (contadorUno < contadorDos && palndromo); return true; } }

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

Ejercicios Propuestos:

de los n primeros nmeros primos.

13

Anlisis: Salidas.

Entradas.

Procedimiento.

Cdigo en java:

14

2. Un equipo de ftbol est en problemas, as que sus dueos han decidido que seguirn

sostenindolo si el promedio de las calificaciones de sus jugadores, despus 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 mnimo debe pedir once calificaciones y mximo 14. 3. Los dueos del mismo equipo de ftbol le han pedido un nuevo programa, que les permita decidir si un jugador sigue en el equipo o no. Al terminar cada torneo se evala el desempeo de los jugadores teniendo en cuenta el promedio de sus calificaciones en los partidos que jug, el nmero de tarjetas amarillas y rojas que recibi y la cantidad de partidos en que jug como titular. Y los requisitos para que contine en el equipo son: El promedio de sus calificaciones debe ser superior a 5.5 Las tarjetas amarillas no pueden ser ms de 5 y las rojas no pueden ser ms 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 informacin se digitar partido a partido.

3.4

Instruccin for (inicializacin ; condicin ; incremento).

Esta instruccin es ligeramente diferente a las otras, en el sentido de que no se limita a dar una condicin, sino que permite dar un valor inicial, y una forma de incremento, con lo cual se simplifica la programacin. Dado que combina tres acciones en un solo paso, no es fcil pensar en una situacin de la vida real que pueda ser asociada a ella. Empieza con la tabla del uno, sigue hasta la del 10, aprendiendo cada da 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, adems es claro que cada da debe aprender la del siguiente nmero. En java se cuenta con la instruccin for(inicializacin ; condicin ; incremento), cuya sintaxis se presenta a continuacin: for (inicializacin ; condicin ; incremento) { /** En este espacio debe ir el bloque de cdigo que se requiere se ejecute mientras la condicin 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 inicializacin, debe tenerse en cuenta que puede trabajar con cualquiera de los tipos de datos numricos, incluidos los reales. Adems puede hacerse la definicin de la variable y su inicializacin o puede slo hacerse la inicializacin. Es decir que los siguientes bloques de cdigo son correctos: declara e inicializa : for (int contador = 0 ; ... ; ... ) {
15

... } slo inicializa : double contador; ... for (contador = 0 ; ... ; ... ) { ... } tambin es importante tener presente que no se est limitado a una variable, pueden definirse e inicializarse tantas como se requiera, la nica restriccin es que a todas debe hacrseles lo mismo: o todas se declaran, del mismo tipo, e inicializan o todas se han declarado previamente, y pueden ser de tipos diferentes, y slo se inicializan. Es decir que los siguientes bloques de cdigo son correctos: declara e inicializa : for (int contador = 0, nmero = 8 ; ... ; ... ) { /** ni contador, ni nmero pueden haber sido declaradas por fuera de este bloque, pues generar error diciendo que esas variables ya existen.*/ ... } slo inicializa : double contador; int nmero; ... for (contador = 0, nmero = 8 ; ... ; ... ) { ... } si se decide utilizar la parte de la condicin, deben tenerse en cuenta que la condicin puede estar asociada a la variable o variables que se manejaron en la parte de la inicializacin. Sin embargo esto NO es necesario. En otras palabras la condicin puede estar construida a partir de valores completamente independientes a los trabajados en la parte de inicializacin. Igualmente la condicin puede ser simple o compleja, o sea puede ser una condicin, o varias unidas con los operadores y (& &&) y o (| ||) Es decir que los siguientes bloques de cdigo son correctos: tiene condicin, pero omite la inicializacin; boolean cierto = true; ... for (; cierto ; ...) { // seguir en el ciclo mientras la variable cierto no cambie de valor. ... } utiliza la parte de inicializacin, pero no tiene en cuenta esa variable en la condicin : boolean cierto = true;

16

... for (int contador = 0 ; cierto ; ...) { ... } utiliza la parte de inicializacin, y trabaja con esa variable en la condicin: 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 cdigo son correctos: completamente independiente : boolean cierto = true; double nmero = 0; ... for (int contador = 0 ; cierto ; nmero += 2 ) { ... } relacin con lo que se inicializ : boolean cierto = true; ... for (int contador = 0 ; cierto ; contador++ ) { ... } relacin con lo que se inicializ y con la condicin: double contador; ... for (contador = 0 ; contador < 10 ; contador++ ) { ... } al iniciar la ejecucin del for, y su bloque de cdigo asociado, se realiza lo que aparezca en la parte de inicializacin, despus se evala la condicin y se pasa a ejecutar las instrucciones contenidas en el bloque de cdigo. Una vez se ha concluido la ejecucin del bloque, se ejecuta lo que corresponde a la parte del incremento e inmediatamente despus se evala, de nuevo, la condicin. Se contina as mientras la condicin se siga cumpliendo. As podemos concluir que la inicializacin se ejecuta una sola vez, la revisin de la condicin y el incremento se continan realizando mientras la condicin siga siendo cierta. Si la primera vez que se llega al for, al evaluar la condicin esta no se cumple, las instrucciones contenidas en l no se ejecutarn ni una vez. nuevamente el uso de las llaves depende de la cantidad de instrucciones que se quiera incluir en l.

17

en este caso sigue siendo vlido el concepto de bloque de cdigo, es decir que las variables definidas en este bloque, sern desconocidas fuera de l, incluidas las que sean definidas en la parte de inicializacin. la inicializacin, condicin e incremento que van entre parntesis y separados con punto y coma, son opcionales tal como se ha visto hasta ahora. O sea que es posible dejar que los parntesis 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 nmero, en forma aleatoria, entre 1 y 10. El usuario jugar a adivinarlo, pero slo tiene 5 oportunidades, ni una ms. Anlisis: Salidas. Si el usuario adivin, un mensaje que lo indique y muestre cuntos intentos hizo; de lo contrario un mensaje que muestre que perdi. Entradas El nmero, esta entrada puede repetirse hasta cinco veces. Procedimiento. mtodo main: +main(String[ ]):void salidas: valor de retorno: entradas: parmetros: procedimiento: generar el nmero en forma aleatoria llamar al mtodo jugar(nmero) mtodo jugar: +jugar(int):void salidas: el nmero de intentos que el usuario requiri para adivinar el nmero. valor de retorno: entradas: parmetros: el nmero que debe adivinar procedimiento: encontr = falso desde 1, hasta cinco o hasta que lo encuentre, aumentando de uno en uno pedir nuevoNmero. si nuevoNmero es igual a nmero muestre mensaje: Lo encontr al + contador+ intento. encontr = verdadero si no lo encontr mostrar mensaje indicando que perdi.

18

Cdigo en java:
import java.util.Scanner.*; import java.util.*; public class Adivine { public static void main(java.lang.String[] args) { Random generador = new Random(); int nmero = generador.nextInt(10000); nmero %= 10; nmero++; jugar(nmero); } public static void jugar(int nmero){ Scanner lector = new Scanner(System.in); boolean encontr = false; int contador, nuevoNmero; for (contador = 0;(contador < 5 && !encontr); contador++) { System.out.println("Digita un nmero entre 1 y 10"); nuevoNmero = lector.nextInt(); if (nuevoNmero == nmero) { System.out.println("Lo lograste, al " + (contador + 1) + " intento"); encontr = true; } } if (!encontr) { System.out.println(" Perdiste !.\nEl nmero era: "+nmero); } } }

Problema: El cuadrado de un nmero se obtiene al sumar tantos nmeros impares como indique el nmero. 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 mtodo para calcular el cuadrado de cualquier nmero entero que el usuario digite. Anlisis: Salidas. El cuadrado del nmero. Entradas El nmero. Procedimiento. mtodo main: +main(String[ ]):void salidas: valor de retorno: entradas: parmetros: procedimiento: leer la entrada. si el nmero es menor que 0
19

multiplquelo por -1. llamar al mtodo cuadrado(nmero) mtodo cuadrado: +cuadrado(int):void salidas: el cuadrado del nmero valor de retorno: entradas: el nmero parmetros: procedimiento: desde 1 hasta nmero, aumentando contador de uno en uno e impar de dos en dos acumular el impar calculado. mostrar el valor que obtuvo. Cdigo en java:

import java.util.Scanner.*; public class Cuadrado { public static void main(String[] args) { Scanner lector = new Scanner(System.in); System.out.println("A qu nmero desea encontrarle el cuadrado?"); int nmero; int unNmero = lector.nextInt(); if (unNmero < 0) { unNmero *= -1; } cuadrado(unNmero); } public static void cuadrado (int nmero) { int acumulador, impar, contador; for (contador=1, acumulador=0, impar=1; contador<=nmero; contador++, impar+= 2) { acumulador += impar; } System.out.println("El cuadrado de " + unNmero + " 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 palndromo. Se debe revisar omitiendo espacios en blanco y las tildes; por ejemplo, dbale 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 cuatro nmeros diferentes, comprendidos entre uno y cincuenta. Un usuario intentar adivinarlos y tendr seis oportunidades para cada nmero, pero si hace los seis intentos y no acierta el nmero, el programa debe terminar e informarle que perdi. Los nmeros de la serie deben ser generados por su programa en forma aleatoria, y no es necesario que el usuario los adivine en orden.

20

3.5

Matrices.

Cuando se present el tema de arreglos, captulo uno seccin 11, se dijo que este era un tipo de datos que poda contener otros datos, organizados mediante una estructura dada. Al revisar esta definicin se afirma que los datos que es posible almacenar en arreglos pueden pertenecer a cualquiera de los grupos de datos que maneja el lenguaje, independiente de que se trate de valores o de datos referenciados. Hasta el momento se ha trabajado con arreglos que contienen valores pertenecientes a los tipos bsicos; con datos pertenecientes a String, que es uno de los dos tipos de datos referenciados que se conocen; pero no se ha intentado trabajar un arreglo pidindole que contenga el otro tipo de dato referenciado: los arreglos. Java permite que un arreglo contenga otros arreglos, y si todos estos arreglos tienen la misma longitud, entonces se comporta como una matriz. As que si, por ejemplo, se quisiera definir una matriz de dimensiones 5x4 (5 filas, 4 columnas), que contenga valores enteros; en realidad se definira un arreglo de 5 posiciones, cada una de las cuales contendr un arreglo de enteros de 4 posiciones, y el cdigo requerido para ello sera:
int[ ][ ] matriz = new int[5][4];

lo cual permitira obtener algo similar a esto:

0 0 0 0 0

0 0 0 0 0

0 0 0 0 0

0 0 0 0 0

Para hacer referencia a una casilla debe darse el nombre de la matriz, el nmero de la fila, entre corchetes, y el nmero de la columna, tambin entre corchetes; esto es as bien sea que se quiera asignar un valor a la casilla u obtener el valor contenido en ella. Por ejemplo, si en la matriz del ejemplo anterior, se quisiera asignar 1 a la casilla que ocupa la fila 0 y la columna 1, el cdigo requerido para ello sera:
matriz[0][1] = 1;

y si a una variable entera se le quisiera asignar el valor contenido en la casilla que est en la fila 3, columna 0, sera:
int variable = matriz[3][0] = 1;
21

Problema: Se necesita un programa que defina una matriz de enteros, que tenga cinco filas y cuatro columnas, despus se quiere que quede llena con los nmeros del 0 al 9, y si es necesario volver a empezar, haga. Es decir algo as: 0 4 8 2 6 1 5 9 3 7 2 6 0 4 8 3 7 1 5 9

Ejercicio Resuelto.

Anlisis: Salidas. La matriz que se pide. Entradas Procedimiento. mtodo main: +main(String[ ]):void salidas: valor de retorno: entradas: parmetros: procedimiento: llamar al mtodo llenarMatriz() mtodo llenarMatriz: +llenarMatriz():void salidas: valor de retorno: entradas: parmetros: procedimiento: definir la matriz crear un contador que empiece en 0. desde filas = 0, hasta 4, aumentando de uno en uno desde columnas = 0, hasta 3, aumentando de uno en uno asignar a la casilla[fila][columna] el valor del contador e incremntelo si el contador es igual a 10 dle el valor de 0. mostrarMatriz(matriz) mtodo mostrarMatriz: +mostrarMatriz(int[] []):void salidas: la matriz llena de la forma indicada valor de retorno: entradas: la matriz que se debe mostrar parmetros: procedimiento:
22

desde filas = 0, hasta 4, aumentando de uno en uno desde columnas = 0, hasta 3, aumentando de uno en uno mostrar la casilla[fila][columna] cambiar de lnea Cdigo en java:
import java.util.Scanner.*; public class LlenarMatriz { public static void main(java.lang.String[] args) { llenarMatriz(); } public static void llenarMatriz(){ int matriz[][] = new int[5][4]; int contador = 0; for (int fila = 0; fila < 5; fila++) { for (int columna = 0; columna < 4; columna++) { matriz[fila][columna] = contador++; if (contador == 10) { contador = 0; } } } mostrarMatriz(matriz); } public static void mostrarMatriz(int[][] matriz){ for (int fila = 0; fila < 5; fila++) { for (int columna = 0; columna < 4; columna++) { System.out.print(matriz[fila][columna] + " "); } System.out.println(" "); } } }

Ejercicios Propuestos:
1. Qu salida produce el siguiente cdigo?
import java.util.*; public class Matriz { public static void main(java.lang.String[] args) { Scanner lector = new Scanner(System.in); int matriz[][] = new int[5][5]; for (int fila = 0; fila < 5; fila++){ for (int columna = 0; columna < 5; columna++){ matriz[fila][columna] = fila*columna; if (matriz[fila][columna] < 10) { System.out.print (" "+matriz[fila][columna]+" "); } else { System.out.print (" "+matriz[fila][columna]+" "); } } System.out.println(); } } }

Salida.

23

2. Se requiere una clase ejecutable, en java, que permita crear una matriz de

dimensiones filas x columnas, donde filas y columnas son valores enteros dados por el usuario; y que llene cada casilla con el producto de la fila por la columna que dicha casilla ocupa. 3. Elaborar una clase ejecutable, en java, la cual permita crear una matriz cuadrada, es decir el nmero de las filas es igual al nmero de las columnas, y la llene de acuerdo al siguiente patrn:
0 1 2 4 7 0 0 3 5 8 0 0 0 6 9 0 0 0 0 10 0 0 0 0 0

4. Elaborar una clase ejecutable, en java, la cual permita crear una matriz cuadrada, y la

llene de acuerdo al siguiente patrn:


0 0 0 0 5 0 0 0 4 0 0 0 3 0 0 0 2 0 0 0 1 0 0 0 0

5. Elaborar una clase ejecutable, en java, la cual permita crear una matriz cuadrada, y la

llene de acuerdo al siguiente patrn:


1 0 6 0 11 0 4 0 9 0

2 0 7 0 12

0 5 0 10 0

3 0 8 0 13

6. Elaborar una clase ejecutable, en java, la cual permita crear una matriz cuadrada, y la

llene de acuerdo al siguiente patrn:


1 10 11 20 21 2 9 12 19 22

3 8 13 18 23

4 7 14 17 24

5 6 15 16 25

7. Dada una matriz de dimensiones filas x columnas, verificar si la matriz es simtrica . 8. Dada una matriz cuadrada, de dimensiones digitadas por el usuario, elaborar una

clase ejecutable, en java, que intercambie las diagonales.

Una matriz es simtrica si se cumplen las siguientes condiciones: a) filas = columnas b) Matriz(fila,columna) = Matriz(columna,fila) para 0 <= fila < filas y 0 <= columna < columnas

24