Funciones en programación
Un concepto que conecta a las matemáticas con la computación es el de función. Una
función es una regla que asocia valores de entrada con un valor de salida. A continuación se
muestran ejemplos de funciones usando la notación que hemos usado desde secundaria y en
bachillerato:
f (x) = x + 2
Si x = 3 entonces f (3) = 3 + 2 = 5
g(x, y, z) = x + 2y − z
Si x = 7, y = 2 y z = 5 entonces g(7, 2, 5) = 7 + 4 − 5 = 6
sen(x)
tan(x) = cos(x)
sen(30 ◦ )
Si x = 30 entonces tan(30 ◦ ) =
◦
cos(30 ◦ )
= 0,5
√
0,5 3
= √1
3
El último ejemplo ilustra una función denida en términos de otras funciones. Es justo
esta habilidad lo que nos permite especicar cálculos cada vez más complicados.
A veces es importante hacer explícito el domino y el codominio de una función, por
ejemplo, la función g de arriba podría complementarse con g : R3 → R. En muchos lenguajes
de programación (C inluido) sucede algo similar, al tener que identicar el tipo de dato de
cada parámetro de entrada y del de la salida. Así, la función g podría escribirse en C como:
float g(float x, float y, float z) {
float res;
res = x + (2*y) -z;
return res;
}
donde el primer float corresponde con el tipo de dato del valor de salida que regresa la
función.
En todo programa en C existe una función especial que ya conocemos, se evalúa automá-
ticamente y a partir de la cual se hace el resto del cálculo. Esa función se llama main .
La función main no necesita parámetros pues se evalúa automáticamente, por eso no hay
nada etre los paréntesis. Por convención, cuando main regresa 0 signica que el programa
terminó sin contratiempos. Y como 0 es entero, ponemos int antes del nombre de la función,
como el tipo de dato de regreso de la misma. Como hemos visto, la forma de escribir esto en
el lenguaje C es la siguiente:
int main ( ) {
//Instrucciones aquí
return 0;
}
1
Si queremos que main evalúe otra función, primero debemos denirla. Afortunadamente,
todo lenguaje trae predenidas cientos o incluso miles de funciones escritas por otros progra-
madores. Esta colección de funciones predenidas recibe el nombre de biblioteca estándar. La
biblioteca estándar de C está repartida entre distintos archivos con extensión .h (que viene
de header o encabezado en inglés). Estos archivos pueden incluirse con la sentencia #include
<archivo> y el archivo de encabezado que más usamos es stdio.h, el cual dene funciones
para poder pedir valores al usuario e imprimir mensajes.
Código Salida
#include <stdio.h> Hola Mundo
int main( ) {
printf("Hola Mundo");
return 0;
}
Deniendo funciones en C
En general, una función en C que recibe N parámetros de entrada tiene la siguiente forma:
tipo_dato nombre_fun (tipo_dato param1, ..., tipo_dato paramN) {
//procedimiento de la función
return valor;
}
donde el primer tipo_dato corresponde al tipo del valor de salida regresado por la función.
Del mismo modo que se dene la función main, podemos denir funciones adicionales. Lo
usual es que, como en matemáticas, estas funciones tomen valores, regresen un resultado y
sean llamadas desde alguna otra parte del código. Por ejemplo:
Código Salida
#include <stdio.h> 8.5
float promedio(float a, float b) {
return (a + b) / 2;
}
int main( ) {
printf(" %f", promedio(7, 10));
return 0;
}
2
Para alguien que apenas está aprendiendo a programar, generalmente es difícil decidir si
denir o no funciones auxiliares, ya que siempre existe la alternativa de poner toda la lógica
del programa en main. La recomendación es denir una función auxiliar cuando estemos en
alguna de las siguientes situaciones:
Alguna parte del cálculo es muy común y general (por ejemplo, calcular el máximo de
dos números).
Cierto cálculo se realizará varias veces en distintos puntos del código (entonces bastaría
escribirlo una vez y evaluar la función varias veces).
Cierto cálculo es muy complicada pero depende únicamente de unos pocos valores de
entrada (de este modo podemos aislar el cálculo del resto del programa).
Como tal, las funciones son el principal mecanismo de los lenguajes de programación
actuales para construir software cada vez más complicado, sin que por ello éste se vuelva
incomprensible o inmanejable. Aunque un programa tenga miles de líneas de código, si una
función es corta y está bien escrita entonces debe ser fácil poder razonar sobre ella.
Desafortunadamente, en C es un error usar una función que está declarada abajo de su
punto de uso:
Código Diagnóstico del compilador
#include <stdio.h> error: conflicting types for `promedio'
float promedio(float a, float b) {
int main( ) { ^~~~~~~~
printf(" %f", promedio(7, 10));
return 0;
}
float promedio(float a, float b) {
return (a + b) / 2;
}
Si nos entercamos en denir una función abajo de main, podemos declararla arriba y
denirla abajo. La declaración sin denición de una función se hace con ; sin especicar el
cuerpo de la función:
3
Código Salida
#include <stdio.h> 8.5
float promedio(float a, float b);
int main( ) {
printf(" %f", promedio(7, 10));
return 0;
}
float promedio(float a, float b) {
return (a + b) / 2;
}
Salvo que esté justicado, no se recomienda declarar una función sin denirla. Hacer
aumenta la cantidad de código escrito y nos obliga a que cualquier cambio en el nombre,
parámetros o tipo de retorno de una función se tenga que hacer en dos partes del código en
lugar de sólo en una.
Como en matemáticas, los símbolos de una función son independientes de los símbolos de
las demás funciones. Cuando evaluamos g(1,3) en el siguiente programa, x,y valen 1, 3 en
g. Cuando la evaluación de g(1,3) a su vez evalúa f(3,2) tenemos que x,y valen 3, 2 en f.
Código Salida
#include <stdio.h> 11.000000
float f(float x, float y) {
return 3 * x + y;
}
float g(float x, float y) {
return f(y, 2 * x);
}
int main( ) {
printf(" %f", g(1, 3));
return 0;
}
Si una función no necesita tomar parámetros para regresar un valor, entonces la lista de
parámetros puede ir vacía (como en el caso de main). Aunque en matemáticas esto suele no
tener sentido, en computación es usual. Por otra parte, ya hemos explicado que la sentencia
return sirve para especicar el valor que la función debe regresar. En caso de que la función
tenga más de un return, el primero que se ejecute tiene prioridad y además termina de
inmediato la ejecución de la función:
4
Código Salida
#include <stdio.h> 2
int f( ) {
return 2;
return 7;
}
int main( ) {
printf(" %d", f( ));
return 0;
}
En general, hay dos clases de funciones: aquéllas que calculan valores y aquéllas que
realizan alguna acción. Cuando una función realiza una acción y no tiene nada útil que
regresar, el tipo de retorno se especica con la palabra void y no es necesario hacer un return
dentro de la función. Por ejemplo, a continuación se muestra una función que imprime un
mensaje pero que no calcula ningún valor útil:
Código Salida
#include <stdio.h> hola
void saluda( ) {
printf("hola\n");
}
int main( ) {
saluda( );
return 0;
}
Se puede usar la sentencia return; para terminar anticipadamente una función que re-
gresa void.