Remplacement dans une chaîne

Discutez d'informatique ici !
Valentin03
Membre Relatif
Messages: 429
Enregistré le: 23 Déc 2012, 13:08

Remplacement dans une chaîne

par Valentin03 » 14 Oct 2013, 10:22

Salut aux savants,
Quelqu'un aurait-il un algo en pseudo-code ou en FCF (français de Clermont-Ferrand),
pour remplacer dans une chaîne, tout les mots identiques (fer) par un mot unique (cuivre) ?
Mon problème, c'est qu'en cours de remplacement, le remplaçant étant plus long que le remplacé, la chaîne s'allooooonge. :mur:
Un gros: Merci; de me sortir de ce pétrin.



Avatar de l’utilisateur
chombier
Membre Irrationnel
Messages: 1324
Enregistré le: 19 Juil 2012, 18:35

par chombier » 14 Oct 2013, 10:24

Quel langage utilisés-tu ? Comment est représentée ta chaîne de caractères ? Tableau ou liste chaînée ?

As-tu pensé à créer une autre chaîne pour le résultat ?

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 14 Oct 2013, 10:26

Bonjour,

Je ne sais pas dans quel langage tu travailles mais tu peux utiliser les expressions régulières pour t'en sortir.

Il existe des fonctions toutes faites. Le but de ton exercice est de créer l'algo le faisant ou simplement remplacer dans une chaine ?

Valentin03
Membre Relatif
Messages: 429
Enregistré le: 23 Déc 2012, 13:08

par Valentin03 » 14 Oct 2013, 12:28

Le langage, c'est un basic. La chaîne c'est une chaîne (en fait c'est du code mis en chaîne)
Je voudrais bien faire l'algo. (pour comprendre pourquoi je coince.)
Les fonctions existantes sont certainement en C; C++ ou autre langues, qui comportent des caractères qui me sont inconnus; et des "cabrioles" que ne me permets plus le degrés d'oxydation de mon cerveau.
Evidemment, j'utilise du: left$, mid$; right$.
Le problème c'est l'allongement de la chaîne au fur et à mesure que je remplace.
J'ai fais un algo qui marche, mais ça s'arrête avant la fin, because j'analyse la chaîne modifiée (qui est plus longue que la chaîne d'origine)
Il faudrait transférer, (chaîne provisoire ?) et c'est là que je coince.

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 14 Oct 2013, 12:32

Montre nous ce que tu as déjà peut-être pour qu'on puisse te dire où cela ne fonctionne pas.

Avatar de l’utilisateur
chombier
Membre Irrationnel
Messages: 1324
Enregistré le: 19 Juil 2012, 18:35

par chombier » 14 Oct 2013, 12:36

