Anda di halaman 1dari 0

Elementos de Programacin

Funciones
Preparado por Guillermo Mdica
1 / 13
Funciones

Las funciones constituyen una herramienta esencial en la programacin modular. Por un lado,
permiten desarrollar slo una vez procedimientos (rutinas o, mejor, subrutinas) que son de
utilizacin frecuente o que se utilizan en diferentes lugares de un mismo programa; por otro lado,
permiten utilizar mecanismos de abstraccin que facilitan la construccin de un programa
concentrndose en los aspectos ms relevantes y despreocupndose de detalles que pueden ser
encarados en otra etapa del diseo.

Una funcin es, bsicamente, un subprograma; por lo tanto, tiene una estructura similar a la de
cualquier programa:

Entradas Proceso Salidas,

slo que interacta (se comunica) con otra funcin o directamente con el programa principal; dicha
comunicacin se establece a travs de argumentos (parmetros) que conforman los datos (entradas)
y resultados (salidas). Como cualquier programa, utilizan variables de trabajo denominadas
variables locales proveyendo mecanismos de proteccin que hacen a stas inaccesibles desde
cualquier otro mbito fuera del de la misma funcin.

Elementos de una funcin.
Tipo de dato que devuelve (constituye una salida).
Nombre .
Argumentos (Parmetros Formales).
o Parmetros de entrada (Datos del problema).
o Parmetros de salida (Resultados).
Precondiciones (requisitos que deben cumplir las entradas para que pueda utilizarse la
funcin).
Poscondiciones: expresin formal de la salida.
Cuerpo de la funcin.
o Variables locales.
o Proceso algortmico.

Para invocar a una funcin (utilizarla en un programa o en otra funcin) basta con mencionar su
nombre y, entre parntesis, la lista de parmetros con que se la quiere usar, especificando slo el
nombre de cada uno. Estos parmetros se denominan reales (o actuales).


Mediante las funciones pueden implementarse procesos equivalentes a operadores (stos tienen uno
o ms operandos -argumentos de entrada- y devuelven un determinado valor de un cierto tipo de
datos) o procedimientos (que procesan un conjunto de entradas para obtener un conjunto de
salidas).





Elementos de Programacin
Funciones
Preparado por Guillermo Mdica
2 / 13
En los lenguajes de programacin existen una buena cantidad de funciones predefinidas que nos
facilitan la tarea al despreocuparnos de su complejidad.

Entre las funciones operadores del lenguaje C, por ejemplo, tenemos:
o abs(int) valor absoluto de un entero
o fabs(float) valor absoluto de un real
o pow(double, double) potencia real de un real
o sqrt(int), raz cuadrada de un entero
o sqrtf(float), raz cuadrada de un real, etc.

Entre las funciones procedimientos del lenguaje C por ejemplo, tenemos:
o printf() imprime un texto en el monitor
o scanf() lee variables desde el teclado
o getch(), lee un carcter desde el teclado, etc.

Elementos de Programacin
Funciones
Preparado por Guillermo Mdica
3 / 13
Funciones operadores.

Tienen slo una salida de tipo de datos elemental (tipos de datos predefinidos en el lenguaje) y cero,
uno o ms argumentos (entradas). La salida es el valor devuelto por la funcin.

Ejemplos.
1. Funcin que calcula el factorial de un nmero. El factorial de un nmero n (se escribe n!) es
la productoria de los naturales 1, 2, 3 . n-1, n;
Ej.: 5! = 5 x 4 x 3 x 2 x 1=120.

El anlisis previo del problema es
Datos ( Entradas): el nmero entero n.
Precondicin: n 0
Poscondiciones: f = n * (n-1) * (n-2) * . . . . 3 * 2* 1.
Resultados: el valor entero f.

Elementos:
Tipo de dato que devuelve: entero
Nombre : factorial
Argumentos:
o Parmetros de entrada: n, entero
o Parmetros de salida : no tiene (La nica salida es lo que devuelve).
Precondiciones: n 0
Poscondiciones: f = n * (n-1) * (n-2) * . . . . 3 * 2* 1.
Cuerpo de la funcin: proceso de clculo del factorial y devolucin del resultado (f).




