Professional Documents
Culture Documents
Funciones
Un programa es la implementacin de un algoritmo para resolver un problema mediante la
computadora en un lenguaje de programacin. Un programa consta de una serie de datos
y los procesos que se van a realizar sobre esos datos. En el Captulo 2: Algoritmos,
Programacin estructurada, Diseo descendente, se estudi una tcnica que nos permita
generar el algoritmo para la solucin de un problema. Esta tcnica, llamada diseo
descendente consiste en, inicialmente describir la solucin del problema en forma general,
mediante una serie de subtareas que sabemos que son necesarias para resolver el
problema, pero que no necesariamente tengamos en forma clara como realizarlas en esta
primera etapa. Posteriormente cada una de esas subtareas se analiza con ms detalle y
de ser necesario se descompone a su vez, en una serie de subtareas. Este proceso se
contina hasta que cada uno de los pasos para resolver el problema puede expresarse
mediante instrucciones que la computadora puede realizar.
Los dos principios fundamentales en la tcnica de diseo descendente son: Primero, una
tarea compleja se subdivide en varias subtareas ms pequeas y fciles de llevar a cabo;
y segundo, una tarea delega a sus subtareas la misin de realizar su cometido sin
importarle los detalles de cmo la realiza.
C soporta la tcnica de diseo descendente mediante el concepto de funcin. En el
Captulo 4: Estructura de un programa en C, se mencion que un programa en C consiste
de una o ms funciones. Una funcin en C es un subprograma que realiza una tarea
especfica del programa. Una funcin consta de una serie de datos y el proceso a
realizarse con ellos.
Por ejemplo considere el siguiente problema:
Crea un programa que calcule el rea bajo la curva y = x2 y que se encuentra entre las
rectas x = xi y x = xf. Aproxime el rea bajo la curva como la suma de las reas de n
rectngulos inscritos bajo la curva. El programa deber pedir los valores de xi y xf, as
como el nmero de rectngulos a usarse.
Una primera aproximacin a la solucin del problema est dada por el siguiente
pseudocdigo:
lee datos
calcula rea
escribe rea
ITSON
88
Funciones
En lugar de proceder a refinar cada uno de los pasos anteriores, podemos pensar que
cada una de las tareas anteriores puede realizarse mediante una funcin. Esto es,
podemos tener una funcin para leer los datos, leedatos(), otra para calcular el rea,
calculaArea() y una tercera para escribir el rea, escribeArea(). La funcin
main() se encarga de llamar a las funciones en la secuencia adecuada para que la tarea
se lleve a cabo.
Las ventajas del uso de funciones en un programa son:
1. Las funciones en un programa facilitan el partir un programa grande en unidades
ms manejables y pequeas. Cada una de estas partes constituye un subprograma
el cual puede implementarse y probarse por separado.
2. Colocando la parte del cdigo del programa que se usa con ms frecuencia en una
funcin permite acortar el tamao de ste. Por ejemplo considere un programa en
el cual se utilice varias veces la funcin printf(). En el programa ejecutable, slo
aparece una vez el cdigo de esta funcin an cuando en el programa la hayamos
llamado 10 o 20 veces. Esto mismo es aplicable a funciones que nosotros creemos.
3. Las funciones creadas para un programa pueden reutilizarse en otros. De nuevo
considere la funcin printf(), la cual podemos llamarla desde cualquier
programa que deseemos. C nos permite que el cdigo de una o varias funciones
que hayamos creado, sea incluido en cualquier programa.
4. Una funcin encapsula (nos oculta) su cdigo y datos. Esto es, para poder usar
una funcin no es necesario tener el conocimiento de la operacin interna de la
funcin, slo debemos saber su interfaz (como llamarla, qu valor regresa y que
informacin requiere para operar). De nuevo, para usar la funcin printf() no se
requiere conocer el cdigo de la funcin, slo su interfaz.
Para poder emplear una funcin en C se requiere hacer lo siguiente: Declarar la funcin,
definir la funcin y llamar a sta en el programa.
ITSON
Captulo 6
Funciones
89
Donde tipo, es un especificador de tipo, el tipo de la funcin, es decir el tipo del valor
regresado por la funcin. Una funcin puede ser de cualquiera de los tipos enteros o
flotantes. Inclusive la funcin puede no regresar valores en cuyo caso se dice que la
funcin es de tipo void.
nomFunc es un identificador, el nombre de la funcin.
tipo1 [nomParam1][, tipo2 [nomParam2]] es la lista de declaraciones de
parmetros de la funcin. Cada declaracin de un parmetro consta de un especificador
de tipo seguido opcionalmente de un identificador. Aunque el nombre del parmetro es
opcional se recomienda incluirlo ya que el nombre es indicativo del uso que se le da al
parmetro. El tipo del parmetro es el tipo del valor que la funcin recibir al momento de
ser llamada. Una funcin puede tener cero, uno o ms parmetros. En el caso de que la
funcin no tenga parmetros, se utiliza la palabra void en lugar de la lista de parmetros.
El propsito bsico de la declaracin de una funcin es el de permitirle al compilador
verificar que al llamar a la funcin, los tipos de los argumentos que le pasemos sean los
mismos que los de los parmetros que se especificaron en la declaracin. Lo anterior nos
da un nivel de proteccin contra el mal uso de las funciones.
Una funcin debe declararse antes de ser llamada. Su posicin en el cdigo puede ocurrir
en varios lugares: Si la declaracin se hace externa a las funciones, el compilador la
reconoce desde el momento en que aparece la declaracin hasta el final del cdigo. Si la
declaracin forma parte de la lista de declaraciones dentro de una funcin, la declaracin
slo es vlida dentro de la funcin en que fue hecha. La prctica ms comn es colocar
las declaraciones de las funciones al principio del cdigo, despus de las directivas al
preprocesador.
En el caso de las funciones de la biblioteca estndar de C, las declaraciones de las
funciones o prototipos se encuentran agrupadas por categoras en archivos texto,
llamados archivos de encabezados, los cuales tienen la extensin ".h" y para incluir su
contenido a nuestro programa usamos la directiva del preprocesador #include. Por
ejemplo los prototipos de las funciones de entrada y salida de la biblioteca estndar tales
como printf() o scanf(), se encuentran en un archivo de encabezados llamado
stdio.h.
La declaracin de la funcin le muestra al programador cul es la interfaz entre el
programa y la funcin, ya que puede determinar a partir del prototipo cmo usar la funcin.
Esto es, al momento de declarar la funcin estamos estableciendo como va a interactuar
la funcin con el resto del programa, sin necesidad de saber cmo la funcin realiza su
tarea. Por ejemplo para hacer las declaraciones de las funciones del problema sobre el
clculo del rea bajo una curva mencionado en la seccin anterior debemos establecer
para cada funcin, que valor regresa y qu datos requiere. Supongamos que en este
ejemplo, diseamos el programa de tal manera que la funcin main() llama
ITSON
90
Funciones
Figura 7-1
Podemos ver que la funcin leeDatos() lee del teclado la abscisa inicial, xi, la abscisa
final xf y el nmero de rectngulos, n. Dado que la funcin calculaArea() requiere
estos datos para calcular el rea, la funcin main() que es quien la llama debe
mandrselos. Para ello main() debe allegarse de esos datos primero. Desearamos
pues, que la funcin leeDatos() le devuelva a main() los datos ledos. Sin embargo
una funcin slo puede devolver un dato y no tres, por lo que una opcin para resolver
este problema es que la funcin leeDatos() le regrese un valor y los otros dos los deje
en localidades de memoria que sean accesibles a todas las funciones. Este tipo de
localidades se conocen como variables externas (ver las secciones: Clases de
Almacenamiento y Alcance Lxico). En el Captulo 8: Apuntadores, se estudiar una
mejor manera de resolver este problema. Por lo pronto, la funcin leeDatos() regresar
el nmero de rectngulos, un nmero entero, y dejar en las variables xi y xf los valores de
xi y xf. La funcin leeDatos no requiere de informacin para realizar su trabajo, por lo que
su declaracin tiene la forma:
int leeDatos(void);
recuerde que la palabra void en la lista de parmetros indica que la funcin no tiene
parmetros.
La funcin calculaArea() por su parte debe regresar el valor del rea bajo la curva, un
flotante. Esta funcin requiere para poder calcular el rea de los valores de las abscisas
inicial y final y del nmero de rectngulos. Los valores de las abscisas los puede accesar
directamente de las variables externas xi y xf, pero el nmero de rectngulos lo debe
recibir de la funcin main(), ya que es quien la llama. La declaracin de
calculaArea() queda como:
ITSON
Captulo 6
Funciones
91
Por ltimo la funcin escribeArea() no regresa ningn valor ya que su trabajo es slo
de desplegar el resultado. La funcin escribeArea() requiere que la funcin main() le
mande el valor del rea, un flotante. La declaracin de la funcin queda como:
void escribeArea(float area);
ITSON
92
Funciones
Las llaves delimitan al bloque. Las declaraciones locales van en la parte superior del
bloque.
El bloque de una funcin es un bloque y contiene todo el cdigo que se ejecutar cuando
se llame a la funcin.
Las declaraciones locales son normalmente declaraciones de variables automticas;
aunque podemos declarar localmente una funcin, tal como se mencion en la seccin:
Declaracin de una funcin, (ver las secciones: Clases de Almacenamiento y Alcance
Lxico).
La sentencia return
Cuando se llama a una funcin, el control del programa pasa de la funcin llamante a la
primera sentencia dentro del bloque de la funcin llamada y a partir de sta se ejecutan las
dems instrucciones en forma secuencial. Normalmente la funcin termina cuando se ha
ejecutado la ltima instruccin en el bloque de la funcin y en ese momento el control es
transferido a la funcin llamante. Sin embargo es posible terminar la funcin en cualquier
lugar del cdigo utilizando para ello la sentencia return, cuya sintaxis es:
return [expresin];
La sentencia return genera un salto al final de la ltima instruccin dentro del bloque de la
funcin, terminando as la ejecucin de la funcin. Puede haber cero, una o ms
sentencias return dentro de una funcin, pero slo una de ellas se ejecutar.
expresin debe ser una expresin del mismo tipo de la funcin. Si se ejecuta una
sentencia return que tiene asociada una expresin; antes de terminar la ejecucin de la
funcin se evala la expresin y su valor es el valor devuelto a la funcin llamante.
ITSON
Captulo 6
Funciones
93
Si una funcin es declarada como de tipo void, puede haber sentencias return pero no
deben estar asociadas con expresiones. De estarlo el compilador marcar error.
Si una funcin regresa un valor, la funcin llamante puede utilizar, almacenar o descartar
ese valor. El valor se descarta si no hay una localidad de memoria a la que se asigne
dicho valor.
Si una funcin es de un tipo diferente a void y no contiene una sentencia return o la
sentencia return no tiene asociada una expresin, el valor que regresa la funcin est
indeterminado.
Considere el ejemplo ya mencionado sobre el clculo del rea bajo una curva. Una
definicin de la funcin leeDatos() puede ser:
int leeDatos(void) {
int n;
printf("\nValor de la abscisa inicial, xi: ");
scanf("%f", &xi);
printf("\nValor de la abscisa final, xf: ");
scanf("%f", &xf);
printf("\nNmero de rectngulos a emplear: n: ");
scanf("%d", &n);
return n;
}
Recuerde que las variables xi y xf son globales. La variable n es declarada como local.
La funcin calculaArea() tiene la siguiente definicin:
float calculaArea(int n) {
float x, base, sumaH;
base = (xf - xi)/n;
sumaH = 0;
Las variables x, base y sumaH son locales. Note que no es necesario tener en esta
funcin una variable para almacenar el valor del rea. Por ltimo, la funcin
escribeArea(), tiene la siguiente definicin:
void escribeArea(float area) {
printf("\El rea bajo la curva es %.8f", area);
}
ITSON
94
Funciones
ITSON
Captulo 6
Funciones
95
area es la variable en la que se almacena el valor del rea bajo la curva. Por ltimo, la
llamada a la funcin escribeArea() se escribe como:
escribeArea(area);
ITSON
96
Funciones
ITSON
Captulo 6
Funciones
97
Ejercicios
1. Modifica el programa anterior, para que las funciones en lugar de ser llamadas
todas por la funcin main(), interacten tal como se muestra en la figura 2.
Note que la funcin main() en este caso slo llama a la funcin leeDatos() y
que sta llama a la funcin calculaArea(). Por ltimo la funcin
calculaArea() llama a la funcin escribeArea() para que despliegue el rea
bajo la curva. Bajo este esquema no se necesitan variables externas.
Figura 7-2
2. Rescribir el programa que calcula la media de las edades de un grupo de alumnos
(ejercicio 1 sobre la sentencia while, Captulo 5: Sentencias de Control), de tal
manera que se conste de tres funciones las cuales sern llamadas por la funcin
main():
leeDatos()
calculaMedia()
escribeResultado()
ITSON
98
Funciones
Clases de Almacenamiento
Por clase de almacenamiento entendemos la duracin que tiene una variable en un
programa: Hay dos clases de almacenamiento: automtica y esttica. Para especificar la
clase de almacenamiento de una variable se utilizan varias palabras reservadas junto con
el contexto de la declaracin.
ITSON
Captulo 6
Funciones
99
--}
--}
Una variable esttica es una variable que slo es conocida por el bloque en la cual es
declarada pero que permanece con vida el tiempo que el programa est ejecutndose. No
es creada ni destruida cada vez que se llama y sale del bloque en que est declarada. En
otras palabras un variable con clase de almacenamiento esttica conserva su valor entre
llamadas. Las variables estticas pueden inicializarse al declararse. Sin embargo, esta
inicializacin slo ocurre una vez, al principio de la ejecucin del programa.
Las variables externas, que son las que se declaran fuera de todos los bloques, al mismo
nivel que las definiciones de las funciones, son siempre estticas. Una variable externa es
creada al inicio de la ejecucin del programa y conserva permanentemente su localidad de
memoria.
En el ejemplo anterior, se muestran las diferentes variables con clase de almacenamiento
estticas.
Alcance Lxico
El alcance lxico del nombre de una variable o funcin es la regin del cdigo del
programa dentro de la que se reconoce dicha variable o funcin. Hay varios tipos de
alcance:
ITSON
100
Funciones
ITSON
Captulo 6
Funciones
101
Parmetros
1. El nombre de un parmetro es local a la funcin en que se declara, esto es,
podemos utilizar el mismo nombre del parmetro para otro parmetro o variable
local en otra funcin o para una variable externa.
2. Los parmetros se crean al momento de llamar a la funcin y se inicializan a los
valores con los que se llama a la funcin.
3. Un parmetro es local al procedimiento. Esto es, slo es reconocida por la funcin
que lo crea y slo tiene validez mientras la funcin se est ejecutando.
4. Una funcin puede modificar los valores de sus parmetros.
5. Los parmetros son destruidos al salir de la funcin y su valor se pierde.
Variables Automticas
1. El nombre de una variable automtica es local a la funcin en que se declara, esto
es, podemos utilizar el mismo nombre del de la variable para otro parmetro o
variable automtica en otra funcin o para una variable externa.
2. Las variables automticas se crean al momento de llamar a la funcin.
3. Una variable automtica slo es reconocida por la funcin que la crea y slo tiene
validez mientras la funcin se est ejecutando.
4. Las variables automticas son destruidas al salir de la funcin y su valor se pierde.
ITSON
102
Funciones
/* Variables externas */
int a, b, x, y;
int main(void)
{
a = 1; b = 2; x = 7; y = 11;
printf("\n%d\t%d\t%d\t%d", a, b, x, y);
mezcla(a, b, x);
printf("\n%d\t%d\t%d\t%d",a, b, x, y);
mezcla(b, a, x - y);
printf("\n%d\t%d\t%d\t%d",a, b, x, y);
return 0;
}
void mezcla(int q, int a, int r)
/* q, a y r son parmetros */
{
/* Variables automticas */
int x, z;
scanf("%d", &x);
z = -x;
x = x + 1;
q = 2 * q + a;
b = 1 + z - 2 * x;
printf("\n%d\t%d\t%d\t%d\t%d\t%d",q, a, b, r, x, z);
}
ITSON
Captulo 6
Funciones
103
el inicializador puede ser cualquier expresin que pueda ser evaluada al tiempo de la
inicializacin. La inicializacin se hace cada vez que se entra a la funcin o bloque.
Problemas
1. Construir una funcin que determine la distancia entre dos puntos. La funcin
deber recibir como parmetros las coordenadas de los dos puntos y regresar la
distancia entre ellos.
Crea un programa que llame a la funcin anterior y que despliegue la distancia
entre los dos puntos.
2. Crea una funcin que lea las calificaciones (0 - 10) de alumnos y cuente el nmero
de alumnos reprobados, calificacin < 7, de un conjunto de notas. La funcin debe
recibir por medio de un parmetro, el nmero de notas a leer y deber regresar el
nmero de alumnos reprobados.
Crea un programa que llame a la funcin anterior y que despliegue el nmero de
alumnos reprobados.
3. El mximo comn divisor de dos nmeros positivos es el entero ms grande que es
divisor de ambos nmeros. Por ejemplo el mximo comn divisor de 6 y 15 es 3.
Escriba una funcin que reciba como parmetros dos nmeros enteros y regrese
su mximo comn divisor.
Crea un programa que llame a la funcin anterior y que despliegue el mximo
comn divisor de dos nmeros.
4. El mnimo comn mltiplo de dos nmeros positivos es el entero ms pequeo que
es mltiplo de ambos nmeros. Por ejemplo el mnimo comn mltiplo de 6 y 15 es
30. Escriba una funcin que reciba como parmetros dos nmeros enteros y
regrese su mnimo comn mltiplo.
Crea un programa que llame a la funcin anterior y que despliegue el mnimo
comn mltiplo de dos nmeros.
5. Mostrar lo que imprime el siguiente programa. Suponer que los datos tecleados son
3, 2, 4.
#include <stdio.h>
const int diez = 10;
int c;
void test(int z, int x);
ITSON
104
Funciones
int main(void)
{
int a, b;
scanf("%d%d%d", &a, &b, &c);
test(a - b, c);
b += diez;
printf("\nLas respuestas son: %d, %d, %d", a, b, c);
return 0;
}
void test(int z, int x)
{
int b;
b = z * z;
c = x / b;
}
Si la conversin va a ser de C a F o de F a C.
El rango de valores de la tabla.
El incremento.
ITSON