Heinsohn Privacidad y Ciberseguridad para el sector educativo
Control Flow Structures: Selection
1. Tema 8. Estructuras de
control: Selecci´on
Introducci´on a la Inform´atica y a la Programaci´on (IIP)
Curso 2011/2012
Departamento de Sistemas Inform´aticos y Computaci´on
2. ´Indice
1 Introducci´on y motivaci´on 3
2 Revisi´on de condicionales 5
3 Instrucciones condicionales 7
• Instrucci´on if-else
• Instrucci´on switch
4 El operador ternario condicional 18
22 de octubre de 2011 IIP - Curso 2011/2012 Page 8.2
3. Introducci´on y motivaci´on
Hasta ahora hemos considerado el c´odigo simplemente como una secuencia
de instrucciones.
Sin embargo, la mayor parte de los problemas reales necesitan tomar deci-
siones seg´un la situaci´on, y con ello elegir entre distintas subsecuencias de
instrucciones.
Las estructuras de control permiten cambiar el flujo simple de instrucciones
para conseguir estas caracter´ısticas.
En un m´etodo, las decisiones se toman generalmente en funci´on de los datos
de entrada. La secuencia de instrucciones puede cambiar dependiendo de los
datos de entrada o los datos intermedios generados durante la ejecuci´on.
En este tema presentaremos los mecanismos que ofrece el lenguaje Java para
tomar decisiones.
22 de octubre de 2011 IIP - Curso 2011/2012 Page 8.3
4. Introducci´on y motivaci´on
Las instrucciones condicionales pueden ser sencillas o anidadas:
if (temp>100)
System.out.println("Temperatura mayor que 100");
else System.out.println("Temperatura menor o igual que 100");
//.....
if (temp>100)
System.out.println("Mayor que 100");
else if (temp>50)
System.out.println("Mayor que 50, menor o igual que 100");
else System.out.println("Menor o igual que 50");
System.out.println("Continuamos aqui");
. . ...
22 de octubre de 2011 IIP - Curso 2011/2012 Page 8.4
5. Revisi´on de condicionales
La mayor´ıa de las estructuras de decisi´on dependen de expresiones l´ogicas
(boolean).
Las expresiones l´ogicas se construyen a partir de expresiones num´ericas
empleando operadores relacionales y a partir de otras expresiones l´ogicas
usando operadores l´ogicos.
Una expresi´on l´ogica es toda aquella expresi´on que se eval´ua a cierto
(true) o falso (false).
Operadores condicionales
Operador Operaci´on
== Igual a
!= Diferente a
> Mayor que
>= Mayor o igual que
< Menor que
<= Menor o igual que
Operadores l´ogicos
Operador Operaci´on
! NOT
& AND
| OR
^ XOR
&& AND cortocircuitado
|| OR cortocircuitado
22 de octubre de 2011 IIP - Curso 2011/2012 Page 8.5
6. Revisi´on de condicionales
Tabla de verdad
x y x && y x || y x ^ y !x
x & y x | y
false false false false false true
false true false true true true
true false false true true false
true true true true false false
if ((temp>=15) && (temp<=20)) .....
if ((temp>15) || (temp==15)) .....
// similar a (temp>=15)
if ((temp>=0) ^ (temp<=100)) .....
// similar a (temp>100) || (temp<0)
22 de octubre de 2011 IIP - Curso 2011/2012 Page 8.6
7. Instrucci´on condicional: if
El condicional m´as simple de Java presenta
esta estructura:
if (B) S
B es una condici´on.
S es cualquier instrucci´on o bloque de ins-
trucciones.
Ejecuci´on:
1. Se eval´ua B.
2. Si B es cierto, se ejecuta S.
3. Se contin´ua con la instrucci´on que sigue al
condicional.
22 de octubre de 2011 IIP - Curso 2011/2012 Page 8.7
8. Instrucci´on condicional: if
Ejemplo: clase Circulo, m´etodo setRadio:
/** actualiza radio del Circulo a nuevoRadio
solo si nuevoRadio es positivo o cero. */
public void setRadio(double nuevoRadio) {
if (nuevoRadio >= 0)
radio = nuevoRadio;
}
Ejemplo: datos m´edicos, seg´un el sexo, se pregunta si la persona est´a embarazada
Humano h = new Humano();
// ...
System.out.print("Que edad tiene? ");
// ...
if (h.getSexo()==’M’) {
System.out.print("Esta embarazada? ");
// ...
}
System.out.print("Es alergico a algun medicamento? ");
// ...
22 de octubre de 2011 IIP - Curso 2011/2012 Page 8.8
9. Instrucci´on condicional: if-else
Su forma general es:
if (B) S1 else S2
B es una condici´on.
S1 y S2 son cualquier instrucci´on o conjunto
de instrucciones.
Ejecuci´on:
1. Se eval´ua B.
2. Si B es cierto, se ejecuta S1.
3. Si B es falso, se ejecuta S2.
4. Se contin´ua con la instrucci´on que sigue al
condicional.
22 de octubre de 2011 IIP - Curso 2011/2012 Page 8.9
10. Instrucci´on condicional: if-else
Ejemplo: seg´un la temperatura, en-
cender o apagar el aire acondiciona-
do:
Habitacion h = new Habitacion();
AireAcon a = new AireAcon();
// ...
if (h.getTemp()>26.0)
a.encender();
else
a.apagar();
// ...
Ejemplo: seg´un la intensidad solar, re-
gular la intensidad de las luces:
DetectorSolar d = new DetectorSolar();
Bombilla b1 = new Bombilla();
Bombilla b2 = new Bombilla();
// ...
if (d.getIntensidad()<100) {
b1.incrIntens();
b2.incrIntens();
}
else {
b1.decrIntens();
b2.decrIntens();
}
// ...
22 de octubre de 2011 IIP - Curso 2011/2012 Page 8.10
11. Instrucci´on condicional: if-else
En cualquiera de las formas de las instrucciones condicionales if ...else ...,
los bloques de instrucciones pueden incluir otras instrucciones condicionales:
instrucciones condicionales anidadas.
Ejemplos:
if (B1)
if (B2) S1;
else S2;
if (B1)
if (B2) S1;
else S2;
if (B1)
if (B2) S1;
else S2;
else
if (B3) S3;
else S4;
22 de octubre de 2011 IIP - Curso 2011/2012 Page 8.11
12. Instrucci´on condicional: if-else
Ejemplo: gestor de multas de tr´afico:
// ...
if (vehic.getVel()>carr.getMaxVel()) {
System.out.println("Velocidad maxima sobrepasada");
if (vehic.getVel()>1.2*carr.getMaxVel())
vehic.crearMultaEspecial();
else
vehic.crearMultaNormal();
}
else {
if (vehic.getVel()<carr.getMinVel())
vehic.crearMultaNormal();
}
// ...
22 de octubre de 2011 IIP - Curso 2011/2012 Page 8.12
13. Instrucci´on condicional: if-else
Una instrucci´on if-else se di-
ce m´ultiple cuando cada uno de
los else tiene asociado un nuevo
if-else (excepto el ´ultimo).
if (B1) S1
else if (B2) S2
else if (B3) S3
...
else if (Bn) Sn
else Sn+1
22 de octubre de 2011 IIP - Curso 2011/2012 Page 8.13
14. Instrucci´on condicional: if-else
Ejemplo completo de uso de condicionales: validar una fecha (m´etodo validar)
public class Fecha {
int dd, mm, aa; // Dia, mes, anyo
// ...
public boolean bisiesto() { return ((aa%4)==0 && (aa%100)!=0) || (aa%400)==0; }
public boolean validar() {
int numdd=31; // Numero de dias del mes
if ((mm<=0) || (mm>12)) return false; // Examina rango del mes
// Determinar rango de dias
if ((mm==4) || (mm==6) || (mm==9) || (mm==11)) numdd=30;
else if (mm==2)
if (bisiesto()) numdd=29; else numdd=28;
if ((dd<=0) || (dd>numdd)) return false; // Examina rango del dia
return true;
}
// ...
}
22 de octubre de 2011 IIP - Curso 2011/2012 Page 8.14
15. Instrucci´on condicional: switch
switch (expresion) {
case val1: [SC1] [break;]
case val2: [SC2] [break;]
...
...
case valn: [SCn] [break;]
[default: [SCn+1] [break;]]
}
expresion debe evaluarse a un tipo primitivo (excepto float o double) o
a String (desde la versi´on 7.0 de Java).
val1, val2, . . . , valn son valores cuyo tipo de datos es compatible con el
de expresion.
SC1, SC2, . . . , SCn+1 son cualquier secuencia de instrucciones.
Los componentes que aparecen entre corchetes ([]) son opcionales.
22 de octubre de 2011 IIP - Curso 2011/2012 Page 8.15
16. Instrucci´on condicional: switch
Ejecuci´on:
1. Se eval´ua expresion.
2. Se compara su valor con todos los
valores en los case.
3. Cuando es igual a alguno de ellos,
ejecutar las instrucciones desde ese
punto incluyendo el c´odigo asocia-
do a otras etiquetas case hasta:
que se encuentre un break, o
que se finaliza el bloque switch,
4. Si no es igual a ning´un valor, se
ejecutan las instrucciones asociadas
a la etiqueta default (si las hay)
hasta el fin del bloque switch.
5. Se contin´ua con la instrucci´on que
sigue al bloque switch.
22 de octubre de 2011 IIP - Curso 2011/2012 Page 8.16
17. Instrucci´on condicional: switch
Un ejemplo completo: escribir el nombre del mes a partir de su n´umero:
public class Fecha {
int dd, mm, aa; // Dia, mes, anyo
// ...
public String nomMes() {
String mn;
switch(mm) {
case 1: mn=new String("Enero"); break;
case 2: mn=new String("Febrero"); break;
case 3: mn=new String("Marzo"); break;
case 4: mn=new String("Abril"); break;
// ...
case 12: mn=new String("Diciembre"); break;
default: mn=new String("Desconocido");
}
return mn;
}
// ...
}
22 de octubre de 2011 IIP - Curso 2011/2012 Page 8.17
18. El operador ternario o condicional
Java, al igual que C y C++, posee un operador ternario con un comportamiento
semejante a una instrucci´on condicional.
boolexpr ? expr1 : expr2
donde boolexpr es una expresi´on l´ogica y expr1 y expr2 son expresiones
cualquiera, pero del mismo tipo de datos.
Ejecuci´on:
1. Se eval´ua boolexpr.
2. Si boolexpr es cierta (true), la expresi´on completa se eval´ua a expr1.
3. En otro caso (boolexpr es falsa), la expresi´on completa se eval´ua a expr2.
22 de octubre de 2011 IIP - Curso 2011/2012 Page 8.18
19. El operador ternario o condicional
Ejemplo: validaci´on de fecha usando operador ternario
public class Fecha {
int dd, mm, aa; // Dia, mes, anyo
// ...
public boolean bisiesto() { return ((aa%4)==0 && (aa%100)!=0) || (aa%400)==0; }
public boolean validar() {
int numdd=31; // Numero de dias del mes
if ((mm<=0) || (mm>12)) return false; // Examina rango de mes
// Determinar rango de dia
if ((mm==4) || (mm==6) || (mm==9) || (mm==11)) numdd=30;
else if (mm==2) numdd=(bisiesto())?29:28; // Aqui se usa el operador ternario
if ((dd<=0) || (dd>numdd)) return false; // Examina rango de dia
return true;
}
// ...
}
22 de octubre de 2011 IIP - Curso 2011/2012 Page 8.19