control de flujo -...

24
Java Control de Flujo H. Tejeda V [email protected] Universidad Michoacana Facultad de Ciencias F´ ısico-Matem ´ aticas Java– p. 1

Upload: others

Post on 08-Oct-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

Java

Control de Flujo

H. Tejeda V

[email protected]

Universidad Michoacana

Facultad de Ciencias Fısico-Matematicas

Java– p. 1

Page 2: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

Introduccion

• La posibilidad de controlar el orden en el que se ejecutan las sentencias,es decir, de comprobar condiciones y de ejecutar diferentes sentenciasen función del resultado de la comprobación, añade capacidad a laherramienta de programación.

• Con lo anterior es posible pasar de un programa puramente secuencial,a un programa en el cual se puedan ejecutar sólo un conjunto desentencias de acuerdo con una condición, o bien, repetir un conjunto desentencias mientras una condición se cumple.

Java– p. 2

Page 3: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

Sentencias y bloques

• Los dos tipos básicos de sentencias son: las de expresión y las dedeclaración

• Se considera al punto y coma como una sentencia que no hace nada(sentencia vacía).

• Los siguientes tipos de expresiones se pueden convertir en sentenciasañadiendo al final un punto y coma:

◦ Expresiones de asignación, ya sea con = o de la forma op= .◦ Formas de prefijo y sufijo de los operadores ++ y - .◦ Llamadas a métodos (devuelvan o no un valor).◦ Expresiones de creación de objetos – aquellas donde se usa new

para crear un objeto.

Java– p. 3

Page 4: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

Sentencias y bloques cont.

• Las sentencias de declaración de variables locales, declaran unavariable y la pueden inicializar con un valor. Estas sentencias puedenaparecer en cualquier parte dentro de un bloque.

• Las variables locales existen mientras el bloque que las contiene se estáejecutando.

• Las variables locales deben ser inicializadas antes de usarlas, ya sea aldeclararlas o mediante una asignación, si no se hace se genera un erroral compilar el código.

• Las llaves { y } , agrupan cero o más sentencias en un bloque. El bloquees una sentencia, pero compuesta.

Java– p. 4

Page 5: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

if-else

• Es la forma más básica de flujo de control condicional, ya que permiteescoger si se ejecutan las sentencias que le siguen:

if (expresion-booleana)sentencia1

elsesentencia2

• Primero se evalúa la expresión booleana. Si el valor es true se ejecutala sentencia1. Si es false y si tien la cláusula else , se ejecuta lasentencia2. else es opcional.

• Se puede realizar varias pruebas agregando un if a la cláusula else deun if previo.

public void setPropiedad(String clave, double valor)throws PropiedadDesconocida {

if ( clave.equals(" encanto ") )encanto(valor);

else if (clave.equals(" ajeno "))ajeno(valor);

elsethrow new PropiedadDesconocida(clave);

} Java– p. 5

Page 6: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

¿Que sucede si hay mas de un if sin un else ?

• public double sumaPositivo(double[] valores) {double suma = 0.0;

if (valores.length > 1)for (int i = 0; i < valores.length; i++)

if (valores[i] > 0)suma += valores[i];

else // ¡cuidado!suma = valores[0];

return suma;}

• La cláusula else parece estar asociada a la comprobación de longituddel arreglo, gracias al espejismo del sangrado, pero el compilador laasocia con el if más reciente que no tenga una.

• Para realizar la asociación correcta es necesario usar llaves para crearbloques.

Java– p. 6

Page 7: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

switch

• Permite pasar el control a un punto de entrada etiquetado en un bloquede sentencias, usando el valor de una expresión entera.

switch (expresion) {case n: sentenciascase m: sentencias. . .default:sentencias

}

• El cuerpo se conoce como bloque switch pudiendo contener sentenciasprefijadas con las etiquetas case .

• A La sentencia case se asocia una expresión entera.• Cuando el valor de la expresión coincide con el valor de una etiqueta

case , el control se transfiere a la primera sentencia que sigue a laetiqueta.

• Si no hay ninguna etiqueta case que coincida, el control se transfiere ala primera sentencia que sigue a la etiqueta default si la hubiera, si nose sale de la sentencia switch .

Java– p. 7

Page 8: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

switch – Ejemplo

Verbosa v = ... ; // inicializado de forma apropiadapublic void vuelcaEstado() {

int verbosidad = v.getVerbosidad();switch (verbosidad) {

case Verbosa.SILENCIOSA:break; // no se hace nada

case Verbosa.VERBOSA:System.out.println(detallesEstado);// SIGUE

case Verbosa.NORMAL:System.out.println(estadoBasico);// SIGUE

case Verbosa.BREVE:System.out.println(resumenEstado);break;

default:throw new EstadoIlegalException(

"verbosidad=" + verbosidad);}

}

Java– p. 8

Page 9: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

switch – Ejemplo – Comentarios

• Interface Verbosa {static int SILENCIOSA = 0;static int BREVE = 1;static int NORMAL = 2;static int VERBOSA = 3;void setVerbosidad( int nivel );int getVerbosidad();

}

• Una vez que el control se ha transferido a la sentencia que sigue a laetiqueta case , las siguientes sentencias se ejecutan sucesivamente,aunque las sentencias tengan sus propias etiquetas case diferentes.

• Una etiqueta case o default no fuerza la salida del switch , pararealizarlo se requiere la sentencia break , con lo que el control setransfiere a la primera sentencia posterior al switch .

Java– p. 9

Page 10: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

switch – Asociacion de varios case

• Una sentencia o varias pueden tener más de una etiqueta case , útilcuando se realiza la misma acción en varios casos.

public int valorHex(char cr) throws NoDigitoHexException {

switch (cr) {case ’0’: case ’1’: case ’2’: case ’3’: case ’4’:case ’5’: case ’6’: case ’7’: case ’8’: case ’9’:

return (cr - ’0’);case ’a’: case ’b’: case ’c’:case ’d’: case ’e’: case ’f’:

return (cr - ’a’ + 10);case ’A’: case ’B’: case ’C’:case ’D’: case ’E’: case ’F’:

return (cr - ’A’ + 10);default:

throw new NoDigitoHexException(cr);}

}

Java– p. 10

Page 11: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

switch – Asociacion de varios case

• No se emplean sentencias break , ya que con las sentencia return sesale del bloque switch y del método completo.

• La expresión del switch debe ser de tipo char , byte , short o int .• Todas las etiquetas case deben ser expresiones constantes (literales o

constantes con nombre inicializadas con expresiones constantes).• Todo valor de un case debe ser único, y puede haber sólo una etiqueta

default .

Java– p. 11

Page 12: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

while

• El ciclo while tiene la siguiente forma:

while (expresi on-booleana)sentencia

• La expresión booleana se evalúa y si es verdadera se ejecuta lasentencia (que puede ser un bloque). Cuando se termina la sentencia, sevuelve a evaluar la expresión y si sigue siendo verdadera, la sentencia seejecuta nuevamente.

• Lo anterior se repite hasta que la evaluación sea falsa, y entonces elcontrol se transfiere a la sentencia que sigue al while .

• El bucle while se ejecuta cero o más veces, debido a que la expresiónbooleana puede ser falsa la primera vez que se evalúa.

• Se muestra el ejemplo que genera los números de Fibonacci:

while (a1 < MAX) {System.out.println(a1);a1 = ba + a1;ba = a1 - ba;

}

Java– p. 12

Page 13: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

do-while

• Cuando se desea ejecutar el cuerpo de un ciclo al menos una vez sedebe usar do-while

dosentencia

while (expresi on-booleana);

• La expresión booleana se evalúa después de que se ejecuta lasentencia. Mientras la expresión sea true , la sentencia se ejecutarepetidamente.

Java– p. 13

Page 14: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

for

• Se usa para realizar un ciclo con un intervalo de valores a partir de unvalor inicial hasta uno final. Su formato es:

for (expr-inic; expr-booleana; expr-incr)sentencia

• La expr-inic permite declarar y/o inicializar variables del ciclo, y seejecuta sólo una vez.

• Después se evalúa la expresión booleana y si es true se ejecuta lasentencia del cuerpo del ciclo.

• Al terminar de ejecutarse el cuerpo del bucle, se evalúa expr-incr paraactualizar los valores de las variables del bucle.

• Se evalúa de nuevo la expresión booleana y el ciclo se repite mientras laexpresión booleana sea verdadera , pudiendo ser equivalente a:

{expr-inic;while (expr-booleana) {

sentencia;expr-incr;

}

}Java– p. 14

Page 15: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

for cont. 1

• En la inicialización e incremento se puede poner una lista de expresionesseparadas por comas, siendo la lista evaluada de izquierda a derecha,por ejemplo en el siguiente ciclo se manipulan dos índices:

for (int i = 0, j = arr.length - 1; j >= 0; i++, j--) {// ...

}

• La declaración de variables de diferentes tipos no puede hacerse en lasección de inicialización, por lo que ninguna de ellas se puede declarardentro del ciclo for , por ejemplo:

int i;Celda nodo;for (i = 0, nodo = cabecera;

i < MAX && nodo != null;i++, nodo=nodo.siguiente)

System.out.println(nodo.getElemento());

Java– p. 15

Page 16: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

for cont. 2

• El ciclo se emplea para iterar una variable sobre un intervalo de valoreshasta que se alcanza el final, pero se pueden poner otro tipo decondiciones también.

• Ciclo para calcular el valor mínimo de exp tal que 10exp ≥ valor:

public static int potenciaDiez(int valor) {int exp, v;for (exp = 0, v = valor - 1; v > 0; exp++, v /= 10)

continue;return exp;

}

• Dos variables están recorriendo intervalos diferentes. Mientras v > 0, seincrementa el valor del exponente y se divide por 10. Al terminar el ciclo,el valor 10

exp es la mínima potencia de 10 que es mayor o igual que valor• En el cuerpo del ciclo sólo se tiene la sentencia continue , que hace

que inicie la siguiente iteración, en decir, no se hace nada en el cuerpo.Esta forma se usa para indicar que el cuerpo del ciclo está vacío.

Java– p. 16

Page 17: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

for cont. 3

• Todas las expresiones del ciclo for son opcionales, en el caso deexpr-booleana se asume que es true si no se pone, por lo que la formade poner un ciclo infinito es:

for (;;)sentencia

Java– p. 17

Page 18: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

Etiquetas

• Las sentencias se pueden etiquetar con la finalidad de darles un nombre.• Las etiquetas pueden usarse para referirse a las sentencias.• Una etiqueta precede a la sentencia que nombra:

etiqueta: sentencia

• Sólo las sentencias break y continue pueden hacer uso de etiquetas.

Java– p. 18

Page 19: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

break

• Se usa para salir de cualquier bloque, no sólo de un switch .• La sentencia se puede usar de dos formas, que son:

◦ break sin etiquetabreak;

◦ break con etiquetabreak etiqueta;

• Un break sin etiqueta finaliza la sentencia switch , for , while o domás interna, y por lo tanto sólo puede aparecer dentro de ellas.

• Un break con etiqueta no es un goto , ya que con la primera se refiere auna etiqueta que permite salir de o repetir solamente un bloqueespecífico etiquetado, mientras que con la segunda se podrían realizarsaltos arbitrarios indiscriminados por todo el código.

Java– p. 19

Page 20: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

break -- Ejemplo

• Se muestra un ejemplo donde se busca el primer elemento vacío en unarreglo de referencias a objetos Contenido

class Contiene {private Contenido[] Objs;// ...public void agregaEn(Contenido obj)

throws NoElemVacioException{

int i;for (i = 0; i < Objs.length; i++)

if (Objs[i] == null)break;

if (i >= Objs.length )throw new NoElemVacioException();

Objs[i] = obj; // ponerloobj.interior(this); // est a en el interior

}

}

Java– p. 20

Page 21: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

break – Ejemplo 2

• Para finalizar un bloque o ciclo externo se etiqueta la sentencia externa yse utiliza el nombre de la etiqueta en la sentencia break :

private float[][] Matriz;public boolean actuaEnBand(float bandera) {

int y, x;boolean encontrado = false;

busqueda:for (y=0; y < Matriz.length; y++) {

for (x=0; x < Matriz[y].length; x++) {

if (Matriz[y][x] == bandera) {encontrado = true;break busqueda;

}

}return encontrado;

}

• En el ejemplo anterior se ha etiquetado el bucle for externo, y cuandose encuentra el valor que se busca, se finalizan los bucles interno yexterno con un break con etiqueta.

Java– p. 21

Page 22: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

continue

• Se puede usar sólo dentro de un ciclo (for , while o do) para transferirel control al final del cuerpo del ciclo.

• En el caso de while y do , la expresión del bucle se evalúa acontinuación.

• En un bucle for , la expr-incr se evalúa antes de la expresión del ciclo.• Al igual que break , la sentencia continue puede ser no etiquetada:

continue:

y etiquetada:

continue etiqueta;

• En la forma no etiquetada, se transfiere el control al final del cuerpo delbucle más interno.

• La forma etiquetada transfiere el control al final del bucle que tenga laetiqueta correspondiente, debiendo la etiqueta pertenecer a unasentencia del bucle.

Java– p. 22

Page 23: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

continue – Ejemplo

• Se usa generalmente para evitar o ignorar uno o varios elementos de unciclo.

while (!stream.eof()) {token = stream.next();if ( token.equals("saltar") )

continue;// ... procesar token ...

}

Java– p. 23

Page 24: Control de Flujo - computo.fismat.umich.mxcomputo.fismat.umich.mx/computacion/notas_intr/flujo.pdf · Java Control de Flujo H. Tejeda V htejeda@fismat.umich.mx Universidad Michoacana

return

• Se usa para finalizar la ejecución de un método y devuelve el control alque lo invocó.

• Si el método no devuelve ningún valor, se usará así:

return;

• Si el método tiene un tipo de retorno, se debe incluir una expresión de untipo que se pueda asignar al tipo de retorno. Por ejemplo, si un métododevuelve double , el return podría tener una expresión que fueradouble , float o entera:

protected double noNegativo(double val) {if (val < 0)

return 0; // una constante enteraelse

return val: // un double}

• Se puede usar también para salir de constructores y de código deinicialización estático. Como ningún constructor tenga tipo de retorno, sedebe usar sin especificar un valor de retorno.

Java– p. 24