Está en la página 1de 8

Procedimientos y funciones

Objetivos

Al final de esta actividad debes ser capaz de:


1. Describir los conceptos de procedimiento y funcin, la diferencias entre ellos, y su
utilidad
2. Definir los conceptos: cabecera de procedimiento o funcin, parmetros formales,
variables locales, resultado de la funcin, activacin del procedimiento o funcin,
parmetros reales
3. Codificar convenientemente una llamada a procedimiento o funcin, pasando
correctamente los parmetros por valor
4. Codificar en forma de procedimiento o funcin una tarea convenientemente
especificada, estableciendo adecuadamente los parmetros necesarios

Motivacin

En los programas que hemos hecho hasta ahora todo el cdigo se encuentra en el
programa principal (a partir del void main). Esta estrategia resulta problemtica
cuando tenemos programas grandes, porque al encontrarse todo el cdigo en el
programa principal es ms difcil de entender, detectar errores, hacer modificaciones,
etc.
Todos los lenguajes de programacin tienen algn mecanismo que permite definir
bloques de cdigo que se escriben aparte del programa principal. Cada bloque realiza
una cierta operacin con entidad lgica (por ejemplo, ordenar un vector, o escribir unos
datos en pantalla), y el programa principal activa los bloques de cdigo cuando necesita
realizar esas operaciones.
Organizar los programas usando bloques hace que el cdigo est mejor organizado y sea
ms fcil de entender (y por tanto, de mantener). Incluso en algunas ocasiones, el
programa principal activa un mismo bloques varias veces, con lo cual, aunque el cdigo
ejecuta varias veces, slo hay que escribirlo una vez.

Las funciones en C

En lenguaje C, los bloques se llaman funciones. Veamos un ejemplo de una funcin y


cmo se usa.

#include <stdio.h>
void main ()
{
int a,b;
int max;
(Escribe los numeros:\n); #include <stdio.h>
#includeprintf
<stdio.h>
scanf (%d %d,&a,&b);
int maximo (int x, int y)
if ()
(a>b)
void main
{
max = a;
{
if (x>y )
else
int a,b;
return x ;
int max;max = b;
else
return y ;
printf (Escribe los numeros:\n);
} ;
scanf (%d %d,&a,&b);
if (a > b)
void main ()
max = a;
{
else
int a,b;
max = b;
int max;
printf (El maximo es %d\n,max);
}
printf (Escribe los numeros:\n);
scanf (%d %d,&a,&b);
max = maximo (a,b);
printf (El maximo es %d\n,max);
}

El cuadro de la izquierda muestra el programa original, sin funciones. Todo el cdigo


est en el programa principal. El cuadro de la derecha muestra el programa que usa una
funcin. La funcin se llama maximo y se escribe antes del programa principal.
La funcin retorna como resultado el mximo de dos valores enteros. La primera lnea
de la funcin es lo que llamamos cabecera o prototipo de la funcin. En esa lnea, de
izquierda a derecha, lo primero que se indica es que el resultado de la funcin ser un
nmero entero. Despus viene el nombre de la funcin (en este caso maximo).
Finalmente viene una lista de parmetros formales, que nos indica qu tipos de datos
necesita la funcin para realizar la tarea asignada. En este caso, la funcin tiene dos
parmetros que son nmeros enteros.
Despus de la cabecera viene el cuerpo de la funcin, en el que se especifica las
operaciones que hay que realizar con los datos que se reciben como parmetros para
calcular el resultado. La sentencia return indica que la funcin se termina en ese
momento y el resultado de la funcin es el valor que se especifica a la derecha de la
palabra return.
En el programa principal, para ejecutar la funcin lo nico que tenemos que hacer es
escribir el nombre de la funcin y entre parntesis los valores que queremos pasarle a la
funcin como parmetros (los denominamos parmetros reales). En este caso, pasamos
a la funcin los nmeros enteros contenidos en las variables a y b del programa
principal. Puesto que estamos llamando a una funcin, debemos especificar tambin qu
hay que hacer con el resultado de la funcin. En este caso, indicamos que el resultado de
la funcin se almacena en la variable max.
1. Para comprender mejor el funcionamiento del mecanismo de funciones, construye un
proyecto con el programa de la parte derecha de la figura. Ahora ejectalo, siguiendo
cuidadosamente las siguientes instrucciones.

Pulsa F10 para iniciar la ejecucin paso a paso. Coloca en la


ventana del watch las variables x, y, a, b y max. La ventana
del watch tendr el aspecto de la derecha.
El computador no entiende todava lo que es x e y (los
parmetros formales de la funcin). Adems, te est indicando
que todava no se ha reservado espacio en memoria para las
variables a,b y max (porque todava no se ha ejecutado la
declaracin de esas variables).
Pulsa una vez ms F10. El programa ejecuta la declaracin de
variables, con lo que el computador reserva espacio en
memoria para a, b y max). La ventana del watch tendr el
aspecto de la derecha.
El computador sigue sin saber lo que es x e y. Ahora ya sabe lo
que son a, b y max, y el valor inicial de esas variables es
basura.
Avanza con el F10 para ejecutar las sentencias printf y
scanf. Si introducer los valores 4 y 5 la ventana del watch
tendr el aspecto de la derecha.
Pulsa ahora F11 para ejecutar la operacin de activacin de la
funcin. Observa que el computador ha abandonado el
programa principal y se ha quedado preparado para ejecutar la
primera sentencia de la funcin. La ventana del watch tiene el
aspecto de la derecha.
Por fin el computador reconoce las variables x e y (los
parmetros formales de la funcin). En cambio, ya no sabe lo
que es a, b ni max, porque estas son variables que pertenecen
al programa principal, que ha sido abandonado
momentneamente.
Adems, ha tenido lugar un proceso clave en el mecanismo de
las funciones: el paso de parmetros. Antes de poner en marcha
la funcin, el computador a copiado los valores de los
parmetros reales (a y b) en los parmetros formales
correspondientes (x e y). A partir de ese momento, la funcin
puede usar esos valores, trabajando con las variables x e y.
Ejecuta la funcin paso a paso pulsando F10 hasta que
regresemos al programa principal. En ese momento, la ventana
del watch tendr el aspecto de la derecha.
De nuevo, el computador ha dejado de entender lo que son x e
y (la funcin ya acab), y vuelve a reconocer a, b y max,
porque hemos regresado al programa principal. Adems, se ha
producido la asignacin del resultado de la funcin a la variable
max.

