martes, 14 de abril de 2009

CAPíTULO 5 ESTRUCTURAS DE SELECCIÓN: SENTENCIAS IF Y SWITCH

14/04/09



5.1. ESTRUCTURAS DE CONTROL
Las estructuras de control controlan el flujo de ejecución de un programa o función. Las estructuras de control permiten combinar instrucciones o sentencias individuales en una simple unidad lógica con un punto de entrada y un punto de salida.
Las instrucciones o sentencias se organizan en tres tipos de estructuras de control que sirven para controlar el flujo de la ejecución: secuencia, selección (decisión) y repetición. Hasta este momento sólo se ha utilizado el flujo secuencial. Una sentencia compuesta es un conjunto de sentencias encerradas entre llaves ({ y 1) que se utiliza para especificar un flujo secuencial.
{
sentencia ;
sentencia ;
sentencia ;
}
El control fluye de la sentenciu, a la .sentencia2 y así sucesivamente. Sin embargo, existen problemas que requieren etapas con dos o más opciones o alternativas a elegir en función del valor de una condición + o expresión.




5.2. LA SENTENCIA if
En C, la estructura de control de selección principal es una sentencia if. La sentencia if tiene dos
alternativas o formatos posibles. El formato más sencillo tiene la sintaxis siguiente:


i f (Expresión) Acción
Acción se ejecuta si la expresión
\ lógica es verdadera Expresión lógica que determina
SI la acción se ha de ejecutar


La sentencia i f funciona de la siguiente manera. Cuando se alcanza la sentencia if dentro de un
programa, se evalúa la expresión entre paréntesis que viene a continuación de if. Si Expresión es
verdadera, se ejecuta Acción; en caso contrario no se ejecuta Acción (en su formato más simple,
Acción es una sentencia simple y en los restantes formatos es una sentencia compuesta). En cualquier caso la ejecución del programa continúa con la siguiente sentencia del programa. La Figura 5.1 muestra un diagrama deflujo que indica el flujo de ejecución del programa.
Otro sistema de representar la sentencia i f es:

if (condición) sentencia;

condicion es una expresión entera(lógica).
sentencia es cualquier sentencia ejecutable, que se ejecutará sólo si la condición toma




5.3. SENTENCIA if DE DOS ALTERNATIVAS: if -else
Un segundo formato de la sentencia i f es la sentencia if -else. Este formato de la sentencia if tiene la siguiente sintaxis:
if (Expresión)
Expresión lógica que determina la de ejecutar
Acción1


accion que se realiza si la expresion logica es verdaddera


else


accion2
acción que se ejecuta si la expresion lógica es falsa
En este formato Acción y Acción son individualmente, o bien una Única sentencia que termina
en un punto y coma (;) o un grupo de sentencias encerrado entre llaves. Cuando se ejecuta la sentencia if -else, se evalúa Expresión. Si Expresión es verdadera, se ejecuta Acción y en caso contrario se ejecuta Acción . La Figura 5.2 muestra la semántica de la sentencia if -else.
un valor distinto de cero.






5.4. SENTENCIAS if -else ANIDADAS
Hasta este punto, las sentencias if implementan decisiones que implican una o dos alternativas. En esta sección, se mostrará como se puede utilizar la sentencia i f para implementar decisiones que impliquen diferentes alternativas.
Una sentencia i f es anidada cuando la sentencia de la rama verdadera o la rama falsa, es a su vez
una sentencia if. Una sentencia if anidada se puede utilizar para implementar decisiones con varias alternativas o multi-alternativas.



La sentencia if anidada tiene tres alternativas. Se incrementa una de las tres variables (num-pos ,num-neg y num-ceros) en 1, dependiendo de que x sea mayor que cero, menor que cero o igual a cero, respectivamente. Las cajas muestran la estructura lógica de la sentencia if anidada; la segunda sentencia if es la acción o tarea falsa (a continuación de else) de la primera sentencia if.
La ejecución de la sentencia if anidada se realiza como sigue: se comprueba la primera condición
(x > O); si es verdadera, numjos se incrementa en 1 y se salta el resto de la sentencia if. Si la primera condición es falsa, se comprueba la segunda condición (x <>


5.4.1. Sangría en las sentencias if anidadas
El formato muitibifurcación se compone de una serie de sentencias if anidadas, que se pueden escribir en cada línea una sentencia if. La sintaxis myltibifurcación anidada es:



5.4.2. Comparación de sentencias if anidadas y secuencias de sentencias if
Los programadores tienen dos alternativas: 1) usar una secuencia de sentencias if; 2) una Única
sentencia if anidada. Por ejemplo, la sentencia i f del Ejemplo 5.7 se puede reescribir como la siguiente secuencia de sentencias if.
if (x > O)
if (x < O)
if ( x == O)
numsos = num-pos + 1;
num-neg = num-neg + 1;
num-ceros = num-ceros + 1;


