Sentencias de Repeticion
-
Upload
kenyi-figueroa -
Category
Technology
-
view
3.329 -
download
6
Transcript of Sentencias de Repeticion
Clase 6
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
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.
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;
number = number + 1;
}
System.out.print(“La Suma es: “ + suma);
Estas sentencias son ejecutadas mientras que la variable number sea menor o igual que 100
Estas sentencias son ejecutadas mientras que la variable number sea menor o igual que 100
5
Sintaxis para la sentencia while while ( <expresión booleana> ) {
<sentencia 1><sentencia 1><sentencia n> }
while ( number <= 100 ) {
sum = sum + number;
number = number + 1;
}
Sentencias(loop body)
Sentencias(loop body)
Expresión Booleana Expresión Booleana
6
Flujo de Control while
int sum = 0, number = 1int sum = 0, number = 1
number <= 100 ?number <= 100 ?
falsesum = sum + number;
number = number + 1;
sum = sum + number;
number = number + 1;
true
7
Mas EjemplosSigue sumando números 1, 2, 3, …hasta que la variable sum sea mayor a 1,000,000.
Sigue sumando números 1, 2, 3, …hasta que la variable sum sea mayor a 1,000,000.
Calcula el producto de los 20 primeros enteros
Calcula el producto de los 20 primeros enteros
int sum = 0, number = 1;
while ( sum <= 1000000 ) {
sum = sum + number;
number = number + 1;
}
11
int producto = 1, numero = 1, contador = 20, ultimoNumero;
ultimoNumero = 2 * contador - 1;
while (numero <= ultimoNumero) {
producto = producto * numero;
numero = numero + 2;
}
22
8
Encontrando el Maximo Comun Divisor
Aproximación directa
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;}
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;}
Solución mas eficiente
10
Ejemplo: Probando datos de ingreso
String inputStr;
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);
}
Primera lecturaPrimera lectura
Segunda lecturaSegunda lectura
11
Operadores cortos utiles
suma = suma + numero; suma += numero;Es equivalente a
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;
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
13
Loop Error #1 - Loop Infinito
int contador = 1;
while ( contador != 10 ) {
contador = contador + 2;
}
22
int producto = 0;
while ( producto < 500000 ) {
product = product * 5;
}
11 Error Estas sentencias se ejecutaran por siempre. La expresion boolena nunca será falsa.Para solucionar el problema producto debe inicializarse en 1
Error Estas sentencias se ejecutaran por siempre. La expresion boolena nunca será falsa.Para solucionar el problema producto debe inicializarse en 1
Error La expresión boolena nunca sera falsa.Para solucionar el problema count debe ser inicializado en 1
Error La expresión boolena nunca sera falsa.Para solucionar el problema count debe ser inicializado en 1
14
Loop Error #2 – error por uno Objetivo : Ejecute el cuerpo del loop 10 veces
count = 1;
while ( count < 10 ){
. . .
count++;
}
11
count = 0;
while ( count <= 10 ){
. . .
count++;
}
33
count = 1;
while ( count <= 10 ){
. . .
count++;
}
22
count = 0;
while ( count < 10 ){
. . .
count++;
}
44
11 33 y exiben el error por uno.
15
La sentencia do-while
int sum = 0, number = 1;
do {
sum = sum + number;
number++;
} while ( sum <= 100 );
Estas sentencias son ejecutadas hasta que la variable sum sea menor o igual que 100
Estas sentencias son ejecutadas hasta que la variable sum sea menor o igual que 100
16
Sintaxis do-while
do {
sum = sum + number;
number++;
} while ( sum <= 100 );
do
<sentencias>
while ( <expresion booleana> ) ;
Sentencias(loop body)
Sentencias(loop body)
Expresion booleanaExpresion booleana
17
Flujo de Control do-while
int sum = 0, number = 1int sum = 0, number = 1
sum = sum + numbernumber++;
sum = sum + numbernumber++;
sum <= 100sum <= 100true
false
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.
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.");}
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.
21
Bucle: Sentencia break (1/4)int i = 1;int sum = 0;while (sum < 20) { sum += i; ++i;}System.out.println("sum is " + sum);System.out.println("i is " + i);
sum is 21i is 7
int i = 1;int sum = 0;while (sum < 20) { sum += i; if (sum % 2 == 0) break; ++i;}System.out.println("sum is " + sum);System.out.println("i is " + i);
sum is 6i is 3
22
Bucle: Sentencia break (2/4)int i = 1;int sum = 0;while ( true ) { sum += i; if (sum > 10) break; ++i;}System.out.println("sum is " + sum);System.out.println("i is " + i);
sum es 15i es 5
Note: Sin el break, es un bucle infinito!
Trate de evitar el uso de break, a menos que sea necesario.
int i = 0;int sum = 0;while (sum <= 10) { ++i; sum += i;}System.out.println("sum is " + sum);System.out.println("i is " + i);
23
Bucle: Sentencia break (3/4)Random number = new Random();int i;
while (true) { i = number.nextInt(100); System.out.println("i is " + i); if (i >= 80) break;}
i is 43i is 2i is 12i is 95
Random class will be discussed later.
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) { int b = 1; while (b < 5) { System.out.println("a is " + a + ", b is " + b); if (b == 2) break; ++b; } ++a;}
a is 1, b is 1a is 1, b is 2a is 2, b is 1a is 2, b is 2a is 3, b is 1a is 3, b is 2a is 4, b is 1a is 4, b is 2
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.
26
Bucle: Sentencia continue(2/2)int i = 0;
while (i <= 6) { ++i; if (i == 3) continue; System.out.println("i is " + i);}
i is 1i is 2i is 4i is 5i is 6i is 7
int i = 1;int sum = 0;while (sum < 20) { sum += i; if (sum % 2 == 0) continue; ++i;}System.out.println("sum is " + sum);System.out.println("i is " + i);
sum is 23i is 6
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.
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 48Next random number is 14Next random number is 89Next random number is 7Next random number is 44
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);
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);}
Adicional
Preguntas de Examen
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?
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. 9B. 15C. 69D. 123E. 168
34
La sentencia for
int i, sum = 0, number;
for (i = 0; i < 20; i++) {
number = scanner.nextInt( );
sum = sum + number;
}Estas sentencias son ejecutadas 20 veces ( i = 0, 1, 2, … , 19).
Estas sentencias son ejecutadas 20 veces ( i = 0, 1, 2, … , 19).
Utilizamos for cuando sabemos cuantas veces se va a realizar la repetición
35
Syntax sentencia for
for ( i = 0 ; i < 20 ; i++ ) {
number = scanner.nextInt();
sum = sum + number;
}
for ( <inicializacion>; <expresion booleana>; <incremento> ){
<sentencias>
}
InicializacionInicializacion Expresión Booleana
Expresión Booleana IncrementoIncremento
Sentencias(loop body)
Sentencias(loop body)
36
Control Flow of for
i = 0;i = 0;
false
number = . . . ;sum = sum + number;
number = . . . ;sum = sum + number;
true
i ++;i ++;
i < 20 ? i < 20 ?
37
i++ or ++i?
for ( i = 0; i < 20; i++ ) {
...
}
for ( i = 0; i < 20; ++i ) {
...
}
Alguna diferencia?
Aqui es lo mismo…Solo cuando es partede una expresion..si son diferentes
38
Compare for y while
for ( Init ; Expression ; Increment )
Action
Init
while ( Expression ) {
Action
Increment
}
Si realmente odian utilizar WHILEpor alguna razon….pueden reescribirla
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;
}
40
Seguimiento de la ejecución (1/12)
for (int i = 0; i < 3; ++i) {System.out.println("i es " + i);
}
System.out.println(“terminamos");
0i
41
Seguimiento de la ejecución(2/12)
for (int i = 0; i < 3; ++i) {System.out.println("i es " + i);
}
System.out.println(“terminamos");
0i
42
Seguimiento de la ejecución(3/12)
for (int i = 0; i < 3; ++i) {System.out.println("i es " + i);
}
System.out.println(“terminamos");
0i
Output:
i es 0
43
Seguimiento de la ejecución(4/12)
for (int i = 0; i < 3; ++i) {System.out.println("i es " + i);
}
System.out.println(“terminamos");
1i
Output:
i es 0
44
Seguimiento de la ejecución(5/12)
for (int i = 0; i < 3; ++i) {System.out.println("i es " + i);
}
System.out.println(“terminamos");
1i
Output:
i es 0
45
Seguimiento de la ejecución(6/12)
for (int i = 0; i < 3; ++i) {System.out.println("i es " + i);
}
System.out.println(“terminamo");
1i
Output:
i es 0i es 1
46
Seguimiento de la ejecución(7/12)
for (int i = 0; i < 3; ++i) {System.out.println("i es " + i);
}
System.out.println(“terminamos");
2i
Output:
i es 0i es 1
47
Seguimiento de la ejecución(8/12)
for (int i = 0; i < 3; ++i) {System.out.println("i es " + i);
}
System.out.println(“terminamos");
2i
Output:
i es 0i es 1
48
Seguimiento de la ejecución(9/12)
for (int i = 0; i < 3; ++i) {System.out.println("i es " + i);
}
System.out.println(“terminamos");
2i
Output:
i es 0i es 1i es 2
49
Seguimiento de la ejecución(10/12)
for (int i = 0; i < 3; ++i) {System.out.println("i es " + i);
}
System.out.println(“terminamos");
3i
Output:
i es 0i es 1i es 2
50
Seguimiento de la ejecución(11/12)
for (int i = 0; i < 3; ++i) {System.out.println("i es " + i);
}
System.out.println(“terminamos");
3i
Output:
i es 0i es 1i es 2
51
Seguimiento de la ejecución(12/12)
for (int i = 0; i < 3; ++i) {System.out.println("i es " + i);
}
System.out.println(“terminamos");
3i
Output:
i es 0i es 1i es 2terminamos
Utilzar siempre i dentro del loop
52
Mas ejemplos
for (int i = 0; i < 100; i += 5)11
i = 0, 5, 10, … , 95 i = 0, 5, 10, … , 95
for (int j = 2; j < 40; j *= 2)22
j = 2, 4, 8, 16, 32 j = 2, 4, 8, 16, 32
for (int k = 100; k > 0; k--) )33
k = 100, 99, 98, 97, ..., 1k = 100, 99, 98, 97, ..., 1
53
Factorial Definition:
int nFactorial = 1;
for (int i = 2; i <= n; ++i) {
nFactorial *= i;
}
1 if 2 1
0 if1!
nn
nn
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?
55
For anidados Es cuando utilizamos un for dentro de otro for.
56
57
Generando la Tabla
int precio;
for (int ancho = 11; ancho <=20, ancho++){
for (int largo = 5, largo <=25, largo+=5){
precio = ancho * largo * 19; //$19 x metro cuadrado System.out.print (" " + precio);
}
//finalizada una fila se va a la siguiente
System.out.println("");
}
INN
ER
OU
TE
R
58
For anidados (1/2)for (int i = 0; i < 3; ++i) {
System.out.println("i is " + i);
for (int j = 0; j < 4; ++j) {System.out.println(" j is " +
j);}
}
i is 0 j is 0 j is 1 j is 2 j is 3i is 1 j is 0 j is 1 j is 2 j is 3i is 2 j is 0 j is 1 j is 2 j is 3
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?
60
Fin Clase 6