Está en la página 1de 14

Tema 8

Funciones

Las funciones son fundamentales para realizar programas de cierta envergadura. Por un lado
permiten desarrollar algoritmos y códigos modulares lo cual mejora la legibilidad, pero además
descargan el trabajo del programador pues cada función constituye un nuevo bloque constructivo
en el que apoyarse.

8.1 Concepto de función

Una función es un conjunto de órdenes que lleva a cabo una tarea precisa. La función es utilizada
dentro de un programa como si de una orden se tratara. La función puede calcular resultados
utilizando los datos que se le suministran explı́citamente.

Un ejemplo de función es sin. Observemos que cumple las condiciones que hemos impuesto:

• Es un conjunto de órdenes aunque en las modernas versiones de MATLAB no podamos


verlo pues se encuentra en una forma especial.
• Realiza una tarea concreta consistente en calcular el seno del número indicado.
• Calcula resultados a partir de datos suministrados.

Recuerde que en el entorno MATLAB la función sin puede utilizarse para calcular el seno
como en el ejemplo siguiente:

>> x = 1.57

143
144 TEMA 8. FUNCIONES

x =
1.57000000000000

>> sin(x)
ans =
0.99999968293183

En este ejemplo el resultado es el seno de 1.57 radianes que aproximadamente el seno de π/2
y por tanto el resultado es casi 1.

También es posible asignar el resultado de una función a una variable, como en el ejemplo
siguiente:

>> x = 1.57
x =
1.57000000000000

>> y=sin(x)
y =
0.99999968293183

Finalmente es posible realizar la misma tarea pero sin que aparezca nada en la pantalla, para
ello basta con colocar unos signos punto y coma.

>> x=1.57; y=sin(x);

A pesar de que la pantalla no muestra ningún mensaje las asignaciones se han realizado
correctamente como puede comprobarse:

>> x
x =
1.57000000000000

>> y
y =
0.99999968293183

No pierda de vista estos ejemplos pues resultan muy útiles para comprender la forma en que
las funciones se usan y también para comprender porqué las funciones se escriben de una manera
c MRA & JAAR
� 2010 DISA. ESI. US. 145

especial que será descrita más adelante. Baste decir por ahora que las funciones pueden verse
como módulos con los cuales es posible construir programas. Son similares a los módulos que
se han utilizado en los diagramas de flujo. Además poseen una caracterı́stica que las hace muy
útiles: las funciones pueden usarse una y otra vez con datos distintos. Desde este punto de vista
la función es una máquina capaz de producir resultados a partir de datos que se le suministran.
Este aspecto es ilustrado por el diagrama de la figura 8.1.

Argumentos

Función

Resultados

Figura 8.1:

8.1.1 Datos y resultados

En matemáticas una función f calcula un valor (y variable dependiente) a partir de otro dado
(x variable independiente). Tanto x como y pueden ser escalares, vectores o matrices. Con las
funciones de MATLAB ocurre otro tanto. El papel de la variable independiente es represen-
tado por los datos que se le suministran a la función, llamados normalmente argumento. Se
dice habitualmente que la función ”devuelve” un resultado que es el equivalente a la variable
dependiente.

Para aclarar las ideas consideremos la sentencia de MATLAB y = sin(x). Hemos de recor-
dar que la ejecución de esta sentencia provoca lo siguiente:

1. El cálculo mediante la función sin del seno del dato proporcionado, que en este caso es el
valor de x.

2. La asignación a la variable y del valor calculado por la función sin (que es, lógicamente
sen(x)).
146 TEMA 8. FUNCIONES

Es muy conveniente no perder de vista estos pasos en las explicaciones que se darán poste-
riormente.

8.1.2 Variables locales

Son variables que sólo pueden ser vistas y utilizadas dentro de alguna función. Fuera de la
misma no son visibles y por tanto no son utilizables.

Las variables locales pueden ser efı́meras (volátiles, automáticas y dinámicas son otros nom-
bres que reciben) o permanentes. Las variables locales efı́meras son creadas por una función y
desaparecen al terminar la función. Debido a esto, las variables efı́meras no conservan su valor
de una llamada a otra de la función.

También existe la posibilidad de usar variables globales. Este tipo de variable puede ser
visto y utilizado en cualquier función, debido a ello su uso es más simple. Sin embargo conllevan
peligros que se desea evitar a toda costa y por ello no se van a usar en este curso variables
globales.

En resumen, las variables se clasifican según su alcance en locales y globales y según su


