logo sinuh
 

Inicio arrow Conocimiento arrow Curso de programación en C desde cero arrow Entrega 9. Control de flujo (I).
Entrega 9. Control de flujo (I). Imprimir
Por Luis García Galván   
sábado, 27 ene 2007 09:49

CURSO DESDE 0 DE PROGRAMACIÓN C BAJO GNU/LINUX.


Entrega 9. Control de flujo (I).


Introducción.


Hasta ahora hemos visto en todos los ejemplos cómo las órdenes se iban ejecutando de una en una de forma secuencial según aparecían. Pero esto por sí solo nos limita mucho, necesitamos cambiar ese orden según nuestras necesidades y para ello usaremos las estructuras de control del flujo. Hay dos tipos de control de flujo:


  1. Estructuras condicionales. Nos permiten decidir sobre la ejecución en base al resultado de una condición. Serian decisiones del estilo, “Si llueve saco el paraguas, en caso contrario me pongo gafas de sol”.

  2. Estructuras iterativas. Nos permiten ejecutar repetidamente un conjunto de instrucciones dependiendo del resultado de una condición. Serian cosas como, “Conduzco, ¿he llegado ya?, si es SI paro, SI NO Conduzco”.


En ambos casos usamos condiciones, vamos a ver un poco sobre el tema.


Condiciones.


Y llegados a este punto, simplemente decir que una condición no es más que una expresión de las muchas que ya hemos visto, pero encerrada entre paréntesis. Podemos usar los operadores racionales, lógicos y aritméticos.


Si recordamos, un valor de 0 se considera como falso y un valor distinto de 0 se considera como verdadero. Veamos cómo se evalúan algunas condiciones:


(x<y)

Cierto cuando X es menor que Y

(x=y)

Cierta cuando Y es distinto de 0

(x==y)

Cierto cuando X e Y son iguales

(x-y)

Cierto cuando X e Y son distintas


Uno de los errores más típicos en C, sobre todo para los más noveles, es olvidarse que para comparar si dos cosas son iguales se usa '==' que es la comparación y no '=' que es para asignar. Por ejemplo, si considerando que X contenga 0 entonces (X=0) es falso y (X==0) es verdadero.


Instrucciones simples y compuestas.


Una instrucción simple en C es toda expresión terminada de ';' como por ejemplo 'x=x+y;'.


Pero para que las estructuras de control nos sean útiles para un conjunto de instrucciones necesitamos instrucciones compuestas o más bien crear bloques de instrucciones. Esto se consigue encerrándolas entre llaves '{}', por ejemplo:


{

x=0;

x=x+1;

}


Estructuras condicionales.


Son 3:


  1. Estructura if ... else.

  2. Operador condicional.

  3. Estructura switch.


Las vamos a ver una por una.


Estructura IF... ELSE.


Esta estructura nos permite elegir la ejecución de una instrucción u otra, dependiendo de la evaluación de la condición. Su sintaxis es la siguiente:


if (condición)

instrucción 1;

[else

instrucción 2;]


Lo que está entre corchetes es que es opcional. Supongamos que usamos la estructura completa, pues bien, si la condición se cumple se ejecuta 'instrucción 1;' en caso contrario se ejecuta 'instrucción 2;'.


Pero esto puede complicarse aún mucho más, ya que como la estructura 'if...else' en sí es una instrucción como otra cualquiera, con lo que podemos anidar varias estructuras 'if...else'.


Como esto puede ser muy lioso, veamos un ejemplo:


# include <stdio.h>


void main (void)

{

int x,y;

x=5;

y=4;

if (1==x-y) printf ("Valgo 1\n"); else printf ("Esto no debería imprimirse nunca \n");

//Ahora vamos ha usar if en su forma más sencilla.

if (x==5) printf ("Ahora vamos a usar instrucciones complejas\n");

if (y=0)

{

y=4;

printf("Aquí no entramos nunca, y además en la condición");

printf(" has asignado a y el valor de 0 en vez de compararlo\n");

}

else

{

printf("x=%d, y=%d\n",x,y);

}

//Ahora vamos a anidar los if

if (x+y==5)

{

if (y>0)

{

y=0;

}

else y=1;

}

else

{

y=0;

}

printf("x=%d, y=%d\n",x,y);

}


Y su ejecución:


matados2k@imperio:~/curso programacion$ ./ejemplo_9_1

