2. Clase 6: Sentencias de
Repetición
Después de haber estudiado este capítulo usted podrá:
Implementar sentencias de repetición en su programa utilizando
while, do-while y for.
Implementar sentencias de repetición utilizando: while, do-while y
for.
Implementar sentencias de control genéricas
Realizar sentencias de repetición anidadas
Elegir la sentencia de repetición adecuada según el problema
Generar números aleatorios
Lograr que el usuario interactúe con la máquina en una sesión
SI-NO para continuar ejecutando el programa
2
3. Definición
Las sentencias de repetición son un bloque de
código que son ejecutadas por un cierto número de
veces hasta que se cumpla una condición.
Repeticiones controladas por contador: terminan la
ejecución del bloque después que este ha sido
ejecutado por un número de veces determinado
Repeticiones controladas por centinela: termina la
ejecución del bloque después que un valor diseñado
como centinela ha sido encontrado.
Las sentencias de repetición son llamadas LOOP o
BUCLE.
3
4. Sentencia while
//este programa realiza la suma de los 100 primeros
números
int sum = 0, number = 1;
while ( number <= 100 ) {
sum = sum + number;
Estas sentencias son
Estas sentencias son
ejecutadas mientras que
ejecutadas mientras que
la variable number sea
la variable number sea
number = number + 1; menor ooigual que 100
menor igual que 100
}
System.out.print(“La Suma es: “ + suma);
4
5. Sintaxis para la sentencia while
while ( <expresión booleana> ) {
<sentencia 1>
<sentencia 1>
<sentencia n> }
Expresión Booleana
Expresión Booleana
while ( number <= 100 ) {
sum = sum + number;
Sentencias
Sentencias
(loop body)
(loop body) number = number + 1;
}
5
6. Flujo de Control while
int sum = 0, number = 1
int sum = 0, number = 1
number = number + 1;
sum = sum + number;
number = number + 1;
sum = sum + number;
number <= 100 ?
number <= 100 ?
false
true
6
7. Mas Ejemplos
Sigue sumando
1
1 int sum = 0, number = 1; Sigue sumando
números 1, 2, 3, …
números 1, 2, 3, …
hasta que la variable
hasta que la variable
while ( sum <= 1000000 ) { sum sea mayor aa
sum sea mayor
1,000,000.
1,000,000.
sum = sum + number;
number = number + 1;
}
2
2 int producto = 1, numero = 1, Calcula el producto de
Calcula el producto de
contador = 20, ultimoNumero;
los 20 primeros enteros
los 20 primeros enteros
ultimoNumero = 2 * contador - 1;
while (numero <= ultimoNumero) {
producto = producto * numero;
numero = numero + 2;
}
7
8. Encontrando el Maximo Comun Divisor
public int
mcdBruteforce(int m, int n) {
// assume m, n >= 1
int menor = Math.min(m, n);
int mcd;
int i = 1;
while (i <= menor) {
if (m%i == 0 && n%i == 0) {
mcd = i;
}
i++;
}
return mcd;
}
8
Aproximación directa
9. Encontrando el Maximo Comun Divisor
public int gcd(int m, int n) {
// no importa si n o m
// es mayor, este metodo;
// trabaja bien
//
// assume m, n >= 1
int r = n % m;
while (r != 0) {
n = m;
m = r;
r = n % m;
}
return m;
}
9
Solución mas eficiente
10. Ejemplo: Probando datos de ingreso
String inputStr;
Primera lectura
Primera lectura
int edad;
inputStr = JOptionPane.showInputDialog(null,“Su edad (entre 18 y 90):");
edad = Integer.parseInt(inputStr);
while (edad < 18 || edad > 90) {
JOptionPane.showMessageDialog(null,
“Se ingreso una edad no valida. Por favor vuelva a intentarlo");
inputStr = JOptionPane.showInputDialog(null,“Su edad (entre 18 y 90):");
edad = Integer.parseInt(inputStr);
}
Segunda lectura
Segunda lectura
10
11. Operadores cortos utiles
suma = suma + numero; Es equivalente a suma += numero;
Operador Uso Significado
+= a += b; a = a + b;
-= a -= b; a = a – b;
*= a *= b; a = a * b;
/= a /= b; a = a / b;
%= a %= b; a = a % b;
11
12. Tenga cuidado con los errores
1. Cuidado con el error “por uno”
2. Asegúrese que el cuerpo del loop contiene
sentencias que eventualmente harán que el loop
finalice
3. Si quiere ejecutar el cuerpo del loop N veces,
entonces inicialice el contador en 0 y utilice una
condicion que evalue contador <N, o inicialice el
contador en 1 y evalue contador <=N
12
13. Loop Error #1 - Loop Infinito
Error
Error
1
1 int producto = 0; Estas sentencias se
Estas sentencias se
ejecutaran por siempre.
ejecutaran por siempre.
La expresion boolena
La expresion boolena
while ( producto < 500000 ) { nunca será falsa.
nunca será falsa.
Para solucionar el
Para solucionar el
product = product * 5; problema producto debe
problema producto debe
} inicializarse en 11
inicializarse en
2
2 int contador = 1;
Error
Error
while ( contador != 10 ) { La expresión boolena
La expresión boolena
nunca sera falsa.
nunca sera falsa.
contador = contador + 2; Para solucionar el
Para solucionar el
problema count debe ser
problema count debe ser
} inicializado en 11
inicializado en
13
14. Loop Error #2 – error por uno
Objetivo : Ejecute el cuerpo del loop 10 veces
1
1 count = 1; 2
2 count = 1;
while ( count < 10 ){ while ( count <= 10 ){
. . . . . .
count++; count++;
} }
3
3 count = 0; 4
4 count = 0;
while ( count <= 10 ){ while ( count < 10 ){
. . . . . .
count++; count++;
} }
1 y
1 3 exiben el error por uno.
3
14
15. La sentencia do-while
int sum = 0, number = 1;
do {
Estas sentencias son
Estas sentencias son
sum = sum + number; ejecutadas hasta que la
ejecutadas hasta que la
variable sum sea menor
variable sum sea menor
number++; ooigual que 100
igual que 100
} while ( sum <= 100 );
15
16. Sintaxis do-while
do
<sentencias>
while ( <expresion booleana> ) ;
do {
sum = sum + number; Sentencias
Sentencias
number++; (loop body)
(loop body)
} while ( sum <= 100 );
Expresion booleana
Expresion booleana
16
17. Flujo de Control do-while
int sum = 0, number = 1
int sum = 0, number = 1
sum = sum + number
sum = sum + number
number++;
number++;
true
sum <= 100
sum <= 100
false
17
18. Bucle y Control de Media Repetición
Bucle y Control de Media Repeticiόn puede ser
utilizado para evaluar la condicion de terminacion
de un bucle en medio del cuerpo del bucle.
Es implementado utilizando las palabras
reservadas while, if, and break.
18
19. Ejemplo: Bucle-y-MedioControl
String name;
while (true){
name = JOptionPane.showInputDialog(null, “Tu nombre");
if (name.length() > 0) break;
JOptionPane.showMessageDialog(null, "Ingreso no
valido." + “Debe ingresar al menos un caracter.");
}
19
20. Errores en Bucles-y-MedioControl
Ponga atenciόn en dos cosas cuando utilice
Bucles-y-MedioControl:
El peligro de un bucle infinito. La expresión booleana
del while es true, la cual siempre evaluará a true. Si
olvidamos incluir una sentencia if para romper el
bucle, terminaremos en un bucle infinito.
Multiple exit points. It is possible, although complex, to
write a correct control loop with multiple exit points
(breaks). It is good practice to enforce the one-entry
one-exit control flow.
20
21. Bucle: Sentencia break (1/4)
int i = 1;
int sum = 0;
sum is 21
while (sum < 20) {
sum += i; i is 7
++i;
}
System.out.println("sum is " + sum);
System.out.println("i is " + i);
int i = 1;
int sum = 0;
while (sum < 20) {
sum += i; sum is 6
if (sum % 2 == 0) break; i is 3
++i;
}
System.out.println("sum is " + sum);
System.out.println("i is " + i);
21
22. Bucle: Sentencia break (2/4)
int i = 1;
int sum = 0;
sum es 15
while ( true ) {
sum += i; i es 5
if (sum > 10) break;
Note: Sin el break, es
++i; un bucle infinito!
}
System.out.println("sum is " + sum);
System.out.println("i is " + i);
int i = 0;
int sum = 0; Trate de
while (sum <= 10) { evitar el uso
++i; de break, a
sum += i; menos que
} sea
System.out.println("sum is " + sum); necesario.
System.out.println("i is " + i);
22
23. Bucle: Sentencia break (3/4)
Random number = new Random();
int i;
i is 43
while (true) { i is 2
i = number.nextInt(100); i is 12
System.out.println("i is " + i); i is 95
if (i >= 80) break;
}
Random class will be discussed later.
23
24. Bucle: Sentencia break (4/4)
break causa que el control salga del bucle mas interno
en el que esta contenido..
int a = 1;
while (a < 5) { a is 1, b is 1
int b = 1; a is 1, b is 2
while (b < 5) { a is 2, b is 1
System.out.println("a is " + a
a is 2, b is 2
+ ", b is " + b);
a is 3, b is 1
if (b == 2) break; a is 3, b is 2
++b; a is 4, b is 1
}
++a; a is 4, b is 2
}
24
25. Bucle: Sentencia continue (1/2)
Algunas veces podríamos querer ir inmediatamente a
la siguiente iteracion, sin ejecutar el resto de las
sentencias en el cuerpo del bucle.
Esto puede ser realizado utilizando continue.
Como break, continue solo causa que el control
vaya a la siguiente iteracion en el bucle mas interno
que lo contiene.
25
26. Bucle: Sentencia continue(2/2)
int i = 0; i is 1
i is 2
while (i <= 6) {
++i; i is 4
if (i == 3) continue; i is 5
System.out.println("i is " + i); i is 6
} i is 7
int i = 1;
int sum = 0;
while (sum < 20) {
sum += i; sum is 23
if (sum % 2 == 0) continue; i is 6
++i;
}
System.out.println("sum is " + sum);
System.out.println("i is " + i);
26
27. Random Numbers (1/2)
Random number generation is discussed in section 3.8 of
your textbook.
We learn another way here, using the Random class.
Notes:
Need to import java.util.*;
Random( ): constructs a new random number generator
Random whose seed is based on the current time.
int nextInt(int n): returns the next pseudo-random, from the
interval [0, 1, … n-1], uniformly distributed value of a Random
object.
Refer to the API specification for the complete description of class
Random.
27
28. Random Numbers (2/2)
import java.util.*;
public class Random1 {
public static void main(String[] args) {
Random num = new Random();
for (int i=0; i<5; i++) {
System.out.println("Next random number is "
+ num.nextInt(100));
}
} Next random number is 48
} Next random number is 14
Next random number is 89
Next random number is 7
Next random number is 44
28
29. Diálogo de Confirmación
dialogo de confirmación puede ser utilizado para que el
usuario elija si quiere seguir con la ejecución del programa
o no.
JOptionPane.showConfirmDialog(null,
/*prompt*/ "Play Another Game?",
/*dialog title*/ "Confirmation",
/*button options*/ JOptionPane.YES_NO_OPTION);
29
30. Ejemplo: Diálogo de Confirmación
boolean sigaJugando = true;
int seleccion;
while (sigaJugando){
//codigo que realiza un juego viene aqui
// . . .
seleccion = JOptionPane.showConfirmDialog(null,
“Quiere volver a jugar?",
"Confirmacion",
JOptionPane.YES_NO_OPTION);
sigaJugando = (seleccion ==
JOptionPane.YES_OPTION);
}
30
32. Considere el siguiente código
int i = 1;
while (i <= n) {
if (i % n == 0) {
++i;
}
}
System.out.println(i);
(a) Cual es la salida si n es 0?
(b) Cual es la salida si n es 1?
(c) Cual es la salida si n es 3?
32
33. Que retorna el siguiente método,
asumiendo que n es 12345?
public static int metodoX(int n) {
int sum = 0;
while (n > 0) {
sum += n % 100;
n /= 100;
}
return sum;
}
A. 9
B. 15
C. 69
D. 123
E. 168
33
34. La sentencia for
int i, sum = 0, number;
for (i = 0; i < 20; i++) {
number = scanner.nextInt( );
sum = sum + number;
}
Estas sentencias son
Estas sentencias son
ejecutadas 20 veces
ejecutadas 20 veces
((i i= 0, 1, 2, … , ,19).
= 0, 1, 2, … 19).
Utilizamos for cuando sabemos cuantas veces
se va a realizar la repetición
34
35. Syntax sentencia for
for ( <inicializacion>; <expresion booleana>; <incremento> ){
<sentencias>
}
Expresión
Expresión
Inicializacion
Inicializacion Incremento
Incremento
Booleana
Booleana
for ( i = 0 ; i < 20 ; i++ ) {
number = scanner.nextInt(); Sentencias
Sentencias
sum = sum + number; (loop body)
(loop body)
}
35
36. false
true
i i= 0;
= 0;
i i< 20 ?
< 20 ?
ber =
ber = . .. .. .; ;
= sum + number;
Control Flow of for
= sum + number;
++;
i i++;
36
37. i++ or ++i?
for ( i = 0; i < 20; i++ ) {
...
}
Alguna diferencia?
for ( i = 0; i < 20; ++i ) {
...
Aqui es lo mismo…
} Solo cuando es parte
de una expresion..si
son diferentes
37
38. Compare for y while
for ( Init ; Expression ; Increment )
Action
Init Si realmente odian utilizar WHILE
por alguna razon….
while ( Expression ) pueden reescribirla
{
Action
Increment
}
38
39. Sentencia while
//este programa realiza la suma de los 100
primeros numeros
int sum = 0, number = 1;
while ( number <= 100 ) {
sum = sum + number;
number = number + 1;
}
39
40. Seguimiento de la ejecución (1/12)
i 0
for (int i = 0; i < 3; ++i) {
System.out.println("i es " + i);
}
System.out.println(“terminamos");
40
41. Seguimiento de la ejecución(2/12)
i 0
for (int i = 0; i < 3; ++i) {
System.out.println("i es " + i);
}
System.out.println(“terminamos");
41
42. Seguimiento de la ejecución(3/12)
i 0
for (int i = 0; i < 3; ++i) {
System.out.println("i es " + i);
}
System.out.println(“terminamos");
Output:
i es 0
42
43. Seguimiento de la ejecución(4/12)
i 1
for (int i = 0; i < 3; ++i) {
System.out.println("i es " + i);
}
System.out.println(“terminamos");
Output:
i es 0
43
44. Seguimiento de la ejecución(5/12)
i 1
for (int i = 0; i < 3; ++i) {
System.out.println("i es " + i);
}
System.out.println(“terminamos");
Output:
i es 0
44
45. Seguimiento de la ejecución(6/12)
i 1
for (int i = 0; i < 3; ++i) {
System.out.println("i es " + i);
}
System.out.println(“terminamo");
Output:
i es 0
i es 1
45
46. Seguimiento de la ejecución(7/12)
i 2
for (int i = 0; i < 3; ++i) {
System.out.println("i es " + i);
}
System.out.println(“terminamos");
Output:
i es 0
i es 1
46
47. Seguimiento de la ejecución(8/12)
i 2
for (int i = 0; i < 3; ++i) {
System.out.println("i es " + i);
}
System.out.println(“terminamos");
Output:
i es 0
i es 1
47
48. Seguimiento de la ejecución(9/12)
i 2
for (int i = 0; i < 3; ++i) {
System.out.println("i es " + i);
}
System.out.println(“terminamos");
Output:
i es 0
i es 1
i es 2
48
49. Seguimiento de la ejecución(10/12)
i 3
for (int i = 0; i < 3; ++i) {
System.out.println("i es " + i);
}
System.out.println(“terminamos");
Output:
i es 0
i es 1
i es 2
49
50. Seguimiento de la ejecución(11/12)
i 3
for (int i = 0; i < 3; ++i) {
System.out.println("i es " + i);
}
System.out.println(“terminamos");
Output:
i es 0
i es 1
i es 2
50
51. Seguimiento de la ejecución(12/12)
3
for (int i = 0; i < 3; ++i) {
System.out.println("i es " + i);
}
System.out.println(“terminamos");
Output:
Utilzar siempre i dentro del loop i es 0
i es 1
i es 2
terminamos
51
52. Mas ejemplos
1
1 for (int i = 0; i < 100; i += 5)
i i= 0, 5, 10, … ,,95
= 0, 5, 10, … 95
2
2 for (int j = 2; j < 40; j *= 2)
j j= 2, 4, 8, 16, 32
= 2, 4, 8, 16, 32
3
3 for (int k = 100; k > 0; k--) )
k = 100, 99, 98, 97, ..., 1
k = 100, 99, 98, 97, ..., 1
52
53. Factorial
Definition:
1 if n = 0
n!=
1 × 2 × × n if n ≥ 1
int nFactorial = 1;
for (int i = 2; i <= n; ++i) {
nFactorial *= i;
}
53
54. Alcance de Variable
Considere:
int valorActual = 2;
for (int i = 0; i < 5; ++i) {
System.out.println(valorActual);
valorActual = valorActual* 2;
}
System.out.println("i is " + i);
Que muestra valor actual al final?
Que muestra i?
54
55. For anidados
Es cuando utilizamos un for dentro de otro for.
55
57. Generando la Tabla
int precio;
for (int ancho = 11; ancho <=20, ancho++){
for (int largo = 5, largo <=25, largo+=5){
INNER
OUTER
precio = ancho * largo * 19; //$19 x metro cuadrado
System.out.print (" " + precio);
}
//finalizada una fila se va a la siguiente
System.out.println("");
}
57
58. For anidados (1/2)
i is 0
for (int i = 0; i < 3; ++i) {
j is 0
j is 1
System.out.println("i is " + i);
j is 2
j is 3
for (int j = 0; j < 4; ++j) {
i is 1
System.out.println(" j is " + j);
j is 0
}
j is 1
j is 2
}
j is 3
i is 2
j is 0
j is 1
j is 2
j is 3
58
59. For anidados (2/2)
for (int i = 0; i < 3; ++i) {
System.out.println("i is " + i);
for (int j = 0; j < i; ++j) {
System.out.println(" j is " + j);
}
}
Cual es la salida?
59