Ordonner des données avec Fortran90

Eldude -  
cchristian Messages postés 928 Statut Membre -
Bonjour à tous,

Je suis débutant en Fortran et je souhaite écrire un script capable de lire un fichier composé de 3 colonnes et de N lignes :

PROGRAM LECTUREFICHIER

IMPLICIT NONE

INTEGER :: I
INTEGER,PARAMETER :: N=100
REAL*8, DIMENSION(N,3)::MATRICE

OPEN(UNIT=10,FILE='fichier.dat',STATUS='OLD')

DO I=1,N
READ(10,*) MATRICE(I,1),MATRICE(I,2),MATRICE(I,3)
ENDDO

close(10)

END PROGRAM LECTUREFICHIER

Je suis alors obligé de déclarer le nombre de ligne à l'avance (ici N=100). Est-il possible de ne pas imposer une valeur à N afin de pouvoir lire des fichiers de taille quelconque ?

J'aimerai ensuite (compliquer les choses) ordonner les lignes de manière à ce que la dernière colonne (MATRICE(I,3)) soit rangée dans l'ordre croissant. Je n'arrive pas à trouver de module capable de faire cela...

Quelqu'un l'aurai t-il déjà fait ??

Merci d'avance : )

Seb
A voir également:

1 réponse

cchristian Messages postés 928 Statut Membre 131
 
Bonjour,

Une petite réflexion au sujet du cas que tu soumets:

        PROGRAM LECTUREFICHIER 

        IMPLICIT NONE 

        INTEGER               :: IO_RC         =  0 
        INTEGER               :: CPT_ENREG     =  0,  CPT_ENR_TRIES  = 0 
        CHARACTER,PARAMETER   :: F_NAME*16     =  'fichier.dat' 
        CHARACTER IO_ORDRE*16 
        INTEGER               :: I             =  0,   J  =  0 
!       Je suis alors obligé de déclarer le nombre de ligne à l'avance 
!      (ici N=100).
!       Est-il possible de ne pas imposer une valeur à N afin de pouvoir  
!       lire des fichiers de taille quelconque ? 
!       Le problème réside dans la déclaration du tableau recueillant 
!        les valeurs de chaque enregistrement du fichier. J'ai forcé ici 
!        la valeur de N à 9999 et  j'ai utilisé une déclaration ajustable
!       (1:N,.) 'Adjustable array declarator'.
!        Mais je présume que la taille mémoire effectivement réservée 
!       est maximale:  (9999 x 8 x 3).                  
        INTEGER,PARAMETER       :: N=9999 
        REAL*8, DIMENSION(1:N,3):: MATRICE 
!       Zone tampon servant, lors du tri, à la permutation des 3 valeurs
!       de chaque  enregistrement stockées dans le tableau MATRICE. 
        REAL*8, DIMENSION(3)    :: S_MATRICE 

       OPEN (UNIT=10, FILE=F_NAME, STATUS='OLD') 

       IO_ORDRE              = 'READ' 
!      Copie des enregistrements dans MATRICE.
       DO WHILE  ( IO_RC  ==  0 )
          I          =  I  +  1      
          READ(UNIT=10,FMT=*, IOSTAT=IO_RC) MATRICE(I,1),MATRICE(I,2),MATRICE(I,3)
          IF     (IO_RC    .eq.    -1)                                THEN
            PRINT *,F_NAME, ': RC: ', IO_RC,' SUR ORDRE : ', IO_ORDRE
            PRINT *,F_NAME,': Nb.d''enreg. lus/affiches: ', CPT_ENREG      
          ELSE
            PRINT *,   MATRICE(I,1),MATRICE(I,2),MATRICE(I,3) 
            CPT_ENREG    = CPT_ENREG   +  1
          ENDIF                   
        ENDDO 

        CLOSE (10) 

!      J'aimerai ensuite (compliquer les choses) ordonner les lignes de 
!     manière à ce que la dernière colonne (MATRICE(I,3)) soit rangée
!     dans l'ordre croissant.  Je n'arrive pas à trouver de module 
!     capable de faire cela... 
!      Tri des postes sur le critère: MATRICE(I, 3) (Si j'ai bien 
!      compris). 
       DO             I   =  1,  CPT_ENREG - 1,  1 
          J               =  I   +   1
          DO WHILE  ( J  <=  CPT_ENREG )    
             IF     ( MATRICE   (I,3)  > MATRICE(J,3) )              THEN
                      S_MATRICE (1)    = MATRICE(I, 1)
                      S_MATRICE (2)    = MATRICE(I, 2)
                      S_MATRICE (3)    = MATRICE(I, 3)
                      MATRICE   (I, 1) = MATRICE(J, 1)
                      MATRICE   (I, 2) = MATRICE(J, 2)
                      MATRICE   (I, 3) = MATRICE(J, 3)
                      MATRICE   (J, 1) = S_MATRICE(1)
                      MATRICE   (J, 2) = S_MATRICE(2)
                      MATRICE   (J, 3) = S_MATRICE(3)
             END IF
             J       =  J  +  1
          END DO   
       END DO               

       OPEN (UNIT=10, FILE=F_NAME, STATUS='OLD') 

!      Ecriture dans le même fichier des postes triés.
       IO_ORDRE      = 'WRITE' 
       DO   I        =  1,   CPT_ENREG 
      WRITE(UNIT=10,FMT=*, IOSTAT=IO_RC) MATRICE(I,1),MATRICE(I,2),MATRICE(I,3)
       IF     (IO_RC    .ne.    0 )                               THEN
         PRINT *,F_NAME, ': RC: ', IO_RC,' SUR ORDRE : ', IO_ORDRE
         PRINT *,F_NAME,': Anomalie écriture du ', CPT_ENREG, 'enreg.'   
       ELSE
         PRINT *,   MATRICE(I,1),MATRICE(I,2),MATRICE(I,3) 
         CPT_ENR_TRIES    =  CPT_ENR_TRIES   +  1
       ENDIF                   
       END DO               
       PRINT *,F_NAME,': Nb.d''enreg. tries et ecrits: ',  CPT_ENR_TRIES      

       CLOSE (10) 

       END PROGRAM LECTUREFICHIER 
       
!      Sur ce jeu d'essais en entrée: 
!           1.00000000000       2.00000000000              3.00000000300
!           1.00000000000       2.00000000000              3.00000000200
!           1.00000000000       2.00000000000              3.00000000100
!           1.00000000000       2.00000000000              3.00000000100
!           1.00000000000       2.00000000000              3.00000000300
!           1.00000000000       2.00000000000              3.00000000200
!           1.00000000000       2.00000000000              3.00000000100
!           1.00000000000       2.00000000000              3.00000000200
!           1.00000000000       2.00000000000              3.00000000300
!
!      Ca donne cela:
!
! fichier.dat     : RC:           -1 SUR ORDRE : READ
! fichier.dat     : Nb.d'enregistrements lus/affiches:               9
!           1.00000000000       2.00000000000              3.00000000100
!           1.00000000000       2.00000000000              3.00000000100
!           1.00000000000       2.00000000000              3.00000000100
!           1.00000000000       2.00000000000              3.00000000200
!           1.00000000000       2.00000000000              3.00000000200
!           1.00000000000       2.00000000000              3.00000000200
!           1.00000000000       2.00000000000              3.00000000300
!           1.00000000000       2.00000000000              3.00000000300
!           1.00000000000       2.00000000000              3.00000000300
 !fichier.dat     : Nb.d'enregistrements tries et ecrits:            9
0