1 Objetivos
2 Motivación
En los programas que hemos hecho hasta ahora todo el código se encuentra en el
programa principal (a partir del void main). Esta estrategia resulta problemática
cuando tenemos programas grandes, porque al encontrarse todo el código en el
programa principal es más difícil de entender, detectar errores, hacer modificaciones,
etc.
Todos los lenguajes de programación tienen algún mecanismo que permite definir
bloques de código que se escriben aparte del programa principal. Cada bloque realiza
una cierta operación con entidad lógica (por ejemplo, ordenar un vector, o escribir unos
datos en pantalla), y el programa principal activa los bloques de código cuando necesita
realizar esas operaciones.
Organizar los programas usando bloques hace que el código esté mejor organizado y sea
más fácil 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 código
ejecuta varias veces, sólo hay que escribirlo una vez.
3 Las funciones en C
En lenguaje C, los bloques se llaman funciones. Veamos un ejemplo de una función y
cómo se usa.
1
#include <stdio.h>
void main ()
{
int a,b;
int max;
2
Pulsa F10 para iniciar la ejecución 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 todavía lo que es x e y (los
parámetros formales de la función). Además, te está indicando
que todavía no se ha reservado espacio en memoria para las
variables a,b y max (porque todavía no se ha ejecutado la
declaración de esas variables).
Pulsa una vez más F10. El programa ejecuta la declaración 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.
Habrás observado que a veces hemos avanzado en la ejecución con F10 y otras veces
con F11. Ambas opciones sirven para avanzar la ejecución paso a paso, pero hay una
diferencia muy importante. Si avanzas con F10 entonces, cuando el computador llegue a
una función la ejecutará de golpe sin enseñarte paso a paso las sentencias que hay
dentro de la función. En cambio, si avanzas con F11 el computador te mostrará paso a
paso las sentencias que hay dentro de la función.
2. Ejecuta de nuevo paso a paso el programa anterior, avanzando siempre con F10. Verás
como la función se ejecuta de golpe en un solo paso, sin mostrarte las sentencias que hay
dentro de la función.
3. Ejecuta ahora de nuevo el programa paso a paso pero avanzando siempre con F11. Verás
que justo cuanto das la orden de ejecutar la sentencia printf el computador te muestra
3
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 estás usando F11, el
computador está intentando mostrarte la ejecución paso a paso de la función printf, que
es una función como cualquier otra, aunque ya programada previamente. La imagen de la
derecha te muestra las instrucciones de la función printf escritas en el lenguaje
ensamblador del computador.
Escribe un programa principal que use la función maximo para calcular el mayor de 4
números enteros, usando el menor número posible de sentencias.
4 Procedimientos
A veces es necesario realizar una tarea que no produce ningún resultado. Esa tarea
también se puede escribir en forma de bloque, pero en ese caso, en vez de llamarla
función la llamamos procedimiento. Fíjate en el siguiente ejemplo.
4
#include <stdio.h>
int maximo (int x, int y)
{
if (x>y )
return x ;
else
return y ;
} ;
void main ()
{
int a,b;
int max;
printf (“Escribe los numeros:\n”);
scanf (“%d %d”,&a,&b);
max = maximo (a,b);
escribir (max);
}
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));
}
5
La función suma_d calcula la suma de los dígitos del número entero que recibe como
parámetro. Para ello necesita las variables locales d y suma.
4. Ejecuta el programa y comprueba que funciona correctamente. Ejecútalo después paso a
paso, observando las variables d y suma en la ventana del watch. Comprueba que antes de
llamar a la función suma_d, el computador no reconoce las variables d y suma (puesto
que son locales a la función, y todavía no se han creado). Justo cuando se inicia la función
se crean las variables, que vuelven a desaparecer cuando la función ha acabado.
#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;
} ;
void main ()
{
int i;
int v[10];
6
Por otra parte, la función suma_primos calcula la suma de los números primos que
hay en el vector que recibe como parámetro. Para ello, usa la función es_primo.
Por último, el programa principal lee de teclado un vector de números, y calcula la suma
de los que son primos, usando la función suma_primos.
5. Pon en funcionamiento este programa. Comprobarás que NO funciona bien. En realidad
tiene dos errores muy tontos. Busca y corrige esos errores usando lo que has aprendido
sobre ejecución paso a paso, y visualización de variables en la ventana del watch.
Este ejemplo nos muestra:
1. Que una función puede llamar a otras
2. Cómo trabajar con funciones que retornan verdadero o falso
3. Como trabajar con funciones que reciben vectores como parámetro
7 Ejercicios
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 función llamada media2 que reciba dos reales y devuelva el
real que representa la media aritmética de ambos números. Escribe luego un programa
utilizando la función del ejercicio anterior que lea dos reales por teclado y devuelva la
media aritmética de ambos.
7
Ejercicio 3: Escribe un procedimiento que escriba en pantalla los n primeros números
primos. El procedimiento recibe n como parámetro. Construye una función para ver si
un número es primo o no, y usa esa función para construir el procedimiento.
Ejercicio 4: Escribe una función que reciba un número como parámetro y devuelva el
número que se obtiene al invertir el orden de los dígitos del número original. Por
ejemplo, si la función recibe el número 356 devolverá el número 653.