Sei sulla pagina 1di 5

UNLaR - APUNTES DE PROGRAMACION I

Prof. Ing. Marcelo Daniel Camargo

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 -

UNLaR - APUNTES DE PROGRAMACION I


Prof. Ing. Marcelo Daniel Camargo

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 -

UNLaR - APUNTES DE PROGRAMACION I


Prof. Ing. Marcelo Daniel Camargo

Los parmetros formales de la funcin suma son dos: x e y.


aux es una variable local de la funcin suma.
Esta funcin retorna a travs de aux la suma entre x e y.

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);
:

/* m,5 = Argumentos utilizados por la funcin suma */


/* se le asigna a z, el entero devuelto por suma */

Una alternativa reducida del ejemplo anterior podra ser :


:
int m;
m=8;
printf("%d",suma(m,5));
:

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 -

UNLaR - APUNTES DE PROGRAMACION I


Prof. Ing. Marcelo Daniel Camargo

nombres de los parmetros formales.


Una de las funciones que cumplen los archivos de cabecera incorporados al cdigo del programa
(con la clusula include del preprocesador), es prototipar al grupo de funciones compiladas, que
pretendemos utilizar.
En el siguiente breve ejemplo se ver un programa completo, que permite ver la forma en que se
prototipan las funciones.
#include <windows.h> // Para compilar fuera de Borland
#include <stdio.h>
#include <conio.h>
#include <string.h>
void caja_tit(int izq, int arr, int der, int aba,const char s[]);
void printf_centrado(int izq,int der,int fila,const char s[]);
void caja(int izq, int arr, int der, int aba);
void gotoxy(int x, int y); // Esta func ya existe en Borland
int main(void) {
caja(1,1,80,23); // 23 para no producir el scroll de la pantalla
printf_centrado(1,79,2,"*** TITULO DE LA PANTALLA ***");
caja_tit(5,5,55,20," TITULO DE LA CAJA ");
gotoxy(1,24);
printf("Linea de estado");
_getch(); // Requiere conio.h solo para verla en el entorno
return 0;
}
void printf_centrado(int izq,int der,int fila,const char s[]) {
gotoxy(izq+(der-izq+1)/2-strlen(s)/2,fila);
printf(s);
}
void caja_tit(int izq, int arr, int der, int aba, const char s[]) {
caja(izq,arr,der,aba);
printf_centrado(izq,der,arr,s);
}
void caja(int izq, int arr, int der, int aba) {
int i;
gotoxy(izq,arr);
printf("%c",201);
for (i=izq+1; i<der; i++)
printf("%c",205);
printf("%c",187);
for (i=arr+1; i<aba; i++) {
gotoxy(izq,i);
printf("%c",186);
gotoxy(der,i);
printf("%c",186);
}
gotoxy(izq,aba);
printf("%c",200);
for (i=izq+1; i<der; i++)
printf("%c",205);
printf("%c",188);
}
void gotoxy(int x, int y) { // Fuera de Borland - Requiere windows.h
static COORD coord;
coord.X = x-1;
coord.Y = y-1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}

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 -

UNLaR - APUNTES DE PROGRAMACION I


Prof. Ing. Marcelo Daniel Camargo

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 PANTALLA ***

TITULO DE LA CAJA

Linea de estado

Al iniciar el cdigo se muestra el prototipado de las funciones caja, caja_tit y


printf_centrado.
caja permite dibujar una caja en pantalla indicando las coordenadas del borde superior
izquierdo y el inferior derecho.
caja_tit dibuja la caja y sobre el borde superior, centra el texto obtenido como argumento .
printf_centrado imprime en pantalla un texto centrado, indicando la primera y segunda
columna de donde se quiere centrar el texto entregado como argumento.

Llamadas por valor y por referencia


Es la forma en que se pasan los argumentos a las funciones.
En las llamadas por valor se copia el valor del argumento en la variable usada como parmetro
formal, de esta forma los cambios hechos al parmetro dentro del cuerpo de la funcin no afectan
a la variable utilizada como argumento. Es el caso de todas las funciones de usuario planteadas
hasta el momento.
La llamada por referencia es la segunda forma de pasar los argumentos, en lugar de pasar el
valor, se pasa una referencia la variable. De esta forma los cambios hechos a la variable
referenciada, la afectan fuera del mbito de la funcin. En el ANSI C, se puede simular este tipo de
llamadas, pasando como parmetros de la funcin las direcciones de la variable (los punteros a
ellas).
El C++, mejor este aspecto, implementando concretamente las llamadas por referencia.

- 60 -

Potrebbero piacerti anche