Habrs observado que a veces hemos avanzado en la ejecucin con F10 y otras veces
con F11. Ambas opciones sirven para avanzar la ejecucin paso a paso, pero hay una
diferencia muy importante. Si avanzas con F10 entonces, cuando el computador llegue a
una funcin la ejecutar de golpe sin ensearte paso a paso las sentencias que hay
dentro de la funcin. En cambio, si avanzas con F11 el computador te mostrar paso a
paso las sentencias que hay dentro de la funcin.
2.

Ejecuta de nuevo paso a paso el programa anterior, avanzando siempre con F10. Vers
como la funcin se ejecuta de golpe en un solo paso, sin mostrarte las sentencias que hay
dentro de la funcin.

3. Ejecuta ahora de nuevo el programa paso a paso pero avanzando siempre con F11. Vers
que justo cuanto das la orden de ejecutar la sentencia printf el computador te muestra
una ventana con la imagen de la izquierda. Si cierras esa ventana aparecer una pantalla

con la imagen de la derecha. Lo que ha pasado es que, puesto que ests usando F11, el
computador est intentando mostrarte la ejecucin paso a paso de la funcin printf, que
es una funcin como cualquier otra, aunque ya programada previamente. La imagen de la
derecha te muestra las instrucciones de la funcin printf escritas en el lenguaje
ensamblador del computador.

Naturalmente, a nosotros no nos interesa ejecutar paso a paso la funcin printf. En


realidad, muchas veces querremos ejecutar paso a paso nuestro programa pero sin ver
paso a paso algunas de nuestras funciones, porque estamos seguros que esas funciones
no tienen errores. Es por eso que va bien avanzar paso a paso a veces con F10, y otras
veces con F11 (cuando queremos ver las sentencias de las funciones).
En el ejemplo has visto la forma ms obvia de usar una funcin. Fjate en los siguientes
ejemplos, que tambin son correctos.
max = maximo (5,a);

Llamamos a la funcin, pero en este caso uno de


los parmetros reales es una constante, y el otro el
valor de una variable.
Llamamos a la funcin y en lugar de almacenar
temporalmente el resultado en una variable antes
de escribirlo, usamos el resultado de la funcin
directamente en la sentencia printf.
Calculamos el mayor de 3 nmeros, llamando dos
veces a la funcin maximo. Primero la llamamos
para calcular el mayor entre el valor de b y 5. El
resultado lo pasamos directamente como parmetro
de nuevo a la funcin maximo, junto con el valor
de a, para calcular el mayor definitivo.

printf (El mximo es %d\n,


maximo(a,b));
max = maximo(a, maximo(b,5));

Escribe un programa principal que use la funcin maximo para calcular el mayor de 4
nmeros enteros, usando el menor nmero posible de sentencias.

Procedimientos

A veces es necesario realizar una tarea que no produce ningn resultado. Esa tarea
tambin se puede escribir en forma de bloque, pero en ese caso, en vez de llamarla
funcin la llamamos procedimiento. Fjate en el siguiente ejemplo.

#include <stdio.h>
int maximo (int x, int y)
{
if (x>y )
return x ;
else
return y ;
} ;
void escribir (int r)
{
printf (El resultado es %d\n,r);
};
void main ()
{
int a,b;
int max;
printf (Escribe los numeros:\n);
scanf (%d %d,&a,&b);
max = maximo (a,b);
escribir (max);
}

En ese ejemplo se ha definido un procedimiento que se llama escribir, que tiene un


