Está en la página 1de 25

Control de Flujo de programa

2.0 Introduccin

En tema anterior aprendimos a trabajar con variables, leer sus valores por teclado, visualizarlas en pantalla y realizar operaciones elementales con ellas.

Los programas que escribimos hasta ahora se ejecutaban secuencialmente, es decir, instruccin tras instruccin, sin posibilidad de volver a ejecutar una instruccin ya ejecutada o evitar la ejecucin de un grupo de instrucciones si se dan unas caractersticas determinadas.

En este tercer tema se describirn las instrucciones que nos permiten escribir programas que no se ejecuten de una forma secuencial en el sentido explicado en el prrafo anterior.

2.1 Expresiones condicionales.

En ciertas ocasiones nos puede interesar que un programa llegado a un punto de su ejecucin vuelva hacia atrs y se ejecute de nuevo, pero lo que en general nos interesar ser que este regreso a una lnea de terminada de nuestro cdigo se realice si se cumple una cierta condicin. Por esta razn es necesario explicar,

antes de comenzar con las instrucciones propiamente dichas de control de flujo de programa, como le indicamos al ordenador que deseamos evaluar una condicin.

Las expresiones que nos permiten realizar sto reciben el nombre de expresiones condicionales o booleanas. Estas expresiones slo pueden tomar dos valores: VERDADERO (TRUE) o FALSO (FALSE). En general un valor de 0 indica que la expresin es falsa y un valor distinto de 0 indica que la expresin es verdadera.

Como hemos indicado se trata de expresiones condicionales, y anlogamente a las expresiones aritmticas podemos comparar variables entre s, constantes entre s (lo cual no es muy til puesto que si conocemos los dos valores ya sabemos la relacin que existe entre ambas constantes) y por supuesto variables y constantes. Adems podemos agrupar condiciones entre s formando expresiones ms complejas y ayudarnos de los parntesis para indicar el orden de evaluacin. Los operadores condicionales son:

== Representa igualdad. != Representa desigualdad > Mayor que. < Menor que. >= Mayor o igual que. <= Menor o igual que.

Podemos encadenar distintas expresiones condicionales, las cuales deben de ir entre parntesis (comparamos de dos en dos) utilizando los operadores:

&& Y lgico. || O lgico.

Veamos un ejemplo de expresin condicional

(a==2)||((b>=0)&&(b<=20))

la expresin ser cierta si la variable a es igual a dos o si la variable b tiene un valor comprendido entre 0 y 20.

2.1.1 La instruccin if... else.

En ingls if significa si condicional, por ejemplo, si llueve me llevar el paraguas, else significa sino, sino llueve me ir a la playa. Este es el significado que poseen en programacin. Su sintaxis es:

if (condicin) instruccin;else instruccin;

NOTA: La sintaxis real del IF es la siguiente: if (condicin) bloque else bloque.

Un programa ejemplo nos indicar su funcionamiento con claridad. Supongamos que deseamos dividir dos nmeros. El nmero por el que dividimos no puede ser cero, sto nos dara un valor de infinito, provocando un error en el ordenador. Por tanto antes de dividir deberamos de comprobar si el divisor es cero. El programa sera algo como sto:

#include <stdio.h>

main() { float dividendo,divisor;

printf ("\nDime el dividendo:"); scanf ("%f",ndo); printf ("\nDime el divisor:"); scanf ("%f",&divisor);

if (divisor==0) printf ("\nNo podemos dividir un nmero por 0"); else printf ("\nEl resultado es: %f",dividendo/divisor); }

Como en todas los comandos del lenguaje C una instruccin,

en general, puede ser solamente una o un conjunto de ellas incluidas entre llaves.

Por ltimo el lenguaje C dispone de un operador ternario (de tres elementos) que permite construir determinadas estructuras if-else, en concreto toma un valor u otro dependiendo de una expresin condicional. Su sintaxis es:

exp1 ? exp2 : exp3

Si exp1 es cierta la expresin tomar el valor exp2, sino tomar el valor exp3. Un ejemplo de su utilizacin:

/* La variable z toma el valor mximo entre a y b */ z = ( (a>b) ? a : b);

Como se puede observar se trata de una secuencia if else pero muy concreta, probablemente el compilador generar un cdigo mucho ms eficiente para este tipo de secuencia de ah su inclusin en el juego de operadores del C.