Aunque la secuencia anterior es lógicamente equivalente a la original, no es tan legible ni eficiente. Al contrario que la sentencia i f anidada, la secuencia no muestra claramente cual es la sentencia a ejecutar para un valor determinado de x. Con respecto a la eficiencia, la sentencia if anidada se ejecuta más rápidamente cuando x es positivo ya que la primera condición (x > o) es verdadera, lo que significa que la parte de la sentencia i f a continuación del primer e i s e se salta. En contraste, se comprueban siempre las tres condiciones en la secuencia de sentencias if. Si x es negativa, se comprueban dos condiciones en las sentencias if anidadas frente a las tres condiciones de las secuencias de sentencias if. Una estructura típica if -else anidada permitida es:
if (numero > O)
{
...

}
else
{

if ( . . . )
{
...

}
else
if ( ... )
{
...
}
}
. . .
}


5.5. SENTENCIA DE CONTROL switch
La sentencia switch es una sentencia C que se utiliza para seleccionar una de entre múltiples alternativas. La sentencia switch es especialmente Útil cuando la selección se basa en el valor de una variable simple o de una expresión simple denominada expresicín de control o selector. El valor de esta expresión puede ser de tipo int o char, pero no de tipo float ni double.

La expresión de control o se1 ector se evalúa y se compara con cada una de las etiquetas de case.
La expresión selector debe ser un tipo ordinal (por ejemplo, int , char, pero no float o string ) . Cada etiqueta es un valor Único, constante y cada etiqueta debe tener un valor diferente de los otros. Si el valor de la expresión selector es igual a una de las etiquetas case -por ejemplo, etiqueta - entonces la ejecución comenzará con la primera sentencia de la secuencia sentencia y continuará hasta que se encuentra el final de la sentencia de control switch, o hasta encontrar la sentencia break. Es habitual que después de cada bloque de sentencias correspondiente a una secuencia se desee terminar la ejecución del switch; para ello se sitúa la sentencia break como Última sentencia del bloque. break hace que siga la ejecución en la siguiente sentencia al switch.


5.5.1. Caso particular de case
Está permitido tener varias expresiones case en una alternativa dada dentro de la sentencia switch. Por ejemplo, se puede escribir:
switch(c) {
case '0':case '1': case '2': case '3': case '4':
case '5':case '6': case '7': case '8': case '9':
num-digitos++; /*se incrementa en 1 el valor de num-digitos * /
break;
case" :case '\t': case '\n':
num-blancos++; /*se incrementa en 1 el valor de num-blancos*/
break;
default:
num-distintos++;
}


5.5.2. Uso de sentencias switch en menús
La sentencia i f -else es más versátil que la sentencia switch y se puede utilizar unas sentencias if -else anidadas o multidecisión, en cualquier parte que se utiliza una sentencia case. Sin embargo,
normalmente, la sentencia switch es más clara. Por ejemplo, la sentencia switch es idónea para
implementar menús.
Un menú de un restaurante presenta una lista de alternativas para que un cliente elija entre sus
diferentes opciones. Un menú en un programa de computadora hace la misma función: presentar una lista de alternativas en la pantalla para que el usuario elija una de ellas.
En los capítulos siguientes se volverá a tratar el tema de los menús en programación con ejemplosprácticos.


