35
Programación Básica 2020-II 1 Subprogramas –funciones- La programación modular es una técnica que consiste en dividir un programa en tareas y dar origen a la creación de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la elaboración y mantenimiento del mismo. Fortran dispone de dos tipos de subprogramas: las funciones y las subrutinas. La principal diferencia es que

Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

1

Subprogramas –funciones-

La programación modular es una técnica que consiste en

dividir un programa en tareas y dar origen a la creación

de pequeños programas llamados módulos,

subprogramas o subrutinas con la finalidad de simplificar

la elaboración y mantenimiento del mismo.

Fortran dispone de dos tipos de subprogramas: las funciones y las subrutinas. La principal diferencia es que

Page 2: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

2

las funciones tienen un valor de retorno y pueden por lo tanto ser utilizadas en expresiones aritméticas o de otro tipo. Por el contrario, las subrutinas no devuelven ningún valor y todos sus resultados los transmiten a través de modificaciones de sus argumentos.

Las funciones intrínsecas son procedimientos provistos por el compilador.

El propio lenguaje Fortran proporciona un gran número de funciones de librería - funciones intrínsecas-.

Page 3: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

3

Una función externa es una unidad de programa que se compila por separado.

Partes o componentes de una función

Las funciones en Fortran constan de las siguientes partes:

1. Encabezamiento o sentencia FUNCTION. 2. Sentencias de especificación 3. Sentencias ejecutables 4. Sentencia END FUNCTION

Page 4: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

4

La sentencia FUNCTION es la primera sentencia de cualquier función y tiene la forma siguiente: [tipo_retorno] FUNCTION nombre_funcion(lista_de_argumentos)

donde tipo_retorno es un identificador de tipo opcional (REAL, INTEGER, …), nombre_funcion, es un identificador válido de Fortran, y lista_de_argumentos, es una lista de variables que son utilizadas para pasar información a la función. A estos argumentos que aparecen en el encabezamiento de la función se les llama argumentos formales, para

Page 5: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

5

distinguirlos de los argumentos actuales, que son los que aparecen en la llamada a la función desde otro programa. En la parte de las sentencias de especificación deben determinarse:

1. El tipo del valor de retorno, si no se ha especificado en la sentencia FUNCTION.

2. Los tipos de todos y cada uno de los argumentos

formales.

Page 6: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

6

Las sentencias ejecutables son distintas sentencias de Fortran que realizarán diversas operaciones, pero que siempre deberán calcular el valor de retorno antes de devolver el control. Esto se hace asignando valor a una variable cuyo nombre y tipo es el de la función. La última sentencia de la función tiene la forma: END FUNCTION nombre_funcion o bien, para las funciones externas (las definidas después de la sentencia END PROGRAM): END

Page 7: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

7

Sentencia RETURN

La ejecución de la función termina cuando se llega a la sentencia END FUNCTION o cuando se encuentra una sentencia RETURN en la parte correspondiente a las sentencias ejecutables. Se puede decir que la sentencia RETURN es una forma de adelantar la devolución del control al programa que ha llamado a la función, sin esperar a llegar a la sentencia END FUNCTION.

Page 8: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

8

Las funciones deben definirse de modo que el programa que las llama o programa principal tenga acceso a ellas. Esto se puede hacer de una de las formas siguientes:

1. Colocando el código de la función en el mismo archivo que el programa principal, justo antes de la sentencia END PROGRAM. En este caso se dice que la función es interna.

2. El código de la función se introduce en un módulo, al que el programa principal deberá tener acceso para poder importarlo. En este caso se dice que la función es un módulo.

Page 9: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

9

3. El código de la función puede ser también situado en el mismo archivo que el programa principal, pero después de la sentencia END PROGRAM. En este caso se dice que la función es externa.

Las funciones internas se definen al final de un programa (o de otra función externa). La definición de las funciones −puede haber más de una− se realiza después de la palabra clave CONTAINS. No se puede definir una función dentro de otra función interna. Tipo de argumentos actuales y formales