Elementos de Programacin
Funciones
Preparado por Guillermo Mdica
4 / 13
2. Funcin que calcula el nmero combinatorio (a / b) (Combinaciones de p elementos tomados
de a q)
C(a / b) = a! / (b! * (a - b)!)

El anlisis previo del problema es
Datos ( Entradas): los nmeros enteros a y b.
Precondiciones: b 0 y a b
Poscondiciones: c = a! / (b! * (a - b)!).
Resultados: el valor entero c

Elementos:
Tipo de dato que devuelve: entero
Nombre : combinatorio
Argumentos:
o Parmetros de entrada: a, b: entero
o Parmetros de salida : no tiene.
Precondiciones : b 0 y a b
Cuerpo de la funcin: proceso de clculo del combinatorio y devolucin del
resultado.














Elementos de Programacin
Funciones
Preparado por Guillermo Mdica
5 / 13
3. Programa que utiliza la funcin factorial


4. Programa que utiliza la funcin combinatorio



Elementos de Programacin
Funciones
Preparado por Guillermo Mdica
6 / 13
Funciones procedimientos.

Tienen ninguna, una salida de tipo de datos no elemental o ms de una salida y cero, uno o ms
argumentos (entradas). Normalmente no devuelven nada (tipo de dato de la funcin es void)
aunque, en el lenguaje C, puede usarse el valor devuelto como una de las salidas cuando sta es de
tipo elemental.

Antes de ejemplificar funciones de este tipo, hay que analizar los mecanismos de intercambio de
parmetros cuando se invoca a una funcin, conocidos como mtodos de sustitucin de parmetros.
En la invocacin de la funcin, los parmetros que se pasan se denominan parmetros reales (o
actuales); En el desarrollo de la funcin, los parmetros de la misma de denominan parmetros
formales.

Analicemos el diagrama del programa que usa la funcin factorial:

En el programa, se invoca a la funcin pasando como parmetro la variable entera x. Entonces x es
el parmetro actual (o real); en la funcin factorial, el parmetro n es el parmetro formal.

Los mtodos de sustitucin de parmetros son los mecanismos que permiten establecer la relacin
entre los parmetros reales y los formales correspondientes.
Bsicamente existen dos mtodos, llamados por valor y por referencia.

Sustitucin por valor: el parmetro formal toma como valor una copia del parmetro real. Esto
tiene como consecuencia directa que los cambios que eventualmente se realicen en la funcin sobre
los parmetros formales (que son locales de la funcin) no afectan a las variables utilizadas como
parmetros reales. Por ese motivo, este mtodo se utiliza slo para parmetros de entrada.

Sustitucin por referencia: El parmetro formal es una referencia del correspondiente parmetro
real; su valor no es el valor del parmetro real sino su direccin de memoria por lo que cualquier
cambio que se haga en el parmetro formal repercute en el real (ya que son la misma cosa). Este
mtodo es necesario utilizar en los parmetros de salida (o de entrada/salida)


Mtodos permitidos segn el tipo de parmetros

Parmetros Entrada Salida Entrada/Salida
Sustitucin por valor S No No
Sustitucin por referencia S S S









Elementos de Programacin
Funciones
Preparado por Guillermo Mdica
7 / 13
Ejemplos de funciones procedimientos.

1. Obtener la fecha del da siguiente a uno dado.
El anlisis previo del problema es
Datos (Entradas): 3 nmeros enteros que representan el da, mes y ao de la fecha
dato.
Precondiciones: los 3 datos cumplen con los requisitos de una fecha (da, mes y ao,
respectivamente).
Poscondiciones: ds, ms y as son el da, mes y ao, respectivamente, del da siguiente
a la fecha dato.
Resultados: los valores enteros ds, ms, as.

