Reconnaissance de caractères

elnilam Messages postés 41 Statut Membre -  
elnilam Messages postés 41 Statut Membre -
Bonjour,
je suis en fortran 95 et je cherche une méthode pour écrire dans un fichier .txt une série de formule type h + f -> e + d.
Ensuite, cette formule serait lue (h,f,e,d) en tant que caractères pour être utiliser dans un autre fichier et c'est là où je bloque parce que je ne sais pas du tout comment faire. Si vous aviez un cours ou un exemple cela m'aiderait beaucoup.
D'avance merci.
Configuration: Linux Mandriva
Firefox 2.0.0.11

31 réponses

  • 1
  • 2
Résumé de la discussion

On cherche à écrire en Fortran 95 dans un fichier texte une suite de formules, h +> e + d, puis à les lire comme chaînes pour une utilisation ultérieure. Plusieurs réponses proposent d'utiliser une transcoding par tables, associant groupes de caractères à des valeurs numériques (TAB_GRP et TAB_VAL_GRP), ou d'écrire/nommer les fichiers selon le contenu des formules. Des extraits montrent l'ouverture, la lecture et l'écriture des fichiers (OPEN, READ, WRITE) ainsi que le traitement des chaînes, la détection de groupes de caractères, signes '->' et bornes de fin qui déclenchent erreurs. En pratique, certaines solutions privilégient de nommer les fichiers selon le contenu de chaque ligne, afin de simplifier le routage des résultats et d'éviter des conversions numériques intermédiaires.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. cchristian Messages postés 928 Statut Membre 131
     
    Bonjour Elnilam

    .......... Ensuite, cette formule serait lue (h,f,e,d) en tant que caractères pour être utilisée dans un autre fichier et c'est là où je bloque parce que je ne sais pas du tout comment faire............

    Peux-tu donner un exemple plus concret ?
    0
    1. elnilam Messages postés 41 Statut Membre 1
       
      Bonjour,
      en préambule, je débute dans la programmation.
      Précisément je voudrais mettre plusieurs séries de caractères comme " H2 + E -> H2+ + E + E " dans un fichier texte.
      ensuite, ces caractères seraient lus,pour obtenir une combinaison unique correspondant à (H2,E,H2+,E,E) puis à chaque caractères j'attribuerais un nombre unique (1,2,3,2,2) par exemple.
      Je ne sais pas comment faire pour lire la suite de caractères pour en faire une combinaison puis la transcrire en chiffres.
      Pour la seconde partie, je me demande si je dois utliiser un IF(..='H2') THEN..X=2..auquel cas il faudrait que j'ai enregistré à l'avance tous les IF possible en leur associant un nombre. En fait, je cherche un exemple ou une aide sur les commandes à utiliser.
      Par avance, merci
      elnilam
      0
  2. cchristian Messages postés 928 Statut Membre 131
     
    Bonjour,

    Précisément je voudrais mettre plusieurs séries de caractères comme " H2 + E -> H2+ + E + E " dans un fichier texte.
    ensuite, ces caractères seraient lus,pour obtenir une combinaison unique correspondant à (H2,E,H2+,E,E) puis à chaque caractères j'attribuerais un nombre unique (1,2,3,2,2) par exemple.
    Je ne sais pas comment faire pour lire la suite de caractères pour en faire une combinaison puis la transcrire en chiffres.


    1) Dans un premier temps il s'agit de "stocker" des suites de caractères du type "H2 + E -> H2+ + E + E " dans un fichier texte.
    Jusque là pas de problème ?

    2) Dans un second temps ces suites de caractères sont lues (réceptionnées) par un programme, à partir du fichier texte puis une première transposition est effectuée afin d'obtenir des combinaisons du type (H2,E,H2+,E,E)
    Pour automatiser la transposition il faut dégager la règle exacte de trancodification ? (apparemment il y a un compactage de la chaîne par élimination des caractères spéciaux (liste exhaustive.) sauf quand il sont doublés (multiples) ++ ?)

    3) Dans un troisième temps une seconde transposition (dans la foulée de la 1ère ?) est réalisée pour obtenir des suites de chiffres (que tu appelles un nombre) tel que (1,2,3,2,2).
    Mêmes remarques qu'en 2)

    Cela suggère plusieurs étapes fonctionnelles puiqu'il y a un fichier au moins .........

    Si j'ai correctement résumé le problème il n'y a semble-t-il pas de difficultés majeures, à condition de dégager les règles de transposition. Il sera possible de les intégrer quelque soit "le moment" (l'étape fonctionnelle, le programme) où ces transpos. doivent intervenir.
    Il est souhaitable que ce soit à la phase d'intégration dans le fichier (en 1). Il devient alors une table de correspondance.
    Les nombres ((1,2,3,2,2 => 12322) pourraient, entre autres hypothèses, servir de clé d'accès au fichier qui serait à accès direct (à tester).

    -----------------------------------------------------
    Pour la seconde partie, je me demande si je dois utliiser un IF(..='H2') THEN..X=2..auquel cas il faudrait que j'ai enregistré à l'avance tous les IF possible en leur associant un nombre. En fait, je cherche un exemple ou une aide sur les commandes à utiliser.
    Tu peux faire une table (un tableau Fortran) de correspondance où chaque élément du tableau serait du type H2=2
    ou 2 tableaux dont l'un deux contient dans chaque élément un code du type H2 par exemple et l'autre la valeur numérique qui lui est affectée 2, les deux valeurs H2 et 2 occuppent bien entendu le même rang dans chacun des tableaux.

    La difficulté pour toi réside dans le fait de dégager les règles de transcodification où dans la programmation (Fortran en l'occurrence) du problème ?
    0
    1. elnilam Messages postés 41 Statut Membre 1
       
      Bonjour Cchristian,
      merci pour les explications.
      le problème serait dans la programmation en fortran (désolé).
      Je n'ai bien compris l'étape 2) e je pense que la 3) ira ...quand la 2) ira.
      Précisément, c'est l'étape de transposition puis sont automatisation qui me gène.
      Après, il s'agirait de créer le tableau à 2d (c'est bon) et passer à l'étape 3) comme la 2)..?!
      Merci
      elnilam
      0
  3. cchristian Messages postés 928 Statut Membre 131
     
    bonjour,

    le problème serait dans la programmation en fortran (désolé).
    En ce qui concerne la programmation Fortran je pourrai te filer un coup de main (dans la limite de mes connaissances bien sûr). Par contre en math ne compte pas sur moi........

    Je n'ai bien compris l'étape 2) e je pense que la 3) ira ...quand la 2) ira.
    Oui, j'ai scindé en deux étapes (les étapes 2 et la 3) afin de dégager les cas de figure et surtout en prévision d'une éventuelle impossibilité relative à un découpage fonctionnel en plusieurs programmes, d'effectuer les transcodifications dans la foulée.

    Précisément, c'est l'étape de transposition puis sont automatisation qui me gène.
    C'est semble-t-il, pour toi le point le plus sensible. Il n'y a pourtant que toi qui puisses dégager les règles en fonction de ce que tu veux obtenir, le but à atteindre. Par exemple quelle est la finalité de ces transcodifications? Qui (ou quoi, c-a-d quels programme(s) ou algorithme(s)) utilisera ces codifications et pour en faire quoi ? C'est en répondant à des questions de ce type relatives au problème à résoudre, que tu dégageras à l'évidence les règles.

    Essaie de formaliser concrètement le problème et utilises une méthode du type de celle-ci :
    http://www.commentcamarche.net/forum/affich 5660374 les solustions des algorithmes
    0
    1. elnilam Messages postés 41 Statut Membre 1
       
      C'est encore moi,
      En plusieurs étapes, le programme donnerait
      - lecture des formules type H2 + E ->.. dans un fichier .txt
      - construction des combinaisons de chiffres uniques
      Une combinaison va me servir à ouvrir un fichier de données dont le nom correspond à la suite de chiffres.
      par exemple, 12322.txt
      Dans l'idée, cela devrait aussi me servir à remplir des équations type d/dt (H2) ( ou 2, idem)= fonction(12322)+...
      Ensuite, c'est une boucle où je renouvelle les valeurs de H, H2...
      Pour l'instant je l'écris sur papier donc je ne connais pas encore mes problèmes mais je sais que je ne sais pas lire les caractères.
      merci
      0
  4. cchristian Messages postés 928 Statut Membre 131
     
    Bonsoir,

    Au risque d'anticiper et afin de répondre, je l'espère, à une de tes questions voici une séquence (écrite en Fortran 77) qui explore caractère par caractère une variable CHARACTER.
    Il est alors possible dans la logique spécifique de les analyser, identifier les séparateurs et par le fait identifier les groupes de caractères, éliminer les caractères indésirables, ......... afin d'effectuer les traitements correspondants.

           CHARACTER     CHAINE_CARACT*256
           CHARACTER     C_XX
           INTEGER          IS_I
    
           ............................................
    C    Boucle de lecture du fichier contenant les formules type " H2 + E -> ...." 
           ............................................
    
           DO  1000   IS_I    =   1,    LEN  (CHAINE_CARACT),     1 ! ou un DO WHILE
                  C_XX            =                  CHAINE_CARACT      (IS_I  : 1)
    
                  PRINT  *,  'Le caractere ',  C_XX,   '  se trouve en  ', 
        S                        IS_I, ' eme position. '  
    
    C            IF    ( ..... C_XX  est un caractère à considérer .......)      THEN
    C    ici insérer ou appeler  la logique spécifique au problème à traiter (transco.)
    C             END IF
    
    1000    CONTINUE
    
           ............................................
    C      Fin de la boucle de lecture du fichier contenant les formules 
           ............................................
    
    


    P. S. En ce qui concerne la valeur numérique servant entre autre à la numérotation (des noms) des fichiers, es-tu limité à un nombre de chiffres ?
    0
    1. elnilam Messages postés 41 Statut Membre 1
       
      Bonjour,
      je ne crois pas avoir de limites dans la numérotation, je pense que une version tiendrait compte de 100 'H,H2...', et 4 à 6 caractères dans une formule au maximum.
      Pour la partie fortran, si j'ai compris..
      DO 1000 IS_I = 1, LEN (CHAINE_CARACT), 1 ! ou un DO WHILE
      C_XX = CHAINE_CARACT (IS_I : 1)
      Cette partie va lire une ligne de formule (ex : H2 + e -> H2+ + e + e) caractère par caractère.
      question: comment reconnaître un e d'un H2 ou H2+..étant donné qu'ils ne font pas la même taille, si la lecture se fait cases par cases?

      Dans cette partie, "ici insérer ou appeler la logique spécifique au problème à traiter" correspond à changer les caractères en chiffres ?! (avec le tableau préalablement créé)
      C IF ( ..... C_XX est un caractère à considérer .......) THEN
      C ici insérer ou appeler la logique spécifique au problème à traiter (transco.)
      C END IF

      question2: c'est la question bête, je n'ai pas l'impression que l'on change de ligne, donc est ce que je dois mettre une sorte d'étoile à la fin de chaque formule?
      ex:
      H2 + e -> H2+ + e + e '*'
      H + e -> H+ + e + e '*'

      Merci encore
      elnilam
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. cchristian Messages postés 928 Statut Membre 131
     
    Bonjour,

    En première reflexion sur le "(dé)groupage" des caractères je te propose cela (désolé pour la mise en forme) :
    Il s'agit d'une séquence "brute", Je ne l'ai pas spécialement optimisée.

    C     C0_TEST  simule 1 ligne (enregistrement) du fichier en INPUT.
           CHARACTER      C0_TEST*256  /'H2 + e -> H2+ + e + e'/
    
    C     C1_TEST est la variable réceptrice des groupes de caractères.
           CHARACTER      C1_TEST*32   /'  '/
    
    C     C2_TEST simule 1 poste d'une table de référence.
           CHARACTER      C2_TEST*32   /'H2 '/  !( par exemple et entre autre)
    
           CHARACTER      C_XX              /' '/
    
    
           print *, 'H2 + e -> H2+ + e + e'
    C     Variable de progression de la boucle DO.v
           IS_I             =  1
    C     Compteur de caractères d'un groupe
           ICPT_CAR     =  0
    C     Position dans la chaine du 1er ou du seul caractère d'un groupe.
           ISAVE_POS   =  1  
           DO      WHILE        ( IS_I     <=     LEN  (C0_TEST) )
    	  C_XX        =        C0_TEST   (IS_I  : 1)
    	  IF             (C_XX      .eq.  '  ' )                THEN
    	      C1_TEST (1:ICPT_CAR)       = 
         S	                                 C0_TEST (ISAVE_POS:ISAVE_POS + ICPT_CAR)
    	      ISAVE_POS                       =     IS_I           +   1  
                          ICPT_CAR                         =     0 		   
    	 ELSE
                         ICPT_CAR                          =     ICPT_CAR   +   1
    	      IF       (C1_TEST   (1: 1)   .ne. '  ')      THEN
             print *, 'CONTENU DE C1_TEST :  ', C1_TEST
    C       Simulation de la recherche du groupe de caractères en table.   
                              IF  (C1_TEST               .eq. C2_TEST)   THEN
            print *, 'OKKKKK ',   C1_TEST
                              END IF            
    	         C1_TEST                      = '  '
                         END IF
           print  *,  'Le caractere ',  C_XX,  '  se trouve en  ', 
         S                       IS_I, ' eme position. '
              END IF 
           IS_I                                               = IS_I     +     1   
           END DO


    Les "print" sont là pour les tests.
    Il est souhaitable que cette séquence face l'objet d'une SUBROUTINE.

    Résultats :

    H2 + e -> H2+ + e + e
    Le caractere H se trouve en 1 eme position.
    Le caractere 2 se trouve en 2 eme position.
    CONTENU DE C1_TEST : H2

    OKKKKK H2 (simulation recherche en table)

    Le caractere + se trouve en 4 eme position.
    CONTENU DE C1_TEST : +

    Le caractere e se trouve en 6 eme position.
    CONTENU DE C1_TEST : e

    Le caractere - se trouve en 8 eme position.
    Le caractere > se trouve en 9 eme position.
    CONTENU DE C1_TEST : ->

    Le caractere H se trouve en 11 eme position.
    Le caractere 2 se trouve en 12 eme position.
    Le caractere + se trouve en 13 eme position.
    CONTENU DE C1_TEST : H2+

    Le caractere + se trouve en 15 eme position.
    CONTENU DE C1_TEST : +

    Le caractere e se trouve en 17 eme position.
    CONTENU DE C1_TEST : e

    Le caractere + se trouve en 19 eme position.
    CONTENU DE C1_TEST : +

    Le caractere e se trouve en 21 eme position.
    CONTENU DE C1_TEST : e
    0
  7. cchristian Messages postés 928 Statut Membre 131
     
    Bonjour,

    question2: c'est la question bête, je n'ai pas l'impression que l'on change de ligne, donc est ce que je dois mettre une sorte d'étoile à la fin de chaque formule?
    Une formule par enregistrement du fichier en INPUT.

    Cette partie va lire une ligne de formule (ex : H2 + e -> H2+ + e + e) caractère par caractère.
    question: comment reconnaître un e d'un H2 ou H2+..étant donné qu'ils ne font pas la même taille, si la lecture se fait cases par cases?


    En première réflexion, Je vois un tableau de chaînes de caractères du type :
    DIMENSION TAB_GRP (nn) ! Tableau constitué de nn lignes
    CHARACTER TAB_GRP*16 ! de 16 (ou davantage) colonnes chacune.

    DATA (TAB_GRP (L), L = 1,nn,1) /'H2', 'e','H2+',................./

    A méditer !!!!!!!!!!
    0
    1. elnilam Messages postés 41 Statut Membre 1
       
      Bonjour Cchristian,
      Pour le mail en fortran je crois que j'ai tout compris.
      Pour la question bête, c'est vrai qu'elle est bête parce que je me suis dit après coup que je pouvais faire une boucle sur chaque ligne.

      question: comment reconnaître un e d'un H2 ou H2+..étant donné qu'ils ne font pas la même taille, si la lecture se fait cases par cases?

      J'ai l'impression que c'est fait dans le programme en fortran et
      =>
      DIMENSION TAB_GRP (nn) ! Tableau constitué de nn lignes
      CHARACTER TAB_GRP*16 ! de 16 (ou davantage) colonnes chacune.

      DATA (TAB_GRP (L), L = 1,nn,1) /'H2', 'e','H2+',................./
      <=
      C'est comment créer la table de référence il me semble.
      En tout cas, merci pour tout.
      elnilam
      0
  8. cchristian Messages postés 928 Statut Membre 131
     
    Bonsoir,

    J'ai fait plusieurs tests avec ces enregistrements (jeux d'essais) dans le fichier en entrée :
    H1 + a -> H2+ + a + a
    H3 + b -> H4+ + b + b
    H5 + c -> H6+ + c + c
    H7 + d -> H8+ + d + d
    H2 + e -> H2+ + e + e 

    et une table créée et chargée de cette manière (ou d'une autre manière):
           DIMENSION       TAB_GRP  (13) ! Tableau constitué de 13 lignes pour tests
           CHARACTER       TAB_GRP*16    !         de 16 colonnes chacune.
    			    
           DATA     (TAB_GRP   (K), K = 1,13,1)  /'H1', 'a', 'H2+',
         S                                        'H3', 'b', 'H4+',
         S                                        'H5', 'c', 'H6+',
         S                                        'H7', 'd', 'H8+' , 'e'/

    Les résultats sont corrects. Je ne les ai pas joints car ils sont semblables à ceux postés précédemment (au nombre près) ici 5 traitements (un par enregistrement).

    -------------------------------------------------------------------------------------------------------------------------
    En ce qui concerne le tableau, on obtient en faisanr un print *, TAB_GRP le résultat suivant :
    H1              a               H2+             H3
    b               H4+             H5              c
    H6+             H7              d               H8+

    et en faisant un print *, TAB_GRP (3) on obtient : H2+

    Il suffit de comparer chaque groupe de caractère(s) extrait de l'algorithme précédent avec chaque élément de la table pour rechercher une équivalence (Pour illustrer une itération, j'ai délibérément figé les tests aux No. de poste 3 et 13 ):
    IF (C1_TEST .eq. TAB_GRP (3))        THEN
    	 PRINT *, ' OK trouve H2+  ', C1_TEST
               END IF
    IF (C1_TEST .eq. TAB_GRP (13))        THEN
    	 PRINT *, ' OK trouve e ', C1_TEST
               END IF

    Fortran compare les variables deux à deux, octet par octets de la gauche vers la droite sans considération des différences de taille en mémoire pouvant exister entre deux variables. Ce qui n'est pas le cas en COBOL par exemple. Dans mon test C1_TEST fait 256 octets et un élément de TAB_GRP fait 16 octets. Il est vraisemblable que la comparaison octet par octet s'effectue à concurence du nombre d'octets (de définition en mémoire) de la plus petite variable.

    Pour tester j'ai modifié la séquence d'instructions de mon précédent message, en ajoutant le fichier. Est-ce que cela t'intéresse ?
    0
  9. cchristian Messages postés 928 Statut Membre 131
     
    Bonjour,

    Rectificatif :

    Le "e" a dû sauter au copier/coller.............................

    H1              a               H2+             H3
    b               H4+             H5              c
    H6+             H7              d               H8+          e
    0
    1. elnilam Messages postés 41 Statut Membre 1
       
      Bonjour,
      la suite serait après les lignes du message" le jeudi 29 mai 2008 à 18:56:12". Auquel cas je veux bien même si je crois avoir compris ce que donnerait le résultat, mais c'est rassurant.
      merci
      elnilam
      0
      1. elnilam Messages postés 41 Statut Membre 1 > elnilam Messages postés 41 Statut Membre
         
        C'est encore moi,
        c'est un peu un récapittulatif et en fait une question.
        un exemple:
        H2 + e -> H2+ + e + e
        H3+ + e -> H + H2

        et dans ce jeu, on obtient par la séquence précédente un tableau auquel je ferai correspondre la combinaison de chiffres uniques ainsi que des variables.
        on a plusieurs équations dont par exemple
        d/dt ([H2])= CC*sig2*v(e)*[H2]*[e] + CC* k(e)*[H3+]*[e].
        d/dt est la dérivée par rapport à t.
        [H2], [e]... sont les variables associéesà H2, e...
        CC vaut -1 si variable à gauche dans l'équation et +1 si droite

        L'idée serait que ma combinaison unique de chiffres me ferait aller dans un nouveau fichier(1,2,3,2,2) qui me calculerait au besoin sig2*v(e) ou encore k(e) dans un autre fichier pour enfin les sommer dans la variable correspondant
        à d/dt ([H2]).
        Donc est-ce que cela veut dire qu'en retour dans chaque fichier je dois créer une variable qui portera, dans tous, le même nom comme "tot"
        et que dans le programme qui gère l'ensemble, je ferai pour la variable "d/dt ([H2])", "d/dt ([H2])"="tot".
        C'est ma première idée mais je ne sais comment elle est.
        J'ai une deuxième question, il y a une troisème partie qui consiterait à calculer la dérivée mathématique de d/dt ([H2]) par rapport à [H3+] par exemple et je ne trouve pas de subroutine pour faire ce type de calcul et je me demandais s'il en existais ou si tu en connaissais.
        C'est assez embêtant en même temps parce que "d/dt ([H2])" est une variable et non pas une fonction donc je ne sais même si la subroutine existe, si le résultat ne serait pas 0. Désolé, ça fait beaucoup de questions.
        Merci pour tout.
        elnilam
        0
  10. elnilam Messages postés 41 Statut Membre 1
     
    C'est encore² moi,
    pour la dérivée de la fonction, on m'a conseillé de faire une dérivée numérique (je pensais implcitement à quelque chose d'analytique compliqué) avec un calcul type [f(H3+ + Dt(H3+))-f(H3+ - Dt(H3+))] / 2Dt(H3+)
    elnilam
    0
  11. cchristian Messages postés 928 Statut Membre 131
     
    Bonjour,

    Je me suis pris un peu au jeu et j'ai poussé un peu plus loin les extensions sur le précédent script.

    Si tu exécutes ce programme tu dois au préalable :

    1) Créer un fichier .txt nommé dans le programme F_FORMUL.txt (paragraphe PARAMETER) dans le même dossier que l'exécutable (mon jeu d'essais) :

    H2 + e -> H2+ + e + e 
    H1 + a -> H2+ + a + a
    H3 + b -> H4+ + b + b
    H5 + c -> H6+ + c + c
    H7 + d -> H8+ + d + d
    H2 + abcde -> H2+ + e + x +

    (Attention à ne pas laisser de ligne(s) blanche surtout la dernière )

    2) Si tu souhaites changer la transcodification (type H2 <=> nn) tu dois intervenir sur les tables TABLE_GRP et TABLE_VAL_GRP directement dans le programme. A terme il faudrait créer un fichier paramètres dont les valeurs seraient chargées dans les tableaux)

    NB : Chaque caractère ou groupe de caractères d'une formule retenu sera transcodé avec une valeur numérique constituée par deux positions numériques au maximum (0 à 99 ) c'est peut-être un handicap, dans ce cas il faudra revoir la séquence de transcodification.
    Exemple : 
    H2 + e -> H2+ + e + e     ==>    H2 e H2+ e e   ==>    1314031414   
    (si le nb. de positions est impair,  le zéro en tête est implicite ex: 102030202)

    - Les instructions écrites en minuscule dans le programme sont utiles pour effectuer les tests. Elles pourront être éliminées. Certaines sont en Commentaire afin de ne pas surcharger l'affichage des résultats à l'écran, elles peuvent être débloquées .
    Exemple d'affichage pour contrôles d'une formule (1 enregistrement du fichier)
    H2 + e -> H2+ + e + e
    
    TAB_INT_VAL :  13 14 3 14 14 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
    -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
    
    TAB_FORM_INIT              : H2 + e -> H2+ + e + e
    TAB_FORM     1er niveau (compactag): H2 e H2+ e e
    TAB_VAL_NUM  2em niveau (numÚrique):  1314031414
    TAB_CHAR_NUM 3em niveau (alphanum.): 1314031414


    j'ai laissé quelques commentaires généraux dans le programme que tu peux ignorer.

    Voilà j'espère t'avoir tout écrit, sinon si tu as des questions n'hésite pas.

    --------------------------------------------------------------------------------------------------------------------------------------------------
    C     NOM:         FORTRANS.                                  
    C     AUTEUR:      CH.
    C     LANGAGE:     FORTRAN 77. 
    C     DESCRIPTION: Force 2.0  (G77)
    C     DATE:        Début le 02/06/2008   
    C     Références :
    C 
    C(FIV)   Livre : fortran IV de M. DREYFUS         (DUNOD Paris 1970)       
    C(ILF)   Livre : Initiation au langage fortran    (DUNOD Paris 1970)  
    C(IBM)   IBM : Common Programming interface-FORTRAN Référence (1990)
    C
    C(WE1)   https://perso.imt-mines-albi.fr/~gaborit/lang/CoursDeFortran/
    C(WE2)   https://docs.oracle.com/pls/topic/lookup?ctx=dsc&id=/app/docs/doc/802-2998/6i6u3logs?a=view
    C     __________________________________________________________________
    C
    C     Ce programme n'a aucun objectif fonctionel particulier, il se 
    C        propose d'effectuer, après les avoir isolés, une transcodifica-
    C        tion de groupes de caractères présents dans une chaîne de car-
    C        actères (formules). 
     
           PROGRAM  FORTRANS
    
    C--------------------              
    C                                              Character Type (p.20 IBM)     
           CHARACTER      C0_TEST*80  /' '/
           CHARACTER      C1_TEST*64  /' '/
           CHARACTER      C_XX         /' '/
           CHARACTER(*)   IO_ORDRE*16
           CHARACTER      F_NAME_IN*16,      NOM_PGM*8  
           CHARACTER      FMT_VAL*32         
    
    C       CHARACTER*8    HEURE
    C                                                Numéric Type (p.15 IBM)     
           INTEGER        NB_POSTES     /1/, NB_POSTES_VALID     /1/
           INTEGER        DATA_UT_IN    
           INTEGER        IO_RC         /0/
           INTEGER        CPT_ENREG     /0/
           INTEGER        IND_GRP       /0/
           INTEGER*8      INT_CALCUL    /0/
           INTEGER        IND_INTERM    /0/
           INTEGER        IS_KO_OK      /0/
           INTEGER        INDIC_ANOM    /0/ 
    C----------------------------------------------------------------------- 
    C                                                  Constantes (p.40 IBM)     
           PARAMETER  (
         S             DATA_UT_IN  = 10,
         S             F_NAME_IN   = 'F_FORMUL.txt',
         S             FMT_VAL     = '(I10)',
         S             NOM_PGM     = 'FORTRANS')
    
    C-----------------------------------------------------------------------              
    C                                    Déclaration des tableaux (p.21 IBM)     
    
    C                                    
           DIMENSION    TAB_GRP     (256) !Tableau des groupes de   
           CHARACTER    TAB_GRP*32        ! caractères et signes valides. 
    
           DIMENSION    TAB_VAL_GRP (256) !Tableau des valeurs affectées aux 
           INTEGER      TAB_VAL_GRP       ! groupes de caractères et signes 
    
    
    C     Tableau de stockage résultats intermédiaires:TAB_GRP<=>TAB_VAL_GRP 
           INTEGER      TAB_INT_VAL (32)  ! .
    	   
    	  
    C      Tableaux de stockage.
           DIMENSION  TAB_FORM_INIT (256) !Tableau des formules d'origine. 
           CHARACTER  TAB_FORM_INIT*80    !(idem fichier)   
                                                           
    C      Tableaux de stockage des résultats des transcodifications.
           DIMENSION  TAB_FORM      (256)
           CHARACTER  TAB_FORM*32     !Tableau des formules sans opérateurs.
    
           INTEGER*8  TAB_VAL_NUM   (256) !Tableau des valeurs<=>formules
                      
           DIMENSION  TAB_CHAR_NUM  (256) !Tableau des valeurs des formules
           CHARACTER  TAB_CHAR_NUM*32     !en mode caractères.
    
    C-----------------------------------------------------------------------              
    C                                                        DATA (p.44 IBM)       
    			    
    C --------------------------------------------------------------------
    C      LES 2 TABLEAUX SUIVANTS SONT A RENSEIGNER OU A VERIFIER AVANT
    C          TOUT NOUVEAU TRAITEMENT. 
    
    C      Taleaux de définition des codes et des équivalences numériques. 
           DATA     (TAB_GRP        (K), K = 1,22,1)               /
    C      Les(groupes de)caractères suivants génèrent une transcodification 
         S                    'H1', 'a', 'H2+', 'H3', 'b', 'H4+',
         S                    'H5', 'c', 'H6+', 'H7', 'd', 'H8+',
         S                    'H2', 'e', 'abcde', 'x',
    C      '£' Borne identifiant la fin des groupes de c. à transcoder.        
         S                              '£', 
    C      Les (groupes de) caractères suivants ne génèrent aucune transco. 
         S                     '->', '+', '-', ' ',
         S                              '$'                        /
    C      '$' Borne identifiant la fin du tableau.        
    
    C      Equivalences numériques (POSITIONNELLES avec TAB_GRP ex: H2+ = 03):
    C      Taleaux de définition des équivalences numériques. 
    C      --------------------- ATTENTION ----------!2 CHIFFRES AU MAXIMUM
           DATA     (TAB_VAL_GRP    (K), K = 1,16,1)                /
         S                      01,  02,  03,   04,   05,  06,
         S                      07,  08,  09,   10,   11,  12,
         S                      13,  14,  15,   16                /
    
    C -----------------------------------------------------------
    C      Taleaux de stockage des résultats de transcodification
    C -----------------------------------------------------------
    
           DATA     (TAB_INT_VAL    (K), K = 1,32,1)   /32  * -1 /
    
           DATA     (TAB_FORM_INIT  (K), K = 1,256,1)  /256 * ' '/ 
    
           DATA     (TAB_FORM       (K), K = 1,256,1)  /256 * ' '/
    
           DATA     (TAB_VAL_NUM    (K), K = 1,256,1)  /256 * 0  /
    
           DATA     (TAB_CHAR_NUM   (K), K = 1,256,1)  /256 * ' '/
    
    C----------------------------------------------------------------------- 
    C      Appel de sous programmes externes :            
    C                  -----------------------------------------------------
    C                  Modification de la taille de la fenetre Windows (DOS)     
     
           CALL SYSTEM ('MODE CON COLS=150 LINES=90' )
           
           PRINT *, NOM_PGM
    
    C-----------------------------------------------------------------------    
     
    
    C      Recherche la position de la borne £ de fin des groupes à retenir.        
           NB_POSTES_VALID   =  1 
           DO WHILE ( TAB_GRP (NB_POSTES_VALID) (1:1)  .ne.   '£')
             NB_POSTES_VALID =  NB_POSTES_VALID  +  1
           END DO     
    
    C      Recherche la position de la borne $ de fin du tableau.        
           NB_POSTES         =  1 
           DO WHILE ( TAB_GRP (NB_POSTES) (1:1)  .ne.   '$')
             NB_POSTES       =  NB_POSTES  +  1
           END DO     
           
           print 1000
           print 1010
      
           IO_ORDRE                       = 'OPEN_IN'        
           OPEN      (UNIT   = DATA_UT_IN,     IOSTAT = IO_RC, 
         S            FILE   = F_NAME_IN,      STATUS = 'OLD',
         S            ACCESS = 'SEQUENTIAL',   FORM   = 'FORMATTED', 
         S            ERR    = 15)
    
           IO_ORDRE                        = ' READ_IN'
    C      Boucle de lecture des enregistrements du fichier des formules.         
           DO  WHILE  (IO_RC  ==  0)           
             READ   (UNIT   = DATA_UT_IN,      FMT    = 500,
         S           IOSTAT = IO_RC ,          ERR    = 15)
         S	         C0_TEST
    
             IF     (IO_RC    .eq.    -1)                            THEN
               PRINT *,F_NAME_IN,     ': Fin normale de fichier RC : ',
         S                            IO_RC ,  ' SUR ORDRE :',   IO_ORDRE  
               PRINT *,F_NAME_IN,     ': Nb. d''enregistrements lus : ',
         S                            CPT_ENREG             
             ELSE
               CPT_ENREG                   =  CPT_ENREG  +  1
               TAB_FORM_INIT (CPT_ENREG)   =  C0_TEST
               IS_I                        =  1
               ICPT_CAR                    =  0
               ISAVE_CPT_CAR               =  0
               ISAVE_POS                   =  1
               IPOS_TRANS                  =  0
    C          Boucle d'exploration des caractères d'une même formule.             
               DO WHILE           (IS_I     <=    LEN (C0_TEST) )
      	     C_XX                      =  C0_TEST   (IS_I:1)
    	     IF (C_XX    .eq. ' '   .AND. IS_I  <  LEN(C0_TEST))   THEN
    C              Extraction de l'enregistrement lu le(s) c. d'un groupe
                   IF (ICPT_CAR            >  0)                       THEN  	        
    	          C1_TEST (1:ICPT_CAR) = 
         S	                  C0_TEST     (ISAVE_POS:ISAVE_POS + ICPT_CAR)
    	          ISAVE_POS            =  IS_I      +   1  
                      ISAVE_CPT_CAR        =  ICPT_CAR 
                      ICPT_CAR             =  0 
                   END IF		   		   
    	     ELSE
                   ICPT_CAR                =  ICPT_CAR   +   1
    	       IF (C1_TEST    (1: 1) .ne. ' '      .OR. IS_I == 1) THEN
    C       write (*,'(47X,A,A)') 'CONTENU DE C1_TEST: ', C1_TEST
    C                 Recherche d'égalité entre TAB_GRP <=> groupe en cours.          
                      CALL CHERCH_GRP (C1_TEST,   TAB_GRP,         IS_KO_OK,
         S                             NB_POSTES, NB_POSTES_VALID, IPOS_GRP)
                      IF          (IS_KO_OK ==  1)                     THEN
    	             IND_GRP            =  IND_GRP    +   1   
                         TAB_FORM (CPT_ENREG) = 
         S                         TAB_FORM   (CPT_ENREG) (1:IPOS_TRANS)  // 
         S    	               C1_TEST    (1:ISAVE_CPT_CAR)
                         IPOS_TRANS         = IPOS_TRANS + ISAVE_CPT_CAR + 1 
    C	             Correspondance groupe <=> valeur numérique
                         TAB_INT_VAL (IND_GRP) = TAB_VAL_GRP (IPOS_GRP) 		    
                      ELSE                     
                         IF       (IS_KO_OK ==  0)                     THEN
                           INDIC_ANOM       =  1 
                         END IF
                      END IF
    	          C1_TEST               = ' '
    	       END IF
    C       print  *,  'Le caractere ',  C_XX,  '  se trouve en  ', 
    C     S             IS_I, ' eme position. '
                 END IF 
                 IS_I                       =  IS_I      +   1   
               END DO             ! Fin de la Boucle d'exploration des c..
           
           print *,' '
           print *, C0_TEST (1:80)
           if (INDIC_ANOM                    == 0 )                    then 
           print *, ' '
           print *,'TAB_INT_VAL : ',TAB_INT_VAL                      
           print *, ' '
           end if
           
    	   IND_GRP                      =  0
               INT_CALCUL                   =  0
               IND_INTERM                   =  0
               IDIX                         =  1
    	   II                           =  LEN (TAB_GRP  (1) )
               IF (INDIC_ANOM               == 1 )                    THEN 
    	      II                        =  0
    	   END IF
    C          Interprétation et cumul des valeurs associées à chaque groupe	            
               DO  WHILE           ( II     >  0 )
    C       print *, 'TAB_INT_VAL  (II) ',TAB_INT_VAL  (II), ' II ',II      
                 IF (TAB_INT_VAL   (II)     >  -1)                     THEN
                     IRANG                  =  TAB_INT_VAL   (II) 
    		  IF ( IRANG    >  10 .AND. INT_CALCUL  .ne.  0)   THEN                     
                         DO  WHILE (IRANG   >  10 )
                           IRANG            =  IRANG       /   10
                           IND_INTERM       =  IND_INTERM  +  1
                         END DO  
                      ELSE   
                         IF (IDIX  .ne.  1)                            THEN
    		        IND_INTERM      =  IND_INTERM  +  1
    	 	     END IF        
                      END IF
    C       print *,' ================================ II ', 10**IND_INTERM,
    C     S         'IND8INTERM ', IND_INTERM  
    C                 Cumul des valeurs numériques(en fonction de leur rang)                   
                      INT_CALCUL            =  INT_CALCUL          +     (
         S		                           TAB_INT_VAL   (II)  *  (
         S                                     IDIX**IND_INTERM       )  )
    		  IDIX                  =  10      
                      IND_INTERM            =  IND_INTERM  +  1
                      TAB_INT_VAL     (II)  =  0
                 END IF
                 II                         =  II          -  1 
               END DO
               TAB_VAL_NUM   (CPT_ENREG)    = INT_CALCUL
    C          Traduction des valeurs numériques en valeur caractère(format)
               WRITE    (TAB_CHAR_NUM   (CPT_ENREG),    FMT_VAL) 
         S	             TAB_VAL_NUM    (CPT_ENREG) 
             
           if (INDIC_ANOM                    == 0 )                    then 
           print *,                      
         S 'TAB_FORM_INIT              : ',TAB_FORM_INIT(CPT_ENREG) (1:36),   
         S 'TAB_FORM     1er niveau (compactag): ',TAB_FORM     (CPT_ENREG),   
         S 'TAB_VAL_NUM  2em niveau (numérique): ',TAB_VAL_NUM  (CPT_ENREG),  
         S 'TAB_CHAR_NUM 3em niveau (alphanum.): ',TAB_CHAR_NUM (CPT_ENREG)
           end if
    C       print *,C0_TEST (1:IPOS_TRANS + 30),
    C       print *,C0_TEST (1:80),
    C     S  ' APRES ELIMINATION DES C.SPECIAUX:  ',TAB_FORM(CPT_ENREG)
           print *, ' '
    
              END IF                ! Fin normale de fichier
           END DO                   ! Fin de la Boucle de lecture du fichier
    
    
           IO_ORDRE                         = 'CLOSE_IN'        
           CLOSE       (UNIT   = DATA_UT_IN,     IOSTAT = IO_RC,
         S              ERR    = 15,             STATUS = 'KEEP')
    
     
           IF (INDIC_ANOM                   == 1 )                    THEN 
    	   II                           =  1 
               DO  WHILE           ( II     <  5 )
    	   WRITE (*, '(//, A)')  'UNE OU PLUSIEURS ANOMALIE(S) ONT ETE '
         S           // 'DETECTEE(S) LE TRAITEMENT EST ERRONE.'
               II                           =  II    +    1      	  
    	   END DO
           END IF                        
    
           pause
    
           print *, ' '
           print *, 'TAB_FORM_INIT : Table des formules avec operateurs : '
           IS_I             = 1
           do while (IS_I   <=  CPT_ENREG )
               print *, TAB_FORM_INIT (IS_I) 
    	   IS_I         = IS_I  +  1 
           end do
    
           print *, ' '
           print *, 'TAB_FORM : Table des formules sans operateurs : '
           IS_I             = 1
           do while (IS_I   <=  CPT_ENREG )
               print *, TAB_FORM (IS_I) 
    	   IS_I         = IS_I  +  1 
           end do
    
           print *, ' '
           print *, 'TAB_VAL_NUM : Table des valeurs des formules : '
           IS_I             = 1
           do while (IS_I   <=  CPT_ENREG )
               print *, TAB_VAL_NUM (IS_I) 
    	   IS_I         = IS_I  +  1 
           end do
    
           print *, ' '
           print *, 'TAB_CHAR_NUM : Table des valeurs des formules : '
           IS_I             = 1
           do while (IS_I   <=  CPT_ENREG )
               print *, TAB_CHAR_NUM (IS_I) 
    	   IS_I         = IS_I  +  1 
           end do
    
    C       print *, '=>',TAB_FORM (CPT_ENREG),'<= IPOS_TRANS ', IPOS_TRANS,
    C     S ' ISAVE_CPT_CAR ',ISAVE_CPT_CAR, '==>',C1_TEST (1:ISAVE_CPT_CAR),  
    C     S '<== ICPT_CAR ',ICPT_CAR
    C       print *, ' '           
    
    C-----------------------------------------------------------------------              
    C                                    -----------------------------------              
    C                                    FORMAT (p 92 IBM) (p 77 fortran IV)
    500       FORMAT (A80                                               )
    1000      FORMAT (
         S        '0        1         2         3         4         5     ',
         S        '    6         7         8'                           )
    1010      FORMAT (
         S        '1---5----0----5----0----5----0----5----0----5----0----5',
         S        '----0----5----0----5----0', /                        )
    
    
           GO TO 110
           
    15     PRINT *,' '
           PRINT *, 'ANOMALIE ENTREE/SORTIE FS : ',    IO_RC, ' SUR ORDRE :'            
         S         ,IO_ORDRE 
    110    CONTINUE   
    
           STOP
           END 
    
    C-----------------------------------------------------------------------              
    C         S.P. de recherche d'égalité entre TAB_GRP <=> groupe en cours.          
    
           SUBROUTINE   CHERCH_GRP  ( GRP, TAB_GRP,    IS_KO_OK,  NB_POSTES,
         S                            NB_POSTES_VALID, IS_POS_GRP  )
    
           CHARACTER    GRP*64
    
           INTEGER      IS_POS_GRP    
    
           DIMENSION    TAB_GRP     (256) !Tableau des groupes de   
           CHARACTER    TAB_GRP*32        ! caractères et signes valides. 
    
           DIMENSION    TAB_VAL_GRP (256) !Tableau des valeurs affectées aux 
           INTEGER      TAB_VAL_GRP       ! groupes de caractères
    
           IS_KO_OK                  =   2
           IS_POS_GRP                =   1             
    
           DO  WHILE    (IS_POS_GRP  <   NB_POSTES                 .AND. 
         S                                   TAB_GRP (IS_POS_GRP) .ne. GRP)
               IS_POS_GRP            =   IS_POS_GRP   +   1
           END DO
    
           IF           (IS_POS_GRP  <   NB_POSTES_VALID)              THEN
             IS_KO_OK                =   1
           ELSE                     
              IF        (IS_POS_GRP  ==  NB_POSTES)                    THEN
           print *, ' NON TROUVE C1_TEST: ', GRP (1:50)
                IS_KO_OK             =  0
              END IF
           END IF 
     
           RETURN
           END

    0
    1. elnilam Messages postés 41 Statut Membre 1
       
      Bonjour,
      comment dire..j'avais commencé un truc mais à la vue de sa longueur je me demande si j'ai bon
      ça donnait ceci

      DO I=1,6
      TAB_COR(I,1)=TAB_GRP(I)
      TAB_COR(I,2)=I
      ENDDO

      nb_equa=9
      c l'idée de cor_num_reactions.ini est de créer un jeu unique (1,2,3,1,1)
      c par ex. correspondant à une réaction et de créer un fichier avec ce nom.
      OPEN (UNIT=777,FILE='cor_num_reactions.ini')
      OPEN (UNIT=555,FILE='reactions.ini',STATUS='OLD')
      DO I=1,nb_equa
      READ(555,*) C0_TEST*256

      IS_I = 1
      C Compteur de caractères d'un groupe
      ICPT_CAR = 0
      C Position dans la chaine du 1er ou du seul caractère d'un groupe.
      ISAVE_POS = 1
      DO WHILE(IS_I.LE.LEN(C0_TEST))
      C_XX = C0_TEST(IS_I : 1)
      IF(C_XX.EQ.' ') THEN
      C1_TEST(1:ICPT_CAR)=C0_TEST(ISAVE_POS:ISAVE_POS+ICPT_CAR)
      ISAVE_POS = IS_I + 1
      ICPT_CAR = 0
      ELSE
      ICPT_CAR = ICPT_CAR + 1
      IF(C1_TEST(1:1).NE.' ') THEN
      WRITE(*,*)'CONTENU DE C1_TEST : ', C1_TEST

      c petit changement ci-après
      C Simulation de la recherche du groupe de caractères en table

      DO I=1,6
      TEST_CHARA=TAB_GRP(I)
      IF(C1_TEST.EQ.TEST_CHARA) THEN
      WRITE(*,*)'OK, on trouve', C1_TEST
      WRITE(777,*) TAB_COR(I,2) ! pour le fichier unique
      END IF
      ENDDO

      C1_TEST = ' '
      END IF
      WRITE(*,*) C_XX,'se trouve en',IS_I, 'eme position' ! pas obligé
      END IF
      IS_I = IS_I + 1
      ENDDO
      CLOSE(555)
      CLOSE(777)

      ...comment dire?
      merci
      elnilam
      ps:
      j'en ai pour un bout de temps de tout assimiler
      0
  12. elnilam Messages postés 41 Statut Membre 1
     
    toujours moi,
    j'ai une petite question:

    C Appel de sous programmes externes :
    C -----------------------------------------------------
    C Modification de la taille de la fenetre Windows (DOS)

    CALL SYSTEM ('MODE CON COLS=150 LINES=90' )
    je suis en LINUX mais surtout est ce que c'est juste pour mieux voir ou c'est dans "l'ntérêt " du programme?
    elnilam
    0
  13. cchristian Messages postés 928 Statut Membre 131
     
    oui c'est pour agrandir la console, tu peux virer !
    0
  14. cchristian Messages postés 928 Statut Membre 131
     
    Bonjour,

    Un rectificatif à mon précédent post (rien qui ne vient perturber la logique d'exécution principale) :
    Les tests de fin de boucle et la variable LONG_TABS (en gras) ont été ajoutés pour le cas où l'un des délimiteurs (£, $ où les deux) serait absent ou invalide. D'autres contrôles pourraient d'ailleurs être ajoutés; par exemples ceux concernant la cohérence du nombre d'élément (ici 256) de chacune des tables comparé avec le nombre d'éléménts des autres tables.

    C
           INTEGER        LONG_TABS 
           PARAMETER  (
         S             DATA_UT_IN  = 10,
         S             F_NAME_IN   = 'F_FORMUL.txt',
         S             FMT_VAL     = '(I10)',
         S             LONG_TABS   = 256,
         S             NOM_PGM     = 'FORTRANS')
    
          Recherche la position de la borne £ de fin des groupes à retenir.        
           NB_POSTES_VALID   =  1 
           DO WHILE ( TAB_GRP (NB_POSTES_VALID) (1:1)  .ne.   '£')
             NB_POSTES_VALID = NB_POSTES_VALID  +  1
             IF (NB_POSTES_VALID > LONG_TABS)                     THEN
               PRINT *,'ABSENCE DE BORNE DE FIN DE GROUPE (£) TABLE TAB_GRP'
    	   STOP          END IF   
           END DO     
    
    
    C      Recherche la position de la borne $ de fin du tableau.        
           NB_POSTES         =  1 
           DO WHILE ( TAB_GRP (NB_POSTES)       (1:1)  .ne.   '$')
             NB_POSTES       = NB_POSTES        +  1
             IF (NB_POSTES     > LONG_TABS)                     THEN
               PRINT *,'ABSENCE DE BORNE DE FIN DE GROUPE ($) TABLE TAB_GRP'
    	   STOP 
             END IF   
           END DO


    Désolé, je n'avais pas vu ton avant-dernier message !
    0
    1. elnilam Messages postés 41 Statut Membre 1
       
      Bonjour,
      il ne faut pas être désolé.
      Si j'ai bien compris je dois mettre un £ à chaque fin de lignes de formules et un $ à la fin de toutes.
      Ca fait cher le tableau si je mets 200 formules.
      merci.
      elnilam
      0
    2. elnilam Messages postés 41 Statut Membre 1
       
      Encore moi,
      J'ai une question sur le programme,
      voilà, il y a la variable IND_GRP qui est initialisé à zéro puis IND_GRP=IND_GRP+1.
      Est-ce-qu'il s'agirait bien du numéro de la ligne dans le fichier FORMUL_F.txt d'une réaction?
      Tout de suite, je tente de séparer les réactants (à gauche de ->) des produits (à droite de ->), et je crée deux vecteurs
      react(i,j) et prod(i,j) ou j est IND_GRP et i le numéro associé à un élément par exemple H2+=03.
      Ca va me servir quand je vais écrire d/dt (H2+)= 2*H*e +...-..
      comme je ferai:

      COMPT=0
      DO j=1,IND_GRP
      DO i=1,16 ! nombre d'éléments
      IF(react(i,j)==03) COMPT=COMPT-1
      IF(prod(i,j)==03) COMPT=COMPT+1
      ENDDO
      ENDDO
      Ce qui me donne mon coefficient 2 ou -1...

      elnilam
      0
  15. cchristian Messages postés 928 Statut Membre 131
     
    Bonjour,

    Si j'ai bien compris je dois mettre un £ à chaque fin de lignes de formules et un $ à la fin de toutes.

    Non, il n'y a (dans mon scénario) qu'un seul £ et un seul $. £ indique la fin de ce que j'appelle les groupes de caractères qui génèrent une transcodification (tels H2, H2+, e ......) par opposition aux autres "encadrés" dans la table par ces deux signes, qui eux, ne génèrent pas de transcodification (tels les signes '->', '+',.......). Cela permet à la logique du programme d'identifier pour une même formule les groupes de caractères significatifs à transcoder de ceux qui ne le sont pas.
    Ta question génère quelques doutes dans mon (petit) esprit concernant les cas de figures possibles. Je m'explique, ce procédé sous-entend que pour 2 ou plusieurs formules distinctes un même groupe (H2 par exemple), présent dans chacune d'elles, sera transcodé avec la même valeur ( H2 vaut 13 dans mon scénario) déterminée une fois pour toutes dans les tableaux TAB_GRP et TAB_VAL_GRP, et ce pour un lot de formules présentes dans le fichier F_FORMUL.txt (donc pour un même traitement).

    Exemples :

    TAB_FORM_INIT : H2 + e -> H2+ + e + e
    TAB_FORM 1er niveau (compactag): H2 e H2+ e e
    TAB_VAL_NUM ............................................
    TAB_CHAR_NUM 3em niveau (alphanum.): 1314031414

    TAB_FORM_INIT : H2 + abcde -> H2+ + e + x +
    TAB_FORM 1er niveau (compactag): H2 abcde H2+ e x
    TAB_VAL_NUM ............................................
    TAB_CHAR_NUM 3em niveau (alphanum.): 1315031416

    P.S. Cela fait cher le tableau .........
    Quand on aime on ne compte pas ................... C'est un tableau de Maître !
    0
  16. cchristian Messages postés 928 Statut Membre 131
     
    J'ai une question sur le programme,
    voilà, il y a la variable IND_GRP qui est initialisé à zéro puis IND_GRP=IND_GRP+1.
    Est-ce-qu'il s'agirait bien du numéro de la ligne dans le fichier FORMUL_F.txt d'une réaction?
    Tout de suite, je tente de séparer les réactants (à gauche de ->) des produits (à droite de ->), et je crée deux vecteurs
    react(i,j) et prod(i,j) ou j est IND_GRP et i le numéro associé à un élément par exemple H2+=03.
    Ca va me servir quand je vais écrire d/dt (H2+)= 2*H*e +...-..
    comme je ferai:


    Là j'ai un peu de mal à suivre, les maths ............
    Par contre je crois pouvoir te confirmer que IND_GRP dans la séquence en question référence bien ce que tu énonces comme : numéro de la ligne dans le fichier FORMUL_F.txt d'une réaction c'est à dire ce que j'appelle un groupe de caractères identifié, à ce niveau du programme, comme transcodable et donc à transcoder.

    Ai-je bien répondu ?
    0
    1. elnilam Messages postés 41 Statut Membre 1
       
      Bonjour Cchristian,
      oui, c'est ce que je voulais savoir.
      merci

      ps: c'est de la chimie et un peu de maths et un peu de physiques.
      0
      1. cchristian Messages postés 928 Statut Membre 131 > elnilam Messages postés 41 Statut Membre
         
        Je n'ai rien étudié de tout ça !........... Alors forcément j'ai fait un amalgame => maths, pour le profane c'est un truc fourre-tout bien pratique.
        0
  17. cchristian Messages postés 928 Statut Membre 131
     
    Bonjour,

    Ton message du 02/06/2008 à 16h39.

    Bonjour,
    comment dire..j'avais commencé un truc mais à la vue de sa longueur je me demande si j'ai bon
    ça donnait ceci

    DO I=1,6
    TAB_COR(I,1)=TAB_GRP(I)
    ........................
    c l'idée de cor_num_reactions.ini est de créer un jeu unique (1,2,3,1,1)
    c par ex. correspondant à une réaction et de créer un fichier avec ce nom.


    Je l'ai fait tourner c'est correct, je n'ai pas eu grand chose à faire pour l'installer.

    Je te signale que j'ai une nouvelle version du programme avec création d'un fichier par formule. Alors si tu es intéressé ?
    J'en ai profité pour refondre la séquence d'instructions qui effectue la transco des formules en nom/bre (de fichiers). Elle n'est plus soumise à la contrainte des 2 chiffres par groupes de caractères (par ex: 01 pour 1) et de plus elle admet des valeurs supérieures à 99 pour la numérotation de ces groupes (par ex: H2 = 100) . Mais ce dernier point n'est peut-être pas intéressant ?

    ---
    Cordialement.

    Cchristian.
    0
  18. elnilam Messages postés 41 Statut Membre 1
     
    Bonjour Cchristian,
    merci pour avoir passé du temps sur une nouvelle façon d'écrire le programme, pour l'instant je suis sur celle-ci et por l'instant ça va.
    Je crois que j'ai une nouvelle approche où je fait défiler mes réactions avec le "compteur d'équations" IND_GRP du code fortran.
    A ce propos, je voudairs créer mes tableaux react(i,j) et prod(i,j) qui correspondent respectivement aux termes à gauche et à droite de "->" dans les réactions. J'ai un doute du lieu et comment les placer.
    voilà, je voudrais les placer àcette endroit dans le code **en ayant créer au préalable "un séparateur gauche-droite" ****

    **
    C PRINT *, 'LE CARACTERE ', C_XX, ' SE TROUVE EN ',
    C S IS_I, ' EME POSITION. '

    ****
    NB_POSTES_FLECHE = 1
    DO WHILE ( TAB_GRP (NB_POSTES_FLECHE) (1:1) .NE. '->')
    NB_POSTES_FLECHE = NB_POSTES_FLECHE + 1
    ENDDO

    Ensuite pour remplir mes tableaux je ferais:

    c i1=1, i2=1 en dehors de la boucle sur une ligne de réaction

    IF( IS_I .LT.NB_POSTES_FLECHES) THEN
    react(i1,ind_grp)=C_XX
    i1=i1+1
    ELSE
    prod(i2,ind_grp)=C_XX
    i2=i2+1
    ENDIF

    Je ne sais pas ce que tu en penses, c'est surtout que je me demande si c'est bon, parce que c'est une idée "pas sûre" quant à l'emplacement et la justesse de ce que j'ai écrit..
    Sinon, j'aimerais créer des variables associées à mes caractères ou bien les valeurs numériques mai là je coince .
    Est ce que tu peux encore m'aider?
    D'avance merci.
    elnilam.
    0
  19. cchristian Messages postés 928 Statut Membre 131
     
    Bonjour,

    NB_POSTES_FLECHE = 1
    DO WHILE ( TAB_GRP (NB_POSTES_FLECHE) (1:1) .NE. '->')
    NB_POSTES_FLECHE = NB_POSTES_FLECHE + 1
    ENDDO

    Es-tu certain que c'est TAB_GRP ? Car si c'est bien cette table alors je n'ai pas compris ce que tu souhaites faire.
    0
    1. elnilam Messages postés 41 Statut Membre 1
       
      En fait je souhaite séparer ce qu'il y a gauche de "->" de ce qu'il y a droite. Pour cela je repère "->" avec les lignes suivantes
      NB_POSTES_FLECHE = 1
      DO WHILE ( TAB_GRP (NB_POSTES_FLECHE) (1:1) .NE. '->')
      NB_POSTES_FLECHE = NB_POSTES_FLECHE + 1
      ENDDO
      puis si la case de lecture est inférieure je me mets dans react() et supérieure dans prod().
      Normalement, tous les caractères sont dans TAB_GRP.
      elnilam
      0
      1. cchristian Messages postés 928 Statut Membre 131 > elnilam Messages postés 41 Statut Membre
         
        Oui, mais TAB_GRP n'a qu'une fonction de recensements pour transco. des différents codes et signes utilisés dans une formule, avec une particularité c'est qu'elle distingue les codes à transcoder de ceux qui n'ont pas à l'être.
        0
      2. cchristian Messages postés 928 Statut Membre 131 > cchristian Messages postés 928 Statut Membre
         
        Quelques reflexions :

        Dans l'exemple ci-dessous (voir message suivant) avec la séquence :

        NB_POSTES_FLECHE = 0
        DO WHILE ( TAB_GRP (NB_POSTES_FLECHE) (1:2) .NE. '->')
        NB_POSTES_FLECHE = NB_POSTES_FLECHE + 1
        ENDDO

        tu vas te retrouver avec NB_POSTES_FLECHE = 18 (17 est ici le nombre de groupes se trouvant avant le ->)
        On peut toujours faire remonter le symbole -> dans la catégorie des groupes à transcoder de la table TAB_GRP (pourquoi pas !) et le positionner en bonne place relativement aux nombre de groupe(s) qui doivent le précèder, et ce par traitement (notons qu'il serait plus simple d'entrer un paramètre, une valeur du type NB_POSTES_FLECHE = n en "dur" dans le programme ou à partir d'un fichier "paramètres"). Si cette organisation (ou assimilée) est retenue il est nécessaire de retoucher le programme afin de ne pas considérer le symbole -> comme faisant partie des symboles à transcoder. Enfin je le présume.
        Mais cette façon de faire suppose que toutes les formules (venant du fichier) aient impérativement cette organisation. Par exemple pour un même traitement il serait impossible d'avoir dans le fichier en entrée des formules présentant la différence de physionomie suivante (2 suffisent à l'illustration) :
          H2 + E -> H2+ + E + E   
          H2 + E  +  x -> H2+ + E + E" 
        avec TAB_GRP :
           DATA     (TAB_GRP   (K), K = 1,13,1)  /'H1',, 'H2+', '->, . . . . /'

        car le calcul : NB_POSTES_FLECHE = NB_POSTES_FLECHE + 1 donnerait NB_POSTES_FLECHE = 3 (2 groupes le précédant) ce qui est vrai pour la 1ere formule mais pas pour la seconde.
        Encore une fois est-ce la bonned table (TAB_GRP) que tu considères dans ton raisonnement et ne srait-ce pas plutôt de :
        TAB_FORM_INIT : Table des formules avant compactage:
        H2 + E -> H2+ + E + E (nb.groupes avant -> 3 y compris les opérateurs)
        où bien de
        TAB_FORM : Table des formules sans operateurs :
        H2 + E H2+ + E + E (nb.groupes avant -> 2 sans les opérateurs)

        Car dans la suite de ton code :
        IF( IS_I .LT.NB_POSTES_FLECHES) THEN 
        react(i1,ind_grp)=C_XX 
        i1=i1+1 
        ELSE 
        prod(i2,ind_grp)=C_XX 
        i2=i2+1 
        ENDIF 
        tu renseignes tes tableaux avec les parties d'une "ligne de réaction" situées à droite et gauche du symbole -> en utilisant C_XX et ce à concurrence du nombre de groupes (NB_POSTES_FLECHES) que tu as déterminés dans la séquence précédente.
        C_XX est bien la variable CHARACTER qui par définition contient 1 seul caractère d'une ligne de réaction ? Si c'est le cas en reprenant mon exemple précédent tu renseignerais reac (i1,..) avec les 2 (ou 3) premiers caractères des formules (H2 dans mon exemple) et le reste des caractères irait dans reac (i2,..)Il manque des caractères/groupes dans reac (i1,..) et il y en a trop dans reac (i2,..).
        Le principe est bon à condition de ne pas raisonner avec la table TAB_GRP mais avec l'une ou l'autre des 2 tables
        TAB_FORM_INIT ou TAB_FORM.

        Voilà donc quelques reflexions mais je ne perçois pas suffisamment le problème dans son ensemble pour être plus précis.

        A demain,
        0
  20. cchristian Messages postés 928 Statut Membre 131
     
    Complément d'information sur les tables du programme :

    1) Tableaux de paramétrage de la transcodification :

           DATA     (TAB_GRP        (K), K = 1,22,1)               /
    C      Les(groupes de)caractères suivants génèrent une transcodification 
         S                    'H1', 'a', 'H2+', 'H3', 'b', 'H4+',
         S                    'H5', 'c', 'H6+', 'H7', 'd', 'H8+',
         S                    'H2', 'e', 'abcde', 'x',
    C      '£' Borne identifiant la fin des groupes de c. à transcoder.        
         S                              '£', 
    C      Les (groupes de) caractères suivants ne génèrent aucune transco. 
         S                     '->', '+', '-', ' ',
         S                              '$'                        /
    C      '$' Borne identifiant la fin du tableau.        
    
    C      Equivalences numériques (POSITIONNELLES avec TAB_GRP ex: H2 = 03):
    C      Taleaux de définition des équivalences numériques. 
           DATA     (TAB_VAL_GRP    (K), K = 1,16,1)                /
         S                      01,  02,  03,   04,   05,  06,
         S                      07,  08,  09,   10,   11,  12,
         S                      13,  14,  15,   16                /
    
    C --------------------------------------------------------------------


    2) Tableaux (leur contenu) générés par le programme :

    En fin d'exécution voilà ce dont on dispose dans les tables créées par la logique d"exécution) :

    TAB_FORM_INIT : Table des formules avant compactage:
    H2 + H2+ -> H2+ + e + e
    H2 + e -> H2+ + e + e
    H1 + a -> H2+ + a + a
    H3 + b -> H4+ + b + b
    H5 + c -> H6+ + c + c
    H7 + d -> H8+ + d + d
    H2 + abcde -> H2+ + e + x
    
    TAB_FORM : Table des formules sans operateurs  (après compactage):
    H2 H2+ H2+ e e
    H2 e H2+ e e
    H1 a H2+ a a
    H3 b H4+ b b
    H5 c H6+ c c
    H7 d H8+ d d
    H2 abcde H2+ e x
    
    TAB_VAL_NUM : Table des valeurs numériques des formules  (n'est peut-être pas nécessaire?):
    13331414
    131431414
    12322
    45655
    78988
    1011121111
    131531416
    
    TAB_CHAR_NUM : Table des noms de fichiers/formules  (extension paramétrable) :
    13331414.txt
    131431414.txt
    12322.txt
    45655.txt
    78988.txt
    1011121111.txt
    131531416.txt

    Dis moi si tu peux trouver "ton bonheur" dans la structure des données/informations présentes dans cas tableaux;
    0
  21. elnilam Messages postés 41 Statut Membre 1
     
    Bonjour Cchristian,
    Je vais revoir le tout mais à froid je dirais que j'ai encore besoin de TAB_VAL_NUM pour différencier mes éléments dans une boucle DO par exemple. Par contre TAB_CHAR_NUM, je ne suis plus très sûr si j'utilise react() et prod().
    Pour '->' ,je pensais faire comme
    NB_POSTES_VALID = 1
    DO WHILE ( TAB_GRP (NB_POSTES_VALID) (1:1) .NE. '£')
    NB_POSTES_VALID = NB_POSTES_VALID + 1
    IF (NB_POSTES_VALID > LONG_TABS) THEN
    WRITE(*,*)'PAS DE BORNE DE FIN DE GROUPE (£) TABLE TAB_GRP'
    STOP END IF
    ENDDO

    parce que £ ou encore $ ne sont pas trancodés non plus.

    "Le principe est bon à condition de ne pas raisonner avec la table TAB_GRP mais avec l'une ou l'autre des 2 tables
    TAB_FORM_INIT ou TAB_FORM. "
    ça doit être la solution avec TAB_FORM_INIT.
    Effectivement je voulais placer dans rect(i1) plusieurs caractères 'H2' ... ( i1 pour react() et i2 pour prod() )
    Donc en mettant TAB_FORM_INIT à la place de TAB_GRP ca devrait ere bon selon toi?
    0
  • 1
  • 2