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
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
A voir également:
- Reconnaissance de caractères
- Caractères ascii - Guide
- Caractères spéciaux symboles clavier - Guide
- Reconnaissance musique en ligne - Guide
- Reconnaissance facial photo - Guide
- Caractères spéciaux - Guide
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
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 ?
.......... 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 ?
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
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 ?
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 ?
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
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
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
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
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
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
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
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
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
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
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.
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 ?
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 ?
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
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
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
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
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.
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
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
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
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 !!!!!!!!!!
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 !!!!!!!!!!
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
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
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
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
30 mai 2008 à 19:57
Bonsoir,
J'ai fait plusieurs tests avec ces enregistrements (jeux d'essais) dans le fichier en entrée :
et une table créée et chargée de cette manière (ou d'une autre manière):
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 :
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 ):
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 ?
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 ?
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
2 juin 2008 à 11:25
Bonjour,
Rectificatif :
Le "e" a dû sauter au copier/coller.............................
Rectificatif :
Le "e" a dû sauter au copier/coller.............................
H1 a H2+ H3 b H4+ H5 c H6+ H7 d H8+ e
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
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
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
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
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
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
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
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
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
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
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) :
(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.
- 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)
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.
--------------------------------------------------------------------------------------------------------------------------------------------------
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
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
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
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
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
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
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
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
2 juin 2008 à 18:28
oui c'est pour agrandir la console, tu peux virer !
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
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.
Désolé, je n'avais pas vu ton avant-dernier message !
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 !
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
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
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
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
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
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
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
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 !
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 !
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
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 ?
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 ?
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
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.
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.
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
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.
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
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.
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.
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
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.
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.
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
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.
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.
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
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
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
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
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.
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
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) :
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 :
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,
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 ENDIFtu 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,
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
5 juin 2008 à 17:41
Complément d'information sur les tables du programme :
1) Tableaux de paramétrage de la transcodification :
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) :
Dis moi si tu peux trouver "ton bonheur" dans la structure des données/informations présentes dans cas tableaux;
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;
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
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?
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?
27 mai 2008 à 13:50
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