Elementos:
Tipo de dato que devuelve: void
Nombre : obtener_fecha_dia_siguiente
Argumentos:
o Parmetros de entrada: dh, mh, ah: entero
o Parmetros de salida : ds, ms, as: entero.
Precondiciones : dh, mh y ah cumplen con los requisitos de una fecha.
Poscondiciones: ds= ds+1 o ds=1 si dh es el ltimo da del mes.
ms = mh o ms=mh+ 1 si dh es el ltimo da del mes o
ms = 1 si dh es el ltimo da del mes y mh =12
as = ah o as = ah + 1 si dh es el ltimo da del mes y mh =12
Cuerpo de la funcin: proceso de obtencin del da siguiente.


Para definir los parmetros de salida en el encabezamiento de la funcin, se antepone, a cada uno de
ellos, la palabra REF.
Elementos de Programacin
Funciones
Preparado por Guillermo Mdica
8 / 13
ds dh + 1
ms mh
as ah
ds > cantidadDiasDelMes( ms, as)
ms > 12
ms ms + 1
ds ds - cantidadDiasDelMes(ms, as) ,
as as + 1
ms 1
int dh, int mh, int ah,
REF int ds, REF int ms, REF int as
obtenerFechaDiaSiguiente
void
Precondiciones
dh, mh, ah
corresponden a una
fecha vlida

Elementos de Programacin
Funciones
Preparado por Guillermo Mdica
9 / 13
En la invocacin de las funciones procedimientos no se diferencian los parmetros de entrada con
los de salida (o entrada/salida)

Programa que lee una fecha y, si es vlida, obtiene la correspondiente al da siguiente.



d, m, a
esFechaValida (d, m, a)
El da siguiente a , d, !, m, !, a, es,
dm, !, mm, !, am
"a fecha, d, !, m, !, a, no es vlida
obtenerFechaDiaSiguiente #d, m, a, dm, mm, am$


La funcin esFechaValida() devuelve verdad (en C, 1) si la fecha es correcta y falso (en C, 0) si no
lo es.
Elementos de Programacin
Funciones
Preparado por Guillermo Mdica
10 / 13
Codificacin en C.

La sintaxis de la definicin de funciones incluye el tipo de datos que devuelve, el nombre de la
funcin y, entre parntesis, la lista de parmetros formales, separados por comas (,).

Tipo_de_dato_de_la_funcin nombre_de_funcin ([tpo_dato nombre_parm_formal_1]
[,tpo_dato nombre_parm_formal_2])
{
Cuerpo de la funcin
}

Funciones operadores.
Ejemplos: Funcin factorial

int factorial (int n)
{
int c, f;
f=1;
for( c=2; c<=n; c++)
f = f * c;
return f;
}

Funcin combinatorio

int combinatorio(int a, int b)
{
int c;
c = factorial(a) / (factorial(b) * factorial(a-b));
return c;
}
Elementos de Programacin
Funciones
Preparado por Guillermo Mdica
11 / 13
Cuando se utilizan funciones en un programa, antes de la funcin main deben incluirse los
prototipos (encabezamiento de la funcin) de las funciones que el mismo utiliza.

Ejemplos:
1. Leer un nmero y calcular e imprimir su factorial

#include <stdio.h>
int factorial (int); //En el prototipo, el nombre de los parmetros es opcional)
int main()
{
int x, fact;
printf(\nIngrese un entero para calcular su factorial\n);
scanf(%d, &x);
if(x>=0) //Se controla que se cumpla con la precondicin de la funcin
{
fact = factorial(x);
printf(\nEl factorial de %d es %d, x, fact);
}
else
printf(\nNo se puede calcular el factorial de
un nmero negativo);
return 0;
}


2. Leer dos nmeros p y q y calcular e imprimir el combinatorio p/q. (Combinaciones de p
elementos tomados de a q)

