Sentencias de repetición Programación. Objetivos Implementar control con repeticiones en un...

Post on 02-Feb-2016

252 views 0 download

Transcript of Sentencias de repetición Programación. Objetivos Implementar control con repeticiones en un...

Sentencias de repetición

Programación

Objetivos• Implementar control con repeticiones en un programa usando sentencias while

• Implementar control con repeticiones en un programa usando sentencias do-while

• Implementar control con repeticiones en un programa usando sentencias for

• Anidar la sentencia de control de repetición de un bucle dentro de otra sentencia de repetición

• Elegir la sentencia de control de repetición adecuada para una tarea determinada

• Preguntar al usuario por una respuesta de tipo si-no usando el AnswerBox

• Formatear los datos de salida usando la clase Format del paquete javabook

Introducción

Las sentencias de repetición controlan un bloque de código para que se ejecute un número fijo de veces o hasta que se cumple una determinada condición.

En java existen tres tipos de ciclos:

while, do-while, for

La sentencia while

La sintaxis de la sentencia while es:

while (<expresión booleana>)

<sentencias>

int suma = 0, numero = 1;

while (numero <= 20) {

suma = suma + numero;

numero = numero + 1;

}

SentenciaCuerpo del bucle

Expresión booleana

Diagrama de flujo

numero<= 20

suma = suma + numero;numero = numero + 1;

int suma = 0; numero = 1;

verdadero

falso

Valores de las variables en el ciclo

numero: 1 suma= 1numero: 2 suma= 3numero: 3 suma= 6numero: 4 suma= 10numero: 5 suma= 15numero: 6 suma= 21numero: 7 suma= 28numero: 8 suma= 36numero: 9 suma= 45numero: 10 suma= 55

numero: 11 suma= 66numero: 12 suma= 78numero: 13 suma= 91numero: 14 suma= 105numero: 15 suma= 120numero: 16 suma= 136numero: 17 suma= 153numero: 18 suma= 171numero: 19 suma= 190numero: 20 suma= 210

Producto de impares

int producto = 1, numero = 1, contador = 20, ultimoNumero;

ultimoNumero = 2 * contador -1;

while (numero <= ultimoNumero) {

producto = producto * numero;

numero = numero + 2;

}

Diagrama de flujo

numero<= ultimoNumero

producto = producto * numero;numero = numero + 2;

int producto = 0; numero = 1;contado = 20;

ultimoNumero = 2*contador -1

verdadero

falso

Ciclos controlados por centinela

int edad;

edad = entrada.getInteger("Su edad entre 0 y 130 : ");

while (edad < 0 || edad > 130) {

System.out.pritnln("Se ha introducido una edad inválida.“ +"intentelo de nuevo."); edad = entrada.getInteger("Su edad entre 0 y 130 : ");

}

Lee la edad de una persona entre 0 y 130.

Diagrama de flujo

edad < 0 || edad > 130?

verdadero

falso

Se ha introducido una”edad inválida.

inténtelo de nuevo.

edad

edad

Ciclos controlados por centinela

int suma = 0, numero;

numero = entrada.getInteger(“Teclee un entero : ");

while (numero >= 0) {

suma = suma + numero;

System.out.println("suma = "+suma);

numero = entrada.getInteger("Teclee un entero : ");

}

Lee enteros y calcula la suma hasta que se teclea un número negativo

Tarea

1. Escriba una sentencia while que sume los números del 10 al 50.

2. Escriba un lazo while que sume los cuadrados de los número del 1 al 40.

3. Escriba una sentencia while para calcular el promedio de un conjunto de valores. La entrada de datos deberá terminar con un valor negativo, ¿es un bucle controlado por contador o por centinela? Debe tener un contador del número de valores que se introducen.

Ciclos infinitos

Cuando la condición de un ciclo while es siempre verdadera, se tiene un ciclo infinito.

byte contador = 1;

while (contador != 10){

contador++;

contador++;

}

float contador = 0.0f;

while (contador != 1.0f)

contador = contador + 0.3333333f;

}

float contador = 0.0f;

while (contador != 1.0f)

contador = contador + 0.33333333f;

}

float contador = 0.0f;

while (contador <= 1.0f)

contador = contador + 0.3333333f;

}

float contador = 0.0f;

while (contador <= 1.0f)

contador = contador + 0.25f;

}

Error de fuera por uno OBOE

int contador = 1;

while (contador < 10)

...

contador++;

}

int contador = 0;

while (contador <= 10)

...

contador++;

}

OBOE corregido

int contador = 0;

while (contador < 10)

...

contador++;

}

int contador = 1;

while (contador <= 10)

...

contador++;

}

Comprobaciones en las sentencias de control de repetición

1. Asegúrese de que el cuerpo del bucle contiene una sentencia que hará terminar al bucle en algún momento.

2. Asegúrese de que el bucle se repite exactamente un número correcto de veces.

3. Se quiere ejecutar el cuerpo del bucle N veces, entonces inicie el contador a 0 y use la condición de prueba contador < N o inicie el contador a 1 use la condición de prueba contador <= N.

Preguntas rápidas1. ¿Cuál de los siguientes es un bucle infinito?

a. int suma = 0, i = 0; while (i >= 0){ Suma += i; i++; }

b. int suma = 0, i = 100; while (i != 0){ Suma += i; i--; }

2. Para cada una de las siguientes sentencias de lazo, determine el valor de la suma después de que se haya ejecutado el lazo. a. int contador = 0,suma = 0; while (contador < 10){ suma += contador; contador++; }b. int contador = 1,suma = 0; while (contador <= 30){ suma += contador; contador += 3; }c. int contador = 0,suma = 0; while (contador < 20){ suma += 3*contador; contador += 2; }

La sentencia do-while

La sintaxis de la sentencia do-while es:

do

<sentencias>

while (<expresión booleana>);

int suma = 0, numero = 1;

do {

suma += numero;

numero++;

} while (numero <= 20);

SentenciaCuerpo del bucle

Expresión booleana

Diagrama de flujo

numero<= 20

suma += numero;numero++;

int suma = 0; numero = 1;

verdadero

falso

Lazo con centinela

int edad;do { edad = entrada.getInteger( "Su edad entre 0 y 130 : "); if(edad < 0 || edad> 130) System.out.prinln("Se ha introducido”+ ” una edad inválida." + "intentelo de nuevo.");

} while (edad < 0 || edad> 130);

Condición complejaEl bucle termina cuando se reciba el valor centinela 0, cuando se introduzca un número par o cuando la suma sea mayor que 100.

