Reconnaissance de caractères

Fermé
elnilam Messages postés 38 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 3 mars 2010 - 26 mai 2008 à 15:31
elnilam Messages postés 38 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 3 mars 2010 - 8 août 2008 à 15:56
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.
A voir également:

31 réponses

cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
26 mai 2008 à 16:52
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
elnilam Messages postés 38 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 3 mars 2010 1
27 mai 2008 à 13:50
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
27 mai 2008 à 17:32
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
elnilam Messages postés 38 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 3 mars 2010 1
28 mai 2008 à 17:13
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
28 mai 2008 à 18:05
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
elnilam Messages postés 38 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 3 mars 2010 1
28 mai 2008 à 21:02
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
28 mai 2008 à 23:16
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
elnilam Messages postés 38 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 3 mars 2010 1
29 mai 2008 à 12:47
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
29 mai 2008 à 18:56
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
29 mai 2008 à 19:13
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
elnilam Messages postés 38 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 3 mars 2010 1
30 mai 2008 à 17:48
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
30 mai 2008 à 19:57
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
2 juin 2008 à 11:25
Bonjour,


Rectificatif :

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

H1              a               H2+             H3
b               H4+             H5              c
H6+             H7              d               H8+          e
0
elnilam Messages postés 38 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 3 mars 2010 1
2 juin 2008 à 11:38
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
elnilam Messages postés 38 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 3 mars 2010 1 > elnilam Messages postés 38 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 3 mars 2010
2 juin 2008 à 12:30
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
elnilam Messages postés 38 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 3 mars 2010 1
2 juin 2008 à 13:34
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
2 juin 2008 à 15:11
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
elnilam Messages postés 38 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 3 mars 2010 1
2 juin 2008 à 16:39
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
elnilam Messages postés 38 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 3 mars 2010 1
2 juin 2008 à 17:16
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
2 juin 2008 à 18:28
oui c'est pour agrandir la console, tu peux virer !
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
3 juin 2008 à 10:47
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
elnilam Messages postés 38 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 3 mars 2010 1
3 juin 2008 à 14:07
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
elnilam Messages postés 38 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 3 mars 2010 1
3 juin 2008 à 15:58
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
3 juin 2008 à 17:16
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
3 juin 2008 à 17:58
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
elnilam Messages postés 38 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 3 mars 2010 1
3 juin 2008 à 18:09
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131 > elnilam Messages postés 38 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 3 mars 2010
3 juin 2008 à 19:22
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
5 juin 2008 à 03:23
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
elnilam Messages postés 38 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 3 mars 2010 1
5 juin 2008 à 15:43
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
5 juin 2008 à 17:18
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
elnilam Messages postés 38 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 3 mars 2010 1
5 juin 2008 à 17:24
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131 > elnilam Messages postés 38 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 3 mars 2010
5 juin 2008 à 17:50
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131 > cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012
6 juin 2008 à 02:01
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
5 juin 2008 à 17:41
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
elnilam Messages postés 38 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 3 mars 2010 1
6 juin 2008 à 11:17
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