tiempo de vida en efı́meras y persistentes. Aunque las cuatro combinaciones son posibles en
este curso sólo se van a emplear variables locales efı́meras. Esta pérdida voluntaria de libertad
producirá programas con un código más legible y estructurado.

8.2 Diagramas de flujo con funciones

En los diagramas de flujo se indicará el uso de funciones mediante el bloque llamado función
(subprograma). Dentro de este bloque se va a utilizar la notación matemática para indicar el
envı́o de argumentos y una asignación para indicar la recogida de los valores de las variables
resultado.

A modo de ejemplo considere la tarea consistente en calcular la media de los valores absolutos
de dos cantidades a y b. El diagrama de flujo de la figura 8.2 resuelve dicha tarea utilizando
dos veces la función VAbs(). Nótese que el bloque en el cual se usan las funciones tiene su
forma particular. Dicho diagrama no está completo a menos que se incluya un diagrama de flujo
adicional que explique cómo se calcula dicha función VAbs(), dicho diagrama se encuentra en la
figura 8.3.

El diagrama de flujo de una función ha de operar con valores formales o ficticios puesto que
la función ha de poder ser utilizada con más de un conjunto de datos. Estos valores formales
c MRA & JAAR
� 2010 DISA. ESI. US. 147

inicio
primer dato a Variable real

Leer a y b segundo dato b Variable real


variable auxiliar,
va Variable real
valor absoluto de a
va VAbs(a)
variable auxiliar,
vb Variable real
valor absoluto de b
vb VAbs(b)
resultado, media de
los valores absolutos m Variable real
m (va + vb)/2 de a y b

función que calcula


Devuelve un
Escribir m el valor absoluto de VAbs(x)
valor real
x
fin

Figura 8.2: El diagrama de flujo para calcular la media de | a | y de | b | utiliza dos veces la
función VAbs().

son los argumentos. En la figura 8.3 se muestra la forma en la que aparecen los argumentos en
el diagrama de flujo.

inicio del cálculo de r


argumento x Variable real
mediante VAbs(x)
resultado, valor
absoluto del r Variable real
argumento
no sí valor auxiliar
¿ x < 0 ? 0 Constante entera
para comparar

r x r -x

fin del cálculo de r


mediante VAbs(x)

Figura 8.3: Diagrama de flujo de la función VAbs().

Cabe ahora resaltar la diferencia entre un módulo y una función. Como ya se ha visto en
temas anteriores, los módulos son trozos de diagrama que cumplen tareas concretas al igual
que las funciones, sin embargo las funciones no pueden utilizar ninguna variable que no esté
en su diagrama mientras que los módulos no tienen esta restricción. Se puede decir, utilizando
los conceptos explicados en este tema, que para los módulos todas las variables son globales
mientras que para las funciones no.

Otra diferencia que puede observar es que el diagrama de flujo de una función lleva su
148 TEMA 8. FUNCIONES

propia tabla de objetos en la cual se describen las variables y constantes propias de la función,
incluyendo argumentos y resultados.

Una vez escrita una función (el diagrama de flujo o el código de la misma) puede ser utilizada
una y otra vez de forma cómoda. Esta es otra diferencia con los módulos. Los módulos encajan
bien con un programa concreto mientras que las funciones encajan bien en todas partes. Esto
es ası́ gracias al pase de argumentos y la devolución de resultados. Para ilustrar este punto
suponga que debe resolver el problema de leer un valor real x y calcular y escribir la cantidad
y =| x |3 . Una posible solución viene dada por el diagrama de la figura 8.4 donde se ha utilizado
una vez más la función VAbs(), añadiéndola a la tabla de objetos como un objeto más.

inicio
dato x Variable real
variable auxiliar,
Leer x z Variable real
valor absoluto de x

z VAbs(x) resultado |x| 3 y Variable real

y z·z·z función que calcula


Devuelve un
el valor absoluto de VAbs(x)
valor real
x
Escribir y

fin

Figura 8.4: Diagrama de flujo para calcular y escribir y =| x |3 .

Este ejemplo ilustra la idea de que las funciones pueden re-usarse fácilmente. Esto facilita
el trabajo de producir algoritmos para problemas complejos, pues es posible dividir la tarea en
funciones que se utilizan más de una vez. Incluso se pueden usar funciones realizadas previamente
para otro problema.

8.3 Ejemplos de diagramas de flujo con funciones

A continuación se presentan algunos problemas que son susceptibles de ser resueltos con la ayuda
de funciones. Observe que la elección de las funciones no es casual sino que obedece a criterios
de economı́a y claridad. Pruebe a resolver algunos de estos problemas sin la ayuda de funciones
y comprobará esta afirmación.

