5. Comprobación de condiciones
Java
5. Comprobación de condiciones
5.1. if
En cualquier lenguaje de programación es habitual tener que comprobar si se cumple una cierta condición. La forma más simple de conseguirlo es empleando una construcción que recuerda a:
SI condición ENTONCES órdenes
En Java, la forma exacta será empleando if (si, en inglés), seguido por la condición entre paréntesis, e indicando finalmente entre llaves los pasos que queremos dar si se cumple la condición, así :
if (condición) { órdenes }
Por ejemplo,
// If1.java
// Comprobación de condiciones con "if" 1: mayor que
// Introducción a Java, Nacho Cabanes
class If1 {
public static void main( String args[] ) {
int x = 10;
if (x > 5) {
System.out.println( "x es mayor que 5" );
}
}
}
Nota: Las llaves sólo serán imprescindibles cuando haya que hacer varias cosas. Si sólo queremos dar un paso en caso de que se cumpla la condición, no es necesario emplear llaves (aunque puede ser recomendable usar siempre las llaves, para no olvidarlas si más adelante ampliamos ese fragmento del programa):
// If2.java
// Comprobación de condiciones con "if" 2: sin llaves
// Introducción a Java, Nacho Cabanes
class If2 {
public static void main( String args[] ) {
int x = 10;
if (x > 5)
System.out.println( "x es mayor que 5" );
}
}
Ejercicio propuesto 5.1.1: Crea un programa que pida un número al usuario y diga si es positivo (mayor que cero)
5.2. El caso contrario: else
Una primera mejora a la comprobación de condiciones con "if" es indicar qué hacer en caso de que no se cumpla la condición. Sería algo parecido a
SI condición ENTONCES órdenes EN_CASO_CONTRARIO órdenes_alternativas
que en Java escribiríamos así:
if (condición) { órdenes1 } else { órdenes2 }
Por ejemplo,
// If3.java
// Comprobación de condiciones con "if" 3: else
// Introducción a Java, Nacho Cabanes
class If3 {
public static void main( String args[] ) {
int x = 10;
if (x > 5) {
System.out.println( "x es mayor que 5" );
}
else {
System.out.println( "x es menor o igual que 5" );
}
}
}
Ejercicio propuesto 5.2.1: Crea un programa que pida un número entero al usuario y diga si es positivo (mayor que cero) o si, por el contrario, no lo es (usando "else").
5.3. Operadores relacionales
La forma de comprobar si un dato es "mayor" que otro, que hemos usado en el apartado anterior, debería resultar totalmente intuitiva. Pero también nos interesará comprobar si un variable tiene exactamente un cierto valor, o si tiene un valor distinto, o si es menor, o si es mayor o igual que otro...
Los operadores que utilizaremos para ello son:
Operador | Operación |
---|---|
< | Menor que |
> | Mayor que |
<= | Menor o igual que |
>= | Mayor o igual que |
== | Igual a |
!= | No igual a (distinto de) |
Así, por ejemplo, para ver si el valor de una variable "x" es distinto de 5, escribiríamos:
// If4.java
// Comprobación de condiciones con "if" 4: distinto de
// Introducción a Java, Nacho Cabanes
class If4 {
public static void main( String args[] ) {
int x = 10;
if (x != 5) {
System.out.println( "x no vale 5" );
}
else {
System.out.println( "x vale 5" );
}
}
}
o para ver si la variable "x" vale 70, sería:
// If5.java
// Comprobación de condiciones con "if" 5: igual a
// Introducción a Java, Nacho Cabanes
class If5 {
public static void main( String args[] ) {
int x = 10;
if (x == 70) {
System.out.println( "x vale 70" );
}
else {
System.out.println( "x no vale 70" );
}
}
}
Es muy importante recordar esta diferencia: para asignar un valor a una variable se emplea un único signo de igual, mientras que para comparar si una variable es igual a otra (o a un cierto valor) se emplean dos signos de igual.
Ejercicio propuesto 5.3.1: Crea un programa que pida al usuario que introduzca el número 12. Después debe decirle si lo ha hecho correctamente o no.
Ejercicio propuesto 5.3.2: Crea un programa que pida un número entero al usuario y diga si es positivo (mayor que cero), si es negativo (menor que cero) o si, por el contrario, es exactamente 0 (necesitarás enlazar 2 "if" uno tras otro).
Ejercicio propuesto 5.3.3: Crea un programa que pida dos números reales al usuario y diga cuál es el mayor de ellos.
Ejercicio propuesto 5.3.4: Crea un programa que pida al usuario y diga si ese número es múltiplo de 3 (pista: puedes utilizar la operación "módulo", el "resto de la división": %)
Ejercicio propuesto 5.3.5: Crea un programa que diga si el número introducido por el usuario es impar o no lo es.
5.4. Operadores lógicos para enlazar condiciones
Podremos enlazar varias condiciones, para indicar qué hacer cuando se cumplan ambas, o sólo una de ellas, o cuando no se cumplan. Los operadores que nos permitirán enlazar condiciones son:
Operador | Significado |
---|---|
&& | Y |
|| | O |
! | No |
Por ejemplo, la forma de decir "si a vale 3 y b es mayor que 5, o bien a vale 7 y b no es menor que 4" sería:
// If6.java
// Comprobación de condiciones con "if" 6: varias condiciones
// Introducción a Java, Nacho Cabanes
class If6 {
public static void main( String args[] ) {
int a = 7;
int b = 1;
if ( ((a == 3) || ( b > 5))
|| ((a == 7) && ! (b < 4)) ) {
System.out.println( "Se cumple la condición" );
}
else {
System.out.println( "No se cumple la condición" );
}
}
}
Como se ve en el ejemplo anterior, la condición general del "if" deberá ir entre paréntesis, pero, por legibilidad y por evitar efectos colaterales de que alguna condición no se analice en el orden deseado, convendrá que cada condición individual vaya también entre paréntesis, y será interesante añadir paréntesis adicionales para dejar claro cómo agruparlas.
Ejercicio propuesto 5.4.1: Crea un programa que pida al usuario dos números enteros y diga si los dos son positivos (el primero Y el segundo).
Ejercicio propuesto 5.4.2: Crea un programa que pida al usuario dos números enteros y diga si al menos uno de los dos es positivo (el primero O el segundo).
Ejercicio propuesto 5.4.3: Crea un programa que pida al usuario dos números enteros y cuántos de ellos son pares.
Ejercicio propuesto 5.4.4: Crea un programa que pida tres números enteros largos al usuario y diga cuál es el mayor de los tres.
5.5. switch
Si queremos comprobar varios posibles valores para una misma variable, podemos utilizar varios if - else - if - else - if encadenados, pero tenemos una forma más elegante de elegir entre distintos valores posibles que tome una cierta expresión. Su formato es éste:
switch (expresion) {
case valor1: sentencias1; break;
case valor2: sentencias2; break;
case valor3: sentencias3; break;
// ... Puede haber más valores
}
Es decir, después de la orden switch indicamos entre paréntesis la expresión que queremos evaluar. Después, tenemos distintos apartados, uno para cada valor que queramos comprobar; cada uno de estos apartados se precede con la palabra case, indica los pasos a dar si es ese valor el que tiene la variable (esta serie de pasos no será necesario indicarla entre llaves), y termina con break.
Un ejemplo sería:
// Switch1.java
// Comprobación de condiciones con "switch" 1: ejemplo básico
// Introducción a Java, Nacho Cabanes
class Switch1 {
public static void main( String args[] ) {
int mes = 2;
switch(mes) {
case 1: System.out.println( "El mes es Enero" ); break;
case 2: System.out.println( "El mes es Febrero" ); break;
case 3: System.out.println( "El mes es Marzo" ); break;
}
}
}
También podemos indicar qué queremos que ocurra en el caso de que el valor de la expresión no sea ninguno de los que hemos detallado, usando la palabra "default":
switch (expresion) {
case valor1: sentencias1; break;
case valor2: sentencias2; break;
case valor3: sentencias3; break;
// ... Puede haber más valores
default: sentencias; // Opcional: valor por defecto
}
Por ejemplo, así:
// Switch2.java
// Comprobación de condiciones con "switch" 2: default
// Introducción a Java, Nacho Cabanes
class Switch2 {
public static void main( String args[] ) {
int mes = 4;
switch(mes) {
case 1: System.out.println( "El mes es Enero" ); break;
case 2: System.out.println( "El mes es Febrero" ); break;
case 3: System.out.println( "El mes es Marzo" ); break;
default: System.out.println( "No es entre Enero y Marzo" ); break;
}
}
}
Podemos conseguir que se den los mismos pasos en varios casos, simplemente eliminando la orden "break" de algunos de ellos. Un ejemplo podría ser:
// Switch3.java
// Comprobación de condiciones con "switch" 3: casos en cascada
// Introducción a Java, Nacho Cabanes
class Switch3 {
public static void main( String args[] ) {
int x = 5;
switch ( x ) {
case 1:
case 2:
case 3:
System.out.println( "El valor de x estaba entre 1 y 3" );
break;
case 4:
case 5:
System.out.println( "El valor de x era 4 o 5" );
break;
case 6:
System.out.println( "El valor de x era 6" );
int valorTemporal = 10;
System.out.println( "Operaciones auxiliares completadas" );
break;
default:
System.out.println( "El valor de x no estaba entre 1 y 6" );
break;
}
}
}
A partir de Java 7, se puede usar la orden "switch" también para comprobar los valores de cadenas de texto:
// Switch4.java
// Comprobación de condiciones con "switch" 4: cadenas de texto
// (Para Java 7 o superior)
// Introducción a Java, Nacho Cabanes
class Switch4 {
public static void main( String args[] ) {
String nombre = "yo";
switch(nombre) {
case "uno": System.out.println( "Hola, uno" ); break;
case "yo": System.out.println( "Hola, tú" ); break;
case "otro": System.out.println( "Bienvenido, otro" ); break;
default: System.out.println( "Nombre desconocido" ); break;
}
}
}
Ejercicio propuesto 5.5.1: Crea un programa que pida al usuario el número de un mes y escriba el nombre de ese mes. Por ejemplo, si el usuario introduce 9, deberá escribir "septiembre".
Ejercicio propuesto 5.5.2: Crea un programa que escriba como texto cualquier número del 1 al 10 que introduzca el usuario. Por ejemplo, si el usuario introduce 3, deberá escribir "tres".
5.6. El operador condicional
Existe una construcción adicional, que permite comprobar si se cumple una condición y devolver un cierto valor según si dicha condición se cumple o no. Es lo que se conoce como el "operador condicional (?)" u "operador ternario":
condicion ? resultado_si cierto : resultado_si_falso
Es decir, se indica la condición seguida por una interrogación, después el valor que hay que devolver si se cumple la condición, a continuación un símbolo de "dos puntos" y finalmente el resultado que hay que devolver si no se cumple la condición.
Es frecuente emplearlo en asignaciones (aunque algunos autores desaconsejan su uso porque puede resultar menos legible que un "if"), como en este ejemplo:
x = (a == 10) ? b*2 : a ;
En este caso, si "a" vale 10, la variable "x" tomará el valor de b*2, y en caso contrario tomará el valor de a. Esto también se podría haber escrito de la siguiente forma, más larga pero más legible:
if (a == 10)
x = b*2;
else
x = a;
Un ejemplo completo, que diera a la variable "par" el valor 1 si un número "n" es par, o el valor 0 en caso contrario, sería:
// Condicional1.java
// Ejemplo de "operador condicional" (o ternario)
// Introducción a Java, Nacho Cabanes
class Condicional1 {
public static void main( String args[] ) {
int n = 4;
int par;
par = n % 2 == 0 ? 1 : 0;
System.out.print( "\"par\" vale... " );
System.out.println( par );
}
}
Ejercicio propuesto 5.6.1: Crea un programa que pida un número entero al usuario y dé a una variable par el valor 1 si ese número es par o el valor 0 si no es par. Hazlo primero con un "if" y luego con un "operador condicional".
Ejercicio propuesto 5.6.2: Crea un programa que pida dos números de tipo byte al usuario y cree a una variable "menor", que tenga el valor del menor de esos dos números. Hazlo primero con un "if" y luego con un "operador condicional".