Les subrutines són blocs de codi reutilitzables que permeten estructurar i modularitzar els programes en Fortran. Aquestes són similars a les funcions en altres llenguatges de programació, però no necessàriament han de retornar un valor. Les subrutines són útils per dividir el codi en parts més petites i manejables, facilitant la seva lectura, manteniment i depuració.

Continguts

Definició de Subrutines

Una subrutina en Fortran es defineix utilitzant les paraules clau subroutine i end subroutine. La sintaxi bàsica és la següent:

subroutine nom_subrutina(arguments)
    ! Declaracions de variables locals
    ! Cos de la subrutina
end subroutine nom_subrutina

Exemple

subroutine saluda()
    print *, "Hola, món!"
end subroutine saluda

Crida a Subrutines

Per cridar una subrutina, simplement utilitzem la paraula clau call seguida del nom de la subrutina i els arguments (si n'hi ha).

Exemple

program exemple_subrutina
    call saluda()
end program exemple_subrutina

Passant Arguments a Subrutines

Les subrutines poden rebre arguments que es passen per valor o per referència. Els arguments es defineixen a la llista d'arguments de la subrutina.

Exemple

subroutine suma(a, b, resultat)
    integer, intent(in) :: a, b
    integer, intent(out) :: resultat
    resultat = a + b
end subroutine suma

En aquest exemple, a i b són arguments d'entrada, mentre que resultat és un argument de sortida.

Crida amb Arguments

program exemple_suma
    integer :: x, y, z
    x = 5
    y = 10
    call suma(x, y, z)
    print *, "La suma és: ", z
end program exemple_suma

Exemple Pràctic

A continuació, es presenta un exemple complet que utilitza una subrutina per calcular l'àrea d'un rectangle.

Codi

program area_rectangle
    real :: llargada, amplada, area

    ! Assignació de valors
    llargada = 5.0
    amplada = 3.0

    ! Crida a la subrutina
    call calcula_area(llargada, amplada, area)

    ! Mostra el resultat
    print *, "L'àrea del rectangle és: ", area
end program area_rectangle

subroutine calcula_area(l, a, resultat)
    real, intent(in) :: l, a
    real, intent(out) :: resultat
    resultat = l * a
end subroutine calcula_area

Exercicis Pràctics

  1. Exercici 1: Escriu una subrutina que calculi el perímetre d'un rectangle donada la llargada i l'amplada. Prova la subrutina en un programa principal.

  2. Exercici 2: Escriu una subrutina que intercanviï els valors de dues variables. Prova la subrutina en un programa principal.

Solucions

Exercici 1

program perimetre_rectangle
    real :: llargada, amplada, perimetre

    ! Assignació de valors
    llargada = 5.0
    amplada = 3.0

    ! Crida a la subrutina
    call calcula_perimetre(llargada, amplada, perimetre)

    ! Mostra el resultat
    print *, "El perímetre del rectangle és: ", perimetre
end program perimetre_rectangle

subroutine calcula_perimetre(l, a, resultat)
    real, intent(in) :: l, a
    real, intent(out) :: resultat
    resultat = 2 * (l + a)
end subroutine calcula_perimetre

Exercici 2

program intercanvi_valors
    integer :: x, y

    ! Assignació de valors
    x = 10
    y = 20

    ! Mostra els valors abans de l'intercanvi
    print *, "Abans de l'intercanvi: x =", x, ", y =", y

    ! Crida a la subrutina
    call intercanvia(x, y)

    ! Mostra els valors després de l'intercanvi
    print *, "Després de l'intercanvi: x =", x, ", y =", y
end program intercanvi_valors

subroutine intercanvia(a, b)
    integer, intent(inout) :: a, b
    integer :: temp

    temp = a
    a = b
    b = temp
end subroutine intercanvia

Conclusió

Les subrutines són una eina poderosa en Fortran per modularitzar i organitzar el codi. Permeten dividir el programa en parts més petites i manejables, facilitant la seva lectura i manteniment. En aquest tema, hem après a definir subrutines, cridar-les i passar arguments. També hem vist exemples pràctics i hem realitzat exercicis per reforçar els conceptes apresos. En el següent tema, explorarem les funcions en Fortran, que són similars a les subrutines però amb algunes diferències clau.

© Copyright 2024. Tots els drets reservats