Programación en C © © 2003 Kishori Mundargi. Traducción 2006, Lourdes Sada

CAPÍTULO 5

Control de flujo

Este capítulo trata sobre las sentencias del lenguaje C que controlan el flujo de ejecución de un programa. Antes de comenzar con las sentencias que cambian este flujo de ejecución, debemos entender cómo se ejecuta repetidamente un código. Esta operación se conoce como ejecución de un bucle. Cada ejecución de un bucle se llama iteración. El lenguaje C tiene tres sentencias de programación distintas para efectuar bucles. Son las sentencias for , while y do .

Sentencia for

El formato general de una sentencia for es:

for ( expresión1; condición_del_bucle; expresión2)
{
sentencias del programa;
}

El primer componente de la sentencia for , expresión1, se utiliza para definir los valores iniciales antes de que comience una iteración. El segundo componente, condición_del_bucle, especifica la(s) condición(es) que se debe(n) cumplir para que el bucle continúe. El componente final, expresión2, especifía la expresión que se ejecuta cada vez, después de que el cuerpo del bucle se haya ejecutado.

Programa 5.1


/* Uso de distintos operadores aritméticos */
#include <stdio.h>

main ()
{
int contador, numero, numero_triangular;
numero_triangular = 0;
for (numero=1; numero<=100; ++numero)
numero_triangular = numero_triangular + numero
printf("El número triangular de 100 es %d", numero_triangular);
}

Según las exigencias de un programa, puede encontrarse un bucle for dentro de otro. Esto se conoce como bucles anidados. En este caso, el bucle interior se completa primero, y después se termina el bucle exterior. Para que un programa en C sea más legible, es importante la tabulación de las sentencias en los bucles for .

Sentencia while

La sintaxis de la sentencia while es

while (expresión)
{
sentencias del programa
}

Se evalúa la expresión especificada dentro del paréntesis, y si el resultado de dicha expresión es verdadero, se ejecutan las sentencias que hay dentro del bucle. Después de una iteración, la expresión se evalúa de nuevo y se ejecuta o no el bucle, dependiendo de si el resultado sigue siendo verdadero. Si el resultado es falso, se detiene el bucle y continúa la ejecución del programa con las sentencias que siguen al bucle while.

Programa 5.2


/* Programa que imprime múltiplos de 2 */
#include
main ()
{
int contador = 2;

printf("Múltiplos de 2\n");

while (contador <= 50)
{
printf("%d\n", contador);
contador += 2;
}
}

Este programa define primero el valor inicial como 2, después comienza la ejecución del bucle y como el valor del contador es menor a 50, se imprime el valor del contador, 2, y luego se incrementa a 4. Esto sigue así hasta que el valor del contador llegue a 50.

El programa anterior también se puede implementar utilizando un bucle for:


for (contador = 2; contador &lt;= 50; contador += 2)
{
printf("%d\n", contadort);
}

Nota: Antes de escribir un programa completo, busque un algoritmo que produzca el resultado final que desea.

Programa 5.3


/* Programa para invertir los dígitos de un número */
#include
main ()
{
int numero;
int digito_invertido;

printf("Introduzca un número \n");
scanf("%d", &numero);

while (numero != 0)
{
digito_invertido = numero % 10;
printf("%d", digito_invertido);
numero = numero / 10;
}
printf("\n");
}

Bucle do

Las dos sentencias anteriores, for y while, evalúan una condición o expresión antes de ejecutar un bucle. Por tanto, el cuerpo del bucle nunca se ejecuta si las condiciones no se cumplen al comienzo. Algunas veces es necesario evaluar la condición al final de un bucle. Esto se consigue utilizando la sentencia do . La sintaxis de esta sentencia es la siguiente:

do
{
sentencias del programa
}
while (expresión1)

En este caso, se ejecutan una vez las sentencias del programa, después se evalúa la expresión1. Si es verdadero, continúa con la siguiente iteración, y así una y otra vez hasta que el valor de la expresión1 sea falso.

Sentencia break

El formato de esta sentencia es

break;

En ocasiones se hace necesario terminar un bucle dependiendo de una condición. En estas circunstancias se puede utilizar una sentencia break. Esta sentencia hace que el programa salga del bucle y continúe su ejecución en las sentencias que siguen a dicho bucle. En caso de bucles anidados, sólo se detiene el bucle que contiene la sentencia break.

Sentencia continue

El formato de esta sentencia es

continue

Al contrario de break , esta sentencia causa que el bucle que la contiene se siga ejecutando, ignorando todas las sentencias que siguen a la sentencia continue. Se utiliza para eludir dentro de un bucle un grupo de sentencias basadas en ciertos criterios o condiciones.

Sentencia if

Con la sentencia if, el programa adquiere la capacidad de tomar decisiones. El formato de esta sentencia es

if (condición)
{
sentencias del programa;
}

La sentencia if examina primero la condición, que no es otra cosa que una expresión. Si la expresión arroja un valor verdadero, se ejecutan las sentencias del programa que siguen a la sentencia if . Si la expresión da un valor de falso, las sentencias que siguen a la sentencia if se ignoran. Una sentencia compuesta después de una sentencia if debe ir acotada por paréntesis de llave.

Programa 5.4
/ * Programa para calcular el valor absoluto de un número*/

#include <stdio.h>

main ()
{
int numero;
printf("Introduzca un numero \n");
scanf("%d", &numero);
if (numero < 0)
numero = -numero;
printf("El valor absoluto del número es %d", numero);
}

La expresión evaluada por una sentencia if puede ser una simple sentencia que compara dos variables o puede tratarse de dos o tres expresiones unidas por un operador lógico Y u O.

