Proposiciones para el control de flujo de programa.
Bloques de sentencias.
En este capítulo, denominaremos BLOQUE DE SENTENCIAS al conjunto de sentencias individuales incluidas dentro de un par de llaves. Por ejemplo:
Este conjunto se comportará sintácticamente como una sentencia simple y la llave de cierre del bloque no debe ir seguida de punto y coma. Un ejemplo de bloque ya visto, es el cuerpo del programa principal de la función main().{ sentencia 1; sentencia 2; ... sentencia n; }
En las proposiciones de control de flujo de programa, trabajaremos alternativamente con sentencias simples y bloques de ellas.main() { bloque de sentencias }
Proposición IF-ELSE.
Sirve para ejecutar ciertas sentencias de programa, si una expresión resulta cierta u otro grupo de sentencias, si aquella resulta falsa. Su interpretación literal sería: "Sí es cierta tal cosa, hago tal acción, sino lo es, salta la condición."" El caso más sencillo sería:
La sentencia sólo se ejecutará si el resultado de "expresión" es distinto de cero (cierto), en caso contrario el programa salta dicha sentencia, realizando la siguiente en su flujo.if (expresión) sentencia;
Proposición switch.
El switch es una forma sencilla de evitar largos, tediosos y confusos anidamientos de if-else if.
Supongamos que estamos implementando un menu, con varias elecciones posibles. El esqueleto de una posible solución al problema
usando if-else podía ser el siguiente:
Como es fácil de ver, cuando las opciones son muchas, el texto comienza a hacerse difícil de entender y engorroso de escribir.#include <stdio.h> main() { int c; printf("\n MENÚ"); 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\n ESCRIBA 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¡ NO HA SELECCIONADO NADA !" ) ; }
El mismo progrma, usando la sentencia switch, quedaría:
El switch empieza con la sentencia:#include <stdio.h> #include <conio.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 : ") ; c = getchar() ; switch (c) { case 'A' : printf("\nUD. SELECCIONO AGREGAR") ; break ; case 'B' : printf("\nUD. SELECCIONO BORRAR") ; break ; case 'O' : printf("\nUD. SELECCIONO ORDENAR") ; break ; case 'I' : printf("\nUD. SELECCIONO IMPRIMIR") ; break ; case '\n': printf("\n¡ UD. NO HA SELECCIONADO NADA !" ) ; break ; default : printf("\n\a\aUD. APRETO UN CARACTER ILEGAL" ) ; break ; } }
La expresión contenida por los paréntesis debe ser entera, en nuestro caso es 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 termina 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.switch (expresion)
Prestemos atención también 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 progrmaa anterior, al resultar cierta una sentencia de comparación, se ejecutarán las sentencias de ese case particular pero también de todos los case's por debajo del que ha resultado verdadero, hasta encontrar un 'break'.
Al final del bloque de sentencias del switch, aparaece una optativa llamada default, que implica, sino se ha sumplido ningun case, ejecute lo que sigue. Es algo superfluo poner el break en este caso, ya que no hay más sentencias después del 'default'.
Iteración WHILE.
El while es una de las tres iteraciones posibles en C. Su sintaxis podría expresarse de la siguiente forma:
Esta sintaxis en palabras significaria; mientras (expresión) dé un resultado CIERTO ejecuto la preposición 1, 2 o 'n'.while (expresion) { proposición_1 ; proposición_2 ; ... proposición_n ; }
Por lo general, dentro de la proposición o del bloque de ellas, se modifican términos de la expresión condicional, para controlar la duración de la iteración.
La iteración Do-While.
Su sintaxis será:
Expresado en palabras es: ejecute las proposiciones, luego repita la ejecución mientras la expresión dé un resultado CIERTO. La diferencia fundamental entre esta iteración y la iteración anterior es que ésta se ejecuta siempre almenos una vez, sea cual sea el resultado de expresión.do{ proposición_1; proposición_2; ... } while (expresion);
Iteración FOR.
Es simplemente una manera abreviada de expresar un WHILE, su sintaxis es:
Todas estas expresiones, contenidas en el paréntesis del FOR deben estar separadas por punto y coma y NO por comas simples.for (expresion1; expresion2; expresion3 ){ proposicion1; proposicion2; ... }
No es imprescindible que existan todas las expresiones dentro del paréntesis del FOR, pudiéndose dejar en blanco algunas de ellas. Por ejemplo:
Para salir del bucle en estos dos últimos casos, el programador probablemente lo sacará con un break o un return.for (; expr2; expr3)
for (expr1;;)
for (;;)
La sentencia break.
Sirve para terminar loops producidos por while, do-while y for antes que cumpla la condición normal de terminación. En el ejmplo siguiente vemos su suo para terminar un while indeterminado.
#include
#include main(){ char c ; printf("ESTE ES UN LOOP INDEFINIDO ") ; while(1){ printf( "DENTRO DEL LOOP INDEFINIDO (apriete una tecla):" ) ; if( (c = getch()) == 'Q' ) break ; printf( "\nNO FUE LA TECLA CORRECTA PARA ABANDONAR EL LOOP ") ; } printf("\nTECLA CORRECTA : FIN DEL WHILE ") ; }
Sentencia continue.
La sentencia CONTINUE es similar al break con la diferencia que en vez de terminar violentamente el loop, termina con la realización de una iteración particular y permitiendo al programa continuar con la siguiente.
La función exit()
La función exit() tiene una operación mucho más drástica que las anteriores, en vez de saltear una iteración o abandonar
un lazo de programa, esta abandona directamente al programa mismo dándolo por terminado. Realiza también una serie de
operaciones útiles como ser, el cerrado de cualquier archivo que el programa hubiera abierto, el vaciado de los buffers de
salida, etc.
Normalmente se la utiliza para abortar los programas en caso de que se esté por cometer un error fatal e inevitable. Mediante
el valor que se le ponga en su argumento se le puede informar a quien haya llamado al programa (Sistema Operativo, archivo .bat
u otro programa) el tipo que se cometio.
La sentencia GOTO
GOTO implica un salto incondicional de un lugar a otro del programa. Esta práctica hace que los programas sean difíciles de
corregir o mantener. Si no quedará más remedio que usarlo, (y en programación estructurada siempre hay remedio) debe marcarse
el destino del salto mediante un nombre seguido por dos puntos.
En este caso si C es cero se salta todas las sentencias entre el if y el destino, continuandose con la ejecución del printf(). El destino puede ser tanto posterior como anterior al GOTO invocante.if ( c== 0 ) goto OtroLado; ... OtroLado: printf(...)