Valgo 1

Ahora vamos a usar instrucciones complejas

x=5, y=0

x=5, y=1

matados2k@imperio:~/curso programacion$


Si no entiendes los resultados, lo mejor es que cojas papel y lápiz y vayas echando tus cuentas. Te recomiendo encarecidamente que cuando enlaces estructuras 'if .. else' lo hagas con instrucciones complejas o atente a romperte la cabeza de por qué no sale el resultado esperado, no cuesta nada, es más limpio, claro y fácil de depurar.


El operador condicional.


Al igual que los detergentes tienen versiones concentradas, hay algo parecido a una versión comprimida de la estructura 'if ... else' pero con diferencias. El operador condicional en vez de elegir entre la ejecución de una instrucción u otra nos permite elegir entre la evaluación de una expresión u otra.


En resumen, es como un 'if ..else' comprimido, pero que sólo usa instrucciones simples.


Su sintaxis es la siguiente:


(condición) ? expresión 1 : expresión 2;


Se evalúa la condición, si es verdadera se ejecuta la expresión 1 y en caso contrario se usa la expresión 2. Al igual que los 'if ... else' pueden anidarse y su mayor utilidad es cuando se quiere hacer una asignación condicional, si cogemos el fragmento del código anterior siguiente:


if (y>0)

{

y=0;

}

else y=1;


Con el operador condicional quedaría:


y=(y<0)?0:1;


Así que como ejemplo vamos a cambiar todo lo que podamos a operador condicional del ejemplo anterior:


# include <stdio.h>


void main (void)

{

int x,y;

x=5;

y=4;

(1==x-y)?printf ("Valgo 1\n"):printf ("Esto no debería imprimirse nunca \n");

//Ahora vamos ha usar if en su forma más sencilla.

if (x==5) printf ("Ahora vamos a usar instrucciones complejas\n");

(y=0)?y=4:printf("x=%d, y=%d\n",x,y);

//Ahora vamos a anidar los operadores condicionales

(5==x+y)?(y=(y<0)?0:1):(y=0);

printf("x=%d, y=%d\n",x,y);

}


Y su ejecución:


matados2k@imperio:~/curso programacion$ ./ejemplo_9_2

Valgo 1

Ahora vamos a usar instrucciones complejas

x=5, y=0

x=5, y=1

matados2k@imperio:~/curso programacion$


Como podéis observar, el código del primer ejemplo es equivalente al del segundo, aunque haya eliminado dos líneas que aparecían en el primero. Queda más compacto para hacer lo mismo.


Personalmente, yo no uso nunca el operador condicional, lo veo innecesario y no resuelve ningún problema que 'if ..else' no pueda resolver, sí, vale, queda mucho más compacto, pero para mí es mucho más legible y entendible el primer ejemplo que el segundo.


Despedida.


Pues si esta entrega os ha gustado, ya sabéis, la próxima semana más y si es posible ya sin retrasos, que las fiestas quedaron atrás.


Agradecimientos:

· Revisión del documento: Karuchi (Carolina García).



Página oficial y dominio de mi propiedad http://matados2k.es

Matados'2k Usuario y moderador de www.sinuh.org

Matados'2k Moderador de foro.noticias3d.com


matados2k (arroba) gmail (punto) com


Este documento está sometido a la licencia de creative commons en su variante “Reconocimiento-NoComercial-SinObraDerivada 2.1 España” . Es de agradecer que se comunique al autor el uso de este documento en otro medio y se debe incluir de forma obligatoria este recuadro y los agradecimientos.


Comentario[s]

Sólo los usuarios registrados pueden escribir comentarios.
Por favor valídate o regístrate.

Powered by AkoComment 2.0!




© 2002-2005 SINUH - Comunidad GNU/Linux de Extremadura
Este portal utiliza Mambo
DHTML / JavaScript Tree by TwinHelix Designs

Para contactar con nosotros envía un correo a
info
Licencia Creative Commons
Los contenidos de este portal, salvo indicación en contra, están sujetos a una licencia de Creative Commons.

Los logotipos y marcas que aparecen son propiedad de sus respectivos dueños.

Las opiniones y declaraciones de las personas reflejadas en los foros y comentarios son propiedad y responsabilidad de sus autores, no identificando la opinión de SINUH y excluyendo de cualquier responsabilidad a esta asociación.
Ahora 11 visitantes
Advertisement