Page 10: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

10

Los argumentos actuales pueden ser variables o expresiones. !Es decir cuando se llama a la función. Los argumentos formales son variables. !Es decir cuando se crea la función.

Page 11: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

11

Reglas de visibilidad y permanencia de las variables

La regla general es que una variable o una función sólo son visibles en el programa o subprograma en el que se han declarado. Como consecuencia de la regla anterior, una variable declarada en una función (en un subprograma) sólo es accesible dentro de esa función. Por eso estas variables se llaman locales. Asimismo, una variable o subprograma declarado dentro de un programa principal (entre las sentencias

Page 12: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

12

PROGRAM y END PROGRAM) son visibles dentro de dicho programa principal y de sus subprogramas internos, excepto si en dichos subprogramas hay una variable local con el mismo nombre que la oculta. A estas variables o subprogramas se les llama globales. La sentencia IMPLICIT al comienzo de un programa principal tiene también carácter global.

Page 13: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

13

Ejem. A. PROGRAM usoFunciones IMPLICIT NONE INTEGER::OP, RES=1 REAL::A, B, S, R, M, D, suma, resta, multi, divis DO WHILE(RES==1) WRITE (*,*)'SELECCIONA UNA OPCION' WRITE (*,*)'HACER SUMA -1-' WRITE (*,*)'HACER RESTA -2-' WRITE (*,*)'HACER MULTIPLICACION -3-' WRITE (*,*)'HACER DIVISION -4-'

Page 14: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

14

READ*, OP SELECT CASE(OP) CASE (1) WRITE (*,*) 'INGRESA DOS VALORES, GRACIAS' READ *, A, B S=suma(A,B) WRITE (*,*) 'EL RESULTADO DE LA SUMA ES: ', S CASE (2) WRITE (*,*) 'INGRESA DOS VALORES, GRACIAS' READ *, A, B R=resta(A,B) WRITE (*,*) 'EL RESULTADO DE LA RESTA ES: ', R

Page 15: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

15

CASE (3) WRITE (*,*) 'INGRESA DOS VALORES, GRACIAS' READ *, A, B M=multi(A,B) WRITE (*,*) 'EL RESULTADO DE LA MULTIPLICACION ES: ', m CASE (4) WRITE (*,*) 'INGRESA DOS VALORES, GRACIAS' READ *, A, B IF(B/=0) THEN D=divis(A,B) WRITE (*,*) 'EL RESULTADO DE LA RESTA ES: ', D

Page 16: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

16

ELSE WRITE (*,*) 'NO ES POSIBLE HACER LA DIVISIÓN' END IF CASE DEFAULT WRITE (*,*) 'OPCION NO VALIDA!!!' END SELECT WRITE(*,*)'QUIERES VER DE NUEVO EL MENU ESCRIBE 1' READ*,RES END DO END PROGRAM

Page 17: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

17

REAL FUNCTION suma(A,B) suma=A+B RETURN END REAL FUNCTION resta(A,B) resta=A-B RETURN END

Page 18: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

18

REAL FUNCTION multi(A,B) multi=A*B RETURN END REAL FUNCTION divis(A,B) divis=A/B RETURN END

Page 19: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

19

Lectura y escritura de Datos –archivos-

Hasta ahora hemos asumido que los datos que necesita

un programa se capturan desde el teclado durante la

ejecución del programa y que los resultados son

mostrados por pantalla.

Y si, esta forma de proceder es adecuada sólo si la

cantidad de datos de entrada/salida es relativamente

pequeña. Pero para problemas que involucren grandes

Page 20: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

20

cantidades de datos resulta más conveniente que los

mismos estén guardados en archivos.

Un archivo es un conjunto de datos almacenado en un

dispositivo de almacenamiento al que se le ha dado un

nombre. Para la mayoría de las aplicaciones los únicos

tipos de archivos que nos interesa considerar son los

