Sei sulla pagina 1di 21

Semana 2

Lenguaje de Programación

Unidad 3
Control del Flujo del
Programa en C

Material compilado con fines académicos, se prohíbe su


reproducción total o parcial sin la autorización de cada autor.
3. CONTROL DEL FLUJO DEL PROGRAMA EN C
En esta sección presentaremos las instrucciones del lenguaje C que nos permiten tomar
decisiones con base en el valor lógico de una condición (falso o verdadero), de tal forma
que se ejecute una parte de código u otra dependiendo de ese valor.

También se presentarán las instrucciones que nos permiten repetir una porción de código
hasta que cierta condición se cumple.

Al incluir las expresiones de decisión y las de repetición (ciclos), ya es posible elaborar


programas bastante completos orientados a soluciones de problemas comunes.

3.1. Expresión condicional if-else


En la vida cotidiana, todos los días debemos tomar decisiones basadas en alguna con-
dición de la vida real. Por ejemplo, si vamos caminando y la luz del semáforo para los
peatones está en rojo, tomamos la decisión de detenernos para no ser atropellados. Esta
situación se puede representar de la siguiente forma:

Si (La Luz es igual a ROJO)


Nos detenemos;
Ponemos atención al cambio de luz;
Si No
Aceleramos el paso;
Cruzamos la calle;

Este tipo de decisiones ya fueron analizadas exhaustivamente en la materia Análisis de


Algoritmos, de la cual retomaremos algunos segmentos.

Las estructuras selectivas permiten tomar decisiones que son especificadas por medio de
expresiones lógicas. Estas expresiones lógicas utilizadas en las estructuras selectivas se
conocen como condiciones, y dependiendo del resultado de su evaluación se ejecutan
un conjunto con instrucciones (Martín Quetglás, Toledo Lobo & Cerverón Lleó, 1995).
Los tipos de estructuras selectivas son:

• Selectiva simple
• Selectiva doble
• Selectiva múltiple

Estructura selectiva simple


Esta estructura ejecuta un conjunto de acciones cuando el resultado de la evaluación de
la condición es verdadero (Zapata Ospina, 2006). La representación en pseudocódigo y

2
diagrama de flujo de esta estructura se presentan en la figura 1. En esta figura se puede
observar que el comportamiento de esta estructura es el siguiente: “Sólo si la condición
es verdadera, se ejecutarán las acciones Acción_SI1, Acción_SI2…, Acción_SIn. Si la con-
dición es falsa, continuará el algoritmo ejecutando la instrucción a la que apunte la flecha
de falso, o las instrucciones que se encuentren después del fin de la estructura”.

(a) (b)

Si (condición) entonces falso


condición
Accion_SI1
verdadero
Accion _SI2
Acción_ SI1
Accion _SIn

Fin_si Acción_SI2

Acción_SIn

(a) (b)
Figura 1. (a) Pseudocódigo y (b) diagrama de flujo de la selec-
tiva simple. Fuente: Joyanes Aguilar (2007).

En la figura 2 se (condición)
Si presenta entoncesde un algoritmo que
un ejemplo utiliza una estructura
verdadero
condición
selectiva
falso
simple para escribir Acciones_SI
un mensaje cuando un número dado es positivo.
Sino
Acciones_SINO Acciones_ SI Acciones_ SINO

Fin_si

3
4
Figura 2. Algoritmo que utiliza una estructura selectiva simple para escribir un men-
saje cuando un número dado es positivo. Fuente: Zapata Ospina, 2006.

Ahora nos corresponde “traducir” el algoritmo anterior a código de lenguaje C. En el


lenguaje C, la instrucción para evaluar una condición es la instrucción if y su sintaxis es
la siguiente:

if (expresión) instrucción;

Si es un bloque de varias sentencias o instrucciones que se deben de ejecutar cuándo


la expresión es verdadera, todas las instrucciones deben estar encerradas entre llaves:

if (expresión)
{
instrucción1 ;
Instrucción2;

InstrucciónN;
}

El código del algoritmo de la figura 2 quedaría de la siguiente forma en lenguaje C.

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main(int argc, char *argv[])


{
setlocale(LC_ALL, "spanish");

float numero;

printf("¿Cuál es el número a comparar?\n");
scanf("%f",&numero);

5
if (numero > 0)
printf("El número es positivo");

return 0;
}

Al compilar y ejecutar el código anterior con el programa DevC++ podemos comprobar


que cuando ingresamos un número mayor a cero obtenemos como resultado la pantalla
de la figura 3, y cuando proporcionamos un número negativo obtenemos la pantalla de
la figura 4.

Figura 3. Pantalla de salida cuando se proporciona un número positivo. Elaboración propia.

Figura 4. Pantalla de salida cuando se proporciona un número negativo. Elaboración propia.

A continuación, explicaremos cada una de las partes del código.

Al inicio del programa tenemos tres directivas:

6
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

Cada una de ellas incluye un programa prefabricado (librería) del lenguaje C, las primeras
dos incluyen las librerías stdio.h y stdlib.h, que son librerías estándar que casi siempre se
utilizan y aparecen por defecto al iniciar un nuevo proyecto en DevC++.

La directiva a tomar en cuenta es locale.h, una librería que permite utilizar características
del idioma español como acentos y la letra ñ.

La siguiente parte del código contiene la función main, que es la función principal del
programa:
int main(int argc, char *argv[]) {

Todo el código restante se encuentra dentro de las llaves que se abren con esta función
y se cierran al final del código.

La primera instrucción que encontramos dentro de la función main es:
setlocale(LC_ALL, "spanish");

Esta instrucción está incluida en la librería locale.h, y con esto todos los mensajes podrán
utilizar palabras con acento.

El código siguiente declara la variable número, de tipo float, es decir, un número que
acepta puntos decimales:
float numero;

La siguiente instrucción es:


printf("¿Cuál es el número a comparar?\n");

Simplemente imprime en la pantalla el mensaje “¿Cuál es el número a comparar?”. Este


mensaje se le da al usuario para que sepa que vamos a esperar un dato que él debe
proporcionar, sin embargo, printf no lee aún ningún dato, sólo imprime el mensaje.

Es importante notar que el símbolo \n se utiliza para bajar una línea en la pantalla (equi-
valente a presionar la tecla Enter en un texto).

La sentencia siguiente es:


scanf("%d",&numero);

7
Esta instrucción sirve para leer datos del teclado, es decir, el usuario podrá ingresar datos;
en este caso, un número hasta que presione la tecla entrar (Enter).

Finalmente, terminamos con la estructura selectiva simple:


if (numero > 0)
printf("El número es positivo");

La instrucción if evalúa toda la expresión que se encuentra entre paréntesis. Si la expre-


sión es verdadera, ejecuta la instrucción printf("El número es positivo"); si la expresión es
falsa, no ejecuta nada y se salta a la siguiente instrucción, la cual es:
(a) (b)
return 0;

Esta instrucción indica que la función principal main debe retornar con el valor cero, con
Si (condición) entonces
esto culmina la ejecución del programa. Nótese que al final falsose cierra la llave que empezó
condición
en la función main:
Accion_SI1
} verdadero
Accion _SI2

Acción_ SI1
SelectivaAccion
doble_SIn
Esta estructura permite seleccionar entre dos opciones o alternativas posibles, en fun-
Fin_si
ción del cumplimiento o no de una determinada
Acción_SI2
condición (Joyanes Aguilar, 2007). La
representación en pseudocódigo y diagrama de flujo de esta estructura se presenta en
Acción_SIn
la figura 5. En esta figura se puede observar que el comportamiento de esta estructura
es el siguiente: “Si la condición es verdadera, se ejecutarán las acciones Acciones_SI.
En caso contrario, es decir, cuando la condición es falsa, se ejecutarán las acciones
Acciones_SINO. Después de esta estructura, el algoritmo continuará ejecutando las ins-
trucciones que se encuentren después del fin de la estructura”.

(a) (b)

Si (condición) entonces verdadero


condición
falso

Acciones_SI
Sino
Acciones_SINO Acciones_ SI Acciones_ SINO

Fin_si

Figura 5. Pseudocódigo y diagrama de flujo de la selectiva doble. Fuente: Joyanes Aguilar (2007).

8
A continuación se presenta un ejemplo de un algoritmo que utiliza una estructura selectiva
doble para mandar un mensaje cuando la calificación es mayor o igual a 6, y otro mensaje
cuando la calificación es menor que 6.

Figura 6. Algoritmo que utiliza una estructura selectiva doble para mandar un mensaje cuan-
do la calificación es mayor o igual a 6, y otro mensaje cuando la calificación es menor que 6.

El código correspondiente al algoritmo de la figura 6 en lenguaje C es el siguiente.

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main(int argc, char *argv[])


