InicioEjemplos

Búsqueda de máximo de una serie de números

Declaración implícita, bucles condicionados, y subrutinas.

Vamos a estudiar ahora la forma correcta de estructurar el flujo de un programa y cómo utilizar subrutinas y funciones.

Declaración implícita

Para ello vamos a hacer una subrutina que podemos usar para encontrar el elemento máximo de un array unidimensional(un vector). En el primer ejemplo usamos la declaración implícita de variables. Vamos a seguir usando la declaración implícita, solo que ahora vamos a modificarla para programar de forma más comoda. Por ejemplo, queremos que todas las variables que empiecen con letras de A a H y O a Z sean REAL*8, es decir, números reales con el doble de precisión por defecto. También queremos que todas las variables que empiecen con I a N sean enteros, también con doble precisión, ya que los vamos a usar a menudo para contadores.

      PROGRAM MAXIMO

 C    DECLARACIONES

      IMPLICIT REAL*8 A-H,O-Z; INTEGER*4 I-N

También tenemos que especificar la dimensionalidad de nuestro array. Vamos a llamar al vector VEC y por ahora vamos a fijar que tiene tres elementos.

      PROGRAM MAXIMO

 C    DECLARACIONES

      IMPLICIT REAL*8 A-H,O-Z; INTEGER*4 I-N
      DIMENSION VEC(3)

Flujo del programa: subrutinas

Cuando uno hace un programa más complicado siempre se intenta separar en partes, o funciones, más básicas. Por ejemplo, pensamos en el caso de simular el movimiento de un sistema de partículas que interaccionan a través de una atracción coulombiana. El problema se puede separar de forma natural en varias partes independientes:

  • el cálculo de las fuerzas que hay entre cada una de las partículas en cada momento
  • la resolución de la ecuación de Newton con las fuerzas actuales
  • la salida del programa en cada instante de tiempo

Es natural, por tanto, separar un programa también en sus partes independientes. Vamos a usar un "miniprograma", o subrutina, para cada una de estas partes. Este flujo mantiene el programa con una estructura bien definida y fácil de entender para los demás. El programa principal nos va a servir solo para luego combinar las subrutinas para conseguir algo.

Cabe ahora destacar en que se diferencia una subrutina de una función. Para FORTRAN existen dos tipos de subrutina. La propia SUBROUTINE y la FUNCTION. En el fondo las dos son subrutinas pero con unas diferencias importantes:

  • Las subrutinas operan sobre las variables que se declaran como entrada y cualquier modificación de esas variables se ve reflejada en el programa principal.
  • Las funciones utilizan las variables de entrada para calcular alguna otra variable. El valor de esta variable se devuelve al programa principal.

Como el propio nombre indica, las FUNCTION son más apropiadas para las funciones. Las subrutinas son más utiles para aplicar un algoritmo sobre variables del programa donde lo que interesa no es calcular una magnitud nueva sino modificar los valores de las variables ya existentes en el programa principal.

Vamos a crear una función que acepta como entrada al vector que hemos definido previamente. Primero vamos a seguir suponiendo que tenemos un array monodimensional de tres elementos y luego veremos como extenderlo a un caso más general.

Ponemos un nombre apropiado para lo que hace y la colocamos después del END del programa principal.

Ojo: Con la declaración implícita es importante dar un nombre apropriado a nuestra función según lo que queremos devolver. Si quieres devolver un número real tendrá que empezar con alguna letra que no sea de I a N

      PROGRAM MAXIMO

 C    DECLARACIONES

      IMPLICIT REAL*8 A-H,O-Z; INTEGER*4 I-N
      DIMENSION VEC(3)
	
      END

      FUNCTION VECMAX(VEC)
      IMPLICIT REAL*8 A-H,O-Z; INTEGER*4 I-N
      DIMENSION VEC(3)

      END

Hemos vuelto a establecer nuestras normas para la declaración implícita y la dimensionalidad del vector ya que la función es un programa autocontenido que lleva sus propias declaraciones. La terminamos siempre con un END.

Construimos ahora el algoritmo que encuentra el máximo entre los elementos del vector.

