Sentencias de Repeticion

Preview:

Citation preview

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

Recommended