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
Configuration: Linux
Firefox 3.0.10

1 réponse

  1. 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