{

9
setlocale(LC_ALL, "spanish");

float calif;

printf("¿Cuál es la calificación del alumno?\n");
scanf("%f",&calif);

if (calif >= 6)
printf("el alumno aprobó su curso");
else
printf("el alumno reprobó su curso");

return 0;
}

Compila y ejecuta el código anterior utilizando DevC++ y revisa los resultados.


A continuación veremos otro programa en lenguaje C, donde, dados dos números enteros
que entran como datos, indica si uno es divisor del otro:

#include <stdio.h>
#include <conio.h>
#include <locale.h>

int main(int argc, char *argv[])


{
setlocale(LC_ALL, "spanish");
int Numero1=0, Numero2=0; //Variables
printf(“Introduzca el primer número: ”);
scanf(“%d”, &Numero1);
printf(“Introduzca el segundo número: ”);
scanf(“%d”, &Numero2);
if (Numero1 > Numero2)
{
if (Numero1%Numero2 == 0)
{
printf(“%d Sí Es divisor de %d”,
Numero2,Numero1);
}
else
printf(“%d no es divisor de %d ”,
Numero2,Numero1);

10
}
else
printf(“No es divisor porque es mayor %d”,Numero2);

return 0;
}

En el programa anterior estamos utilizando el operador módulo: %, el cual divide dos nú-
meros y como resultado regresa el residuo; si el primer número es mayor que el segundo
y el segundo es divisor del primero, el residuo será cero.

Analiza el programa, compílalo y ejecútalo con DevC++.

3.2. Switch
Selectiva múltiple

Esta estructura se utiliza cuando se necesita decidir entre más de dos opciones. La es-
tructura de decisión múltiple evaluará una expresión que podrá tomar n valores distintos,
1, 2, 3, 4..., n. Según se elija uno de estos valores en la condición, se realizará una de las
n acciones (Joyanes Aguilar, 2007). Es importante mencionar que la expresión a utilizar
en esta estructura puede ser aritmética y regresa un valor entero, o bien, de tipo carácter.

La representación en pseudocódigo y diagrama de flujo de esta estructura se presentan


en la figura 7. En esta figura se puede observar que el comportamiento de esta estructura
es el siguiente:

“Si al evaluar la expresión el resultado es el valor1, se ejecutarán las acciones Ac-


ciones1. En caso contrario, si el resultado de evaluar la expresión es el valor2, se
ejecutarán las acciones Acciones2. Y así sucesivamente, para el resto de los casos.
Es decir, dependiendo del resultado de la evaluación de la expresión, se ejecutará
alguna acción en particular”.

11
Figura 7. Pseudocódigo y diagrama de flujo de la selectiva múltiple.

En la figura 8 se presenta un ejemplo de un algoritmo que utiliza una estructura selectiva


múltiple para escribir un mensaje con el día de la semana según un número proporcio-
nado por el usuario.

Ejemplo:
 Escribir un algoritmo que despliegue en pantalla el nombre del día laborable correspondiente, dado
un número entre 1 y 5.
Algoritmo DiaSemana

var
entero: dia

INICIO
escribir(‘¿Cuál es el día de la semana?’)
leer(dia)
según_sea (dia) hacer
1: escribir(‘El dia es lunes’)
2: escribir(‘El dia es martes’)
3: escribir(‘El dia es miercoles’)
4: escribir(‘El dia es jueves’)
5: escribir(‘El dia es viernes’)
6 ó 7: escribir(‘Fin de semana’)
otro: escribir(‘Día no válido’)
fin_segun Acción que se ejecutará sino
FIN es un día entre 1 y 5

verd
ader
o
INICIO

escribir (‘¿Cuál es el día de la semana?’)

12

leer (dia)
Acción que se ejecutará sino
FIN es un día entre 1 y 5

verd
ader
o
INICIO

escribir (‘¿Cuál es el día de la semana?’)

leer (dia)

expresión
5 6o7
1 2 3 4

escribir(‘El dia escribir(‘El dia escribir(‘El dia escribir(‘El dia escribir(‘El dia escribir(‘Fin de
es lunes’) es martes’) es miercoles’) es jueves’) es viernes’) Semana’)

FIN

Figura 8. Algoritmo que utiliza una estructura selectiva múltiple para escribir un men-
saje con el día de la semana según un número proporcionado por el usuario.

En lenguaje C, la estructura selectiva múltiple se realiza con la instrucción swtich, que


tiene la siguiente sintaxis:

switch (expresión)
{
case constante1: sentencias1;
case constante2: sentencias2;
case constante3: sentencias3;

default: sentencias;
}
Permite tomar una decisión múltiple basada en una expresión que puede tomar un núme-
ro de valores constantes enteros o char (los char son un tipo de entero). El valor de expre-
sión se va comparando con las constantes en orden secuencial y una vez que coincide
con una de ellas se ejecutan todas las sentencias (incluidas las de los cases siguientes)
hasta que se encuentra la sentencia break.

13
Esto permite agrupar varios valores constantes que compartan una misma acción. Si no
queremos que pase de un case al siguiente, debemos terminarlo con la sentencia break.

El algoritmo de la figura 8 se traduciría a lenguaje C con el siguiente código; nótese que


se le hicieron un par de modificaciones sencillas:

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main(int argc, char *argv[])


{
setlocale(LC_ALL, "spanish");

int dia;

printf("Escribe un número del 1 al 7:\n");
scanf("%d",&dia);

switch (dia)
{
case 1:
printf("Lunes");
break;
case 2:
printf("Martes ");
break;
case 3:
printf("Miercoles");
break;
case 4:
printf("Jueves");
break;
case 5:
printf("Viernes");
break;
case 6: case 7:
printf("Fin de Semana");
break;
default:
printf("Día no váido");

14
break;
}

return 0;
}

Compila y ejecuta el código anterior utilizando DevC++ y revisa los resultados.

3.3. Expresión for


Estructuras de control iterativas

También conocidas como estructuras de repetición (bucles o ciclos), se utilizan para rea-
lizar varias veces el mismo conjunto de operaciones. Entre ellas se encuentran aquellas
donde la cantidad de repeticiones se conoce a priori y aquellas en las que las repeticiones
se realizan hasta que se cumple una condición lógica dada. En este bloque se verán las
estructuras iterativas: for, while y do-while.

Para profundizar más en la lógica de las estructuras de control iterativas se recomienda


revisar la sección correspondiente en el bloque III de la materia “Análisis de Algoritmos”.

Empezaremos con la estructura for, que permite definir un bucle controlado por un con-
tador, denominado variable de control o de inducción. La sintaxis es:

for (sentencia_inicial ; condición ; incremento/decremento)


sentencia;

En el caso de que se desee repetir todo un bloque de sentencias, se deberán agregar


las llaves. La sintaxis es:

for (sentencia_inicial ; condición ; incremento/decremento)


{
Sentencia1;
Sentencia1;
Sentencia1;
}

Como se puede observar entre el paréntesis lleva “;”.

sentencia_inicial es una expresión que inicializa una variable de control y sólo se ejecuta
una vez antes de evaluar la condición y antes de ejecutar las sentencias.

15
condición es la condición lógica que debe cumplirse para que se ejecuten las sentencias
del bloque. Es decir, la sentencia o sentencias se ejecutan repetidamente mientras expr2
sea verdadera.

Incremento/decremento es la actualización de la variable de control y se ejecuta al final


de cada ciclo (antes de volver a evaluar expr1).

En el ejemplo siguiente se imprimirá en la pantalla el mensaje “Hola Mundo” 5 veces:

int i;
for (i=1; i<=5; i++)
{
printf(“Hola Mundo\n”;
}

En el lenguaje C, las expresiones del for, a diferencia de otros lenguajes, no tienen por
qué ser referidas a enteros, pueden ser expresiones de cualquier tipo.

En el siguiente programa se escribirán a la pantalla los diez dígitos uno en cada línea.

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main(int argc, char *argv[])


{
setlocale(LC_ALL, "spanish");

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


return 0;
}

En el siguiente ejercicio escribiremos un programa que calcula el valor de eX, en donde:

16
En donde el símbolo ¡ representa el factorial de un número. El factorial de cualquier nú-
mero se calcula con la fórmula:

n! = n * (n-1) * (n-2) * (n-3) …. * 1

El programa solicita al usuario el valor de x (como dato de entrada), y después de realizar


el cálculo reporta el resultado. Se utiliza la función pow (x,i), es decir, el número x elevado
a la potencia i, por lo que se incluye al inicio de tu programa la directiva
#include <math.h>

El código del programa es el siguiente:

#include <stdio.h>
#include <math.h>

int main()
{
int i,j,factorial,potencia;
float x;
float e;
printf("Introduce el valor de x: ");
scanf("%f",&x);
// Calcula los primero 10 valores para e elevado a x.
e=1.0;
for (i=1;i<=10;i++)
{
//Calcula x elevada a una potencia i
potencia= pow(x,i);

// Calcula el Factorial de i
factorial=1;
for (j=i;j>0;j--)
factorial=factorial*j;

//Acumula el valor de e
e=e+(potencia/(float)factorial);
}

17
printf("El valor de e elevado a x: %f", e);
return 0;
}

Analiza el código, y posteriormente escríbelo, compílalo y ejecútalo utilizando DevC++.


Para comprobar tus resultados utiliza los siguientes valores:

Para x=1 , eX = 2.718282


Para x=2 , eX = 7.388995
Para x=3 , eX = 20.079666

3.4. Expresión while


La sintaxis del bucle while es en el lenguaje C:

while (condición) sentencia;

Donde la sentencia puede o no existir (sentencia vacía), pero siempre debe existir la con-
dición. El bucle while se ejecuta mientras la condición sea verdad.

En el siguiente ejemplo las dos sentencias dentro de las llaves se ejecutan mientras que
la condición (i<=100) sea verdadera. En este caso, en cada ejecución del bucle la suma
se va acumulando con el resultado anterior, es decir, se suman los primeros 100 números.

int i=1,suma=0;
while (i<=100)
{
suma=suma+i;
i++;
}

Ahora veamos un programa completo que va calculando los números de la serie de Fi-
bonacci y los va imprimiendo a la pantalla. La serie de Fibonacci es la sucesión infinita de
números naturales que comienza con el 0 y el 1; a partir de estos primeros dos elementos,
cada número siguiente se calcula sumando los dos anteriores, dando como resultado la
sucesión infinita:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144…

El programa que calcula la serie de Fibonacci para todos sus elementos menores a 100
sería el siguiente:

18
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main(int argc, char *argv[])


{
setlocale(LC_ALL, "spanish");

int numero = 1;
int actual=1, anterior=1;

printf ("Los números menores a 100 de la serie de Fibonacci son los siguientes: \n");

while (numero<=100)
{
printf ("%d\n",numero);
numero = anterior + actual;
anterior= actual;
actual= numero;
}

printf ("FIN");

return 0;
}

Después de analizar el código anterior, cópialo, compílalo y ejecútalo con DevC++.

3.5. Expresión do-while


Al contrario que los bucles for y while que comprueban la condición al principio del bucle
y antes de ejecutar cualquier sentencia del bucle, el bucle do/while comprueba la con-
dición al final del mismo, lo que provoca que el bucle se ejecute como mínimo una vez
(independientemente del valor de la condición). La sintaxis del bucle do/while es:

do
sentencia;
while (condición);

El bucle do/while se ejecuta mientras la condición sea verdad. Pero como ya dijimos, la
sentencia se ejecuta al menos una vez.

19
Veamos el siguiente ejemplo:

int i,j;
do
{
scanf(“%d”,&i);
scanf(“%d”,&j);
}
while (i<j);

El ciclo anterior sólo se romperá hasta que el usuario ingrese el primer valor i y éste sea
mayor al segundo valor j.

3.6. Interrupción break


Las sentencias de control break y continue permiten modificar y controlar la ejecución de
los bucles (for, while y do-while).

La sentencia break provoca la interrupción y finalización del bucle en el cual se encuen-


tra, y automáticamente el programa continúa con la ejecución de la sentencia que se
encuentra a continuación del bucle.

La sentencia continue provoca que el programa vaya directamente a comprobar la condi-


ción del bucle en los bucles while y do/while, o bien, que ejecute el incremento y después
compruebe la condición en el caso del bucle for.

Algunos ejemplos de uso de break y de continue:

Ejemplo 1:
int x;
for(x=0;x<10;x++)
{
for(;;)
if (getc(stdin)==‘\x1B’)
break;
printf(“Salí del bucle infinito, el valor de x es: %d\n”,x);
}

Ejemplo 2:
int x;

20
for(x=1;x<=100;x++) /* Esta rutina imprime en pantalla los números pares */
{

if (x%2 > 0)
continue;

printf(“%d\n”,x);
}

En el código del ejemplo 2, la sentencia continue hace que cuando el número x no


sea par, la ejecución no llegue a la sentencia printf, ya que se regresa al principio
del bucle for y ejecuta el incremento x++.

21

Potrebbero piacerti anche