parmetro formal de tipo entero. Lo nico que hace el procedimiento es escribir el valor
del parmetro en la pantalla. Puesto que es un procedimiento no retorna ningn valor
(no usa la sentencia return). La primera palabra de la cabecera del procedimiento es
void. Por ltimo, el programa principal no tiene que hacer nada con el resultado del
procedimiento, porque no hay resultado. Por eso, para llamar al procedimiento
simplemente se escribe el nombre seguido de la lista de parmetros reales.

Las variables locales

Normalmente, una funcin (o un procedimiento) hace tareas ms complejas que las que
hace la funcin maximo. Para realizar esas tareas la funcin necesitar algunas
variables de apoyo, que llamaremos variables locales. Las variables locales se crean en
el momento en que se activa la funcin, y desaparecen en el momento en que la funcin
termina. Veamos un ejemplo.
#include <stdio.h>
int suma_d (int x)
{
int d, suma;
suma=0;
d = x%10;
while (x >0)
{
suma = suma + d;
x = x/10;
d = x%10;
}
return suma;
} ;
void main ()
{
int a;
printf ("Escribe el numero:\n");
scanf ("%d",&a);
printf ("La suma de digitos es %d\n",suma_d(a));
}

La funcin suma_d calcula la suma de los dgitos del nmero entero que recibe como
parmetro. Para ello necesita las variables locales d y suma.
4. Ejecuta el programa y comprueba que funciona correctamente. Ejectalo despus paso a
paso, observando las variables d y suma en la ventana del watch. Comprueba que antes de
llamar a la funcin suma_d, el computador no reconoce las variables d y suma (puesto que
son locales a la funcin, y todava no se han creado). Justo cuando se inicia la funcin se
crean las variables, que vuelven a desaparecer cuando la funcin ha acabado.

Funciones que llaman a otras

Veamos ahora un ejemplo ms complejo. En la siguiente figura tenemos la funcin


es_primo, que indica si el entero que recibe como parmetros es primo o no. Fjate
que la funcin retorna un entero: true (o lo que es lo mismo, un 1) si el nmero es
primo, o false (o lo que es lo mismo, un 0) si el nmero no es primo.
#include <stdio.h>
int es_primo (int x)
{
int i, encontrado;
i=1;
encontrado = false;
while ((i < x) && !encontrado)
{
if ((x%i) == 0)
encontrado = true;
if (!encontrado)
i=i+1;
};
if (!encontrado)
return true;
else
return false;
} ;
int suma_primos (int vector[10])
{
int i, suma;
for (i=0; i<10; i++)
if (es_primo (vector[i]))
suma = suma+vector[i];
return suma;
};
void main ()
{
int i;
int v[10];
for (i=0; i<10; i++)
{
printf ("Escribe el numero:\n");
scanf ("%d",&v[i]);
};
printf ("La suma de primos es %d\n",suma_primos(v));
}

Por otra parte, la funcin suma_primos calcula la suma de los nmeros primos que
hay en el vector que recibe como parmetro. Para ello, usa la funcin es_primo.
Por ltimo, el programa principal lee de teclado un vector de nmeros, y calcula la suma
de los que son primos, usando la funcin suma_primos.
5.

Pon en funcionamiento este programa. Comprobars que NO funciona bien. En realidad


tiene dos errores muy tontos. Busca y corrige esos errores usando lo que has aprendido
sobre ejecucin paso a paso, y visualizacin de variables en la ventana del watch.

Este ejemplo nos muestra:


1. Que una funcin puede llamar a otras
2. Cmo trabajar con funciones que retornan verdadero o falso
3. Como trabajar con funciones que reciben vectores como parmetro

Ejercicios

Ejercicio 1: Dado el siguiente programa en C:


int funcio1(int k1, int k2)
{
int b;
if (k1 == k2)
b=k1+k2;
else
b=k1*k2;
printf(b=%d\n,b);
return b;
}
void main()
{
int a,b,c;
a= 10;
b= 12;
c= funcio1(a,b);
printf(a=%d b=%d c=%d\n,a,b,c);
a= funcio1(12,b);
printf(a=%d b=%d c=%d\n,a,b,c);
}
Haz el seguimiento del programa y determina qu es lo que imprimir por pantalla.
Ejercicio 2: Escribe una funcin llamada media2 que reciba dos reales y devuelva el
real que representa la media aritmtica de ambos nmeros. Escribe luego un programa
utilizando la funcin del ejercicio anterior que lea dos reales por teclado y devuelva la
media aritmtica de ambos.
7

Ejercicio 3: Escribe un procedimiento que escriba en pantalla los n primeros nmeros


primos. El procedimiento recibe n como parmetro. Construye una funcin para ver si
un nmero es primo o no, y usa esa funcin para construir el procedimiento.
Ejercicio 4: Escribe una funcin que reciba un nmero como parmetro y devuelva el
nmero que se obtiene al invertir el orden de los dgitos del nmero original. Por
ejemplo, si la funcin recibe el nmero 356 devolver el nmero 653.

También podría gustarte