1. Evaluación de un polinomio de grado 9. El problema que se desea resolver es el


siguiente: se ha de leer un número real z. El polinomio P(x) = 1 − x + 4x3 + x6 − x9 ha
c MRA & JAAR
� 2010 DISA. ESI. US. 149

inicio del cálculo de p como


Inicio Pot(x,n)

Iniciar k a 0 y p a 1
Leer z
no
¿ k n-1 ?
r 1 - z sí
r r + 4·Pot(z,3)
r r + Pot(z,6) p p · x
r r - Pot(z,9)

k k + 1

Escribir r

fin del cálculo de p como


Fin Pot(x,n)

Variable Argumento. Base. x Variable real


Dato z
real Variable
Argumento. Potencia. n
Resultado, valor Variable entera
r
del polinomio P(z) real Contador. variable Variable
k
Función para auxiliar entera
calcular la Devuelve un
Pot(x,n) Resultado calculado
potencia n-ésima de valor real p Variable real
x como x elevado a n

Figura 8.5: Diagrama de flujo para la evaluación de un polinomio de grado 9 haciendo uso de
la función Pot().

de calcularse en el punto x = z y el resultado escribirse. En otras palabras, se ha de


calcular y escribir la cantidad r = P(z).
La figura 8.5 se muestra una posible solución que hace uso de una función para calcular
las potencias necesarias. Como puede verse la función es descrita someramente en la tabla
de objetos empleados.

2. Evaluación de un polinomio de grado n. El problema que se desea resolver es el


siguiente: se ha de leer un número real z y un número natural n. El polinomio de orden
2 3 4 n
n dado por Q(x) = x + x2 + x3 + x4 + · · · + xn ha de calcularse en el punto x = z y el
resultado escribirse. En otras palabras, se ha de calcular y escribir la cantidad Q(z).
La solución presentada en la figura 8.6 hace uso de la función Pot() al igual que en el
ejercicio anterior. Nótese que el diagrama de flujo correspondiente a la función lleva su
tabla de objetos independiente.
Puede llamar la atención el hecho de que existe una variable de nombre k en cada uno
150 TEMA 8. FUNCIONES

inicio inicio del cálculo de p como


Pot(x,n)
Leer z y n
Iniciar k a 0 y p a 1
k 1, sumap 0
no
no ¿ k < n ?
¿ k n ?


p p · x
sumap sumap+Pot(z,k)/k

k k + 1
k k + 1

Escribir sumap fin del cálculo de p como


Pot(x,n)
fin

Dato (punto) z Variable real Variable


Argumento. Base. x
Dato (grado) n Variable entera real
Argumento. Variable
Suma parcial y n
Exponente. entera
sumap Variable real
resultado, Q(z) Variable
Contador k
entera
Contador k Variable entera
Resultado
Función que Devuelve un Variable
Pot(x,n) calculado como x p
calcula x n valor real real
elevado a n

Figura 8.6: Diagrama de flujo para la evaluación de un polinomio de grado n de la forma


2 3 4 n
Q(x) = x + x2 + x3 + x4 + · · · + xn haciendo uso de la función Pot().

de los diagramas. A continuación se explica que esto no es un error. Se ha indicado en


esta lección que las funciones operan con argumentos precisamente para poder ser usadas
sin necesidad de conocer el nombre de la variable que contiene los datos. En esto reside
la diferencia con un módulo. También se ha dicho que el argumento es una variable local
y por tanto sólo existe dentro de la función. La variable k del diagrama de la función es
pues completamente independiente de la variable k en otras funciones y por tanto puede
llevar el mismo nombre.

3. Evaluaciones repetidas de un polinomio. Dado un vector v ∈ IRn (siendo n > 0,


2 3 4
un valor previamente leı́do) se desea evaluar el polinomio R(x) = 1 + x + x2! + x3! + x4! en
cada una de las componentes de v, creando de este modo el vector w. Dicho de otro modo
se desea calcular el vector w tal que wk = R(vk )∀k = 1, · · · , n.
La solución se muestra en la figura 8.7. Puede observarse que se usa la función Pot() y
la función Fact() dentro de la función R(). Es importante observar que, gracias al uso de
funciones, cada subdiagrama tiene un tamaño aceptablemente pequeño. Además el análisis
c MRA & JAAR
� 2010 DISA. ESI. US. 151

que es necesario hacer antes de codificar se ve muy facilitado por este diseño modular.

