• No se han encontrado resultados

Temario. Fundamentos de Programación FPRG Tema 6. Estructuras de Control v Miguel A. de Miguel 03/11/16

N/A
N/A
Protected

Academic year: 2022

Share "Temario. Fundamentos de Programación FPRG Tema 6. Estructuras de Control v Miguel A. de Miguel 03/11/16"

Copied!
15
0
0

Texto completo

(1)

Fundamentos de Programación FPRG

Tema 6. Estructuras de Control

v. 2.0

Miguel A. de Miguel [email protected]

Fundamentos de Programación 2

Temario

n  Tema 6. Estructuras de control

n  Alternativas if y switch

n  Repetitivas: while, do, for

n  Rupturas de bucle: break, continue

n  Tipos Compuestos

n  Excepciones:

n  Concepto

n  Creación

n  Levantamiento

n  Captura

n  Excepciones en lo métodos

(2)

Fundamentos de Programación 3

Ejecución secuencial

n 

Los programas ejecutan secuencias de sentencias

n 

El final de una secuencia:

n  ; para llamadas simples de método y asignaciones

n  El final del cuerpo de una sentencia de control

n 

Terminada una sentencia se ejecuta la siguiente

n 

Las sentencias de control están determinadas por palabras reservadas: if, for, while …

Alternancia if

n  Estructura general

if (expresion boolean) cuerpo-then else cuerpo-else

parte else es opcional

n  Las partes cuerpo incluyen

n  Una única sentencia

n  Un bloque de sentencias entre { }

n  Si la expresión es true se ejecuta cuerpo-then

n  Si la expresión es false se ejecuta cuerpo-else

n  Si la expresión es false y no hay else se ejecuta la sentencia que sigue al if

(3)

Fundamentos de Programación 5

Bloques de sentencias

n 

Los cuerpos de las sentencias de control pueden ser:

n  Bloques de varias sentencias entre llaves

n  Una única sentencia

n 

Usamos llaves cuando el cuerpo es mas de una sentencia

n  Esto delimita el final del cuerpo

n  Nos determina donde comienza la primera sentencia que sigue a la sentencia de control

Fundamentos de Programación 6

Condiciones

n 

La condición es una expresión boolean

n  Operaciones relaciones

n  Operaciones lógicas

n  Variable boolean

n  Métodos que devuelven boolean

n 

Debemos evitar expresiones que creen efectos laterales (modificar objetos)

n 

Algunas veces las expresiones no se ejecutan completamente

n  Basta con ejecutar una parte para saber si es true o false

n  expresion1 && expresion2 expresion3 || expresion4

(4)

Fundamentos de Programación 7

Partes else

n 

Cuando el cuerpo de una sentencia if es otra sentencia if, el else hace referencia al if mas próximo

if (condicion1) if (condicion2) sentencia1 else sentencia2

n 

Bloques vacíos

if (condicion1)

if (condicion2) sentencia1 else {}

else sentencia2

Alternancias múltiples

n 

Tratamos los diferentes valores de una expresión de formas distintas

if (expresion == valor0) sentencia0;

else if (expresion == valor1) sentencia1;

else if (expresion == valor2) sentencia2;

else if (expresion == valor3) sentencia3;

else sentencia4;

n 

La expresión se evalúa tantas veces como if ejecutamos

n  Ineficiente y poco legible

(5)

Fundamentos de Programación 9

Alternancia switch

switch (expresion) { case valor0:

sentencia0; break;

case valor1:

sentencia1; break;

case valor2:

sentencia2; break;

default:

sentencia4;

}

n  expresion debe ser entero, boolean, carácter, enumerado o String

n  La misma alternancia no puede estar repetida

n  Los valores de case son constantes o literales

n  default es opcional

n  La sentencia break nos saca del switch, si no la incluimos se ejecuta lo que sigue

Fundamentos de Programación 10

Alternancia switch

public class Anio {

public enum Meses {ENERO, FEBRERO, MARZO, ABRIL, MAYO, JUNIO, JULIO, AGOSTO, SEPTIEMBRE, OCTUBRE, NOVIEMBRE, DICIEMBRE}

public static void main(String[] args) { Meses mes = Meses.valueOf(args[1]);

int anio = Integer.parseInt(args[0]);

int numDias = 0;

switch (mes) {

case ENERO: case MARZO: case MAYO: case JULIO:

case AGOSTO: case OCTUBRE: case DICIEMBRE:

numDias = 31; break;

case ABRIL: case JUNIO: case SEPTIEMBRE: case NOVIEMBRE:

numDias = 30; break;

case FEBRERO:

if ((new Anio(anio)).esBisiesto()) numDias = 29;

else

numDias = 28;

break;

default:

numDias=0; break;

}

System.out.println("Numbero de dias = " + numDias);

}

(6)

Fundamentos de Programación 11

Alternancia switch

private int numeroAnio;

public Anio(int valor) { numeroAnio=valor; } public boolean esBisiesto() {

return ((numeroAnio % 4 == 0) &&

(numeroAnio % 100 != 0))) ||

(numeroAnio % 400 == 0);

} }

