ciclos por profesora lillian bras. ciclos un ciclo es una estructura de control para repetir una o...
TRANSCRIPT
CICLOSpor Profesora Lillian Bras
Ciclos
Un ciclo es una estructura de control para repetir una o más instrucciones.
Se le llama cuerpo del ciclo al grupo de instrucciones que se repiten.
La ejecución del cuerpo del ciclo es controlada por una expresión lógica.
Ciclos…
La evaluación de la expresión lógica puede estar antes o después del cuerpo del ciclo.
Los ciclos que tienen la evaluación de la expresión lógica antes del cuerpo se conocen como “pre-test loops” y los que la tienen después se conocen como “post test loops”.
“Pre-Test Loops” en Java
For Controlado por contador
While Controlado por contador o evento (respuesta o sentinela).
4
Flujograma de Ciclo while
statement(s)true
booleanexpression?
false
statement(s)true
booleanexpression
false
Ciclo while
La sintáxis del ciclo while es como sigue:while(condition) { //loop body statements;}
Como puede ver la condición es evaluada al principio, antes de ejecutar el cuerpo del ciclo.
Al evaluar la condición, si ésta es cierta, se ejecuta el cuerpo del ciclo y si es falsa, se procede a la siguiente instrucción después del ciclo.
Decimos que un while se ejecuta de 0 a n veces ya que cabe la posibilidad que la primera vez la condición sea falsa y el ciclo no se ejecute ni siquiera una vez.
Display‘*’
x=1
x<=10 x = x +1True
False
Un ejemplo de while
// En Java
int x = 1;
while (x <= 10) {
System.out.println(‘*’);
x = x + 1;
}
Un ciclo que no se ejecuta
El siguiente es un ejemplo de un ciclo que se ejecuta 0 veces:
int x = 1;
while(x >= 10) {
System.out.println(‘*’);
x = x + 1;
}
El cuerpo del ciclo nunca se ejecuta ya que la condición es falsa la primera vez que se evalúa.
Ciclos...
La mayor parte de las veces la condición que se utiliza para controlar un ciclo depende del valor de una variable y a ésta la llamamos variable de control.
Para que un ciclo sea diseñado correctamente debemos: Inicializar la variable de control correctamente
antes del ciclo Usar una expresión lógica adecuada para evaluar
la variable de control Actualizar la variable de control dentro del ciclo.
En Java…
int x = 1; //Inicialización de variable de control: xwhile(x < = 10) //Evaluación de la variable de control
{
System.out.println(‘*’);x = x + 1; //Actualización de la variable de
control
}
Ciclos controlados por un contador
Cuando el cuerpo se debe repetir un número específico de veces decimos que el ciclo está controlado por un contador.
En este caso la variable de control trabaja contando las veces que se ejecuta el ciclo.
Ciclos Infinitos Si dentro del ciclo no hay una instrucción que logre que en algún
momento la condición sea falsa, tendremos un ciclo infinito.
Por ejemplo si en el ejercicio anterior olvidamos incrementar x, ocurre un ciclo infinito:
int x = 1;while (x <= 10) { System.out.println(‘*’);} // La x SIEMPRE será menor o igual a 10
Si se nos olvidan las llaves como en el siguiente ejemplo podemos obtener un ciclo infinito:
int x = 1; while (x <= 10) System.out.println(‘*’); x = x + 1; // Esta instrucción NO es parte del ciclo
Enunciados en bloque en los ciclos
Como usted ya sabe, las llaves se utilizan para agrupar un número de instrucciones para que sean ejecutadas en bloque.
Igual que en los if, en el ciclo while solo hace falta las llaves si el cuerpo del ciclo contiene mas de una instrucción.
Esto implica que si se olvida incluir las llaves y queríamos que se ejecutaran más de una instrucción como cuerpo del ciclo, sólo se va a ejecutar una.
Flujograma para acumular la suma de 10 números usando ciclo controlado por contador
count = 1
count<=10 Display”Enter a number: ”
Getnum
sum = sum + num
count=count+1
T
F
sum = 0.0
…en Java
//Ejemplo para sumar 10 números entrados
// por el teclado
Scanner keyboard = new Scanner(System.in);
double num, sum = 0.0;
int count = 1;
while (count <= 10) {
System.out.print("Enter a number: ");
num = keyboard.nextDouble();
sum = sum + num;
count = count + 1;
}
System.out.println("The sum is: " + sum);
Acumuladores de suma…
Un acumulador de suma es una variable donde se van sumando valores utilizando la suma anterior.
La variable que se va a usar para acumular la suma se tiene que inicializar en 0 o el primer valor a ser sumado.
La instrucción que logra este proceso es una instrucción de asignación donde la variable que acumula aparece en los dos lados del operador de asignación. Por ejemplo:
sum = sum + num;
En Java podemos usar el operador compuesto de += para acumular. Por ejemplo:
sum += num;
ValidaciónEl proceso de asegurarse que el usuario entre un dato válido se conoce como validación.
Validación…
num < 0 Display“Enter a positive number: ”
Display“Invalid number.”
Display“Enter a positive number: ”
Get num
Get num
T
F
En Java
System.out.print("Enter a positive number: ”);number = keyboard.nextInt();
// Validate the input.while ( number < 0 ) { System.out.println("Invalid number.”); System.out.print("Enter a positive number: "); number = keyboard.nextInt();}
Otro Ejemplo de Validación de datos
Ejemplo en Java
System.out.print("Enter a number in the " + "range of 1 through 100: ");number = keyboard.nextInt();
// Validate the input.while (number < 1 || number > 100) { System.out.println("That number is invalid."); System.out.print("Enter a number in the " + "range of 1 through 100: "); number = keyboard.nextInt();}
Ciclo controlado por variable lógica (Flag)
//Ciclo controlado por banderacountGoodReadings = 0;int thisBP;boolean isSafe = true; // Inicialización de bandera
while (isSafe) { System.out.print("Enter blood pressure “); thisBP = keyboard.nextInt();
if (thisBP >= 200) isSafe = false; //Actualizar bandera else countGoodReadings++;}
Ciclo controlado por respuesta
respuesta ==‘S’Or
respuesta ==‘s’
Display “¿Tiene un dato para entrar?”
Get respuesta
Entrar y procesar Dato
Get respuesta
False
True
Display “¿Tiene otro dato para entrar?”
Ciclo controlado por respuesta
Se le pregunta al usuario antes de la entrada de cada dato si tiene algún dato para entrar.
Duplica la entrada de datos ya que antes de cada dato hay que entrar una respuesta de S o Y además del dato.
La variable de control es de tipo caracter pues es la variable donde se recoge la respuesta.
Ciclos controlados por un evento
Cuando algún suceso durante la ejecución del cuerpo del ciclo debe lograr la terminación del mismo decimos que es un ciclo controlado por un evento.
Un ejemplo de este tipo de ciclo es el ciclo controlado por un valor centinela.
Centinela
Centinela: valor en la lista de datos que indica el final de la entrada de datos.
Debe ser un valor que no pueda confundirse con un valor real, pero del mismo tipo.
Debe informarse al usuario cual es el valor que va a usarse como centinela.
Se utiliza cuando no se puede determinar cuantos datos se van a entrar o leer.
Ciclo Controlado Por Centinela
Requiere una lectura(input) antes del ciclo (priming read)
Requiere una lectura(input) dentro del ciclo, al final del cuerpo.
Ejemplo de la Técnica del Centinela:Leer y sumar una cantidad indefinida demedidas de presión sanguínea
int total = 0;int thisBP;Scanner keyboard = new Scanner(System.in);
//Inicialización de la variable de control por lecturaSystem.out.print(“Enter a blood pressure or -1 to stop: ”);thisBP = keyboard.nextInt(); // Lectura primaria while (thisBP != -1) // Evaluación para centinela{ total = total + thisBP; System.out.print(“Enter a blood pressure or -1” + “to stop: ”); thisBP = keyboard.nextInt(); // Lectura de actualización}
System.out.print(“El total de las presiones “ + “sanguineas entradas es : “ + total);
Otro ciclo : for El ciclo for evalúa la condición antes de ejecutar el cuerpo del ciclo,
por esto es también un “pretest loop”.
Este tipo de ciclo le permite al programador inicializar la variable de control, evaluar la condición y actualizar la variable de control en la misma línea( el encabezado del for).
Típicamente la variable de control de un for es un contador.
Este ciclo es equivalente a la estructura de un ciclo while controlado por un contador.
La sintáxis del for es la siguiente:for(initialization; test; update) {
statement(s);}
Los tres componentes del for
Inicialización La sección de inicialización permite que el ciclo
inicialize su propia variable de control. Después de esta va un punto y coma. Las variables declaradas en esta sección solo pueden
ser utilizadas dentro del for. Está permitido inicializar mas de una variable en esta
sección.
La segunda sección es la de la evaluación de la variable de control del for. De ser esta falsa el cuerpo del for no se ejecuta, igual que en el caso del while.(Después de esta sección también va un punto y coma.)
Los tres componentes del for…
Actualización La última sección o componente es la actualización de
la variable de control Esta sección se utiliza típicamente para incrementar o
decrementar los contadores declarados en la sección de inicialización.
Esta sección se ejecuta al final, después del cuerpo y antes de regresar a evaluar la variable de control.
En esta sección también se pueden actualizar múltiples variables
Se debe evitar el actualizar la variable de control dentro del cuerpo del ciclo, para esto está la sección de actualización en el encabezado del for.
Flujograma del for
Cuerpo del ciclotrueEvaluación de la
variable de control
false
Actualización de la variable de control
Inicialización devariable de control
for (inicializacion; evaluación; actualización) {
// cuerpo del ciclo
}
Ejemplo de For
public class UserSquares {
public static void main(String[] args) {
int number; // Loop control variable
int maxValue; // Maximum value to display
Scanner keyboard = new Scanner(System.in);
System.out.println("I will display a table of numbers" +
" and their squares.");
System.out.print("How high should I go? ");
maxValue = keyboard.nextInt();
System.out.println("Number Number Squared");
System.out.println("-----------------------");
for (number = 1; number <= maxValue; number++) {
System.out.println(number + "\t\t“ + number * number);
}
}
}
Otro ejemplo de for…
public class TotalSales { public static void main(String[] args) { int days; // The number of days double sales; // A day's sales figure double totalSales; // Accumulator String input; // To hold the user's input
DecimalFormat dollar = new DecimalFormat("#,##0.00");
// Get the number of days. input = JOptionPane.showInputDialog("For how many days do you have " + "sales figures?"); days = Integer.parseInt(input);
totalSales = 0.0; // Set the accumulator to 0.
// Get the sales figures and calculate a running total. for (int count = 1; count <= days; count++) { input = JOptionPane.showInputDialog("Enter the sales for day " + count + ": "); sales = Double.parseDouble(input); totalSales += sales; // Add sales to totalSales. }
// Display the total sales. JOptionPane.showMessageDialog(null, "The total sales are $" + dollar.format(totalSales)); System.exit(0); }}
Ciclos anidados
Igual que podemos anidar los if’s también podemos anidar los ciclos.
Ciclos anidados significa que hay un ciclo dentro de otro, cuando esto sucede el ciclo interior se ejecuta completo( todas sus iteraciones) para cada iteración del ciclo exterior.
El siguiente es un ejemplo de ciclos for anidados:
for(int i = 1; i < = 5; i++) { System.out.println(“i: ” + i); System.out.print(“j: ”); for(int j = 1; j < = 3 ; j++) System.out.print(j); System.out.println(); }
Fíjese que, por cada vez que se ejecuta el cuerpo del ciclo externo, se ejecuta 3 veces el cuerpo del ciclo interno.
Las instrucción de break y continue
La instrucción de break termina por completo con la ejecución de un ciclo en forma anormal.
El uso del break rompe con las normas y mecanismos adecuados para controlar un ciclo y no se considera una forma adecuada de terminar un ciclo.
La instrucción continue ocasiona que se termine la ejecución de la iteración del ciclo que se está llevando acabo y que se continúe con la siguiente iteración.
Igual que sucede con la instrucción break, puede hacer que el código sea mas difícil de entender y depurar por esto es aconsejable limitar su uso a situaciones muy particulares.
Ciclo do-while
La estructura de repetición do-while es un ejemplo de ciclo “post-test” .
En este tipo de ciclo, el cuerpo se ejecuta y luego se evalúa la condición.
La sintáxis en java para este tipo de ciclo es como sigue:do {
statement(s);} while (condition);
Note el punto y coma después de los paréntesis y la llave de cerrar antes de la palabra while
Flujograma de ciclo do-while
Cuerpo del ciclo
ciertoEvaluación de
condición
falso
Ejemplo de técnica de respuesta con do - while
public class TestAverage1{ public static void main(String[] args) { int score1, score2, score3; // Three test scores double average; // Average test score char repeat; // To hold 'y' or 'n' System.out.println("This program calculates the " + "average of three test scores.");
// Create a Scanner object for keyboard input. Scanner keyboard = new Scanner(System.in);
// Get as many sets of three test scores as the user wants.do { // Get the three test scores in this set. System.out.print("Enter score #1: "); score1 = keyboard.nextInt(); System.out.print("Enter score #2: "); score2 = keyboard.nextInt(); System.out.print("Enter score #3: "); score3 = keyboard.nextInt(); // Calculate and print the average test score. average = (score1 + score2 + score3) / 3.0; System.out.println("The average is " + average); System.out.println();
// Does the user want to average another set? System.out.println("Would you like to average " + "another set of test scores?"); System.out.print("Enter Y for yes or N for no: "); repeat = keyboard.next.charAt(0); } while (repeat == 'Y' || repeat == 'y'); }}
Recuerde el punto y coma
Validación : while versus do-while
do { System.out.print("Enter number in the range of 1 through 100: "); number = keyboard.nextInt();
if (number < 1 || number > 100) System.out.println("That number is invalid.");} while (number < 1 || number > 100);
System.out.print("Enter number in the range of 1 through 100: ");number = keyboard.nextInt();
while (number < 1 || number > 100) { System.out.println("That number is invalid."); System.out.print("Enter number in the range of 1 through 100: ”); number = keyboard.nextInt();}
Usando while:
Usando do-while:
Qué tipo de ciclo usar while
Use siempre que quiera cubrir la posibilidad de que el ciclo no se ejecute si la condición es falsa de entrada
Si va a usar la técnica del centinela Puede usarse con técnica de respuesta Puede usarse para validar datos entrados
do-while Use siempre que quiera que el ciclo se ejecute por lo
menos una vez Ideal para técnica de menú Puede usarse con técnica de respuesta Puede usarse para validar datos entrados
for Use siempre que sepa la cantidad de veces que quiere
que se ejecute el ciclo o que le pueda preguntar al usuario la cantidad de datos que va a procesar