Software Guru Conference & Expo 2014

Capítulo 002 Ejercicio 020 (Vocales y Consonantes)

/** La orden switch suele clasificarse como sentencia de selección. La sentencia switch selecciona de entre fragmentos
* de código basados en el valor de una expresión entera. Es de la forma:
*
* switch(selector - entero){
* case valor - entero 1 : sentencia; break;
* case valor - entero 2 : sentencia; break;
* case valor - entero 3 : sentencia; break;
* case valor - entero 4 : sentencia; break;
* case valor - entero 5 : sentencia; break;
* // ...
* default: sentencia;
* }
*
* El selector entero es una expresión que produce un valor entero. El switch compara el resultado de selector entero
* con cada valor entero. Si encuenta un valor que coincida, ejecuta la sentencia (simple o compuesta) correspondiente.
* Si no encuentra ninguna coincidencia, ejecuta la sentencia default.
*
* Observese en la definición anterior que cada case acaba con break, lo que causa que la ejecución salte al final de
* la sentencia switch. Ésta es la forma convencional de construir una sentencia switch, pero el break es opcional. Si
* no se pone, se ejecutará el código de las sentencias "case" siguientes, hasta encontrar un break. Aunque este
* comportamiento no suele ser el deseado, puede ser útil para un programador experimentado. Hay que tener en cuenta que
* la última sentencia, la que sigue a default, no tiene break porque la ejecución llega hasta donde le hubiera llevado
* el break. Se podría poner un break al final de la sentencia default sin que ello causara ningún daño, si alguien lo
* considerara importante por razones de estilo.
*
* La sentencia switch es una forma limpia de implementar una selección de múltiples caminos (por ejemplo, seleccionar
* un camino de entre cierto número de caminos de ejecución diferentes), pero requiere de un selector que se evalúe a un
* valor como int o char. Si se desea utilizar, por ejemplo, una cadena de caracteres o un número de coma flotante como
* selector, no se podrá utilizar una sentencia switch. En el caso de tipos no enteros, es necesario utilizar una serie de
* sentencias if.
*
* He aquí un ejemplo que crea letras al azar y determina si se trata de vocales o consonantes:
*
**/

public class VocalesYConsonantes{
public static void main(String args[]){
for(int i = 0; i < 100; i++){
char c = (char)(Math.random() * 26 + 'a');
System.out.print(c + ": ");
switch(c){
case 'a': case 'e': case 'i':
case 'o': case 'u':
System.out.println("Vocal");
break;
case 'y': case 'w':
System.out.println("Aveces una vocal");
break;
default:
System.out.println("Consonante");
}
}
}
}

/** Dado que Math.random() genera un valor entre 0 y 1, sólo es necesario multiplicarlo por el límite
* superior del rango de números que se desea producir (26 para las letras del alfabeto) y añadir un
* desplazamiento para establecer el límite inferior.
*
* Aunque aquí parece que se está haciendo un switch con un carácter, esta sentencia está usando, de hecho,
* el valor entero del caracter. Los caracteres entre comillas simples de las sentencias case también
* producen valores enteros que se usan para las comparaciones.
*
* Fijese como las sentencias case podrían "apilarse" unas sobre otras para proporcionar varias coincidencias
* para un fragmento de código en particular. También habría que ser conscientes de que es esencial poner la
* sentencia break al final de un caso particular, de otra manera, el control simplemente irá descendiendo,
* pasando a ejecutar el case siguiente.
*
**/