24 de octubre de 2018

Estructuras de control combinadas.

   A continuación se presenta un programa un poco más elaborado. El Ejemplo 3.17, utiliza la estructura de selección switch anidada dentro de una estructura de repetición while; también se utiliza la función getchar (línea 13), la cual regresa un carácter leído desde la entrada estándar.

   El prompt de la línea 11 indica que para terminar la entrada de datos se escriba EOF, el cual es un acrónimo de End Of File.

   Si los datos se procesan desde un archivo (y para este ejemplo es posible sin realizar cambio alguno en el código), la marca EOF se encontrará al final del mismo; pero si los datos se procesan desde el teclado, la marca de EOF tendrá que ser simulada: en GNU/Linux se simula con la combinación de teclas Ctrl+D, mientras que en Windows la combinación es Ctrl+Z.

   Observe la sentencia de la línea 13, la cual es un ejemplo muy usual de la forma de escribir expresiones y sentencias en C, ya que la expresión condicional del ciclo while está combinada con una expresión de asignación. La sentencia podría interpretarse en nuestro lenguaje como: “Obtén el siguiente carácter de la entrada estándar, asígnalo a simbolo, y si es distinto de EOF, ejecuta el grupo de sentencias del ciclo”.

   Note que la variable simbolo es de tipo entero (int). Esto se debe a que la función getchar regresa el número entero que representa al símbolo (carácter) procesado.

   Por otro lado, la estructura switch se encarga de hacer una comparación del dato contenido en simbolo, contra los casos (case) de interés: las vocales mayúsculas o minúsculas. Note también la forma en que se han expresado los casos (case), ya que no se ha hecho uso de ningún operador lógico (de hecho, intencionalmente no han sido presentados), pero las sentencias de las líneas 15, 16 y 17 podrían interpretarse en nuestro lenguaje como: “En caso de que simbolo sea una 'A'  o una 'a', incrementa el contador de a's y termina la comparación”. Las líneas 18-29 tendrían una interpretación análoga.

   Observe también que los símbolos 'A' y 'a' han sido puestos entre comillas simples, lo cual, además de auto documentar mejor el código fuente, sirve para que el compilador traduzca el código de dichos símbolos, en su correspondiente representación numérica, y puedan así ser comparados con el valor regresado por la función getchar.

   En resumen, la estructura while se encarga de repetir la lectura de datos y de enviarle los datos a la estructura switch mientras el dato procesado sea distinto de EOF; por otro lado, la estructura switch se encarga de determinar si el dato procesado es o no una vocal. Si lo es, la contabiliza en el contador correspondiente, y si no, lo ignora (default de la línea 30).

   Una muestra de la ejecución del Ejemplo 3.17 con datos procesados desde el teclado se muestra en la siguiente figura:

Una posible salida del Ejemplo 3.17.
 
   Hasta ahora ha sido posible resolver todos los ejemplos y ejercicios sin el uso de operadores lógicos, de hecho esa ha sido la intención, sin embargo, el uso de operadores lógicos resulta indispensable para resolver de manera más sencilla diferentes tipos de problemas. La tabla siguiente muestra los operadores lógicos en C.

Operador    Descripción
               &&          Conjunción (And)
              |  |           Disyunción (Or)
              !            Negación (Not)

   Finalmente, compare el Ejemplo 3.17 con el Ejemplo 3.17_1. Este último hace exactamente lo mismo que el primero pero con una estructura de control if-else anidada y muestra también el uso de los operadores lógicos dentro de una expresión de tipo condicional.