Igualamos nuestra variable de máximo (xMAX porque M está reservada para los enteros) al primer candidato de máximo, el primer elemento del vector. Recuerda que los índices de los arrays en FORTRAN empiezan en 1 y terminan en la dimensionalidad declarada.

      PROGRAM MAXIMO

 C    DECLARACIONES

      IMPLICIT REAL*8 A-H,O-Z; INTEGER*4 I-N
      DIMENSION VEC(3)
	
      END

      FUNCTION VECMAX(VEC)
      IMPLICIT REAL*8 A-H,O-Z; INTEGER*4 I-N
      DIMENSION VEC(3)

      xMAX = VEC(1)

      END

Ahora creamos un bucle que recorre los elementos restantes del vector.

      PROGRAM MAXIMO

 C    DECLARACIONES

      IMPLICIT REAL*8 A-H,O-Z; INTEGER*4 I-N
      DIMENSION VEC(3)
	
      END

      FUNCTION VECMAX(VEC)
      IMPLICIT REAL*8 A-H,O-Z; INTEGER*4 I-N
      DIMENSION VEC(3)

      xMAX = VEC(1)

      DO I = 2,3
      END DO

      END

La sentencia IF:

Usamos ahora una sentencia IF para comparar el candidato de máximo actual con el elemento del vector.

      PROGRAM MAXIMO

 C    DECLARACIONES

      IMPLICIT REAL*8 A-H,O-Z; INTEGER*4 I-N
      DIMENSION VEC(3)
	
      END

      FUNCTION VECMAX(VEC)
      IMPLICIT REAL*8 A-H,O-Z; INTEGER*4 I-N
      DIMENSION VEC(3)

      xMAX = VEC(1)

      DO I = 2,3
        IF (VEC(I).gt.xMAX) THEN
          xMAX = VEC(I)
        END IF 
      END DO

      END

La condición a probar se pone entre paréntesis. .gt. significa "mayor que" y por tanto la siguiente línea sólo se ejecuta cuando la condición, que el elemento sea mayor que el candidato actual almacenado en xMAX.

Los operadores de comparación posibles son:

  • gt - "mayor que"
  • lt - "menor que"
  • ge - "mayor o igual que"
  • le - "menor o igual que"
  • eq - "igual a"

En ese caso el candidato nuevo es el elemento i-ésimo y el bucle continua hasta llegar al final del vector.

Ahora lo único que queda es indicar a la función que queremos devolver este valor al programa principal. Esto se consigue igualando el nombre de la función a la magnitud deseada.

      PROGRAM MAXIMO

 C    DECLARACIONES

      IMPLICIT REAL*8 A-H,O-Z; INTEGER*4 I-N
      DIMENSION VEC(3)
	
      END

      FUNCTION VECMAX(VEC)
      IMPLICIT REAL*8 A-H,O-Z; INTEGER*4 I-N
      DIMENSION VEC(3)

      xMAX = VEC(1)

      DO I = 2,3
        IF (VEC(I).gt.xMAX) THEN
          xMAX = VEC(I)
        END IF 
      END DO

      VECMAX = xMAX

      END

Para llamar a la función desde el programa principal se iguala una variable (del tipo apropiado) al nombre de la función.

      PROGRAM MAXIMO

 C    DECLARACIONES

      IMPLICIT REAL*8 A-H,O-Z; INTEGER*4 I-N
      DIMENSION VEC(3)

      xMAXELEMENT = VECMAX(VEC)
	
      END

      FUNCTION VECMAX(VEC)
      IMPLICIT REAL*8 A-H,O-Z; INTEGER*4 I-N
      DIMENSION VEC(3)

      xMAX = VEC(1)

      DO I = 2,3
        IF (VEC(I).gt.xMAX) THEN
          xMAX = VEC(I)
        END IF 
      END DO

      VECMAX = xMAX

      END

Finalmente, completamos el programa con bucles de entrada y salida.

      PROGRAM MAXIMO

 C    DECLARACIONES

      IMPLICIT REAL*8 A-H,O-Z; INTEGER*4 I-N
      DIMENSION VEC(3)

      WRITE(*,*) 'Elementos del vector:'
      READ(*,*) (VEC(I), I=1,3)
      
      xMAXELEMENT = VECMAX(VEC)

      WRITE(*,*) 'Elemento máximo: ',xMAXELEMENT
	
      END

      FUNCTION VECMAX(VEC)
      IMPLICIT REAL*8 A-H,O-Z; INTEGER*4 I-N
      DIMENSION VEC(3)

      xMAX = VEC(1)

      DO I = 2,3
        IF (VEC(I).gt.xMAX) THEN
          xMAX = VEC(I)
        END IF 
      END DO

      VECMAX = xMAX

      END