#11 - ESTRUCTURAS REPETITIVAS
Definición: Una estructura repetitiva nos permite trabajar en ciclos, es decir, en intérvalos de tiempo. Cuando trabajamos con estructuras repetitivas, podemos contrar la duración de un ciclo y definir qué hacer durante la duración de éste. Ésta estructura es muy útil cuando deseamos hacer procesos largos que del modo normal (secuencial) fueran muy largos y redundantes. El propósito de una estructura repetitiva es repetir un bloque de código mientras una condición sea verdadera.
1. TIPOS DE ESTRUCTURAS REPETITIVAS1.1 WHILE (mientras)En el bucle while, la condición se controla por una variable de control, que en éste caso es llamado centinela.
El centinela es una variable que controlará el ciclo de vida del bucle y que puede ser una variable booleana, entera, etc.
Sintaxis:
mientas <condición> hacer
instrucciones
fin mientras
En Java
while (<condición>) {
// instrucciones
}
1.2 DO WHILE (hacer mientras)Al igual que el bucle while, la condición se controla con un centinela; por el contrario, éste bucle primero ejecuta las instrucciones y luego evalúa la expresión. Ésto es útil cuando queremos que sí o sí primero se ejecuten unas instrucciones y luego evalúe alguna condición.
Sintaxis:
Pseudocódigo:
hacer
<instrucciones>
mientras (<condición>)
Java:
do {
// instrucciones
} while(<condición>);
1.3 FORUna estructura repetitiva for se utiliza para realizar un proceso durante un ciclo del cual tenemos conocimiento de su fin. Consta de 3 partes:
- variable de control: es la variable que controla la condición del bucle.
- condición: es la expresión que for evaluará antes de cada iteración y que pone un límite al bucle.
- aumento/decremento: es el aumento o decremento de la variable de control. Es importante ésta parte ya que si no fijamos un incremento o decremento, la condición nunca terminará.
Sintaxis:
Pseudocódigo:
para i <- x hasta n hacer incremento i+1 hacer
<instrucciones>
fin para
Java:
for(byte indice = 0; indice < 10; indice++) {
// instrucciones
}
2. ¿Cuándo utilizar while, do while y for?
2.1 CUÁNDO USAR WHILEUsaremos while cuando las instrucciones que ejecutará puede que no se ejecuten ninguna vez si la condición es falsa. Por ejemplo:
System.out.println("¿Desea ingresar datos? S/N");
char seguir = reader.next().charAt(0); // centinela
while(seguir == 'S') {
String nombre;
System.out.println("Ingrese su nombre");
nombre = reader.nextLine();
System.out.println(nombre);
System.out.println("¿Desea seguir? S/N");
char = reader.next().charAt(0);
}
En éste caso, el bucle puede nunca ejecutarse (si el usuario ingresa N).
2.2 CUÁNDO USAR DO WHILEUsaremos do while cuando queramos que al menos una vez se ejecutarán las instrucciones. Por ejemplo:
char seguir; // centinela
do {
String nombre;
System.out.println("Ingrese su nombre");
nombre = reader.nextLine();
System.out.println(nombre);
System.out.println("¿Desea seguir? S/N");
char = reader.next().charAt(0);
} while(seguir == 'S');
2.3 CUÁNDO USAR FORUsaremos for cuando sabemos de antemano cuántas veces iterará el bucle. Por ejemplo:
System.out.println("¿Cuántos usuarios desea guardar");
byte maximoUsuarios = reader.nextByte();
for(byte indice = 0; indice < maximoUsuarios; indice++) {
// proceso
}
En el ejemplo anterior, el bucle interará las veces que el usuario ha ingresado. Si el usuario ingresa 10, el bucle iterará 10 veces.
3.EJERCICIOS EN CLASE
En una empresa se requiere calcular el salario semanal de cada uno de los n obreros que laboran en ella. El salario se obtiene de la siguiente forma:
Si el obrero trabaja 40 horas o menos se le paga $20 por hora.
Solución:
Análisis1. Objetivo
Se desea calcular el salario semanal de cada obrero de acuerdo a los parámetros dados:
Si trabaja 40 horas o menos, se le paga $20/h.
Si trabaja más de 40 horas, se le paga lo mismo por las primeras 40h y $25 por cada hora extra.
2. Precondiciones
Que existan empleados y que hayan trabajado.
3. Desarrollo
Pedirle al usuario los nombres de los empleados y sus horas trabajadas.
Por cada empleado, mostrarle su salario de acuerdo a los parámetros fijados.
> Datos importantes:
Entrada:
- Nombre del empleado.
- Horas trabajadas.
Proceso:
- Tarifa por hora normal y por hora extra.
- Salario.
Salida:
Diagrama de flujo:

Código:
package org.underc0de.curso;
import java.util.Scanner;
/**
*
* @author Gustavo
*/
public class Repetitivas {
public static void main(String[] args) {
final byte THORA_NORMAL = 20;
final byte THORA_EXTRA = 25;
Scanner reader = new Scanner(System.in);
byte numeroEmpleados;
System.out.println("¿Cuántos empleados desea ingresar?");
numeroEmpleados = reader.nextByte();
reader.nextLine(); // libera el fin de línea (enter)
for(byte actual=1; actual<=numeroEmpleados; actual++) {
String nombre;
byte horasTrabajadas;
short salarioNeto;
System.out.println("Ingrese el nombre del empleado");
nombre = reader.nextLine();
System.out.println("Ingrese las horas trabajadas");
horasTrabajadas = reader.nextByte();
if(horasTrabajadas <= 40) {
salarioNeto = (short) (horasTrabajadas * THORA_NORMAL);
} else {
byte horasExtras;
short horasNormales;
short salarioBase;
short salarioExtra;
horasExtras = (byte) (horasTrabajadas - 40);
horasNormales = (short) (horasTrabajadas - horasExtras);
salarioBase = (short) (horasNormales * THORA_NORMAL);
salarioExtra = (short) (horasExtras * THORA_EXTRA);
salarioNeto = (short) (salarioBase + salarioExtra);
}
System.out.println("El salario del empleado "+nombre+" es "+salarioNeto+"\n\n");
reader.nextLine(); // libera el final de línea (enter)
}
}
}
La razón por la que hacemos (short) es porque, por defecto Java devuelve las operaciones aritméticas como int. Entonces, dado que las variables son short, hay una pérdida de precisión y debemos convertir ese int a short. Si no desean hacer ésto, simplemente declaren todo como int.
Cuando ingresas un número y das enter, el enter (fín de línea) ingresado queda en memoria, es por ésta razón que cuando llamamos a nextLine() luego de leer un número, el nextLine() lee el enter ingresado anteriormente porque ha quedado en memoria y se salta. Para evitar ésto debemos liberar el enter llamando a nextLine() luego de leer un número y antes de leer un texto.
4. EJERCICIOS PROPUESTOS
1. Leer 10 números e imprimir solamente los números positivos.
2. Leer 20 números e imprimir cuantos son positivos, cuantos negativos y cuantos neutros
3. Imprima la suma de todos los números pares que van del 1 al 100 y diga cuántos hay.
Glosariobucle, loop: estructura repetitiva (while, do while y for).
centinela: variable que controla el ciclo de vida de un bucle.