suma = 0;do { num = entrada.getInteger(“teclee un entero:”); if(num == 0)// centinela mensaje.show(“suma = “+suma); else if(num % 2 ==0)// número par mensaje.show(“Error: número par”); else{ suma += num; if(suma>100)//mayor que 100 mensaje.show(“Suma > 100”); }} while(!(num % 2 == 0 || num == 0 || suma > 100));

La condición anterior se puede expresar como sigue haciendo uso de la equivalencia: !(a || b) <==> !a && !b

(num % 2 != 0 && num != 0 && suma <= 100);

boolean repetir = true;

suma = 0;do { num = entrada.getInteger(“teclee un entero:”); if(num == 0){ // centinela mensaje.show(“suma = “+suma); repetir = false; } else if(num % 2 ==0){ // número par mensaje.show(“Error: número par”); repetir = false; } else{ suma += num; if(suma>100)//mayor que 100 mensaje.show(“Suma > 100”); repetir = false; }} while(repetir);

Preguntas rápidas1. Escriba una sentencia do-while para calcular la suma de los primeros 30 enteros positivos e impares.

2. Reescriba los siguientes bucles while como bucles do-whilea. int contador = 0, suma = 0; while(contador < 10){ suma += contador; contador++; }b. int contador = 1, suma = 0; while(contador <= 30){ suma += contador; contador += 3; }

La sentencia forLa sintaxis de la sentencia for es:

for(<inicio>; <expresión booleana>; <incremento>)

<sentencia>

for( i = 0 ; i < 20 ; i++ ){

numero = entrada.getInteger();

suma += numero;

}

inicioExpresión booleana

Incremento

Sentencia

Diagrama de flujo

i = 0;

i < 20

numero = entradagetInteger();suma += numero;

i++;

verdadero

falso

<Inicio>

<Expresiónbooelana>

<Sentencia>

<incremento>

Cálculo del factorial

SimpleInput entrada = new SimpleInput();

int n, contador;float producto = 1;

n = entrada.getInteger(" Teclee un entero ");

for(contador = 1; contador <= n; contador++) { producto = producto * contador; System.out.println("numero: " + contador + " producto= " + producto);}

System.out.println("El factorial es " + producto);

El factorial de n se define como: n! = 1*2*3...*(n-1)*n

Caída libreSe deja caer un objeto desde una altura H, la posición P del objeto en el instante t esta dada por,

P = –16t2 + H

El instante en que toca el suelo se encuentra haciendo P = 0 en la ecuación anterior y es igual a

t = (H/16)

Programadouble alturaInicial, posicion,tiempoContacto;SimpleInput entrada = new SimpleInput();

alturaInicial = entrada.getDouble(" Altura inicial: ");tiempoContacto = Math.sqrt(alturaInicial/16.0);System.out.println( " Tiempo t posicion en el instante t ");

for(int instante=0;instante<tiempoContacto;instante++){ posicion = -16.0*instante*instante+alturaInicial; System.out.pritnln(" " + instante+" " + posicion);}System.out.println(tiempoContacto + " 0.00");

Declaración dentro del for

El elemento inicio del for se pueden declarar variables:

for(int i = 0; i < 10; i++)

En lugar de

int i

for(i = 0; i < 10; i++)

for(int i=0; i<100; i+=5) // i = 0, 5, 10, ...

for(int j=2; j<40; j*=2) // j = 2, 4, 8, 16, 32

for(int k=100; k>0; k--) // k = 100, 99, 98, ...

Los incrementos pueden ser por cualquier valor.

Preguntas rápidas1. Escriba un bucle for para calcular:

a. La suma de 1, 2, ..., 100

b. La suma de 2, 4, ..., 500

c. El producto de 3, 5, 7, ..., 25

2. Reescriba los siguientes bucles while usando sentencias for,

a. int contador = 0, suma = 0; while(contador < 10){ suma += contador; contador++; }b. int contador = 1, suma = 0; while(contador <= 30){ suma += contador; contador += 3; }

Preguntas rápidas

Escriba sentencias for, do-while y while para calcular las siguientes sumas y productos

a. 1 + 3 + 7 + ...+ (220 -1)

b. 1 + 1/2 + 1/3 + ... + 1/20

c. 1*2 + 2*3 + 3*4 + ... + 19*20

d. 1 x 2 x 4 x 8 x ... x 220

Lazos anidadosEs posible tener una lazo dentro de otro. A esto se le llama anidamiento.

int precio=100;salida.printLine(" 5 10 15 20 25");for(int ancho = 11; ancho <= 20; ancho++) { salida.print(ancho + " "); for(int longitud = 5; longitud <= 25; longitud+=5){ salida.print(" " + precio); } salida.skipLine(1);}

Tabla de multimplicarstatic public void main(String[] args){ MainWindow ventana = new MainWindow(); OutputBox salida = new OutputBox(ventana); ventana.show(); salida.setTitle("Tabla de multiplicar"); salida.show(); salida.printLine(" 1 2 3”+ “ 5 6 7 8 9 10"); for(int i = 1; i <= 10; i++) { salida.print(i + " "); for(int j = 1; j <= 10; j++){ salida.print(" " + i*j); } salida.skipLine(1); }}

Preguntas rápidas

1. ¿Cuál será la suma después de ejecutar los siguientes for anidados?a. Int suma = 0; for(int i=0; i<5; i++){ suma = suma + i; for(int j=0; i<5; j++){ suma = suma + j; }

b. Int suma = 0; for(int i=0; i<5; i++){ suma = suma + i; for(int j=i; i<5; j++){ suma = suma + j; }

El juego alto bajo

Escriba una aplicación que permita jugar Alto-Bajo con el usuario.

Se generarán números secretos aleatorios entre 1 y 100.

Cuando el usuario propone un número, el programa responde Alto o Bajo dependiendo si es mayor o menor que el número secreto.

El número máximo de intentos es 6.

algoritmoGenerar número secreto

num

num != secreto &&intentos != 6?

intentos = 0

intentos = intentos + 1

num == secreto?

FalloAcerto

inicio

fin

V V FF

num>secreto?

num<secreto? Alto

Bajo

VF

V

F

Tarea1. Escriba un método que devuelva true si el argumento es un número primo.

2. Utilizando el método del problema 1 escriba un método que liste todos los primos entre 1 y N , donde N es tecleado por el usuario.

3. Una terna de números a, b, c es cuadrada perfecta si a2 + b2 = c2. Por ejemplo, 3, 4, 5 es una terna cuadrada perfecta. Escriba un programa para obtener todos las ternas cuadradas perfectas entre 1 y N, donde N es tecleado por el usuario. El programa no deberá repetir ternas, es decir, la terna 3, 4, 5 es la misma que la terna 4, 3, 5, y deberá imprimirse una sola vez.