5.6. EXPRESIONES CONDICIONALES: EL OPERADOR ? :
Las sentencias de selección (if y switch) consideradas hasta ahora, son similares a las sentencias
previstas en otros lenguajes, tales como Pascal y Fortran 90. C tiene un tercer mecanismo de selección, una expresión que produce uno de dos valores, resultado de una expresión lógica o booleana (también denominada condición). Este mecanismo se denomina expresión condicional. Una expresión condicional tiene el formato C ? A : B y es realmente una operación ternaria (tres operandos) en el que c , A y B son los tres operandos y ? : es el operador.


5.7. EVALUACIÓN EN CORTOCIRCUITO DE EXPRESIONES LÓGICAS
Cuando se evalúan expresiones lógicas en C se puede emplear una técnica denominada evaluación en cortocircuito. Este tipo de evaluación significa que se puede detener la evaluación de una expresión lógica tan pronto como su valor pueda ser determinado con absoluta certeza. Por ejemplo, si el valor de (soltero == ’s ’ ) es falso, la expresión lógica (soltero == ’s’) &&(sexo = ’h’) hh (edad> 18) && (edad <= 4 5) será falsa con independencia de cual sea el valor de las otras condiciones. La razón es que una expresión lógica del tipo

falso && ( . . . )

debe ser siempre falsa, cuando uno de los operandos de la operación AND es falso. En consecuencia no y necesidad de continuar la evaluación de las otras condiciones cuando (sol tero == ’s’) se evalúa a falso.
El compilador C utiliza este tipo de evaluación. Es decir, la evaluación de una expresión lógica de
la forma, && a se detiene si la subexpresión de la izquierda se evalúa a falsa.

C realiza evaluación en cortocircuito con los operadores && y I I , de modo que evalúa primero la expresión más a la izquierda de las dos expresiones unidas por && o bien por I I . Si de esta evaluación se deduce la información suficiente para determinar el valor final de la expresión (independiente del valor de la segunda expresión), el compilador de C no evalúa la segunda expresión.

5.9. ERRORES FRECUENTES DE PROGRAMACIÓN
I . Uno de los errores más comunes en una sentencia if es utilizar un operador de asignación (=)en lugar de un operador de igualdad (==).
2. En una sentencia i f anidada, cada cláusula el se se corresponde con la i f precedente más
cercana.

Por ejemplo, en el segmento de programa siguiente
if (a > O)
if (b > O)
c = a + b ;
else
c = a + abs(b) ;
d = a * b * c ;
¿Cuál es la sentencia if asociada a else?
El sistema más fácil para evitar errores es el sangrado o indentación, con lo que ya se aprecia
que la cláusula else se corresponde a la sentencia que contiene la condición b > o
if (a > O)
if (b > O)
else
c = a + b ;
c = a + abs(b) ;
d = a * b * c ;


3. Las comparaciones con operadores == de cantidades algebraicamente iguales pueden producir
una expresión lógica falsa, debido u que la mayoría de los números reales no se almacenan
exactamente. Por ejemplo, aunque las expresiones reales siguientes son equivalentes:
a * ( l / a )
1 . 0
son algebraicamente iguales, la expresión
a * ( l / a ) == 1 . 0
puede ser falsa debido a que a es real.
4. Cuando en una sentencia s w i tch o en un bloque de sentencias falta una de las llaves ( { , 1)
aparece un mensaje de error tal como:
Error . . . : Cumpound statement missing } in funct-ion
Si no se tiene cuidado con la presentación de la escritura del código, puede ser muy difícil
5. El selector de una sentencia s w l t ch debe ser de tipo entero o compatible entero. Así las
localizar la llave que falta.
constantes reales
2 . 4 , - 4 . 5 , 3 . 1 4 1 6
no pueden ser utilizadas en el selector.
6. Cuando se utiliza una sentencia s w i t ch, asegúrese que el selector de s w i t ch y las etiquetas
case son del mismo tipo (in t , char pero no f 1 o a t ) . Si el selector se evalúa a un valor no
listado en ninguna de las etiquetas case, la sentencia s w i t ch no gestionará ninguna acción;
por esta causa se suele poner ma etiqueta d e f d u l t pura resolver este problema.

No hay comentarios:

Publicar un comentario