IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Pascal Discussion :

Inversion d'une chaîne


Sujet :

Pascal

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut Inversion d'une chaîne
    BOnjour , j'essaye d'écrire une fonction qui prend une chaine en paramètre , par exemple la chaine "bonjour" , et qui me renvoit la chaine inverse "ruojnob" , et j'ai des difficultés à trouver un algorithme , voici ce que je propose :

    1.On lit chaque caractère de la chaine , on les compte .
    2. Par une boucle , du dernier caractère au 1er , on affiche les caractères de la chaine dans une seconde chaine ?

    QU'en pensez vous , celà peut marcher ?

    merci

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hi,
    Citation Envoyé par Maxence45
    BOnjour , j'essaye d'écrire une fonction qui prend une chaine en paramètre , par exemple la chaine "bonjour" , et qui me renvoit la chaine inverse "ruojnob" , et j'ai des difficultés à trouver un algorithme , voici ce que je propose :

    1.On lit chaque caractère de la chaine , on les compte .
    2. Par une boucle , du dernier caractère au 1er , on affiche les caractères de la chaine dans une seconde chaine ?

    QU'en pensez vous , celà peut marcher ?

    merci
    Oui, ça marchera.

    Par contre, pas besoin de compter les caractères de ta chaine, la fonction length est là pour te donner la longueur de la chaine.

    (D'ailleurs, comment ferais-tu pour calculer la longueur ?)

    On peut faire mieux, mais commence par faire comme ça, et on verra plus tard.
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour

    J'ai créé une fonction qui fait ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    Function ReverseString(Chaine : String) : String ;
    Var
      Tmpstr:String;
      iLoop : Integer;
     
    Begin
      For iLoop := Length(Chaine) DownTo 1 do
          Tmpstr := Tmpstr + Copy(Chaine, iLoop, 1);
     
      Result := TmpStr;
    End;

  4. #4
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    je vous remercierai de ne pas me balancer du code tout fait s'il vous plait car sinon çà sert à rien que je travaille , alors j'ai fait travailler ma cervelle et je propose ce code source qui marche à 99Ù , qu'en dites vous !!! :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function reply(ch: STRING): STRING;
    var
       i : CARDINAL;
       j : char;
    begin
    for i := length(ch) DownTo 1 do
    begin
       j := ch[i];
    write(j);
    end;
       reply := j;
    end;
    le seul petit hic c'est qu'il me rajouter une lettre inutile à la fin...

  5. #5
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Ca ne peut pas marcher, si j est un char, alors à chaque tour de boucle j est écrasé.

    Il faut que tu crées une string avec s[i] à la suite les uns des autres... Et que tu retournes cette string.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  6. #6
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    là mon code marche quasiment , pq j ne peut pas etre un char , la variable lû est bien de type char pourtant...

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hi,
    Citation Envoyé par Maxence45
    je vous remercierai de ne pas me balancer du code tout fait s'il vous plait car sinon çà sert à rien que je travaille , alors j'ai fait travailler ma cervelle et je propose ce code source qui marche à 99Ù , qu'en dites vous !!! :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function reply(ch: STRING): STRING;
    var
       i : CARDINAL;
       j : char;
    begin
    for i := length(ch) DownTo 1 do
    begin
       j := ch[i];
    write(j);
    end;
       reply := j;
    end;
    le seul petit hic c'est qu'il me rajouter une lettre inutile à la fin...
    Je ne vois pas de quoi tu parles, il ne semble pas y avoir de "hic", sauf qu'il faudrait peut-être ajouter un writeln après la sortie de la boucle, uniquement pour que les messages suivants ne se mettent pas directement à la suite de ce que la fonction écrit.

    Il y a de l'idée, mais de petits problèmes:

    reply est une fonction qui doit renvoyer une string,

    or
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
       j : char;
    ...
       reply := j;
    tu lui fais retourner un char

    ici,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       j := ch[i];
    write(j);
    la variable j servant d'intermédiaire est inutile, tu peux parfaitement écrire directement
    A part cela, il y a un grand "hic" :

    Ta fonction affiche bien la chaine inversée, mais c'est tout ce qu'elle fait : elle ne renvoie pas la chaine inversée, même en corrigeant le problème du retour d'un caractère au lieu d'une chaine, comme attendu.

    Ta première version
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function ReverseString(Chaine : String) : String ;
    Var
      Tmpstr:String;
      iLoop : Integer;
     
    Begin
      For iLoop := Length(Chaine) DownTo 1 do
          Tmpstr := Tmpstr + Copy(Chaine, iLoop, 1);
     
      Result := TmpStr;
    End;
    faisait pourtant le travail attendu, à part qu'il fallait initialiser la chaine tampon Tmpstr avant d'entrer dans la boucle la remplissant à partir des données de Chaine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
      Tmpstr := '';
      { puis la boucle }
    ...
    pourquoi en faire une autre ?

    Par rapport à ce que j'ai vu de tes autres posts, ça vient tranquilement, continue

    ps : Prends quand même l'habitude de bien présenter ton code, en ce qui concerne l'indentation surtout
    Si les cons volaient, il ferait nuit à midi.

  8. #8
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    le code que tu me montres n'est pas de moi lol .

    c'est quoi la différence entre renvoyer la chaine et afficher la chaine inversée , le résultat est le même non ?

  9. #9
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    j'ai nettoyé le code de ma fonction comme une grande , qu'en pensez vous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function reply(ch: STRING): STRING;
    var
       i  : CARDINAL;
       gg : STRING;
    begin
    for i := length(ch) DownTo 1 do
    begin
       gg := ch[i];
       write(gg);
    end;
       reply := gg;
    end;

  10. #10
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Non car une fois qu'elle est affichée, elle est perdue... Si par exemple, tu veux pouvoir réutiliser le résultat, c'est-à-dire la chaîne inversée, et ben tu peux pas... D'où l'intérêt des variables !
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  11. #11
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hu,
    Citation Envoyé par Maxence45
    le code que tu me montres n'est pas de moi lol
    j'ai mal lu, moi.

    Citation Envoyé par Maxence45
    c'est quoi la différence entre renvoyer la chaine et afficher la chaine inversée , le résultat est le même non ?
    Non, comme l'a bien dit wormful_sickfoot
    Si les cons volaient, il ferait nuit à midi.

  12. #12
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    j'ai nettoyé mon code source 2 messages plus haut

  13. #13
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Citation Envoyé par Maxence45
    j'ai nettoyé mon code source 2 messages plus haut
    Et il est toujours aussi faux ! Tu ne renvoies pas la string complète, tu ne renvoies qu'un caractère, et tu persistes à afficher le résultat à l'écran. Pour concaténer des caractères dans une string, tu peux utiliser l'opérateur +
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  14. #14
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    je vois pas comment concaténer ce que tu dis , là j'ai ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function reply(ch: STRING): STRING;
    var
       i  : CARDINAL;
       gg : STRING;
    begin
    for i := length(ch) DownTo 1 do
    begin
       gg := ch[i];
    end;
       reply := gg;
    end;
    c'est ici que je dois mettre la concaténation :

    gg := ch[i] , mais je sais pas comment l'écrire j'ai jamais fait...

  15. #15
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    essaye ce code là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var s : String;
    begin
      s := 'a';
      s := s+'b';
      writeln(s);
      readln;
    end.
    Si tu comprends bien ce qu'il fait (et il n'est pas bien long), tu pourras résoudre ton problème (si wormful_sickfoot a raison en ce qui concerne l'opérateur de concaténation, ce dont je ne doute pas ).

  16. #16
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    ne pas le prendre mal mais je refuse de changer tt mon code source que j'ai travaillé pour l'écrire , je veux juste savoir concaténer comme le dit worm...

  17. #17
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hi,
    Citation Envoyé par Maxence45
    ne pas le prendre mal mais je refuse de changer tt mon code source que j'ai travaillé pour l'écrire , je veux juste savoir concaténer comme le dit worm...
    L'exemple montré par Loceka te montre bien comment concaténer, le symbole + est là pour ça, avec les chaines.

    De plus, avant de concaténer quoi que ce soit dans ta chaine tampon, il faut impérativement l'initialiser, sinon elle peut contenir n'importe quoi.
    Si les cons volaient, il ferait nuit à midi.

  18. #18
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    je peux pas tester mon code là je suis pas sur mon pc et je vois tjs pas comment dans mon exemple quoi concaténer et comment mais j'essaye de répondre quand même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function reply(ch: STRING): STRING;
    var
       i  : CARDINAL;
       gg : STRING;
    begin
    gg := '';
    for i := length(ch) DownTo 1 do
    begin
       gg := ch[i];
       gg := ch[i] + ? // c'est ici que je sais pas , c'est pas clair pour moi l'exemple...
    end;
       reply := gg;
    end;

  19. #19
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Bizour,

    Pour essayer de t'expliquer:
    concaténer quelque chose (un caractère, ou une autre chaîne) à une chaîne de caractères, c'est lui ajouter quelque chose.

    On peut raisonner en disant "C'est l'équivalent, pour un entier, de la somme" :

    Pour un entier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ...
    var
      n,x : integer;
    ...
    begin
       { initialisation des variables, ne JAMAIS oublier de le faire }
     
      n := 10;
      x := 2;
     
      { et ajout de n à x }
     
      x := x + n;   { désormais, x vaut 10 + 2 = 12 }
    ...
    end;
    Donc, pour ajouter quelque chose à une chaîne, ce qui est une concaténation, on va faire pareil, avec pour exemple la concaténation d'un simple caractère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    ...
    var
      c : char;
      s : string;
    ...
    begin
       { initialisation des variables, ne JAMAIS oublier de le faire }
     
      s := 'xyz';
      c := 'A';
     
      { et ajout de c à s }
     
      s := s + c;   { désormais, s vaut "xyz", à quoi on concatène 'A', donc 'xyzA' }
    ...
    end;
    J'espère que c'est assez clair, et va débloquer ton problème.
    Si les cons volaient, il ferait nuit à midi.

  20. #20
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    je vois tjs pas comment concaténer ma chaine dans mon exemple ...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Débutant] Inverser une chaîne de caractères
    Par zbooon dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 28/04/2017, 13h44
  2. Inversion d'une chaîne de caractères
    Par camoa dans le forum x86 16-bits
    Réponses: 7
    Dernier message: 31/10/2011, 13h56
  3. Inversion d'une chaîne de caractères
    Par bounadalvidal dans le forum Débuter
    Réponses: 7
    Dernier message: 09/11/2010, 14h51
  4. Réponses: 3
    Dernier message: 26/05/2010, 23h39
  5. Inverser une chaîne de caractères
    Par DBBB dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/03/2003, 11h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo