You are on page 1of 18

Captulo 6

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

Manuel Domitsu Kono

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.

Declaracin de una Funcin


La declaracin de la funcin, tambin llamada prototipo de la funcin, sirve para
informarle al compilador de la existencia, en algn lugar del cdigo, de una funcin y que
la funcin tiene el nombre, regresa un valor del tipo y recibe los parmetros que aparecen
en la declaracin. La sintaxis de la declaracin de una funcin es la siguiente:
tipo nomFunc(tipo1 [nomParam1][, tipo2 [nomParam2]]...);

ITSON

Manuel Domitsu Kono

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

Manuel Domitsu Kono

90

Funciones

consecutivamente a las tres funciones. El diagrama de la figura 1 muestra cmo estn


interactuando las funciones y la informacin que fluye entre ellas.

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

Manuel Domitsu Kono

Captulo 6

Funciones

91

float calculaArea(int n);

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

Definicin de una Funcin


Al definir una funcin estamos estableciendo el contenido de la funcin, esto es, qu
sentencias se ejecutarn al ser llamada.
Las definiciones de las funciones, incluyendo la de la funcin main() pueden ocurrir en
cualquier orden, pero es una prctica comn que la funcin main() se coloque al principio
y las siguientes en el orden en que van siendo llamadas.
La sintaxis de la definicin de una funcin es la siguiente:
tipo nomFunc(tipo1 nomParam1[, tipo2 nomParam2]...) {
[declaracin local] ...
[sentencia] ...
}

La definicin de una funcin consta de dos partes: El encabezado de la funcin y el bloque


de la funcin.

Encabezado de una funcin


El encabezado de una funcin tiene una sintaxis similar a la declaracin de la funcin con
las siguientes diferencias:
1. La declaracin de una funcin termina en punto y coma (;). El encabezado de una
funcin no.
2. En la lista de parmetros, el nombre de cada parmetro no es opcional.
3. Los nombres de los parmetros en la declaracin no tienen que ser los mismos de
los correspondientes parmetros de la definicin.

ITSON

Manuel Domitsu Kono

92

Funciones

Parmetros de una funcin


Los parmetros son localidades de memoria en los que la funcin recibe valores al
momento de ser llamada. Los parmetros se comportan como variables automticas
(ver las secciones: Clases de Almacenamiento y Alcance Lxico).

Bloque de una funcin


Un bloque en un programa es una construccin de cdigo que contiene declaraciones
locales a ese bloque y una sentencia compuesta. la sintaxis de un bloque es:
{
[declaracin local] ...
[sentencia] ...
}

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

Manuel Domitsu Kono

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;

/* base del rectngulo */


/* Acumulador de alturas */

for(x = xi; x < xf; x += base) sumaH += x*x;


return sumaH * base;
}

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

Manuel Domitsu Kono

94

Funciones

Llamada a una Funcin


La llamada a una funcin es la forma en que le indicamos a C que ejecute las sentencias
que componen a esta funcin.
Como ya se mencion anteriormente, La llamada a una funcin puede ocurrir como parte
de una expresin o como parte de una sentencia de expresin. En C cualquier funcin
puede llamar a cualquier otra funcin.
La sintaxis de la llamada a una funcin es la siguiente.
nomFunc([arg1] [,arg2] ...)
nomFunc es el identificador usado para declarar y definir la funcin.
[arg1] [,arg2] ... es la lista de argumentos de la funcin.

Argumentos de una funcin


Una funcin puede tener cero, uno o ms argumentos. En el caso de que la funcin no
tenga argumentos, se escriben los parntesis vacos. No se pueden omitir los parntesis.
Los parmetros usados en la definicin de la funcin y los argumentos usados en la
llamada a la funcin deben de coincidir en nmero, de otra manera ocurre un error de
compilacin.
Cada argumento es una expresin, su valor es el valor que la funcin llamante le pasa a la
funcin llamada. La funcin llamada recibe este valor en su parmetro correspondiente. Si
el tipo del argumento no es el mismo que el tipo del parmetro, el compilador tratar de
convertirlo al tipo del parmetro. Si la conversin no es posible, ocurre un error de
compilacin.
Si el argumento es una variable, el valor de la variable fuera de la funcin no se ve
afectada por los cambios que sufra su copia dentro de la funcin, ya que a la funcin slo
se pasa una copia del valor que hay en la variable que constituye el argumento.
En el ejemplo sobre el clculo del rea bajo una curva, la llamada a la funcin
leeDatos() es:
nRect = leeDatos();

donde nRect es una variable entera en la que se almacena el nmero de rectngulos,


valor regresado por la funcin. La llamada a la funcin calculaArea() es:
area = calculaArea(nRect);

ITSON

Manuel Domitsu Kono

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

El programa completo se muestra a continuacin:


/*
* File:
area3.c
* Author: mdomitsu
*
* Created on 24 de septiembre de 2009, 11:46 PM
*/
#include <stdio.h>
#include <stdlib.h>
/*
* Este programa tabula el area bajo la curva y = x^2, entre las
* abscisas x = xi y x = xf. Utiliza el mtodo del rectangulo.
*
* Este programa ilustra el uso de funciones.
*/
// Variables externas
float xi, xf;
// Declaracion de funciones
int leeDatos(void);
float calculaArea(int n);
void escribeArea(float area);
int main(void) {
int nRect;
float area;
// Lee xi, xf y n
nRect = leeDatos();
// Calcular el area
area = calculaArea(nRect);
// Escribe area
escribeArea(area);
return (EXIT_SUCCESS);
}
// Definicin de funciones
/*
* int leeDatos()
*
* Esta funcin lee del teclado los valores de la abscisa inicial, xi,
* abscisa final, xf, y el nmero de rectngulos.
*
* Regresa el nmero de rectngulos y guarda en las variables externas los
* valores de xi y xf.
*/
int leeDatos(void) {
int n;

ITSON

Manuel Domitsu Kono

96

Funciones

printf("\nEste programa tabula el area bajo la curva y = x^2, entre las");


printf("\nabscisas x = xi y x = xf. Utiliza el mtodo del rectangulo\n");
// Lee la abscisa inicial
printf("\nAbscisa inicial: ");
scanf("%f", &xi);
// Lee la abscisa final
printf("\nAbscisa final: ");
scanf("%f", &xf);
// Lee el nmero de rect ngulos
printf("\nNumero de rectangulos: ");
scanf("%d", &n);
return n;
}
/*
* float calculaArea()
*
* Esta funcion calcula el area bajo la curva y = x^2 entre
* las abscisas xi y xf, usando el metodo del paralelogramo
* con n rectngulos. La funcin recibe el nmero de rectangulos
* y toma de las variables externas los valores de xi y xf.
* La funcin regresa el area.
*/
float calculaArea(int n) {
float base, sumaH = 0;
float x, y, area;
// Calcula base
base = (xf - xi) / n;
x = xi;
// Mientras x < xf
while (x < xf) {
// Calculamos la altura del rectangulo
y = x * x;
// Acumulamos altura
sumaH += y;
// Siguiente x
x += base;
}
// Calcula area
area = base * sumaH;
return area;
}
/*
* void escribeArea()
*
* Esta funcin despliega en la pantalla el area bajo la curva.
* La funcin recibe el area.
*/
void escribeArea(float area) {
printf("\nEl area bajo la curva es %.8f\n\n", area);
}

ITSON

Manuel Domitsu Kono

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()

La funcin leeDatos() deber leer el nmero de alumnos y las edades, las


cuales ir acumulando. La funcin regresa el nmero de alumnos por el mecanismo
de return y deja la suma de edades en una variable externa.

ITSON

Manuel Domitsu Kono

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.

Clase de Almacenamiento Automtica


Las variables automticas son locales a un bloque: se crean al entrar al bloque y se
descartan al salir del bloque. Por lo que los valores almacenados en esas variables se
pierde. Si el programa vuelve a entrar al bloque, el sistema vuelve a asignar memoria,
pero los valores previos de las variables se pierden.
la sintaxis de la declaracin de una variable automtica es:
[[auto|register]] tipo nomVar;
El especificador auto establece una clase de almacenamiento automtica. Como por
ausencia las variables declaradas dentro de un bloque son automticas, el especificador
auto no se requiere y por lo general no se usa. El especificador register, tambin
establece una clase de almacenamiento automtica pero adems le indica al compilador
que, de ser posible, optimice el acceso a esa variable, crendola en uno de los registros
del microprocesador en lugar de la memoria RAM.
Los parmetros de la definicin de una funcin tambin tienen clase de almacenamiento
automtica y su bloque es el bloque de la funcin. En el ejemplo siguiente se muestran las
diferentes variables con clase de almacenamiento automtica.
/* Variables externas. Tienen clase de almacenamiento esttica */
int x = 8;
int y;
int f(int a,
/*
int b)
/*
{
/* Variables locales
register i;
/*
int x, y;
/*
static int p;
/*

Parmetros de la funcin. Tienen */


clase de almacenamiento automtica */
a la funcin f() */
Clase de almacenamiento automtica */
Clase de almacenamiento automtica */
Clase de almacenamiento esttica */

--for(i = 0; i < a; i++)


{
/* Variables locales al
register j;
/* Clase
int z;
/* Clase
static int q; /* Clase

ITSON

bloque de la sentencia for */


de almacenamiento automtica */
de almacenamiento automtica */
de almacenamiento esttica */

Manuel Domitsu Kono

Captulo 6

Funciones

99

--}
--}

Clase de Almacenamiento Esttica


Las variables estticas pueden ser locales a un bloque o externas a todos los bloques, es
decir que se declaran fuera de las funciones. Pero en cualquier caso mantienen su valor
entre salidas y reentradas a funciones o bloques.
Las variables estticas son variables con clase de almacenamiento esttica y local a un
bloque, incluyendo los bloques de funcin. La sintaxis de una variable esttica es:
static tipo nomVar

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

Alcance de archivo. Un identificador de una variable o funcin declaradas fuera de


cualquier funcin tiene alcance de archivo. El alcance de este identificador principia
al final de su declaracin y persiste hasta el final del archivo. Las variables
externas, las definiciones de funcin y las declaraciones de funcin colocadas fuera
de las funciones tienen alcance de archivo.

Manuel Domitsu Kono

100

Funciones

Alcance de bloque. Un identificador de una variable o funcin declaradas dentro


de un bloque tiene alcance de bloque. El alcance de este identificador principia al
final de su declaracin y persiste hasta el final del bloque. Las variables
automticas, los parmetros en la definicin de una funcin y las declaraciones de
funcin colocadas dentro de una funcin tienen alcance de bloque.
Si un identificador se declara explcitamente a la cabeza de un bloque, incluyendo
el que constituye la funcin, cualquier declaracin del identificador fuera del mismo
bloque se suspende hasta el final del bloque.

Alcance de prototipo de funcin. Un identificador de un parmetro en la


declaracin de una funcin tiene alcance de prototipo de funcin. El alcance de
este identificador termina al final de su declaracin. Los prototipos de funcin no
requieren de nombres en la lista de parmetros. Slo de tipos. Si en la lista de
parmetros de un prototipo de funcin se utiliza un nombre, el compilador ignorar
dicho nombre. Los identificadores utilizados para dichos parmetros pueden ser
reutilizados en cualquier parte del programa sin problema.

En el ejemplo siguiente, se muestran identificadores con los diferentes alcances lxicos:


/* Variables externas. Tienen alcance de archivo */
int x = 8;
int y;
/* Declaracin de la funcin f() */
int f(int a,
/* Parmetros de la funcin. Tienen */
int b)
/* alcance de prototipo de funcin */
/* Definicin de la funcin f() */
int f(int a,
/* Parmetros de la funcin. Tienen */
int b)
/* alcance de bloque */
{
/* Variables locales a la funcin f().
Tienen alcance de bloque, el bloque de la funcin */
register i;
int x, y;
static int p;
--for(i = 0; i < a; i++)
{
/* Variables locales al bloque de la sentencia for.
Tienen alcance de bloque, el bloque de la sentencia
for.*/
register j;
int z;
static int q;
--}
--}

ITSON

Manuel Domitsu Kono

Captulo 6

Funciones

101

Conclusiones sobre Clases de


Almacenamiento y Alcance Lxico
De los conceptos de clases de almacenamiento y alcances lxicos podemos resumir lo
siguiente para los parmetros y variables automticas:

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.

Ejemplo Sobre Clases de Almacenamiento y Alcance Lxico


Determina la salida del siguiente programa. Suponga que los valores tecleados son: 2, 3.
/* Programa mezcolanza */
#include <stdio.h>
void mezcla(int q, int a, int r);

ITSON

Manuel Domitsu Kono

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

Recomendaciones sobre el uso de parmetros y


variables en las funciones
1. La comunicacin entre las funciones deber ser a travs de parmetros.
2. Usar lo menos posible variables externas.
3. Procurar (a fin de mejorar la claridad de un programa) no nombrar a una variable
automtica con el mismo nombre que el de una variable externa.
4. Procurar (por la misma razn) no nombrar a un parmetro con el mismo nombre
que el de una variable externa.

Inicializacin de variables por ausencia


En C, las variables con clase de almacenamiento esttica las cuales no son inicializadas
explcitamente por el programador son inicializadas a cero por el sistema. En el caso de
ser inicializadas explcitamente, el inicializador debe ser una expresin constante; La
inicializacin se realiza una vez, antes de que el programa inicialice su ejecucin.
Las variables con clase de almacenamiento automtica, no son inicializadas por el
sistema. Esto significa que al inicio tienen valores indefinidos (basura). Si son inicializadas,

ITSON

Manuel Domitsu Kono

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

Manuel Domitsu Kono

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;
}

6. Crea un programa que permita el despliegue de una tabla de conversin de C a


F o de F a C. El programa deber tener al menos tres funciones:
a. Una que lea los datos:

Si la conversin va a ser de C a F o de F a C.
El rango de valores de la tabla.
El incremento.

b. Otras dos funciones para desplegar cada tipo de tabla de conversin.

ITSON

Manuel Domitsu Kono

You might also like