archivos de texto.

Un archivo de texto consta de una serie de líneas o

registros separadas por una marca de fin de línea. Cada

Page 21: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

21

línea consta de uno o más datos que es un conjunto de

caracteres alfanuméricos que, en el procesamiento de

lectura o escritura, se trata como una sola unidad. El

acceso a los datos del archivo de texto procede en forma

secuencial, esto es, se procesan línea por línea

comenzando desde la primera línea hacia la última. Esto

implica que no es posible acceder a una línea específica

sin haber pasado por las anteriores.

Page 22: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

22

En Fortran, el programa referencia indirectamente a un archivo a través de un número de unidad lógica (lun, del inglés logic unit number), el cual es un entero positivo pequeño (entre 1 y 100, pero distinto de 5 y 6 pues estas unidades están pre-conectadas a la entrada y salida estándar por teclado y pantalla, respectivamente). Así, para trabajar con un archivo, el primer paso consiste en establecer la relación entre el nombre del archivo y una unidad lógica. Esta conexión se realiza con la sentencia OPEN.

Page 23: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

23

Para poder leer o escribir datos de una línea del archivo, conectado a la unidad número, Fortran utiliza las sentencias READ y WRITE, respectivamente, en la forma READ(número,*) variables WRITE(número,*) variables

Así como un programa debe ser abierto para poder trabajar con el mismo, una vez finalizada la lectura o escritura el archivo debe ser cerrado, esto es, debe terminarse la conexión existente entre el archivo y la unidad lógica respectiva. Esta operación se realiza con la sentencia CLOSE seguida por el número de unidad entre paréntesis. Constituye una buena práctica de

Page 24: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

24

programación cerrar el archivo tan pronto no se necesita más. Nótese que mientras un archivo esté abierto su número de unidad no debe ser utilizado para abrir otro archivo. Sin embargo, una vez cerrado un archivo, el número de unidad correspondiente puede ser reutilizado. Por otra parte, un archivo que ha sido cerrado puede ser nuevamente abierto con una sentencia OPEN. Todos los archivos que no han sido cerrados explícitamente con una sentencia CLOSE serán cerrados automáticamente cuando el programa termine (salvo que un error aborte el programa).

Page 25: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

25

OPEN (lista_open)

donde lista_open puede incluir varias cláusulas

separadas por comas, colocadas en cualquier orden, de

las cuales se estudian a continuación las más

importantes:

[UNIT= ] unidad es un número entero comprendido entre 1 y 99 que identifica al archivo. FILE = archivo es una expresión carácter que indica

el nombre del archivo que se quiere abrir. [STATUS = estado_del_archivo] es una de las

siguientes constantes carácter: ‘OLD’, ‘NEW’,

Page 26: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

26

‘REPLACE’, ‘SCRATCH’ o ‘UNKNOWN’ (opción por defecto).

La opción ‘SCRATCH’ crea un archivo temporal que se destruye automáticamente cuando se cierra el archivo o cuando acaba la ejecución del programa. Se suele usar para guardar resultados intermedios durante la ejecución de un programa. Estos archivos no pueden tener nombre.

La opción ‘UNKNOWN’ implica, si existe el archivo antes de ejecutar el programa, que lo

Page 27: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

27

reemplaza, y si no existe, lo crea en tiempo de ejecución y lo abre.

[ACTION = accion] es una de las siguientes constantes carácter: ‘READ’, ‘WRITE’ o ‘READWRITE’ (opción por defecto). [IOSTAT = error_de_apertura] es una variable

entera que almacena el estado de la operación de apertura de archivo.

Aunque es una cláusula opcional, se aconseja usarla

para evitar abortar un programa cuando se produce un

error de apertura. Si el valor de la variable es:

Page 28: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

28

cero, significa éxito en la apertura del archivo,

positivo, significa que se ha producido un error al abrir el archivo.

[ACCESS = acceso] es una de las siguientes constantes carácter: ‘SEQUENTIAL’ (opción por defecto) o ‘DIRECT’.

