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.
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
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.
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.
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.
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.
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.
consecutivamente a las tres funciones. El diagrama de la figura 6-1 muestra cmo estn
interactuando las funciones y la informacin que fluye entre ellas.
Figura 6-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:
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);
[sentencia] ...
}
3. Los nombres de los parmetros en la declaracin no tienen que ser los mismos de
los correspondientes parmetros de la definicin.
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.
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.
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.
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;
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;
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:
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.
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.
En el ejemplo sobre el clculo del rea bajo una curva, la llamada a la funcin
leeDatos() es:
nRect = leeDatos();
area = calculaArea(nRect);
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);
/*
* 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;
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.
*/
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 6-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 6-2
leeDatos()
calculaMedia()
escribeResultado()
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.
---
}
---
}
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.
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:
Parmetros
Variables Automticas
3. Una variable automtica slo es reconocida por la funcin que la crea y slo tiene
validez mientras la funcin se est ejecutando.
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);
/* 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;
}
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.
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.
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);
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.