A continuacin se describirn las instrucciones que nos permiten controlar el flujo de programa, en las cuales tendremos que utilizar expresiones condicionales continuamente, por lo cual no insistiremos ms en este tema.

2.2 Control del flujo de programa

2.2.0 Introduccin

A estas alturas el lector ya debera conocer lo que es el flujo de programa. El flujo de programa es la secuencia de instrucciones que un programa ejecuta desde su comienzo hasta que finaliza. En principio la ejecucin es secuencial, comienza con la primera instruccin y termina con la ltima. Sin embargo es comn que nos interese que nuestro programa no termine con la ltima de las instrucciones (si por ejemplo no podemos abrir un fichero y la funcin del programa es modificar ese fichero, el programa no debera realizar ninguna operacin y terminar al detectar el error), o puede que nos interese que un grupo de instrucciones se ejecute repetidamente hasta que le indiquemos que pare. Todo esto se puede conseguir con las instrucciones que se describirn a continuacin.

2.2.1 Creacin de bucles de ejecucin.

2.2.1.0 Concepto de bucle

En la introduccin ya se ha mencionado lo que es un bucle. Una secuencia de instrucciones que se repite un nmero determinado de veces o hasta que se cumplan unas determinadas condiciones.

Los bucles son extremadamente tiles en nuestros programas, algunos ejemplos son:

* Lectura/Visualizacin de un nmero determinado de datos, como por ejemplo una matriz.

* A veces se hace necesario introducir esperas en nuestros programas ya sea por trabajar con un perifrico lento o simplemente por ralentizar su ejecucin. Los primeros se llaman bucles de espera activa y los segundo bucles vacos.

* En aplicaciones grficas como trazado de lneas o rellenado de polgonos.

* Lectura de datos de un fichero...

A continuacin describiremos las opciones que nos proporciona el lenguaje de programacin C para crear y gestionar los bucles.

2.2.1.1 Bucle for

La primera opcin de que disponemos es el bucle for. Este

tipo de instruccin se halla presente en la mayora de los lenguajes de programacin estructurados, y permite repetir una instruccin o conjunto de instrucciones un nmero determinado de veces. Su sintaxis es como sigue:

for (exp1;exp2;exp3) instruccin;

exp1 es una expresin que slo se ejecuta una vez al principio del bucle. El bucle for suele utilizarse en combinacin con un contador. Un contador es una variable que lleva la cuenta de las veces que se han ejecutado las instrucciones sobre las que acta el comando for. Por tanto exp1 suele contener una expresin que nos permite inicializar ese contador generalmente a 0 aunque eso depende de para qu deseemos utilizar el bucle.

exp2 es la expresin que nos indica cuando debe finalizar el bucle, por tanto se tratar de una expresin condicional. Su interpretacin sera algo como; repite la instruccin (o instrucciones) mientras se cumpla exp2. Esta expresin se evaluar en cada ciclo del bucle para determinar si se debe realizar una nueva iteracin.

NOTA: Hay que recordar que exp2 se evala al principio del bucle, y no al final. Por tanto es posible no ejecutar el bucle NINGUNA vez.

exp3 es una expresin que se ejecuta en cada iteracin. Puesto que como ya indicamos el bucle for se utiliza junto a un contador, exp3 en general contiene una instruccin que actualiza nuestro contador.

Por tanto en un bucle con contador distinguimos tres partes diferenciadas:

* La inicializacin del contador (exp1).

* La condicin de fin de bucle (exp2).

* Y la actualizacin del contador (exp3).

El bucle for esta especialmente pensado para realizar bucles basados en contadores. Se puede utilizar en bucle del tipo "repite esto hasta que se pulse una tecla", pero para estos tenemos instrucciones ms apropiadas. Veamos unos ejemplos que nos permitan comprender ms fcilmente el funcionamiento del comando for.

Ejemplo 1: Contar hasta diez.

#include <stdio.h>

main() {

int i; /* Esta variable la utilizaremos como contador*/

for (i=0;i<10;i++) printf ("\n%d",i); }