Los archivos permiten acceso directo, es decir, saltar de

una línea (también llamada registro) a cualquier otra,

independientemente de su situación en el archivo. Sin

embargo, por razones históricas, la técnica de acceso por

defecto en Fortran es secuencial, es decir, que el acceso

Page 29: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

29

a los registros se realiza en orden consecutivo, desde el

primer registro hasta el último.

[POSITION = posicion] es una de las siguientes constantes carácter: ‘REWIND’, ‘ASIS’ (opción por defecto) o ‘APPEND’. Si la posición es:

‘REWIND’, el puntero de archivo se coloca en el primer registro.

‘ASIS’, el puntero de archivo se coloca en un registro dependiente del procesador.

‘APPEND’, el puntero de archivo se coloca después del último registro justo antes de la marca de fin de archivo.

Page 30: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

30

Ejem. B. PROGRAM textoArchivoNew IMPLICIT NONE OPEN(UNIT=10,FILE='miArchivo.txt', ACTION='WRITE') !EL ARCHIVO miArchivo.txt, NO DEBERÍA EXISTIR, SE GENERA UN ARCHIVO NUEVO EN LA MISMA RUTA DONDE ESTÁ EL PROGRAMA !ALMACENADO, EN CASO QUE EXISTA EL ARCHIVO SE SOBREESCRIBE.

WRITE(10,*) WRITE(10,*) 'PROGRAMACIÓN BÁSICA' WRITE(10,*) WRITE(10,*) 'SEMESTRE 2020-II' WRITE(10,*) WRITE(10,*) 'SALUDOS ALUMNOS' WRITE(10,*)

Page 31: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

31

WRITE(10,*) 'ESPERO LES HAYA GUSTADO EL CURSO' WRITE(10,*) CLOSE(10) END PROGRAM

Page 32: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

32

Ejem. C. PROGRAM lecturaArchivoVARIABLE IMPLICIT NONE INTEGER::M,ERROR OPEN(UNIT=11,FILE='miDato.txt', ACTION='READ') !EL ARCHIVO miDato.txt, DEBE EXISTIR CON ALGÚN VALOR DE TIPO ENTERO, EN LA RUTA DONDE ESTÁ EL PROGRAMA ALMACENDO

READ(11,*,IOSTAT=ERROR)M WRITE(*,*) M WRITE(*,*) CLOSE(11) END PROGRAM

Page 33: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

33

Ejem. D. PROGRAM lecturaArchivoVECTOR IMPLICIT NONE INTEGER::M(5), i, ERROR OPEN(UNIT=12,FILE='miVec.txt', ACTION='READ') !EL ARCHIVO miVec.txt, DEBE EXISTIR CON 5 VALORES DE TIPO ENTERO, EN LA RUTA DONDE ESTÁ EL PROGRAMA ALMACENDO

DO i=1,5 READ(12,*,IOSTAT=ERROR)M(i) END DO CLOSE(12) WRITE(*,*) M END PROGRAM

Page 34: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

34

Ejem. E. PROGRAM lecturaArchivoMATRIZ IMPLICIT NONE INTEGER::M(3,3), i,j, ERROR OPEN(UNIT=13,FILE='miMat.txt', ACTION='READ') !EL ARCHIVO miMat.txt, DEBE EXISTIR CON 9 VALORES DE TIPO ENTERO, EN LA RUTA DONDE ESTÁ EL PROGRAMA ALMACENDO

DO i=1,3 DO j=1,3 READ(13,*,IOSTAT=ERROR)M(i,j) END DO END DO CLOSE(13)

Page 35: Subprogramas funciones-profesores.fi-b.unam.mx/ing_gpemn/cpi/contingencia/...de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplificar la

Programación Básica 2020-II

35

DO i=1,3 WRITE(*,*)(M(i,j),j=1,3) WRITE(*,*) END DO WRITE(*,*) END PROGRAM