Valentin03 a écrit:Le langage, c'est un basic. La chaîne c'est une chaîne (en fait c'est du code mis en chaîne)
Je voudrais bien faire l'algo. (pour comprendre pourquoi je coince.)
Les fonctions existantes sont certainement en C; C++ ou autre langues, qui comportent des caractères qui me sont inconnus; et des "cabrioles" que ne me permets plus le degrés d'oxydation de mon cerveau.


Code: Tout sélectionner
a$ = "le fer me permet de fermer ma ferrure"
b$ = ""
i = 1
tant que i <= longueur(a$)
  si i<= longueur(a$)-2 et a$(i) = 'f' et a$(i+1) = 'e' et a$(i+2) = 'r' alors
    b$ = b$ + "cuivre"
    i = i + 3
  sinon
    b$ = b$ + a$(i)
    i = i + 1
  finsi
fintantque


Ou un truc dans ce gout là, à la louche.

Sinon, en visual basic : Replace("le fer me permet de fermer ma ferrure", "fer", "cuivre").

La plupart des basic ont une fonction intégrée qui permet le remplacement de chaînes.

Valentin03
Membre Relatif
Messages: 429
Enregistré le: 23 Déc 2012, 13:08

par Valentin03 » 14 Oct 2013, 12:46

ampholyte a écrit:Montre nous ce que tu as déjà peut-être pour qu'on puisse te dire où cela ne fonctionne pas.

J'ai mis les len() en variables --(on finit par douter de tout...)

Code: Tout sélectionner
    #w.c, "!contents? orig$":nletr=len(orig$) '--le mots d'origine et sa longueur mise en variable
    #w.d, "!contents? rempl$":lonremp=len(rempl$) '--le mot de remplacement
    #w.tx, "!contents? code$" '--la chaîne à traiter

     xx=1
     toutou=len(code$) '---ici j'ai essayé de rallonger
       for x=1 to tou
          if mid$(code$, x, nletr)=orig$ then cont=cont+1
       next x
       tou=len(code$)+(n*lonremp)
'-----fin de la rallonge que j'ai testé dans une autre version
    for t=1 to toutou '---retour à la version non rallongée
       for x=xx to tou
          if mid$(code$, x, nletr)=orig$ then xx=x-1:exit for '--trouve le premier mot+ mémorise l'index
       next x
       print xx
       scan '----Pour détecter l'arrêt d'urgence
       if sto=1 then wait '--l'arrêt d'urgence (pour les boucles infinies dont je suis un grand amateur !)
       avant$=LEFT$(code$, xx)
       apres$=RIGHT$(code$, tou-xx+1)
       code$=avant$+rempl$+apres$
       xx=xx+1
       tou=len(code$)+lonremp
    next t

Valentin03
Membre Relatif
Messages: 429
Enregistré le: 23 Déc 2012, 13:08

par Valentin03 » 14 Oct 2013, 12:51

Je l'ai tellement "trituré" que c'est possible qu'il y ai des incohérences dans cette dernière version qui ne marche plus.

Valentin03
Membre Relatif
Messages: 429
Enregistré le: 23 Déc 2012, 13:08

par Valentin03 » 14 Oct 2013, 12:54

à chombier;
Il s'agit de remplacer TOUS les mots identiques (il peut y en avoir 50)

Avatar de l’utilisateur
chombier
Membre Irrationnel
Messages: 1324
Enregistré le: 19 Juil 2012, 18:35

par chombier » 14 Oct 2013, 12:55

Valentin03 a écrit:à chombier;
Il s'agit de remplacer TOUS les mots identiques (il peut y en avoir 50)

Mon code remplit cette condition. Le test "si i<= longueur(a$)-2 et a$(i) = 'f' et a$(i+1) = 'e' et a$(i+2) = 'r' alors" peut passer 50 fois.

Valentin03
Membre Relatif
Messages: 429
Enregistré le: 23 Déc 2012, 13:08

par Valentin03 » 14 Oct 2013, 13:02

chombier a écrit:Mon code remplit cette condition. Le test "si i<= longueur(a$)-2 et a$(i) = 'f' et a$(i+1) = 'e' et a$(i+2) = 'r' alors" peut passer 50 fois.

Sorry. Je ne l'ai pas encore testé.

Ah ok, je n'avais pas encore vu les significations de 'f' 'e' et 'r'
On se croise sur le fil.
Je crois que ça va être bon, j'ai eu en plus une réponse des américains dans mon langage.

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 14 Oct 2013, 13:07

C'est le mot "fer" que tu cherches à remplacer.

Je pense que chombier a simplement cru que tu cherchais à remplacer le mot "fer" or tu cherches à créer une fonction remplaçant une chaine 1 par une chaine 2.

Par contre tu peux t'inspirer de l'algo de chombier pour cela.

Je te conseille d'utiliser une variable que tu vas remplir au fur et à mesure.

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 14 Oct 2013, 13:09

Bonjour,
Il peut y avoir des quantités de méthode pour réaliser cela.
Si c'est un exercice, il vaut mieux commencer par écrire l'algorithme en FCF. On utilise souvent, aussi, des ordinogrammes pour décrire cela. Il y a un ancien membre de ce forum qui avait un logiciel vraiment bien pour cela.
Sinon, une astuce est ce commencer par la fin, ça résout pas tous les problèmes, mais ça aide.

Valentin03
Membre Relatif
Messages: 429
Enregistré le: 23 Déc 2012, 13:08

par Valentin03 » 14 Oct 2013, 13:33

Dlzlogic a écrit:Bonjour,
Il peut y avoir des quantités de méthode pour réaliser cela.
Si c'est un exercice, il vaut mieux commencer par écrire l'algorithme en FCF. On utilise souvent, aussi, des ordinogrammes pour décrire cela. Il y a un ancien membre de ce forum qui avait un logiciel vraiment bien pour cela.
Sinon, une astuce est ce commencer par la fin, ça résout pas tous les problèmes, mais ça aide.

Salut Dlzlogic, Ce n'est pas un exercice, j'améliore mon éditeur.
Le but c'est de remplacer en une manip toutes les occurrences d'un mot par un autre.
je sais qu'il y a des éditeurs qui font cela très bien, mais mon éditeur il compile dans la foulée, et pas les autres.
Les américains ont crus que c'était une chaîne de mots. Si ça avait été le cas j'aurais pu mettre en tableau.
C'est une chaîne "continue".
Pour faire un ordinogramme, il faut "tenir" la problématique.
Si je tenais la problématique, je ferais l'algo.
Je vais essayer le pseudo-code de chombier.

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 14 Oct 2013, 13:46

Alors, là, je crois que je ne me casserais pas la tête, je prévoirais une chaine lue et une chaine écrite.
Je lirais et recopierais la chaine lue vers la chaine écrire, jusqu'à trouver le mot " fer ", c'est à dire fer avec avant et après un séparateur, c'est à dire blanc, virgule, point, parenthèse etc.
Puis à la place de " fer ", j'écrirais " cuivre ", puis je continuerais.
Il y a bien longtemps que je n'ai pas écrit en basic, mais de mémoire le traitement des chaines était assez facile.

Avatar de l’utilisateur
chombier
Membre Irrationnel
Messages: 1324
Enregistré le: 19 Juil 2012, 18:35

par chombier » 14 Oct 2013, 13:47

Valentin03 a écrit:Salut Dlzlogic, Ce n'est pas un exercice, j'améliore mon éditeur.
Le but c'est de remplacer en une manip toutes les occurrences d'un mot par un autre.
je sais qu'il y a des éditeurs qui font cela très bien, mais mon éditeur il compile dans la foulée, et pas les autres.
Les américains ont crus que c'était une chaîne de mots. Si ça avait été le cas j'aurais pu mettre en tableau.
C'est une chaîne "continue".
Pour faire un ordinogramme, il faut "tenir" la problématique.
Si je tenais la problématique, je ferais l'algo.
Je vais essayer le pseudo-code de chombier.

Si ce n'est pas un exercice, ne te fatigue pas, il y a forcément une fonction intégrée à ton basic qui fait ça, que ce soit replace, str_replace ou un autre nom, peu importe, elle existe.

Surtout, cette fonction sera bien plus optimisée que tout ce que tu pourra faire en l'écrivant toi même.

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 14 Oct 2013, 13:58

@ cholbier,
C'est pas sûr du tout que cette routine existe en basic.
Par exemple, en C/C++, à ma connaissance elle n'existe pas.
La difficulté est de traiter seulement les mors entiers.
Dans mon éditeur (perso), j'ai utilisé la classe TRitchEdit, et la fonction existe effectivement, mais en basic, c'est pas sûr du tout.

Valentin03
Membre Relatif
Messages: 429
Enregistré le: 23 Déc 2012, 13:08

par Valentin03 » 14 Oct 2013, 14:30

chombier a écrit:Si ce n'est pas un exercice, ne te fatigue pas, il y a forcément une fonction intégrée à ton basic qui fait ça, que ce soit replace, str_replace ou un autre nom, peu importe, elle existe.

Surtout, cette fonction sera bien plus optimisée que tout ce que tu pourra faire en l'écrivant toi même.

T'es optimiste toi ! En testant ton code je m'aperçois que mon langage n'accepte pas les tests dans la "while"!! Alors, str_replace....je peux toujours la chercher...
Je vais essayer la méthode "Dlzlogic", qui m'a l'air d'être aussi optimiste que toi .....

Valentin03
Membre Relatif
Messages: 429
Enregistré le: 23 Déc 2012, 13:08

par Valentin03 » 14 Oct 2013, 14:57

ça maaaarche ! Merci chombier.
Fallait déjà y penser d'analyser le remplaçant lettre par lettre, ça oblige juste à décortiquer le remplaçant, mais c'est nickel.

Avatar de l’utilisateur
chombier
Membre Irrationnel
Messages: 1324
Enregistré le: 19 Juil 2012, 18:35

par chombier » 14 Oct 2013, 14:58

Valentin03 a écrit:T'es optimiste toi ! En testant ton code je m'aperçois que mon langage n'accepte pas les tests dans la "while"!! Alors, str_replace....je peux toujours la chercher...
Je vais essayer la méthode "Dlzlogic", qui m'a l'air d'être aussi optimiste que toi .....

Tu utilises quel langage basic ?

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite