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 :

Supprimer les espaces consécutifs dans une chaîne


Sujet :

Pascal

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 23
    Points : 19
    Points
    19
    Par défaut Supprimer les espaces consécutifs dans une chaîne
    J'ai écrit un programme qui efface les espaces supplémentaires. Il s'exécute mais il ne fonctionne pas bien.
    Voilà le programme :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    program espace_cleaner ;
    uses wincrt ;
    var ch:string ;
     
     
    procedure saisie (var ch :string );
    begin
    writeln('donner une chaine de carractéres ');
    readln (ch);
    end;
     
    procedure espacecleaner (var ch:string );
    var i:integer;
    begin 
    for i:= 1 to length(ch) do
      begin 
      if (ch[i]=' ') and (ch[i+1]=' ') then
      delete(ch,i,1);
      end;
      end;
     
    procedure affichage (ch:string );
    begin
    writeln('ch= ',ch);
    end;  
    begin
    saisie(ch);
    espacecleaner(ch);
    affichage(ch);
    end.
    Quand je le teste, par exemple je donne ch=a (plusieurs espaces) b.
    Il m'affiche ch= a (plusieurs espaces mais moins qu'avant) b
    J'espère que vous m'aiderez à corriger la faute et merci d'avance ^^

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Un While serait mieux et il ne faudra pas incrémenter l'indice de boucle quand on enllève un blanc.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre éclairé

    Inscrit en
    Avril 2003
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 284
    Points : 773
    Points
    773
    Par défaut
    Tu utilises une boucle, et dans celle-ci à chaque fois que tu as deux espaces qui se suivent, tu en enleve un...
    Si par exemple tu as les caractères 4, 5 et 6 de ta chaine qui sont des espaces, ton programme, en arrivant à i=4 va effacer l'espace situé là.
    du coup, l'espace situé en 5 passe en 4ème position, l'espace situé en 6 passe en 5 ème position etc...
    Ta boucle s'incrémente alors et tu passe au test sur la position 5 (qui contient l'ex 6ème caractère)...
    Tu vois le problème? tu n'as pas la detection du double espace 4 et 5 (ex 5 et 6)vu que tu passe au caractère suivant automatiquement...
    La solution est de continuer à nettoyer à une position i tant que tu as un double espace (en i et i+1), et de ne passer qu'ensuite au caractère suivant...

    Bonne continuation

  4. #4
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    Puisque tout est deja presque dit moi je pourrais dire de mettre les balise code
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

  5. #5
    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
    Kio,
    Citation Envoyé par Graffito Voir le message
    Un While serait mieux et il ne faudra pas incrémenter l'indice de boucle quand on enllève un blanc.
    Mieux que cela, il ne faut pas utiliser une boucle For comme cela.

    En effet, en Pascal, les limites utilisées par une boucle For sont calculées une fois pour toute lors de l'entrée dans la boucle, et ne sont donc plus évaluées à chaque itération. C'est la norme Pascal.
    Il ne faut donc pas utiliser comme limites d'une boucle For une donnée étant modifiée dans la boucle.

    Ici, bien que tu modifies la longueur de la chaine, la boucle For sera exécutée jusqu'à ce que le compteur de boucle soit égal à length(ch) au moment de l'entrée dans la boucle, et le comportement risque d'être bizarre.

    Conclusion : une boucle While s'impose (pas Repeat, qui est exécutée au moins une fois).
    Si les cons volaient, il ferait nuit à midi.

  6. #6
    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
    Pareil que les autres à une petite différence près :

    Il faut que tu utilises 2 boucles while pour faire ça bien (ou leur équivalent en fonctions récursives) :

    Une premiere boucle qui parcourt ta chaine et une deuxième boucle qui supprime les espaces consécutifs.

  7. #7
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    merci à tous ^^

  8. #8
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    Juste une petite question à poser à l'auteur du post il s'agit de supprimer :
    -les espaces consecutives dans un mot?
    -les espaces dans un mot?
    -Et enfin il s'agit de le faire sur un mot ou une phrase?
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

  9. #9
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    il s'agit de supprimer les espaces consecutives dans une chaine de caractéres et il ne reste qu'un espace entre chaque deux mots .
    la chaine de caractére peut etre un mot ou une phrase

  10. #10
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    c bon enfin j'ai réussi a corriger le programme grace a vous donc ^^
    je vous remerci et voilà le programme aprés être corrigé :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    program espace_cleaner ;
    uses wincrt ;
    var ch:string ;
     
     
    procedure saisie (var ch :string );
    begin
    writeln('donner une chaine de carractéres ');
    readln (ch);
    end;
     
    function espacecleaner (var ch:string ):string ;
    var i:integer;
    begin
     i:=2;
    while (i<=length(ch)) do 
    begin
    while (ch[i]=' ') and (ch[i-1]=' ') do
    delete(ch,i,1);
    i:=i+1;
    end;
    espacecleaner:= ch;
    end;
     
     
    begin
    saisie(ch);
    writeln (espacecleaner(ch));
    end.

  11. #11
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    Kool,
    Il ne reste plus qu'a bien indenté ton code et/ou mettre des commentaires si tu veux (mais ça peut toujours t'aider bonne habitude à prendre)
    tu pourrais aussi eviter de passer tout le temps les variables par adresse dans les 2 fonctions tu aurais bien pu passer les parametres par valeur mais pour la procedure saisie ça serait bien d'en faire une fonction (ce que je dis c'est des détails)
    Bravo pour ton code
    bonne continuation
    @+
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

  12. #12
    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
    Ouaip, voilà

    Par contre je rejoins Krachik, indente ton code, surtout dans les boucles non délimitées, ça facilite beaucoup la compréhension :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    while (i<=length(ch)) do 
    begin
    while (ch[i]=' ') and (ch[i-1]=' ') do
    delete(ch,i,1);
    i:=i+1;
    end;
     
    (* devient : *)
    while (i<=length(ch)) do 
    begin
      while (ch[i]=' ') and (ch[i-1]=' ') do
        delete(ch,i,1);
      i:=i+1;
    end;

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 362
    Points : 419
    Points
    419
    Par défaut
    A mon avis, ta fonction espacecleaner a un gros défaut :
    elle modifie ch, alors qu'en principe elle ne devrait pas toucher à ch puisqu'elle retourne la chaîne nettoyée en sortie.

    D'ailleurs, le plus simple pour éviter cela serait de faire comme te l'a conseillé krachic : ne pas lui passer la variable ch par variable (ou pour adresse), mais par valeur.

    Ainsi, tu pourrais réutiliser dans ton traitement la valeur initiale de ch (non nettoyée).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VBA_Supprimer les espaces superflus dans une chaîne de caractères
    Par Ma_Mariem dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 24/05/2013, 17h15
  2. [Free Pascal] Programme qui supprime les espaces inutiles dans une chaîne
    Par joreveur dans le forum Free Pascal
    Réponses: 18
    Dernier message: 24/08/2012, 16h51
  3. Réponses: 5
    Dernier message: 25/02/2008, 14h34
  4. Réponses: 3
    Dernier message: 26/03/2007, 09h46
  5. Supprimer les premiers 0 dans une chaîne
    Par supersmoos dans le forum Langage
    Réponses: 2
    Dernier message: 11/01/2007, 11h28

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