Bucle while

n  Estructura general

while (expresion boolean) cuerpo-while

n  La expresión boolean se evalúa al llegar, si es true se ejecuta el cuerpo, si no se sigue con la siguiente sentencia

n  Completado el cuerpo se vuelve a evaluar la expresión boolean,

n  Se vuelve a ejecutar el cuerpo hasta que deje de valer true

n=expresion; factorial=1;

while (n > 1) {

factorial=factorial*n;

n=n-1;

(7)

Fundamentos de Programación 13

Bucle do-while

n  Estructura general do {

cuerpo-do

} while (expresion boolean)

n  El cuerpo se ejecuta al menos una vez

n  Especialmente útil cuando el la expresión dependen de resultados que evalúa el cuerpo

n  Se evalúa la expresión boolean y si es true se vuelve a ejecutar el cuerpo hasta que la expresión sea false

n  Equivalente a: (debemos reescribir el cuerpo)

cuerpo-do

while (expresion boolean) cuerpo-do

Fundamentos de Programación 14

Bucle for

n 

Estructura general

for (inicializacion; condicion; actualizacion) { cuerpo-for

}

n 

inicializacion se ejecuta una sola vez al llegar al bucle. Puede incluir declaración de variables que afectan al cuerpo

n 

Mientras condicion (expresión boolean) se cumpla el cuerpo se ejecuta. Al menos se evalúa después de inicializacion

n 

Después de terminar el cuerpo, y antes de

evaluar condicion se ejecuta actualizacion

for (int i=0; i < 20; i=i+1) m=m+i;

(8)

Fundamentos de Programación 15

Ejercicio

Escriba una clase que permita calcular el número PI con una precisión de "n" decimales. El parámetro "n" deberá introducirse por teclado:

BufferedReader stdin = new BufferedReader(

new InputStreamReader(System.in));

String entrada = stdin.readLine();

int dig=Integer.parseInt(entrada);

Puede utilizar la siguiente fórmula para aproximar el valor de PI/4:

PI/4 = 1 - 1/3 + 1/5 - 1/7 + ... = Suma(n=0,infinito){(-1)^n/(2n+1)}

Estructura de salto break

n 

Estructura general break;

n 

Es una sentencia en un cuerpo de bucle (do-while, while, y for) y de alternancias switch

n 

Da por terminado el bucle o switch y sigue con la sentencia al bucle/switch

n 

Afecta al bucle o switch de anidamiento

mas interno en el que se encuentre

(9)

Fundamentos de Programación 17

Estructura de salto continue

n 

Estructura general continue;

n 

Es una sentencia en un cuerpo de bucle (do- while, while, y for)

n 

Da por terminado el cuerpo del bucle y vuelve a evaluar condición (actualización en el caso de for)

n 

Afecta al bucle de anidamiento mas interno en el que se encuentre

for (int i=1; i < 20; i=i+1) {

if (esPrimo(i)) continue;

imprime(i);

}

Fundamentos de Programación 18

Ejercicio

Escriba el cuerpo de un método “complementario” con la siguiente cabecera:

boolean[][] complementario(boolean[][] matriz) {

}

Que devuelve una nueva matriz de las mismas dimensiones que matriz pero sus valores son el negado de los elementos de matriz.

(10)

Fundamentos de Programación 19

Excepciones

n 

En cualquier programa se producen comportamientos anómalos y errores

n  Correcto: Sin errores y capaz de cumplir requisitos

n  Robusto: Capaz de funcionar incluso en situaciones anormales

n 

La detección y control de errores hacen los programas mas difíciles de entender

if (!error1) {

sentencias con error2 if (!error2) {

sentencias

else tratamiento de error2 else tratamiento de error1

Correcto Robusto

Jerarquía de Clases de Excepciones

n 

Java representa las excepciones y errores como objetos instancia de clases de excepciones

Throwable

Error Exception

RuntimeException MisExcepcionesChequeadas

ExcepcionesSinChequeos

(11)

Fundamentos de Programación 21

Levantamiento de Excepciones

n 

Estructura general

throw ObjetoDeTipoExcepcion;

n 

Aborta lo que se ejecuta y se cede el control a donde se hace el tratamiento:

n  throw está dentro de un manejador de excepciones que trata ese tipo de excepciones

n  La tratamos en el manejador

n  throw no está dentro de un manejador, pero el método levanta ese tipo de excepciones

modificadores Tipo nombre

(Lista parametros) throws ClaseExcep1, ClaseExcep2…

n  Se aborta el método y esa excepción se levanta donde se hizo la llamada

Fundamentos de Programación 22

Excepciones de Máquina Virtual Java

n 

La máquina virtual también puede levantarlas mientras ejecuta el programa

n 

Algunos problemas que pueden provocar levantamiento de excepciones:

n  Intentamos usar una referencia que vale null

Stringd=null;

d.substring(5);

n  Intentamos hacer una conversión (casting) que no se puede realizar

Integer i=(Integer) x;

n  Errores de cálculo como división por cero

int z=0;

j=i/z;

n  No se encuentra el fichero .class de una clase que queremos usar

Clase1 c=new Clase1();

(12)

Fundamentos de Programación 23

Levantamiento de Excepciones

while (x > 0) { switch x/n {

case 0 : t=t+” cero”; break;

case 1 : t=t+” uno”; break;

:

case 9 : t=t+” nueve”; break;

default:

throw new Exception(“Algo va mal”);

break;

}

x=x%n;

n=n/10;

}

Objetos de tipo Exception

n  La clase del objeto asociado a throw debe se Exception o una de sus herederas

class NuevaExcepcion extends Exception { }

n  Solo esos tipos de objetos pueden aparecer en los throw

n  Solo esas clases pueden aparecer en la parte exception de los métodos

n  Solo esas clases pueden aparecer en los catch de los manejadores de excepción

new Exception(“mesaje de error”);

new ClaseExcepcion(parametrosError);

(13)

Fundamentos de Programación 25

Manejadores de Excepciones

n  Estructura general try { cuerpo-try

} catch (ClaseExcepcion1 ref1) { tratamiento ClaseExcepcion1 } catch (ClaseException2 ref2) {tratamiento ClaseExcepcion2 } finally { cuerpo finally

}

n  cuerpo-try representa la ejecución en condiciones normales

n  catch indica como tratar cada tipo de excepción en caso de que un throw o una llamada a método la levante

n  Cuando una excepción salta se busca (en el orden de la declaración) un catch que pueda tratarlo (el tipo de la excepción es compatible)

n  Si no hay ninguno, la excepción sigue levantada y la debe tratar aquello que incluya la sentencia try

n  finally es opcional e incluye aquello que debemos ejecutar tanto si se produce como si no una excepción

Fundamentos de Programación 26

Manejadores de Excepciones

n  Cuando llamamos a un método que levanta una excepción debemos:

n  Incluir la llamada dentro de un try que tiene asociado el tratamiento de ese tipo de excepción

n  El método que incluye la llamada debe indicar que él también puede levantar la llamada

n  Formas de tratar un error:

n  El try-catch cortan la excepción pero debe darle un tratamiento y buscar una solución a ese tipo de error

n  Los métodos pasan el error a sus llamadores

n  Si ningún método contiene un manejador que trate la excepción, se aborta la ejecución y la máquina virtual saca un mensaje como:

mesaje de error

at nombreClase1.nombreMétodo1 (nombreFichero1.java:numeroLínea) at nombreClase2.nombreMétodo2 (nombreFichero2.java:numeroLínea) at nombreClase3.nombreMétodo3 (nombreFichero3.java:numeroLínea) :

(14)

Fundamentos de Programación 27

Ejemplo

public static void main (String[] arg) { try {

double d= Double.parseDouble(arg[0]);

if (d < 0)

throw new Exception(arg[0]+“ no puede ser negativo”);

System.out.println(Math.sqrt(d));

} catch (NumberFormatException e) {

System.err.println(arg[0]+” no es un número real”);

} catch (Exception e) { System.err.println (e);

} } }

Ejemplo

class CuentaBancaria {

public enum EstadoCuenta {Activa, Cerrada, Bloqueada}

private double saldo=0.0;

private EstadoCuenta estado=EstadoCuenta.Activa;

public void depositar(double cantidad) throws Exception { if (estado != EstadoCuenta.Activa)

throw new Exception(“Solo se puede trabajar con cuentas activas”);

saldo=saldo+cantidad;

}

public void retirar(double cantidad) throws Exception { if (estado != EstadoCuenta.Activa)

throw new Exception(“Solo se puede trabajar con cuentas activas”);

if (saldo < cantidad)

throw new Exception(“No hay saldo disponible”);

saldo=saldo-cantidad;

}

(15)

Fundamentos de Programación 29

Ejemplo

public void transferencia(double cantidad, CuentaBancaria destino) throws Exception {

retirar(cantidad);

try destino.depositar(cantidad));

catch (Exception e) {

depositar(cantidad); // devolvemos lo retirado throw e;

} } }

Referencias

Documento similar