1. Apuntes del Prof. Hugo Cuello Módulos: Funciones primitivas y definidas por el usuario
Clase 4 AyE U.T.N. F.R.B.A. Página 1
CLASE 4: Módulos. Funciones: Primitivas y definidas por el usuario.
M
Mó
ód
du
ul
lo
os
s:
:
En la programación modular, los programas se dividen en módulos. Un módulo
es una unidad lógica de código e independiente de otros módulos, en el cual es posible
analizar, codificar y probar por separado. Cada programa tiene un módulo o bloque
principal que actúa como coordinador o controlador, el cual deriva el control a otros
módulos. A su vez un módulo –sub-módulo- puede ceder el control temporalmente a
otro módulo, el cual una vez finalizado deberá devolver el control al módulo que lo
invocó. Ya que, los módulos son independientes unos de otros, una consecuencia de
esto sería poder dividir el trabajo a distintos programadores a efectos de acelerar los
tiempos. Además a un módulo se lo podrá modificar, sin alterar a otros módulos.
También un módulo puede ser invocado desde distintos puntos del algoritmo y con
distintos valores de argumentos, permitiendo de esta manera la reusabilidad del código.
Existen dos formatos de módulos, a saber:
F
Fu
un
nc
ci
io
on
ne
es
s
P
Pr
ro
oc
ce
ed
di
im
mi
ie
en
nt
to
os
s
Funciones:
Una función es un módulo que presenta las siguientes partes:
U
Un
na
a c
ca
ab
be
ec
ce
er
ra
a
U
Un
n c
cu
ue
er
rp
po
o
La cabecera presenta las siguientes partes:
E
El
l n
no
om
mb
br
re
e d
de
e l
la
a f
fu
un
nc
ci
ió
ón
n
U
Un
na
a l
li
is
st
ta
a d
de
e p
pa
ar
rá
ám
me
et
tr
ro
os
s,
, q
qu
ue
e p
po
od
dr
rí
ía
a e
es
st
ta
ar
r v
va
ac
cí
ía
a
E
El
l t
ti
ip
po
o d
de
e v
va
al
lo
or
r –
–s
si
im
mp
pl
le
e-
- q
qu
ue
e d
de
ev
vo
ol
lv
ve
er
rá
á l
la
a f
fu
un
nc
ci
ió
ón
n.
.
El cuerpo de la función es un bloque, dentro del cual se escriben las sentencias.
Deberá existir alguna sentencia que asigne al nombre de la función el resultado de una
expresión que debe ser de igual tipo que el valor devuelto por la función. Al finalizar la
función, el último valor asignado, será el valor que retorne. Una función la podemos ver
como una caja negra –no nos interesa saber su interior- o como una caja transparente –si
nos interesa saber su interior-. Para que una función pueda ser ejecutada, se deberá
llamarla o invocarla. Generalmente los parámetros formales –aquellos que se definen
en la cabecera de la función, son pasados por valor, en estos casos, se trabaja con una
copia del valor pasado desde la invocación, cualquier modificación que se realice en los
parámetros formales, no altera a los parámetros actuales –los indicados en el momento
de la invocación-. Una función se la invoca en forma indirecta, es decir, como
perteneciente a una sentencia, como p.e., la asignación interna, o como formando parte
de una condición, etc..
Una función puede necesitar trabajar con variables internas a su ámbito, en estos
casos esas variables definidas dentro de la función son denominadas variables locales.
Fuera de la función en que han sido definidas no existen, salvo en los caos en que la
función invoque a un módulo definido dentro de su ámbito, allí serán reconocidas. La
comunicación entre el módulo que invocó a la función y la función invocada se
establece por medio de los parámetros. Si bien una función puede devolver valores por
medio de sus parámetros, por el momento no se emplearán, además, en las últimas
2. Apuntes del Prof. Hugo Cuello Módulos: Funciones primitivas y definidas por el usuario
Clase 4 AyE U.T.N. F.R.B.A. Página 2
versiones de Turbo Pascal, una función también puede ser invocada en forma directa,
pero esta variante se tratará de evitar su uso.
Estructura de una función: -definición-
Cabecera
Cuerpo
Llamada o invocación a una función
Ejemplo:
Observación: Los parámetros en la invocación también suelen llamarse
a
ar
rg
gu
um
me
en
nt
to
os
s. En estos casos los parámetros en la cabecera de los módulos se los puede
indicar como p
pa
ar
rá
ám
me
et
tr
ro
os
s a secas.
F
Fu
un
nc
ci
io
on
ne
es
s p
pr
ri
im
mi
it
ti
iv
va
as
s n
nu
um
mé
ér
ri
ic
ca
as
s:
A continuación se verán las funciones numéricas predefinidas por el lenguaje
Pascal, para nosotros serán cajas negras, debido a que solo sabremos el nombre de la
función, los parámetros a pasar, de qué tipo han de ser c/u. de ellos y en que orden
deben aparecer el tipo de valor retornado por la función y que tarea realiza la función,
pero no sabremos nada acerca de cómo lo realiza.
Abs(x):tipo_x: Retorna el valor absoluto de x, en donde x es cualquier valor de tipo
numérico. El valor absoluto de x es x, si x >= 0 o es, –x si x < 0, por lo tanto el valor
retornado es siempre positivo.
Sqrt(x:real):real: Retorna la raíz cuadrada de x, en donde x es >= 0, el tipo de
resultado es real.
Sqr(x):tipo_x: Retorna el cuadrado de x, es decir, x * x. El tipo de resultado es del
mismo tipo que el parámetro x.
Sin(x:real):real: Retorna el seno de x. X expresa un ángulo en radianes. Para
convertir grados a radianes, si x está expresado en grados, utilizar:
radianes x * PI / 180.
Cos(x:real):real: Retorna el coseno de x. X expresa un ángulo en radianes. Para
convertir grados a radianes, si x está expresado en grados, utilizar:
radianes x * PI / 180.
ArcTan(x:real):real: Retorna el arco tangente o tg-
1 de x. El resultado es la medida
del ángulo expresado en radianes. Para convertir de radianes a grados, utilizar:
grados arctan(x) * 180 / PI.
NomFunc (lst_par_formales : tipo1 ): tipo2
Sentencias
NomFunc expresión
R
Var NomFunc(lst_par_actuales)
3. Apuntes del Prof. Hugo Cuello Módulos: Funciones primitivas y definidas por el usuario
Clase 4 AyE U.T.N. F.R.B.A. Página 3
Ln(x:real):real: Retorna el logaritmo natural de x, con x > 0. Para obtener el
logaritmo de otra base, utilizar: log10 ln(x) / ln(10), log4 ln(x) / ln(4), es decir, se
divide el ln(x) sobre el ln de la base a pasar.
Exp(x:real):real: Retorna el exponencial o antilogaritmo o ln-1
de x. Exp(x) = ex
.
Exp(1) = e. Para convertir la base e a otra base, utilizar: expo exp(x * ln(b)), es decir,
multiplicar el valor de x por el ln de la base b, a pasar, y a este resultado aplicar la
función exponencial.
Int(x:real):real: Retorna la parte entera de x, es decir, x redondeado hacia cero; el
resultado es de tipo real, con la parte decimal cero.
Trunc(x:real):longint: Retorna la parte entera de x, es decir, x redondeado hacia
cero, pero a diferencia de int, el tipo de resultado es de tipo longint. Ocurrirá un error si
el resultado no está dentro del intervalo de un longint.
Round(x:real):longint: Retorna la parte entera de x redondeado al entero más
cercano, el tipo de resultado es de tipo longint. Ocurrirá un error si el resultado no está
dentro del intervalo de un longint.
round(x) = trunc(x+0.5) si x >= 0 y
round(x) = trunc(x-0.5) si x < 0.
round(3.2) = 3
round(5.7) = 6
round(-451.3) = -451
round(-2.7) = -3
Frac(x:real):real: Retorna la parte decimal o fraccionaria de x, esto es:
frac(x) = x – int(x). Frac(23.79) = 0.79. frac(-12.43) = -0.43.
Odd(x:longint):boolean: Retorna true si x es impar o false si x es par.
Pi:real: Retorna el número irracional π = 3.1415926535897932385
Random:real
Random(x:longint):longint: Retorna un número al azar.
Random sin argumento genera un número al azar –en realidad pseudoaleatorio- en
el intervalo semicerrado [0; 1).
Random con argumento genera un número al azar en el intervalo [0; x – 1].
Random(6) + 1, generará un valor en el intervalo [1; 6]
Random(b – a + 1) + a, con a <= b, generará un valor en el intervalo [a; b]
Randomize –Procedimiento-: Los valores generados por random son
pseudoaleatorios, debido a que, en distintas ejecuciones se generarán las mismas
secuencias de valores. Por esa razón si queremos generar valores aleatorios para que en
distintas ejecuciones se generen distintas secuencias de valores, debemos utilizar
randomize al comienzo del programa; esto prepara al algoritmo de generación de
números aleatorios para que la semilla, -así se denomina al punto inicial para la
generación de los valores aleatorios- quede preparada con un valor de arranque, que será
distinto en cada nueva ejecución del programa.
F
Fu
un
nc
ci
io
on
ne
es
s d
de
ef
fi
in
ni
id
da
as
s p
po
or
r e
el
l u
us
su
ua
ar
ri
io
o
Como se vio en párrafos previos, una función está formada por una cabecera que
contiene el nombre de la función, eventualmente una lista de parámetros y el tipo de
valor devuelto y el cuerpo en donde se indican las acciones a realizar, en donde, al
4. Apuntes del Prof. Hugo Cuello Módulos: Funciones primitivas y definidas por el usuario
Clase 4 AyE U.T.N. F.R.B.A. Página 4
menos una de estas acciones se debe asignar al nombre de la función el resultado de una
expresión del mismo tipo definido en la cabecera. Siguiendo estos pasos el usuario
podrá definir sus propias funciones. A continuación se desarrollan algunas de estas
funciones, de tratamiento numérico.
Aplicación: Dados dos valores enteros a y b, encontrar la fracción irreducible de a / b.
Mcd( x, y : longint) : longint
Nombre de
la función
Lista de
parámetros
formales
Tipo de valor
retornado por
la función
y <> 0
resto x mod y
x y
y resto
Mcd x
R
Cabecera
de la
función
Cuerpo de
la función
Valor que
retorna
a 24
b 18
a,’/’,b,’=’, a/maxdiv,’/’,b/maxdiv
maxdiv mcd(a,b)
C
F
Invocación
a la función