ESTRUCTURAS CONDICIONALES
PROPOSICION IF - ELSE
Esta proposición sirve para ejecutar ciertas sentencias de programa , si una expresión resulta CIERTA ú otro grupo de sentencias, si aquella resulta FALSA. Su interpretación literal sería : SI es CIERTA tal cosa , haga tal otra , si no lo es salteéla .
El caso más sencillo sería :
if(expresión) sentencia ; ó if(expresión) sentencia ;
Cuando la sentencia que sigue al IF es única, las dos formas de escritura expresadas arriba son equivalentes . La sentencia sólo se ejecutará si el resultado de "expresión" es distinto de cero (CIERTO) , en caso contrario el programa salteará dicha sentencia , realizando la siguiente en su flujo.
TABLA DE OPERADORES RELACIONALES
SIMBOLO | DESCRIPCION | EJEMPLO | ORDEN DE EVALUACION |
< | menor que | (a < b) | 5 |
> | mayor que | (a >b) | 5 |
< = | menor o igual que | (a < = b) | 5 |
>= | mayor o igual que | ( a >>= b ) | 5 |
= = | igual que | ( a = = b) | 6 |
! = | distinto que | ( a != b) | 6 |
TABLA DE OPERADORES LOGICOS
SIMBOLO | DESCRIPCION | EJEMPLO | ORDEN DE EVALUACION |
&& | Y (AND) | (a>b) && (c < d) | 10 |
|| | O (OR) | (a>b) || (c < d) | 11 |
! | NEGACION (NOT) | !(a>b) | 1 |
Veamos unos ejemplos de las distintas formas que puede adoptar la "expresión" dentro de un IF :
if( a > b ) | if( (a > b) != 0 ) | las dos expresiones son idénticas, aunque a veces resulta más claro expresarla de la segunda manera, sobre todo en los primeros contactos con el lenguaje. |
if(a) | if(a != 0) | |
if(!a) | if(a == 0 ) | Las dos superiores son idénticas entre sí , al igual que las dos inferiores Obsérvese que (!a) dará un valor CIERTO sólo cuando a sea FALSO. (ver operador NEGACION en el capítulo anterior ) |
if( a == b ) | ||
if( a = b ) | /* Error */ | La primera es una expresión correcta , el IF se realizará sólo si a es igual a b. En cambio la segunda es un error , ya que no se está comparando a con b , sino ASIGNANDO el valor de esta a aquella . Sin embargo, a veces puede usarse como un truco (un poco sucio) de programacion , ya que primero se realiza la asignación y luego se evalúa el resultado de esta para realizar el IF , es entonces equivalente a escribir : |
a = b ; | ||
if(a) | .................... | con el ahorro de una linea de programa ( a costa de la legibilidad del mismo ). |
En casos más complejos que los anteriores , la proposición IF puede estar seguida por un bloque de sentencias :
if(expresión) if(expresión) { { sentencia 1 ; sentencia 1 ; sentencia 2 ; sentencia 2 ; ............... ............. } }
Las dos maneras son equivalentes , por lo que la posición de la llave de apertura del bloque queda librada al gusto del programador . El indentado de las sentencias (sangría) es también optativo , pero sumamente recomendable ,sobre todo para permitir la lectura de proposiciones muy complejas ó anidadas , como se verá luego. El bloque se ejecutará en su conjunto si la expresion resulta CIERTA. El uso del ELSE es optativo , y su aplicación resulta en la ejecución de una , ó una serie de sentencias en el caso de que la expresión del IF resulta FALSA.
Su aplicación puede verse en el ejemplo siguiente :
if(expresión) if(expresión) { { sentencia 1 ; sentencia 1 ; sentencia 2 ; sentencia 2 ; } } sentencia 3 ; else sentencia 4 ; { sentencia 5 ; sentencia 3 ; sentencia 4 ; } sentencia 5 ;
En el ejemplo de la izquierda no se usa el ELSE y por lo tanto las sentencias
3 , 4 y 5 se ejecutan siempre . En el segundo caso , las sentencias 1 y 2 se
ejecutan solo si la expresión es CIERTA , en ese caso las 3 y 4 NO se ejecutarán
para saltarse directamente a la 5 , en el caso de que la expresión resulte
FALSA se realizarán las 3 y 4 en lugar de las dos primeras y finalmente la 5 .
La proposición ELSE queda siempre asociada al IF más cercano , arriba de él .
Es común también , en caso de decisiones múltiples , el uso de anidamientos
ELSE-IF de la forma indicada abajo:
if(exp.1) if(exp.1) sentencia1 ; sentencia1 ; else if(exp.2) else if(exp.2) sentencia2 ; sentencia2 ; else if(exp.3) else if(exp.3) sentencia3 ; sentencia3 ; else else sentencia5 ; sentencia5 ;
Si bién se suele escribir según la modalidad de la izquierda , a la derecha hemos expresado las asociaciones entre los distintos ELSE é IF por medio del indentado del texto.
PROPOSICION SWITCH
El SWITCH es una forma sencilla de evitar largos , tediosos y confusos
anidamientos de ELSE-IF .
Supongamos que estamos implementando un Menu , con varias elecciones posibles .
El esqueleto de una posible solución al problema usando if-else podría ser el
siguiente :
#include <<stdio.h>> main() { int c ; printf("\nMENU :") ; printf("\n A = ADICIONAR A LA LISTA ") ; printf("\n B = BORRAR DE LA LISTA ") ; printf("\n O = ORDENAR LA LISTA ") ; printf("\n I = IMPRIMIR LA LISTA ") ; printf("\n\nESCRIBA SU SELECCION , Y LUEGO <<ENTER>> : ") ; if( (c = getchar()) != '\n' ) { if( c == 'A') printf("\nUD. SELECCIONO AGREGAR") ; else if( c == 'B') printf("\nUD. SELECCIONO BORRAR") ; else if( c == 'O' ) printf("\nUD. SELECCIONO ORDENAR") ; else if( c == 'I' ) printf("\nUD. SELECCIONO IMPRIMIR") ; else printf("\n\a\aUD. APRETO UN CARACTER ILEGAL" ) ; } else printf("\n¡ UD. NO HA SELECCIONADO NADA !" ) ; }
El SWITCH empieza con la sentencia : switch (expresión) . La expresión
contenida por los paréntesis debe ser ENTERA , en nuestro caso un caracter ;
luego mediante una llave abre el bloque de las sentencias de comparación . Cada
una de ellas se representa por la palabra clave "case" seguida por el
valor de comparación y terminada por dos puntos . Seguidamente se ubican las
sentencias que se quieren ejecutar , en el caso que la comparación resulte
CIERTA . En el caso de resultar FALSA , se realizará la siguiente comparación
, y así sucesivamente .
Prestemos atención tambien a la sentencia BREAK con la que se termina cada
CASE. Una característica poco obvia del SWITCH , es que si se eliminan los
BREAK del programa anterior , al resultar CIERTA una sentencia de comparación,
se ejecutarán las sentencias de ese CASE particular pero TAMBIEN la de todos
los CASE por debajo del que ha resultado verdadero. Quizás se aclare esto
diciendo que , las sentencias propias de un CASE se ejecutarán si su comparación
ú otra comparación ANTERIOR resulta CIERTA . La razón para este poco
"juicioso" comportamiento del SWITCH es que así se permite que varias
comparaciones compartan las mismas sentencias de programa , por ejemplo :
................. case 'X' : case 'Y' : case 'Z' : printf(" UD. ESCRIBIO X , Y , ó Z ") ; break ; ..................
La forma de interrumpir la ejecución luego de haber encontrado un CASE
cierto es por medio del BREAK , el que dá por terminado el SWITCH .
Al final del bloque de sentencias del SWITCH , aparece una optativa llamada
DEFAULT , que implica : si no se ha cumplido ningun CASE , ejecute lo que sigue.
Es algo superfluo poner el BREAK en este caso , ya que no hay más sentencias
despues del DEFAULT , sin embargo , como el orden en que aparecen las
comparaciones no tiene importancia para la ejecución de la instrucción, puede
suceder que en futuras correcciones del programa se agregue algún nuevo CASE
luego del DEFAULT , por lo que es conveniente preveerlo , agregando el BREAK ,
para evitar errores de laboriosa ubicación .
Más adelante volveremos sobre otros usos del BREAK.
Anterior home
Siguiente