Este programa mostrar en pantalla numeros de 0 a 9 (diez en total). exp1 inicializa nuestro contador que en este caso es una variable de tipo entero, con el valor 0, exp2 nos dice que nuestra instruccin (la funcin printf) debe repetirse mientras el contador sea menor que diez y finalmente exp3 indica que el contador debe de incrementarse en una unidad en cada ciclo del bucle.

Nos podra interesar contar desde diez hasta 1, en este caso el comando for debera de ser:

for (i=10;i>0;i--) printf ("\n%d",i);

Ejemplo 2: Visualizar dos tablas de multiplicar en pantalla.

#include <stdio.h>

main() { int int i;

tabla1,tabla2;

tabla1 = 2; /* Primero la tabla del dos */ tabla2 = 5; /* y a continuacin la tabla del cinco*/

for (i=1;i<11;i++) { printf ("\n %2dx%2d=%3d",tabla1,i,tabla1*i); printf (" %2dx%2d=%3d",tabla2,i,tabla2*i); } }

El ejemplo es anlogo al anterior, pero en este caso visualizamos valores desde uno a diez, en lugar de visualizarlos de 0 a 9. En este ejemplo, el bucle acta sobre un conjunto de instrucciones, no sobre una sola, por tanto debemos introducirlas entre las llaves para indicar al compilador que la instruccin for acta sobre las dos instrucciones. Estamos considerando todo lo que se encuentre entre las llaves como una sola instruccin.

Para terminar con los bucles de tipo for un leve comentario sobre los bucles aadados, simplemente lo que se hace es incluir un bucle dentro de otro. Supongamos que deseamos introducir los datos de nuestro jugadores preferidos por teclado para almacenarlos en el ordenador, y que de cada jugador queremos almacenar por ejemplo, su nacionalidad, su peso y su altura. En este caso nos sera til un bucle anidado. El bucle exterior nos contara jugadores, mientras que para cada jugador tendramos otro bucle que nos leyera los tres

datos que necesitamos. Si tenemos veinte jugadores preferidos, incluiramos una unas instrucciones como estas:

for (i=0;i<20;i++) { printf ("Jugador preferido %d",i); for (j=0;j<3;j++) { leo caracterstica j; la almaceno donde sea; } }

Nada ms en lo que a bucles de tipo for respecta. A continuacin veremos las otras estructuras que nos proporciona el lenguaje C para la realizacin de bucles.

2.2.1.2 Bucles while.

La sintaxis de este bucle ser algo as:

while (exp2) instruccin;

En ingls while significa mientras, por tanto la lnea anterior significara mientras de cumpla exp2 ejecuta la

instruccin. Obviamente la instruccin que ejecutemos debe de permitir que en algn caso se cumpla exp2, de lo contraro el ordenador permanecera eternamente ejecutando instruccin. Tambin es evidente que exp2 debe ser una expresin condicional. Como vemos este tipo de bucles no est orientado a contadores, es mucho ms genrico, sin embargo se puede utilizar de forma anloga a for. Con la nomenclatura utilizada anteriormente tendramos algo como sto:

exp1; while (exp2) { instruccin; exp3; }

Con este esquema se hace patente la utilidad de la instruccin for para bucles con contador puesto que se "centraliza" todo el proceso de gestin del contador (inicializacin y actualizacin) en una sola instruccin. Un error comn al escribir un bucle con contador con una estructura while es olvidar introducir exp3, con lo cual nunca se cumple exp2 y nunca salimos del bucle. De nuevo un bucle infinito aunque a veces nos interesa tener un bucle infinito. La forma ms sencilla de realizar un bucle infinito es con la expresin:

while (1) instruccin;

Como indicamos exp2 es una expresin condicional y para estas expresiones un valor distinto de 0 es verdadero por tanto un 1 es siempre cierto y no hay manera de salir del bucle puesto que es una constante y ninguna modificacin de variables por parte de instruccin tendra repercusiones sobre ella.

Los bucle while son tiles en aplicaciones como; lee datos de este fichero mientras no llegues al final muestra estos datos en la pantalla mientras no pulse una tecla.

Una peculiaridad de esta instruccin es que puede no ejecutarse nunca la instruccin afectada por el while. Algunos ejemplos:

Ejemplo 1: Contar hasta diez.

#include <stdio.h>

main() { int i;

i = 0; while (i<10) {

printf ("\n%d",i); i++; } }

El primer valor que visualizaremos ser el 0. Cuando i tenga el valor nueve la condicin i<10 todava se cumple por lo que entraremos en el bucle de nuevo, visualizaremos el nueve e incrementamos i con lo que pasa a tener el valor 10 momento en el cual se vuelve a evaluar la expresin i<10 que en este caso sera falsa y no volveramos a entrar en el bloque de instrucciones (las que estn entre llaves). As visualizamos nueve nmero de 0 a 9 como antes. Si incluysemos una instruccin para visualizar el valor de i antes de abandonar el programa (justo antes de las ltimas llaves el valor que se mostrara sera 10.

Ejemplo 2: Lee nmeros enteros hasta que se introduzca el valor hasta que se introduzca el valor 0.

#include <stdio.h>

main() { int numero;

numero = 10;

while (numero!=0) { printf ("\nDime un nmero:"); scanf ("%d",&numero); } }

En este ejemplo tenemos que introducir en la variable nmero un valor distinto de cero antes de entrar en el bucle, puesto que en principio al declarar una variable el valor de sta no est determinado y podra valer cero, en cuyo caso nunca se ejecutara el bucle. Esta es la misin de la instruccin numero = 10;.

2.2.1.3 Bucle do.. while

Su funcionamiento es anlogo al anterior, con la nica salvedad de que la condicin ahora se evala despus de ejecutar la instruccin su sintaxis sera:

do instruccin while (exp2);

Si en el ejemplo anterior utilizamos esta estructura no sera necesario actualizar numero con un valor distinto de cero, puesto que antes de comprobar si es cero leeramos el valor.

#include <stdio.h>

main() { int numero;

do { printf ("\nDime un numero :"); scanf ("%d",&numero); } while (numero !=0);

La diferencia fundamental con la instruccin anterior es que esta estructura ejecuta la instruccin sobre la que acta al menos una vez.

2.2.1.4 Modificadores del flujo de programa.

Puede que en ciertas ocasiones no nos interese que si se da alguna condicin slo se ejecute un conjunto de todas las instrucciones sobre las que acta el bucle o simplemente salir del bucle antes de llegar a la condicin que hayamos indicado en el comando for o en while. Esto es posible mediante dos modificadores: continue y break.

El primero de ellos, continue, permite volver a reevaluar la condicin de salida, es decir, despus de ejecutar continue la siguiente instruccin que se ejecutar ser el for o el while. Veamos un ejemplo de aplicacin para comprender mejor como funciona este comando.

#include <stdio.h>

main() { int int numero; contador;

contador =0; do { printf ("\nIntroduce el nmero %2d:",contador); scanf ("%d",&numero); if ((numero<0)||(numero>20)) continue; contador++; } while (contador<50); }

Este programa lee nmeros en una variable hasta un mximo de 50, alcanzado este mximo el programa termina. Adems si el nmero no est entre 0 y 20 (si es menor que 0 o mayor que 20) vuelve a

pedir que lo introduzcamos. El comando continue en la instruccin if obliga al programa a saltar a la instruccin while donde se vuelve a evaluar la condicin, sin pasar por la lnea en la que se incrementa el contador. De esta forma se nos vuelve a pedir el mismo nmero y la entrada incorrecta no es tenida en cuenta.

La funcin de break es ligeramente distinta no salta a la instruccin en la que se evala la condicin sino que simplemente abandona el bucle y contina la ejecucin en la lnea inmediatamente siguiente al bucle.

#include <stdio.h>

main() { int i;

for (i=0;i<20;i++) { if (i==5) break; printf ("\n%d",i); } printf ("\n\n%d",i); }

La salida de este programa sera algo como esto:

0 1 2 3 4

Y con esto terminamos todo lo relacionado con los bucles en lenguaje C. Los bucles son una estructura bsica y es necesario utilizarla en la inmensa mayora de los programas.

2.2.2 Mens de Opciones.

2.2.2.1 Introduccin

La mayora de los programas permiten realizar una serie de operaciones sobre datos. Lo ideal sera poder indicarle al ordenador que operacin deseamos realizar sobre estos datos en lenguaje natural. Por ejemplo, para una base de datos nos podra interesar decirle al ordenador: "Buscame todas la fichas de libros que traten sobre informtica" "Borra de la base de datos el libro tal". Existen en la actualidad herramientas de este tipo, pero an distan

bastante del lenguaje natural, por ello una de las formas ms sencillas de indicar al ordenador la operacin que deseamos realizar es utilizar un men de opciones.

La otra solucin comnmente adoptada es una lnea de comandos, es decir, escribimos una frase en un lenguaje muy reducido indicando al ordenador lo que deseamos hacer (de una forma similar a como lo hacemos en MS-DOS). Esta solucin tiene la desventaja de tener que aprender complicados comandos y distintas secuencias para distintos programas.

Un men nos muestra en pantalla todas las opciones que podemos realizar con nuestro programa de forma que no es necesario que el usuario conozca ninguna serie de ordenes complejas, simplificando por tanto el uso de los programas por parte de los usuarios.

2.2.2.2 Sentencia switch-case-default

La mayora de los lenguajes de alto nivel disponen de alguna instruccin que permite gestionar el valor de una variable de una forma estructurada y sencilla, permitiendo por tanto la creacin de mens de programa de una forma sencilla. En lenguaje C esta instruccin es switch-case-default. Veamos un ejemplo de como funciona mediante un pequeo programita.

#include <stdio.h>

main() { int opcion;

printf ("\nEjemplo de Men de Programa"); printf ("\n1.-Cargar fichero de datos"); printf ("\n2.-Almacenar fichero de datos"); printf ("\n3.-Modificar datos"); printf ("\n4.-Salir");

printf ("\n\nDime tu opcin :");scanf ("%d",&opcion);

switch (opcion) { case 1: /* Cdigo para cargar fichero de datos*/ break; case 2: /* Cdigo para almacenar datos */ break; case 3: /* Cdigo para modificar datos */ break;

case 4: /* Salir del programa */ exit (0); default : printf ("\nSu opcin no est disponible"); printf ("\nIntntelo con otra"); }

Del ejemplo se deduce fcilmente el funcionamiento de esta secuencia. El comando switch (var) realizar una bifurcacin o salto a la lnea indicada por la variable var. Si var vale 2, el programa se seguir ejecutando a partir de la lnea marcada con case 2. Todos los separadores case estn separador por un comando break, ya que de no ser as la ejecucin seguira lineal hasta encontrar la llave que termina el comando switch. La palabra clave default indica el cdigo que se debera ejecutar si el valor de la variable especificada en el switch no corresponde con ninguno de los indicados por los case dentro del switch. As en nuestro ejemplo si opcion tiene un valor distinto de 1, 2, 3 4, se mostrar en pantalla un mensaje indicando que la opcin indicada no es correcta. La sintaxis de esta estructura sera:

switch (variable) { case valor1-variable: cdigo asociado;

case valor2-variable: cdigo asociado; . . case valorN-variable: cdigo asociado; default: cdigo asociado; }

Dentro del cdigo asociado a cada opcin se debern incluir las instrucciones break adecuadas. Ya se explic el funcionamiento de break y continue cuando se habl de bucles. Su funcionamiento es anlogo para los comandos for, while, do-while, y switch.

Un fragmento de cdigo para la imprementacin de un men completo sera:

while (Opcion!=0) { /* Secuencia de printfs que muestran en pantalla el men. En este caso la opcin 0 debera ser salir */ switch (opcion) { /* Secuencia de cases */ default :

/* Mostrar mensaje de error */ } }

Por su puesto las aplicaciones del comando switch van mucho ms all de la simple creacin de mens. Puede ser utilizada en cualquier aplicacin en la que se necesite realizar distintas operaciones dependiendo de un valor. Un ejemplo sencillo podra ser un un programa que imprimiese textos en impresora. Podramos marcar en el texto mediante una secuencia especial como debera ser impreso el texto a continuacin. Por ejemplo:

@N - Activa Negrita. @n - Desactiva Negrita. @C,@c - Activa/desactiva cursiva. @S,@s - idem sibrayado etc...

Leeramos estos valores provenientes del teclado o de un fichero y con algo de procesamiento y una instruccin switch con dicha variable, en cada case enviaramos a la impresora la secuencia adecuada para realizar cada una de la opciones.

También podría gustarte