#include <stdio.h>
int factorial (int);
int combinatorio(int, int);
int main()
{
int p, q;
printf(\nIngrese dos enteros para calcular el
combinatorio del primero sobre el segundo: \n);
scanf(%d %d, &p, &q);
if(q>=0 && p >=q) //Se controla que se cumpla con las precondiciones
printf(\nEl combinatorio %d / %d es %d,
p, q, combinatorio(p,q);
else
printf(\nNo se cumplen los prerrequisitos para
el clculo del combinatorio);
return 0;
}





Elementos de Programacin
Funciones
Preparado por Guillermo Mdica
12 / 13
Codificacin de Funciones procedimientos.

Estas funciones utilizan parmetros de salida o de entrada salida. Esto implica el uso del mtodo de
sustitucin de parmetros por referencia. El problema es que el lenguaje C no prev este mtodo de
sustitucin: slo usa sustitucin por valor. Para resolver los parmetros de salida (o de
Entrada/Salida) en lugar de pasar el parmetro real, pasa su direccin (Esto explica el uso del &
precediendo a la variable en la funcin scanf: el operador & devuelve la direccin de memoria de su
operando). El parmetro formal entonces debe ser un puntero (variable que contiene una direccin
de memoria).

Definiciones.
Puntero: variable cuyo contenido es una direccin de memoria. Como cualquier variable,
tiene un tipo de dato que es el de la variable real a la que apunta. Se define:
tipo_de_dato * nombre_del_puntero;
Operador &: devuelve la direccin de memoria de su operando
&x se lee la direccin de x. Contiene la direccin de memoria de x.
Operador *
o En una expresin, precediendo al nombre de un puntero, devuelve el valor
contenido en la direccin de memoria representada en el puntero
(Desrreferenciacin).
o En la declaracin de una variable y precediendo al nombre de la misma, define a
sta como un puntero.





Ejemplos

int a, b; // declaracin de un entero
a=30;
int *pa; //declaracin de un puntero a entero
pa=&a; //El puntero pa toma como valor la direccin de a
b=*pa // la variable b toma el valor al que apunta pa o sea, 30.

Al codificar la funcin, los parmetros pasados por referencia se definen como punteros al tipo de
dato correspondiente, cuyos nombres pueden ser los del diagrama anteponindoles la letra p.
Adems, se sugiere definir variables locales correspondientes a cada parmetro de salida con el
nombre de ellos y trabajar con ellas de acuerdo al diagrama. Finalmente, se desreferencia cada
puntero con el valor de la variable correspondiente.







Elementos de Programacin
Funciones
Preparado por Guillermo Mdica
13 / 13

Ejemplo.
1. Obtener la fecha del da siguiente.

La funcin cantidadDiasDelMes (int m, int a) devuelve la cantidad de das que tiene el mes m
del ao a (28, 29, 30 31).

void obtenerFechaDiaSiguiente (int dh, int mh, int ah,
int *pds, int *pms, int *pas)
{
int ds, ms, as; //
ds = dh + 1;
ms = mh;
as = ah;
if(ds > cantidadDiasDelMes (ms,as))
{
ds = ds - cantidadDiasDelMes (ms,as);
ms = ms + 1;
if(ms > 12)
{
ms = 1;
as = as + 1;
}
}
//Las variables ds, ms y as quedan con la fecha del da siguiente a dh, mh y ah
*pds = ds;
*pms = ms;
*pas = as;
}

Al invocar a la funcin procedimiento, se pasan como parmetros reales la direccin de las
variables correspondientes a los parmetros de salida.

2. Leer una fecha y obtener la del da siguiente

#include <stdio.h>
int esFechaValida(int d, int m, int a);
void obtenerFechaDiaSiguiente(int d, int m, int a, int*pd, int* pm, int*pa);
int main()
{
int d, m, a, dm, mm, am;
printf(\nIngrese la fecha de hoy (d m a): );
scanf(%d %d %d, &d, &m, &a);
if(esFechaValida(d, m, a))
{
obtenerFechaDiaSiguiente(d, m, a, &dm, &mm, &am);
printf(\nEl dia siguiente a %d/%m/%a es %dm/%mm/&am);
}
else
printf(\nLa fecha %d/%d/%d no es valida, d, m, a);
}

Anda mungkin juga menyukai