Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Funciones
Uno de los aspectos deseables de los lenguajes de alto nivel, es que brinde mecanismos que
faciliten la mantenibilidad del cdigo. Para ello, el programa en lenguaje de alto nivel debe ser
comprensible para el ser humano. Sera imposible que una persona lea y entienda la lgica de un
programa de varias pginas si este no est, de alguna forma, estructurado y dividido en mdulos
lgicos, con fines especficos. Los lenguajes de alto nivel, entre ellos el C, brindan una forma de
agrupar una serie de sentencias en un mdulo lgico, para cumplir un fin determinado. Los
nombres que se le dan a estos, en los diversos lenguajes son: procedimientos, subrutinas,
subprogramas o funciones. En C, las funciones son muy flexibles y cubren la mayora de las
necesidades que puede necesitar un programador. La nica limitacin que tiene el C, y que hace a
la modularidad completa de un lenguaje, es la imposibilidad de la declaracin anidada de
funciones (o anidamiento de funciones); esto es lo que permite tener funciones declaradas dentro
de otra funcin, que solo podrn ser utilizadas por esta.
Una funcin es un grupo de sentencias, utilizadas como un todo, que puede ser invocado, desde
distintos lugares del programa. Para invocarla, es necesario utilizar el nombre que se le asign a
esta y seguido, entre parntesis, la lista de argumentos; en el mismo orden en que fueron
declarados los parmetros formales de la funcin.
Declaracin de funcin
La forma general es:
tipo_devuelto nombre_funcin(lista de parmetros)
{ cuerpo de la funcin
return expresin_devuelta
}
en la cual podemos identificar:
tipo_devuelto indica el tipo de dato que devuelve la funcin. Si este no se indica, el
compilador asume que el tipo de dato devuelto es int y ser obligatorio devolver un int
mediante return.1
El nombre de la funcin es un identificador asignado por el programador. Este debe ser
representativo del objetivo que cumple la funcin.
La lista de parmetros contiene los nombres de las variables, separadas por coma, con sus
respectivos tipos, que utilizar la funcin como entrada.
La omisin de los parmetros formales, indica que la funcin no necesita datos de
entrada. Tiene el mismo efecto que el de colocar como nico parmetro un tipo void. De
todos modos, la sintaxis del lenguaje obliga a que los parntesis estn siempre presentes.
El cuerpo de la funcin es un grupo de sentencias que cumplirn el objetivo de esta.
La palabra reservada return indica la salida de la funcin, y retorno inmediato al lugar donde
fue invocada. Puede haber ms de un return en el cuerpo de la funcin, pero se saldr por
solo uno de ellos en cada ejecucin de la funcin, dependiendo de la lgica ejecutada en ese
momento. Se omitir return en caso que el tipo del dato devuelto sea void. Si la salida no es
de tipo void y se omite return, el valor devuelto por la funcin, queda tcnicamente indefinido
(con el warning La funcin debera devolver un valor).
expresin_devuelta es una expresin que del tipo tipo_devuelto.
Existen tres causas por las cuales se puede salir de la funcin. Una es, una vez ejecutada la
ltima sentencia de la funcin, otra cuando se encuentra la palabra clave return, que
opcionalmente puede devolver un valor y ante un exit() que obliga a abandonar el programa.
En la funcin main tambin se debe indicar el tipo devuelto. Algunos compiladores permiten que sea void, sin
embargo, en los compiladores contemporaneos exigen devolver int, y en caso de la ejecucin exitosa se devuelve 0 o
EXIT_SUCCESS o caso contrario devolver EXIT_FAILURE, ambas prototipadas en stdlib.h.
- 56 -
Invocacin de funcin
La forma general es:
identificador_de_funcin(lista de argumentos);
Este es el caso de las funciones con salida void, o sea, que no retornan salida.
Se puede decir entonces, que toda funcin cuya devolucin no sea de tipo void, puede ser
utilizada dentro de cualquier expresin del C.
Por ej. dada una funcin sqr que devuelva el cuadrado de su argumento, podra utilizarse de la
siguiente forma:
y = 2 * sqr(x) + x + 5;
otro ej. podra ser una funcin may que devuelva de sus argumentos el mayor:
if (may(x,y)) printf ("Entradas fuera de rango");
Reglas de mbito
Las reglas de mbito controlan si una sentencia conoce, o tiene acceso, a algn fragmento de
cdigo, o de datos.
En C el cdigo de una funcin es privado, y no se puede acceder a este desde otra funcin, a
menos que se lo haga a travs de una invocacin explcita a la funcin1. El cuerpo de la funcin es
desconocido para el entorno de la funcin y no puede ser accedido por otras partes del programa.
Es decir, que el cdigo y los datos definidos dentro de una funcin, no interactan con el cdigo o
los datos definidos dentro de otra, porque las dos funciones tienen mbitos diferentes.
Variables locales
Son las variables que se definen y son utilizadas dentro del mbito de una funcin. Estas son
dinmicas, es decir, que pueden ser creadas y eliminadas en tiempo de ejecucin; en este caso,
comienzan a existir, cuando se entra en la funcin, y se destruyen al salir de esta. Por esta razn,
las variables locales convencionales no pueden mantener el valor a travs de sucesivas
llamadas. Si se deseara esta caracterstica en alguna determinada variable de alguna funcin, se
debera declarar a esta, con el modificador de tipo static, esto har que la variable tenga el
comportamiento de una variable global, conservando el valor entre llamadas, pero manteniendo su
privacidad.
Parmetros formales
Si una funcin necesita argumentos, debe declarar variables de entrada que acepten estos
valores. A estas variables se les llaman parmetros formales de la funcin. Comparten el mismo
mbito de las variables locales de la funcin y se comportan como tales. Al igual que estas, son
variables dinmicas, es decir, se crean al entrar en la funcin y se destruyen al salir de ella.
Revisin de algunos conceptos previos a travs de ejemplos.
Ejemplo de declaracin de una funcin: Se har el ejemplo de una funcin trivial, que tendr como
nico fin, comprender ciertos conceptos. No se justifica su implementacin en un programa real, ya
que es mucho ms simple y eficiente realizar la operacin con el operador que nos brinda el
lenguaje.
Las implantaciones de las funciones se hacen fuera del cuerpo del main(), y se aconseja hacerlo
debajo de este. No podr incluir o estar incluida en otra declaracin.
int suma(int x, int y) {
int aux;
aux = x + y;
return aux;
}
(1)
Por ej. no podra utilizarse un goto en una funcin para saltar a alguna parte de otra funcin.
- 57 -
Invocacin de una funcin: Se har desde el cuerpo de una funcin (entre ellas la funcin main()).
int m,z;
:
m=8;
z=suma(m,5);
:
printf("%f",z);
:
Se debe tener en cuenta que el tipo de los argumentos deben ser compatible con los tipos de los
parmetros formales de la funcin. Si hay incompatibilidad de tipos, la compilacin no reportar
error, pero los resultados sern impredecibles.
Dentro del cuerpo de la funcin, tanto los parmetros formales como las variables locales, pueden
ser utilizados dentro de cualquier expresin vlida.
Prototipado de funciones
Le indican al compilador el tipo de dato devuelto y el tipo y cantidad parmetros formales que
tendr una funcin. Estos deben estar declarados, local o globalmente, antes que la funcin sea
invocada. Pero lo usual es ubicar todos los prototipos junto con todas las declaraciones globales
del programa, al comienzo del cdigo y antes de cualquier declaracin de funcin.
El prototipado de las funciones naci con el ANSI C, para posibilitar que el compilador haga una
comprobacin estricta de tipos, como se haca en otros compiladores como por ejemplo, los de
Pascal.
Ya vimos que si una funcin no declara el tipo_devuelto, el compilador interpreta que devuelve un
entero. Si tanto los parmetros, como el tipo devuelto, son de tipo entero, no es necesario declarar
el prototipo de la funcin. De todos modos es aconsejable, incluir tambin estos prototipos, ya que
ayudan a la comprensin del cdigo.
La forma general de prototipar una funcin es la siguiente:
tipo_devuelto nombre_funcin(lista de parmetros);
Se puede observar que es casi idntica a la primera lnea de la declaracin de una funcin. Solo
difiere en que finaliza con punto y coma.
El siguiente ej. podra ser el prototipo de una funcin:
float func(int x, int y, float valor);
Cuando se observa esta declaracin, se podra pensar en declarar en conjunto x e y de tipo int. de
la siguiente forma:
float func(int x,y, float valor);
pero esta sintaxis el compilador no la permitir.
Una alternativa valida del prototipo podra ser la siguiente:
float func(int, int, float);
En la cual se declaran la cantidad y los tipos de los parmetros, y no los nombres. Pero en este
caso diferir de la primera lnea de la declaracin de la funcin, en la que debern existir los
- 58 -
Se puede observar la utilidad de dividir al programa en funciones. Viendo por un lado, que es
mucho ms fcil interpretar, por parte de la persona que analiza el cdigo. Por otro lado, nos
muestra el concepto de reusabilidad del cdigo, a travs de la invocacin de una misma funcin
desde distintas partes del programa.
- 59 -
Si estas funciones fueran almacenadas en archivos externos, ya sea como cdigo fuente,
incorporados con la clusula include o como programas objetos, podran ser utilizadas en cualquier
programa que creemos.
El ejemplo mostrar la utilizacin de algunas herramientas que nos permiten realzar la interface
de texto por pantalla de un programa. Esta interface es muy simple y limitada, pero puede servir
como base para realizar una ms compleja.
El resultado de la ejecucin es el que se muestra:
TITULO DE LA CAJA
Linea de estado
- 60 -