next up previous
Next: Fonctions et subroutines Up: Initiation au Langage Fortran Previous: Contrôle de l'exécution

Sous-sections

Les tableaux

A partir des types simples du FORTRAN, on peut former des vecteurs, des matrices, et même des tableaux à plusieurs indices.

Déclaration

type var(m1, m2, ...)

m1, m2,... déterminent la taille du tableau. Elles doivent être des des constantes entières. Il est interdit de mettre des variables entières. Autrement dit : la taille d'un tableau FORTRAN est fixée une fois pour toutes.

Exemples

      real v(100)
      double precision a(100,100)
      integer i(20)

Premier conseil

Pour créer des tableaux, il est conseillé de déclarer les tailles dans des constantes symboliques :

      parameter (max=100)
      double precision a(max,max)
      real v(max)

Second conseil

Avant de déclarer un tableau, pensez à la taille mémoire qu'il va occuper. Le tableau a ci-dessus occupe par exemple $100\times100\times8=80000$ octets.

Utilisation des tableaux

On y accède élément par élément en indiquant le ou les indices entre parenthèses séparés par des virgules. Les indices peuvent être des constantes ou des variables.

Exemples

Somme de deux matrices :

      double precision a(max,max)
      double precision b(max,max)
      double precision c(max,max)
      ...
      do i=1,max
        do j=1,max
          c(i,j)=a(i,j)+b(i,j)
        enddo
      enddo

Produit scalaire de deux vecteurs :

      double precision u(max), v(max)
      double precision prodsca
      ...
      prodsca=0
      do i=1,max
        prodsca=prodsca + u(i)*v(i)
      enddo

Instructions read et write avec boucles implicites

C'est une extension très pratique pour lire des matrices au clavier ou les écrire à l'écran. Il s'agit en quelque sorte d'une boucle do ... enddo combinée a un read ou un write.

Syntaxe

read(*,*) (var(i), i = i1, i2, i3)
write(*,*) (var(i), i = i1, i2, i3)

i représente une variable entière, var(i) une expression ou un tableau dépendant de cette variable i. i1, i2 et i3 ont le même sens que pour les boucles do.

Exemples

Lire les n premières composantes d'un vecteur sur une même ligne au clavier :

      read(*,*) (v(i), i=1,n)

Écrire les n premiers termes de la jème ligne d'une matrice à l'écran, séparés par le caractère « ! » :

      write(*,*) (a(i,j), ' ! ', j=1,n)

Utilisation optimale des tableaux

Problématique

La taille de déclaration des tableaux définit la taille mémoire réservée pour stocker le tableau. En général, on choisit cette taille comme étant la taille maximale du problème que l'on veut traiter, mais il se peut que pour un problème particulier, on utilise seulement une partie du tableau.

Dans l'exemple de l'addition, supposons que nous utilisions les tableaux FORTRAN a(100,100) et b(100,100) pour stocker des matrices $3 \times 3$. La structure de a sera la suivante :


\begin{displaymath}\left[
\begin{array}{cccccc}
a_{11} & a_{12} & a_{13} & 0 & \...
...ts & \vdots \\
0 & 0 & 0 & 0 & \cdots & 0
\end{array}\right]
\end{displaymath}

et de même pour b. Pour faire la somme des deux matrices, il est inutile d'additionner les 0, et les boucles doivent être effectuées de 1 à 3 plutôt que de 1 à 100.

Lorsqu'on utilise un tableau FORTRAN, il faut stocker ses dimensions réelles dans des variables en plus de sa taille de déclaration.

Dans l'exemple de l'addition précédent, on utilisera une variable n si on somme des matrices carrées, ou deux variables nligne et ncolon si on somme des matrices rectangulaires.

Exemple

Écrire un programme complet qui lit au clavier deux matrices de même taille $m\times n$ et effectue leur somme. On part du principe que ces matrices ont au plus 50 lignes et 80 colonnes.

On déclare donc 3 tableaux $50 \times 80$, et on utilise deux variables nligne et ncolon pour stocker les tailles réelles des matrices que l'on traite. Ces tailles réelles sont bien sûr demandées à l'utilisateur.

      parameter (mligne=50, mcolon=80)
      
      double precision a(mligne, mcolon)
      double precision b(mligne, mcolon)
      double precision c(mligne, mcolon)
      
      integer nligne, ncolon
      
      write(*,*)
     &  'Nombre de lignes des matrices'
      read(*,*) nligne
      write(*,*)
     &  'Nombre de colonnes des matrices'
      read(*,*) ncolon
      
      write(*,*) 'Matrice a '
      do i=1,nligne
        read(*,*) (a(i,j), j=1,ncolon)
      enddo
      
      write(*,*) 'Matrice b '
      do i=1,nligne
        read(*,*) (b(i,j), j=1,ncolon)
      enddo
      
      do i=1,nligne
        do j=1,ncolon
          (i,j)=a(i,j)+b(i,j)
        enddo
      enddo
      
      end


next up previous
Next: Fonctions et subroutines Up: Initiation au Langage Fortran Previous: Contrôle de l'exécution

Copyright © EMAC - 1996-1999 - Paul GABORIT