CLASE 14
Computación 2018– FCAG-UNLP – Paula Benaglia
Funciones externas Se utilizan cuando, para generar el valor deseado, hacen falta cálculos que involucran más de una sentencia. Ejemplo: -5, x < 0
f(x) = 0, x = 0 +5, x > 0
…... If (x.lt.0) then fx = -5. elseif(x.gt.0) then fx = 5. else fx = 0. endif
fx = 0. If (x.lt.0) then fx = -5. elseif(x.gt.0) then fx = 5. endif
5
-5
Si se precisa usar nuevamente, o en otro programa, conviene armar una función externa o FUNCTION:
function fx(x) If (x.lt.0) then
fx = -5. elseif(x.gt.0) then fx = 5. else fx = 0.
endif return end
Desde el principal, se llama: program uno ….... q = fx (x) * z w = fx (y) + 4. …..... end
La sentencia function indica que a partir de allí se va a definir una función externa. Estas líneas de código pueden estar a continuación del programa principal – en el mismo archivo- o en un archivo aparte. (1) (2)
Ventajas de cada forma … Para compilar (1): gfortran –o progr1 progr1.f Para compilar (2): se compila primero la function, y luego el programa principal, seguido por la function:
gfortran –c fun1.f à fun1.o gfortran –o progr2 progr2.f fun1.o
Las variables son locales a la propia function: las variables usadas en la function no se relacionan con otras de igual nombre en el programa principal.
Cuando dentro de la function se le asigna valor a la misma, ésta va sin argumentos.
n n n! k k (n-k)! k!
( x + y ) n = Σ yn-k xk
Sea b(k) = xk yn-k, =
n, k son enteros positivos; n ≥ k
Problema: calcular un binomio a la n n n k k=0
Coeficiente binomial
Calcular (x+y)n
program binnew write(*,*) ‘Ingrese x, y, n:’ read (*,*) x, y, n sumat = 0. do k = 0, n coefic = ifact(n) / ifact(k) / ifact (n-k) sumat = sumat + coefic * x**(n-k) * y**k enddo write(*,*) ‘ (‘, x, ’+’, y,’)^’, n, ‘=‘ , sumat end
Integer function ifact(m) Integer iprod, i, m iprod = 1 do i = 1, m iprod = iprod * m Enddo ifact = iprod return end
Arreglos ajustables Cuando la longitud del arreglo a transmitir es variable de acuerdo al momento en que se evalúe la función, podemos mandar como argumento las dimensiones del arreglo a utilizar en la Function:
function opvect (n, flujos) integer flujos(n) …. ....
Se puede pasar así a un subprograma parte de un arreglo dimensionado en el programa principal (desde un elemento, hasta todos). No se puede dimensionar el arreglo con más elementos que los que tiene en el programa principal.
Ejercicio: subprograma para calcular la cantidad de vocales de una palabra
Integer function vocales(palabra) character*(*) palabra vocales = 0 do k=1, len(palabra) if ( index(‘aeiou’, palabra(k:k)) .ne. 0) then
vocales = vocales + 1 endif enddo end
convrt
Luego de la llamada a la subrutina, N cambió de valor ….
El programa funciona igual que el anterior. Si bien i tiene el valor de la constante 5, a ella no se le cambia su valor en la subrutina, por lo que la sintaxis es válida.
J = i + j end
La salida del proceso es dependiente del sistema: puede haber mensaje de error (por querer sobreescribir el valor de la variable ‘20’), o puede haber sobreescritura del valor 25 sobre el valor 20 para la variable J…
Declaración con dimensión ajustable
Mas subrutinas … • De suma de matrices
• De trasposicion
• De producto
• Etc …
Mas subrutinas … • De suma de matrices
• De trasposicion
• De producto
• Etc …
Comprobar la identidad entre matrices: ( A + B) . C = A . C + B . C
FIN CLASE 14