Programa 5.5
/* Programa para encontrar un año bisiesto */

#include <stdio.h>

main ()
{
int anno;
int res4;
/* resto obtenido después de dividir por 4 */

int res100;
/* resto obtenido después de dividir por 100 */

int res400;
/* resto obtenido después de dividir por 400 */

printf("Introduzca el número de un año:");
scanf("%d", &anno);
res4 = anno % 4;
res100 = anno % 100;
res400 = anno % 400;

if (res4 = 0 && res100 = 0 && res400 = 00)
printf("¡Es un año bisiesto! \n");
}
 

Sentencia if else

Otra variación de una sentencia if es la sentencia if else , que ayuda al programador a evaluar una condición y emprender dos acciones diferentes dependiendo de si el resultado es verdadero o falso.

Programa 5.6
/* Programa para hallar el cubo de un número */

#include <stdio.h>

main ()
{
int number;
printf("Introduzca un número distinto de 0 para calcular el cubo: \n");
scanf("%d", &numero);

if (numero)
printf("El cubo de %d es %d", numero, pow(3, numero));
else
printf("Introduzca un entero positivo válido. \n");
}

Construcciones if anidadas

Cuando la expresión evaluada por una sentencia if arroja VERDADERO, se ejecuta la sentencia que sigue a if , que puede ser otra sentencia if . En las sentencias if anidadas, cada claúsula else se asocia con la última sentencia if .

Sentencia else if

Cuando comparamos una variable con tres valores diferentes, podemos utilizar la sentencia else if , más simple, en lugar de tres sentencias if distintas. El formato general de esta sentencia es el siguiente:

if (expresión1)
{
sentencias;
}
else if (expresión2)
{
sentencias;
}
else
{
sentencias;
}

Programa 5.7
/* demostración de una construcción else if*/

#include <stdio.h>

main ()
{
long ingresos;
long gastos;

printf("Introduzca la facturación de su empresa en dólares:\n");
scanf("%ld", &ingresos);
printf("Introduzca los gastos de su empresa en dólares:\n");
scanf("%ld", &gastos);

if (ingresos &gt; gastos)
printf("El beneficio de este año es de $%ld\n", ingresos - gastos);
else if (gastos &gt; ingresos)
printf("Las pérdidas de este año son de $%ld\n", gastos - ingresos);
else
printf("¡Este año hay tantos gastos como ingresos! \n");
}

Sentencia switch

Es habitual en aplicaciones en las que el valor de una variable se compara sucesivamente con distintos valores. Resulta engorroso tener que escribir una larga serie de sentencias if y else if , y el programa se hace más difícil de leer. Se puede expresar de una forma más elegante utilizando la sentencia switch . Su formato es el siguiente:

switch (expresión1)
{
case val1 :
sentencias del programa;
break;
case val2 :
sentencias del programa;
break;
case val3 :
sentencias del programa;
break;
case val4 :
sentencias del programa;
break;
case val5 :
sentencias del programa;
break;
default :
sentencias del programa;
break;
}

La expresión1 se compara repetidamente cont los valores val1, val2, etc. hasta que se encuentra una coincidencia. Entonces se ejecutan las sentencias correspondientes del programa. Cada conjunto de sentencias necesita una sentencia break , o la ejecución del programa continuaría con la siguiente sentencia case que satisficiera la expresión. Existe una sentencia especial default al final que se ejecuta cuando el valor de expresión1 no coincide con ninguno de los valores case.

/* Ejemplo de programa para la sentencia switch case */

#include <stdio.h>

main ()
{
float precio_libro, precio_neto;
float descuento;
int cod_cliente;

printf("Introduzca el precio del libro:\n);
scanf("%f", &precio_libro);
printf("Introduzca el código del cliente:\n);
scanf("%d", &cod_cliente);

switch (codigo) {
case 1 : /* Clientes registrados */
descuento = 0.1;
precio_neto = precio_libro - (precio_libro * descuento);
break;

case 2 : /* Mayoristas */
descuento = 0.15;
precio_neto = precio_libro - (precio_libro * descuento);
break;

case 3: /* Empleados de la empresa */
descuento = 0.17;
precio_neto = precio_libro - (precio_libro * descuento);
break;

default: /* Nuevos clientes */
descuento = 0.05;
precio_neto = precio_libro - (precio_libro * descuento);
break;
}

printf("El precio neto del libro es %f\n", precio_neto);
}

Sentencia goto

El lenguaje C incluye la raramente utilizada sentencia goto , cuyo uso se recomienda evitar. Pero cada programador debe decidir si su programa la necesita o no, y emplearla con sensatez. Una sentencia goto produce una bifurcación en un punto específico del programa. Este punto se marca con una etiqueta, que consiste en un nombre seguido de una coma. Para la creación de etiquetas se aplican las mismas reglas que para los nombres de variables. Pueden colocarse en cualquier lugar del programa, ya sea antes o después de la sentencia goto .

Ejemplo

goto fin_del_bucle;
sentencias del programa
fin_del_bucle :
printf("Salida del bucle\n");

Nota: La utilización de demasiadas sentencias goto en un programa lo hace más ilegible, y el programa resultará más difícil de corregir y mantener.

Números triangulares
Guía de estilo para la programación en C
Estilo en C y patrones de codificación

Cuestionario

Preguntas de repaso

Tareas

[Su opinión es importante. Si tiene un comentario, corrección o pregunta respecto a este capítulo, envíe un mensaje a comments@peoi.org].

Anterior: Expresiones aritméticas

Siguiente: Vectores (arrays)