sentencias de repeticion

60
Clase 6

Upload: kenyi-figueroa

Post on 14-Jun-2015

3.323 views

Category:

Technology


6 download

TRANSCRIPT

Page 1: Sentencias de Repeticion

Clase 6

Page 2: Sentencias de Repeticion

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

Page 3: Sentencias de Repeticion

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.

Page 4: Sentencias de Repeticion

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

Page 5: Sentencias de Repeticion

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

Page 6: Sentencias de Repeticion

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

Page 7: Sentencias de Repeticion

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

Page 8: Sentencias de Repeticion

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;}

Page 9: Sentencias de Repeticion

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

Page 10: Sentencias de Repeticion

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

Page 11: Sentencias de Repeticion

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;

Page 12: Sentencias de Repeticion

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

Page 13: Sentencias de Repeticion

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

Page 14: Sentencias de Repeticion

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.

Page 15: Sentencias de Repeticion

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

Page 16: Sentencias de Repeticion

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

Page 17: Sentencias de Repeticion

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

Page 18: Sentencias de Repeticion

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.

Page 19: Sentencias de Repeticion

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.");}

Page 20: Sentencias de Repeticion

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.

Page 21: Sentencias de Repeticion

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

Page 22: Sentencias de Repeticion

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);

Page 23: Sentencias de Repeticion

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.

Page 24: Sentencias de Repeticion

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

Page 25: Sentencias de Repeticion

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.

Page 26: Sentencias de Repeticion

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

Page 27: Sentencias de Repeticion

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.

Page 28: Sentencias de Repeticion

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

Page 29: Sentencias de Repeticion

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);

Page 30: Sentencias de Repeticion

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);}

Page 31: Sentencias de Repeticion

Adicional

Preguntas de Examen

Page 32: Sentencias de Repeticion

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?

Page 33: Sentencias de Repeticion

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

Page 34: Sentencias de Repeticion

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

Page 35: Sentencias de Repeticion

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)

Page 36: Sentencias de Repeticion

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 ?

Page 37: Sentencias de Repeticion

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

Page 38: Sentencias de Repeticion

38

Compare for y while

for ( Init ; Expression ; Increment )

Action

Init

while ( Expression ) {

Action

Increment

}

Si realmente odian utilizar WHILEpor alguna razon….pueden reescribirla

Page 39: Sentencias de Repeticion

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;

}

Page 40: Sentencias de Repeticion

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

Page 41: Sentencias de Repeticion

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

Page 42: Sentencias de Repeticion

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

Page 43: Sentencias de Repeticion

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

Page 44: Sentencias de Repeticion

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

Page 45: Sentencias de Repeticion

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

Page 46: Sentencias de Repeticion

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

Page 47: Sentencias de Repeticion

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

Page 48: Sentencias de Repeticion

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

Page 49: Sentencias de Repeticion

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

Page 50: Sentencias de Repeticion

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

Page 51: Sentencias de Repeticion

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

Page 52: Sentencias de Repeticion

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

Page 53: Sentencias de Repeticion

53

Factorial Definition:

int nFactorial = 1;

for (int i = 2; i <= n; ++i) {

nFactorial *= i;

}

1 if 2 1

0 if1!

nn

nn

Page 54: Sentencias de Repeticion

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?

Page 55: Sentencias de Repeticion

55

For anidados Es cuando utilizamos un for dentro de otro for.

Page 56: Sentencias de Repeticion

56

Page 57: Sentencias de Repeticion

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

Page 58: Sentencias de Repeticion

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

Page 59: Sentencias de Repeticion

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?

Page 60: Sentencias de Repeticion

60

Fin Clase 6