4. Recta entre dos puntos. Se desea realizar una función que permita calcular los parámetros
de la recta y = ax + b que pasa por dos puntos del plano. Considere dos puntos genéricos
P0 = (x0 , y0 ) y P1 = (x1 , y1 ) de IR2 (suponga que x0 �= x1 ). El problema que la función
ha de resolver es el de calcular la pendiente a y la ordenada en el origen b de la recta que
pasa por P0 y P1 . Recuerde que dicha recta tiene como expresión y = y0 + xy11 −y
−x0 (x − x0 ).
0

La solución se muestra en la figura 8.8. Obsérvese que la función Recta() toma cuatro
argumentos correspondientes a las abscisas y ordenadas de los dos puntos que definen
la recta. Por otra parte esta función devuelve como resultado el vector formado por los
valores a y b.
Este tipo de funciones son análogas a las funciones vectoriales estudiadas en Matemáticas
cuyos valores son vectores y que pueden depender de más de una variable. La mayorı́a de
los lenguajes de programación admiten funciones vectoriales aunque con algún que otro
”truco” según el caso. Los diagramas de flujo que se realicen con funciones vectoriales
seguirán la nomenclatura matemática con independencia del lenguaje de programación
que se vaya a utilizar para codificar. Afortunadamente el programa MATLAB es bastante
fiel a esta forma matemática.

5. Vector de pendientes Se dispone de dos vectores vx y vy de IRn que contienen respec-


tivamente las componentes x e y de n puntos del plano. Es decir, (vx1 , vy1 ) es un punto
del plano, (vx2 , vy2 ) es otro punto, etc. Se desea calcular un nuevo vector va de IRn−1
de tal modo que ∀k = 1, · · · , n − 1 sea vak igual a la pendiente de la recta que pasa por
(vxk , vyk ) y por (vxk+1 , vyk+1 ). Se supone que vx, vy y n ya han sido leı́dos previamente.
Se recomienda usar la función Recta() del ejercicio anterior.
La solución se muestra en la figura 8.9. Puede verse la forma en que se recoge el resultado
de la función Recta() mediante un vector res cuya primera componente es la pendiente,
la otra componente no se utiliza.

8.3.1 Ejercicios de Funciones

Realice los diagramas de flujo de las funciones que se indican.

1. Función que calcule xy , con x ∈ IR, y suponiendo que y es un valor entero y > 0.

2. Función que calcule xy , con x ∈ IR, y sabiendo que y es un valor entero que puede ser
positivo, negativo o cero.
� �
3. Función que calcule m n siendo m y n dos enteros positivos. Puede hacer uso de las
funciones que haya realizado con anterioridad para calcular el factorial.

4. Función que calcule la suma de las componentes de un vector.


152 TEMA 8. FUNCIONES

inicio Vector de
Vector dado v variables
i 1 reales
Dato. Dimensión de Variable
n
no v entera
¿ i n ? vector de
sí Vector resultado w variables de
reales
wi R(v i)
Variable
contador i
entera
i i + 1
Función que
Devuelve un
calcula el R(x)
valor real
polinomio R en x
fin

inicio cálculo de r como R(x) Argumento (punto) x Variable real


Suma parcial y
r Variable real
m 1, r 1 resultado, R(x)
Variable
contador m
entera
no
¿ m 4 ? Función que
sí Devuelve un
calcula x elevado Pot(x,m)
valor real
a m
r r + Pot(x,m)/Fact(m)
Función que
Devuelve un
calcula el Fact(m)
m m + 1 valor entero
factorial de m

fin cálculo de r como R(x)

inicio cálculo de p como Pot(x,n) Variable


Argumento. Base. x
real
Iniciar k a 0 y p a 1 Argumento. Variable
n
Exponente. entera

no Resultado
¿ k < n ? Variable
calculado como x p
real
sí elevado a n
p p · x
Variable
Contador k
entera
k k + 1

fin cálculo de p como Pot(x,n)

inicio cálculo de f como Fact(n) Variable


Argumento. n
entera
Iniciar k a 1 y f a 1 Resultado
Variable
calculado como el f
entera
factorial de n
no
¿ k n ?
sí Variable
Contador k
entera
f f·k

k k + 1

fin del cálculo de f como Fact(n)

Figura 8.7: Diagrama de flujo para calcular un vector (w) a partir de otro dado (v) transformando
2 3 4
sus componentes según el polinomio R(x) = 1 + x + x2! + x3! + x4! .
c MRA & JAAR
� 2010 DISA. ESI. US. 153

Argumento. Abscisa del


