En Fortran, los procedimientos (subrutinas y funciones) pueden recibir datos de entrada y devolver resultados a través de argumentos. Este mecanismo es fundamental para escribir programas modulares y reutilizables. En esta sección, aprenderemos cómo pasar argumentos a subrutinas y funciones, y cómo manejar estos argumentos dentro de los procedimientos.
Conceptos Clave
- Argumentos de Entrada y Salida: Los argumentos pueden ser utilizados para pasar datos a un procedimiento (entrada) y para recibir datos de un procedimiento (salida).
- Tipos de Argumentos: Los argumentos pueden ser de cualquier tipo de datos, incluyendo tipos primitivos (enteros, reales, caracteres) y tipos derivados.
- Paso por Valor y Referencia: En Fortran, los argumentos se pasan por referencia de manera predeterminada, lo que significa que el procedimiento puede modificar el valor de los argumentos originales.
Ejemplo Básico: Subrutina con Argumentos
Veamos un ejemplo simple de una subrutina que recibe dos números enteros y devuelve su suma.
program main implicit none integer :: a, b, result ! Asignar valores a las variables a = 5 b = 10 ! Llamar a la subrutina para sumar los números call sum_numbers(a, b, result) ! Imprimir el resultado print *, "La suma de ", a, " y ", b, " es ", result contains subroutine sum_numbers(x, y, sum) integer, intent(in) :: x, y integer, intent(out) :: sum ! Calcular la suma sum = x + y end subroutine sum_numbers end program main
Explicación del Código
- Declaración del Programa Principal: El programa principal
main
declara tres variables enterasa
,b
yresult
. - Asignación de Valores: Se asignan valores a
a
yb
. - Llamada a la Subrutina: La subrutina
sum_numbers
se llama cona
,b
yresult
como argumentos. - Definición de la Subrutina: La subrutina
sum_numbers
se define dentro de la seccióncontains
del programa principal.intent(in)
: Indica quex
yy
son argumentos de entrada.intent(out)
: Indica quesum
es un argumento de salida.
- Cálculo de la Suma: La subrutina calcula la suma de
x
yy
y asigna el resultado asum
.
Ejemplo Avanzado: Función con Argumentos
Ahora, veamos un ejemplo de una función que calcula el área de un círculo dado su radio.
program main implicit none real :: radius, area ! Asignar valor al radio radius = 5.0 ! Llamar a la función para calcular el área area = circle_area(radius) ! Imprimir el resultado print *, "El área del círculo con radio ", radius, " es ", area contains function circle_area(r) result(area) real, intent(in) :: r real :: area real, parameter :: pi = 3.14159 ! Calcular el área area = pi * r * r end function circle_area end program main
Explicación del Código
- Declaración del Programa Principal: El programa principal
main
declara dos variables realesradius
yarea
. - Asignación de Valor al Radio: Se asigna un valor al radio.
- Llamada a la Función: La función
circle_area
se llama conradius
como argumento y su resultado se asigna aarea
. - Definición de la Función: La función
circle_area
se define dentro de la seccióncontains
del programa principal.intent(in)
: Indica quer
es un argumento de entrada.result(area)
: Especifica que el resultado de la función se almacenará enarea
.
- Cálculo del Área: La función calcula el área del círculo usando la fórmula
πr²
.
Ejercicios Prácticos
Ejercicio 1: Producto de Dos Números
Escribe una subrutina que reciba dos números reales y devuelva su producto.
Solución:
program main implicit none real :: x, y, product ! Asignar valores a las variables x = 3.0 y = 4.0 ! Llamar a la subrutina para calcular el producto call multiply_numbers(x, y, product) ! Imprimir el resultado print *, "El producto de ", x, " y ", y, " es ", product contains subroutine multiply_numbers(a, b, result) real, intent(in) :: a, b real, intent(out) :: result ! Calcular el producto result = a * b end subroutine multiply_numbers end program main
Ejercicio 2: Promedio de Tres Números
Escribe una función que reciba tres números reales y devuelva su promedio.
Solución:
program main implicit none real :: num1, num2, num3, avg ! Asignar valores a las variables num1 = 5.0 num2 = 10.0 num3 = 15.0 ! Llamar a la función para calcular el promedio avg = average(num1, num2, num3) ! Imprimir el resultado print *, "El promedio de ", num1, ", ", num2, " y ", num3, " es ", avg contains function average(a, b, c) result(avg) real, intent(in) :: a, b, c real :: avg ! Calcular el promedio avg = (a + b + c) / 3.0 end function average end program main
Resumen
En esta sección, hemos aprendido cómo pasar argumentos a subrutinas y funciones en Fortran. Hemos visto ejemplos prácticos de cómo utilizar argumentos de entrada y salida, y cómo definir y llamar a subrutinas y funciones. Además, hemos practicado con ejercicios para reforzar estos conceptos. En la siguiente sección, exploraremos el alcance y la vida útil de las variables en Fortran.
Curso de Programación en Fortran
Módulo 1: Introducción a Fortran
- Introducción a Fortran
- Configuración del Entorno de Desarrollo
- Sintaxis y Estructura Básica
- Escribiendo tu Primer Programa en Fortran
Módulo 2: Conceptos Básicos
- Variables y Tipos de Datos
- Operadores y Expresiones
- Entrada y Salida
- Estructuras de Control: Sentencias If
- Estructuras de Control: Bucles
Módulo 3: Arreglos y Cadenas
- Introducción a los Arreglos
- Arreglos Multidimensionales
- Manejo de Cadenas
- Operaciones con Arreglos y Cadenas
Módulo 4: Procedimientos y Funciones
Módulo 5: Estructuras de Datos Avanzadas
Módulo 6: Manejo de Archivos
- Lectura de Archivos
- Escritura de Archivos
- Posicionamiento de Archivos
- Operaciones con Archivos Binarios
Módulo 7: Temas Avanzados
Módulo 8: Mejores Prácticas y Optimización
- Técnicas de Optimización de Código
- Depuración y Perfilado
- Escribiendo Código Mantenible
- Estándares y Portabilidad de Fortran