Subsecciones

3. Estructuras Condicionales

En este capítulo se revisan los distintos métodos con los que C controla el flujo lógico de un programa.

Como se revisó en el capítulo anterior, los operadores relaciones binarios que se usan son:

==, !=, <, <=, > y >=

además los operadores lógicos binarios:

||, &&

y el operador lógico unario de negación !, que sólo toma un argumento.

Los operadores anterior son usados con las siguientes estructuras que se muestran.

3.1 La sentencia if

Las tres formas como se puede emplear la sentencia if son:

if (condicion)
sentencia;

...o

if (condicion)
sentencia1;
else
sentencia2;

...o

if (condicion1)
sentencia1;
else if (condicion2)
sentencia2;
...
else
sentencian;

El flujo lógico de esta estructura es de arriba hacia abajo. La primera sentencia se ejecutará y se saldrá de la estructura if si la primera condición es verdadera. Si la primera condición fue falsa, y existe otra condición, se evalúa, y si la condición es verdadera, entonces se ejecuta la sentencia asociada. Si existen más condiciones dentro de la estructura if, se van evaluando éstas, siempre y cuando las condiciones que le precedan sean falsas.

La sentencia que esta asociada a la palabra reservada else, se ejecuta si todas las condiciones de la estructura if fueron falsas.

Por ejemplo:

main()
{
   int x, y, w;

	........

   if (x>0)
   {
      z=w;
      .......
   }
   else
   {
      z=y;
      .......
   }
}

3.2 El operador ?

El operador ternario condicional ? es más eficiente que la sentencia if. El operador ? tiene el siguiente formato:

expresion1 ? expresion 2 : expresion3;

Que es equivalente a la siguiente expresión:

if (expresion1) then expresion2 else expresion3;

Por ejemplo, para asignar el máximo de a y b a la variable z, usando ?, tendríamos:

z = (a>b) ? a : b;

que es lo mismo que:

    if (a > b)
        z = a;
    else
        z = b;

El uso del operador ? para reemplazar las sentencias if ... else no se restringe sólo a asignaciones, como en el ejemplo anterior. Se pueden ejecutar una o más llamadas de función usando el operador ? poniéndolas en las expresiones que forman los operandos, como en el ejemplo siguiente:

f1(int n)
{
    printf("%d ",n);
}

f2()
{
    printf("introducido\n");
}

main()
{
    int t;

    printf(": ");
    scanf("%d",&t);

    /* imprime mensaje apropiado */
    t ? f1(t) + f2() : printf("Se dió un cero\n");

}

3.3 La sentencia switch

Aunque con la estructura if ... else if se pueden realizar comprobaciones múltiples, en ocasiones no es muy elegante, ya que el código puede ser difícil de seguir y puede confundir incluso al autor transcurrido un tiempo. Por lo anterior, C tiene incorporada una sentencia de bifurcación múltiple llamada switch. Con esta sentencia, la computadora comprueba una variable sucesivamente frente a una lista de constantes enteras o de caracter. Después de encontrar una coincidencia, la computadora ejecuta la sentencia o bloque de sentencias que se asocian con la constante. La forma general de la sentencia switch es:

switch (variable) {
case constante1:
secuencia de sentencias
break;
case constante2:
secuencia de sentencias
break;
case constante3:
secuencia de sentencias
break;
...
default:
secuencia de sentencias
}

donde la computadora ejecuta la sentencia default si no coincide ninguna constante con la variable, esta última es opcional. Cuando se encuentra una coincidencia, la computadora ejecuta las sentencias asociadas con el case hasta encontrar la sentencia break con lo que sale de la estructura switch.

Las limitaciones que tiene la sentencia switch ... case respecto a la estructura if son:

La forma como se puede simular el último punto, es no teniendo sentencias asociados a un case, es decir, teniendo una sentencia nula donde sólo se pone el caso, con lo que se permite que el flujo del programa caiga al omitir las sentencias, como se muestra a continuación:

switch (letra)
{
   case 'a':
   case 'e':
   case 'i':
   case 'o':
   case 'u':
      numvocales++;
      break;

   case ' ':
      numesp++;
      break;

   default:
      numotras++;
      break;
}

3.4 Ejercicios

  1. Escribir un programa que lea dos caracteres, e imprima su valor cuando se pueda interpretar como un número hexadecimal. Aceptar letras mayúsculas y minúsculas para los valores del 10 al 15.
  2. Leer un valor entero. Suponer que el número es un día de la semana. Suponer que 0 corresponde a Domingo y así sucesivamente. Imprimir el nombre del día.
  3. Dados como entrada 3 enteros representando la fecha como día, mes, año, imprimir la fecha del día anterior. Por ejemplo para una entrada como: 1 3 1992 La salida será: Fecha anterior a 1-3-1992 es 29-02-1992
  4. Escribir un programa el cual lea dos valores enteros. Si el primero es menor que el segundo, que imprima el mensaje ``Arriba''. Si el segundo es menor que el primero, que imprima el mensaje ``Abajo''. Si los números son iguales, que imprima el mensaje ``igual''. Si hay un error en la lectura de los datos, que imprima un mensaje conteniendo la palabra ``Error'' y haga exit( 0 );