inicio del cálculo de (a,b) primer punto
x0 Variable real
como Recta(x0,y0,x1,y1)
Argumento. Ordenada del
y0 Variable real
primer punto
Argumento. Abscisa del
x1 Variable real
segundo punto
dx x1-x0 Argumento. Ordenada del
y1 Variable real
dy y1-y0 segundo punto
a dy/dx
Diferencia de abscisas dx Variable real
b y0-a·x0
Diferencia de ordenadas dy Variable real

Resultado, pendiente de
la recta que pasa por a Variable real
fin del cálculo de (a,b) como ambos puntos
Recta(x0,y0,x1,y1) Resultado, ordenada en
el origen de la recta b Variable real
que pasa por P 0 y P 1

Figura 8.8: Diagrama de flujo de una función que calcula la pendiente a y la ordenada en el
origen b de la recta que pasa por dos puntos genéricos del plano P0 y P1 .

5. Función para calcular la media aritmética de las componentes de un vector.



6. Función para calcular la suma S = nh=1 hahn , siendo a un vector dado como argumento,
a ∈ IRn y siendo n > 0 entero otro argumento.
7. Función para calcular el producto escalar de dos vectores v ∈ IRn y w ∈ IRn , suponiendo
n > 0 entero.
8. Función EvaPol() que evalúe el polinomio A(x) = a1 xn + · · · + an x1 + an+1 x0 dado el grado
del polinomio n ≥ 0 entero, el vector de coeficientes a = (a1 , · · · , an+1 ) y el valor x. Puede
hacer uso de las funciones que haya realizado con anterioridad para calcular las potencias.
9. Función que calcule el vector de coeficientes de un polinomio C suma de otros dos (A y B).
La función ha de recibir los grados na, nb y los vectores de coeficientes vA = (a1 , · · · , ana+1 )
y vB = (b1 , · · · , bnb+1 ) de cada uno de los dos polinomios sumandos. La función devolverá
el grado y el vector de coeficientes del polinomio suma C = A + B.

8.3.2 Ejercicios de Programas

Realice los diagramas de flujo de los algoritmos que resuelven los problemas planteados. Intente
utilizar funciones para hacer frente a tareas que aparecen con frecuencia.

1. Se ha de realizar un programa que lea dos valores enteros positivos x e y y calcule y escriba
xy +y x
la cantidad r = (x+y) x+y .
154 TEMA 8. FUNCIONES

inicio Vector de
Dato, vector de n
vx variables
abscisas
reales
k 1
Vector de
Dato, vector de n
vy variables
ordenadas
reales
no
¿ k n-1 ? Variable
Dimensión de vx y vy n
entera
sí Variable
contador k
entera
res Recta(vx k
,vy k ,vx k+1 ,vy k+1 )
vector auxiliar de 2
Vector de
componentes que recoge
res variables
el resultado de
va k res reales
1 Recta()

k k + 1 Función que calcula Devuelve un


los parámetros de la vector con
Recta(x0,
recta que pasa por dos
dos puntos dados y0, x1,y1) componentes
como argumento reales
fin

Argumento. Abscisa del


x0 Variable real
primer punto
inicio del cálculo de (a,b) Argumento. Ordenada del
y0 Variable real
como Recta(x0,y0,x1,y1) primer punto
Argumento. Abscisa del
x1 Variable real
segundo punto
Argumento. Ordenada del
y1 Variable real
segundo punto
dx x1-x0
dy y1-y0 Diferencia de abscisas dx Variable real
a dy/dx
b y0-a·x0 Diferencia de ordenadas dy Variable real

Resultado, pendiente de
la recta que pasa por a Variable real
ambos puntos
fin del cálculo de (a,b) como Resultado, ordenada en
el origen de la recta b Variable real
Recta(x0,y0,x1,y1)
que pasa por P 0 y P 1

Figura 8.9: Cálculo de las pendientes de las rectas que pasan por un conjunto de puntos de IR2 .
c MRA & JAAR
� 2010 DISA. ESI. US. 155

2. Se ha de realizar un programa que lea dos vectores de IR3 y calcule y escriba el coseno del
ángulo que forman.

3. Se ha de realizar un programa que lea dos vectores de IR3 . El programa posteriormente


escribirá: un cero si los vectores son paralelos, en caso contrario el programa escribirá un
vector perpendicular al plano que forman los vectores leı́dos.

4. Se ha de realizar un programa que lea los coeficientes ck de un polinomio P de grado 4.


Se supondrá que el polinomio es de la forma P (x) = c1 x4 + c2 x3 + c3 x2 + c4 x1 + c5 x0 . El
programa posteriormente leerá un valor para la variable independiente x. Finalmente el
programa escribirá el valor r = P (x) usando la función EvaPol().
156 TEMA 8. FUNCIONES

También podría gustarte