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

Langage Pascal Discussion :

[LG]Retirer les blancs dans une chaine


Sujet :

Langage Pascal

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 21
    Points : 12
    Points
    12
    Par défaut [LG]Retirer les blancs dans une chaine
    Bonjour tous le monde
    J'ai écrit une fonction (enfin essayé :-) ) qui retire tous les blancs dans une chaine , elle retire des blancs mais pas tous est-ce que quelqu'un a une idée......
    J'ai visité le forum et j'ai pas vu que le sujet était déjà traité .....
    Voici ma Fct

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function retire_tous_les_blancs(var s:string):string;
    var k,i:integer;
    begin
    for i:=0 to length(s) do
       begin
           if s[i]=(' ') then for k:=i to length(s) do s[k]:=s[k+1]
       end;
    result:=s;
    end;
    Merci d'avance
    Andy

    ------
    Balise code par Pascail ... Pensez y vous même !

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 944
    Points : 59 431
    Points
    59 431
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    C'est juste que si tu as deux blancs de suite, lorsque tu as ôté le premier en décalant le reste de la chaîne, ta boucle incrémente i et donc tu ne traites pas le nouveau blanc qui vient de remplacer celui que tu effaces (puisque tu traites le caractère suivant).

    Soit la chaîne suivante (les blancs sont remplacés par *) :
    AB**CDEF

    Lorsque tu arrives au 1er blanc, tu décales le reste de la chaîne :
    AB*CDEF

    Mais ton i est incrémenté et le test suivant se fait sur le C et non le deuxième blanc !
    CQFD.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Juste !!!!!
    Bon ben je repenser mon algo.....
    Merci

  4. #4
    tintin22
    Invité(e)
    Par défaut
    deux remarques pour t'aider
    -Tu utilises une fonction, et un parametre en sortie (var) ??
    puisque tu as le resultat de la fonction, tu peux l'utiliser, et omettre le parametre le var , sinon tu utilises une procedure.
    -Ta boucle commence par 0 (0 to Length(s))
    remplace le par 1 , car le premier élément (c'est-à-dire le 0) contient la longueur de ta chaîne, donc vaut mieux ne pas y toucher.
    -Pour le test (if), Tu concatènes les caractères uniquement quand c'est different de 'blanc'.

  5. #5
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Le parametre var c'etait pour envoyer ma chaine de mon prog principal
    direct à la fct qui va la retournée modifiée....

    Merci pour le 0 dans la boucle for , je le savais pas du tout !!!
    Et ça evitera à mon prof de me le dire :-)

    Le concat !!!!!!! C'était clair !!!!!!!

    Bon , je recommence demain et je poste l'algo complet comme ça si il y a un autre étudiant que ça interresse.....

    Merci Merci BCP Ilyes

  6. #6
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Bingo ça marche mais j'ai utilisé delete et non pas concat , c'est peut-être pas l'algo le plus compétitif mais il marche dans tous las cas (c'est déjà ça)
    J'avais réussi un algo qui retirait les espaces au début de la chaine et un autre qui les retirait à la fin de la chaine , mais au milieu c'était vraiment plus dure

    En tous cas j'ai 2 versions différentes.....
    Si quelqu'un peut me dire qu'elle est la meilleure..... :
    La 2ieme travaille + mais ne fait pas appel à la fct DELETE....


    VERSION 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function retire_tous_les_blancs(var s:string):string;
    var k,i:integer;
       begin
       i:=1;
          while i<>length(s)do
          begin
              if s[i]=(' ')then delete(s,i,1)
                 else
                   inc(i);
          end;
       result:=s;
       end;

    VERSION 2


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function retire_tous_les_blancs(var s:string):string;
    var k,i:integer;
       begin
       i:=1;
           while i<>length(s)do
           begin
                while s[i]=(' ') do
                begin
                    for k:=i to length(s) do s[k]:=s[k+1];
                end;
           inc(i);
           end;
        result:=s;
        end;
    MERCI BCP Alcatiz et Ilyes

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    En fait dans la 1ere version on peut retirer la variable K,
    et dans les 2 on peux retirer le VAR de la déclaration , j'ai été trop vite pour poster

    Mais même comme ça , elles tournent toutes les 2 .

    Andy

  8. #8
    Membre éclairé
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Points : 746
    Points
    746
    Par défaut autre solution
    une autre solution aurait été de garder la première version mais de parcourir ton string de la fin vers le début :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i:=Lenght(s) downto 1 do ...
    Donnez un poisson à un homme et il mangera pendant un jour... Apprenez-lui à pêcher et il s'assiéra dans une barque et boira de la bière toute la journée

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Tu utilises delphi ? Dans ce cas, pas besoin d'utiliser de variables intermédiaires "result" ( pas besoin de la déclarer, mais on la garde quand même dans la fonction ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Function retire_tous_les_blancs(s:string):string;
    var i:integer;
    var result:string;
    begin
    i:=1;
    result:=s;
    while i<=length(result) do if result[i]=' ' then delete(result,i,1) else inc(i);
    end;
    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  10. #10
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Merci tout le monde et maintenant y a meme 3 versions
    mais celle de Wormful est surement meilleure que la mienne :o

    A+

  11. #11
    tintin22
    Invité(e)
    Par défaut
    Voila une 4eme version, avec la concatenation et sans la fonction Delete !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function retire_tous_les_blancs(s : string) : string;
    var i   : integer;
        Res : string;
    begin
         Res:='' ;
         for i:=1 to Length(S) do if s[i]<>' ' then Res:=Res+S[i] ;
         retire_tous_les_blancs:=Res ;
    end;

  12. #12
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Merci tous le monde !!!!

  13. #13
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Février 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 17
    Points : 26
    Points
    26
    Par défaut Supprimer les espaces d'une chaine
    Voici une 5e version:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function DeleteSpaces(const Str: string): string;
    var
      S: string;
    begin
      S:=str;
      while Pos(' ',S)>0 do begin
        Delete(S,Pos(' ',S),1);
      end;
      Result:=S;
    end;
    Ce qui donne avec
    'Jean-Pierre C est un gros PD': 'JeanPierreCestungrosPD'
    ---------------------------------
    HADES -2000, çà, c'est pas
    du logiciel de PD (euh ...)

  14. #14
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Pas mal la boucle while avec le "pos" en condition de continuation.

  15. #15
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Février 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 17
    Points : 26
    Points
    26
    Par défaut Supprimer les espaces d'une chaine
    Ben oui: On ne programme pas comme des PD à SiliconCavings ...

    (mes potes, connaissant mon homosexualité, restent sceptiques lorsque je leur dis çà)
    ---------------------------------
    HADES -2000, çà, c'est pas
    du logiciel de PD (euh ...)

  16. #16
    Membre actif

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 107
    Points : 279
    Points
    279
    Par défaut
    Je pense que le meilleur algo est celui de Ilyes. Simple efficace, 2 ligne de code et dla route !
    J'aurais fait comme ça.

    Ps : j'ai supprimé ton doublon Ilyes
    Chaque jour, l'homme crée des choses plus grandes, meilleures et sûres, et chaque jour, la nature crée des idiots plus performants. Pour l'instant, je pense que la nature gagne.

  17. #17
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Oui, la solution de Ilyes me semble la meilleure.

    pipistrelle > appeler la fonction pos en boucle est une mauvaise idée. Il doit le recalculer à chaque appel...

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

Discussions similaires

  1. Supprimer tous les blancs dans une chaine de caractères
    Par joel74 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 20/02/2014, 16h19
  2. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  3. Retirer les accents d'une chaine avec MySQL
    Par orus8 dans le forum Requêtes
    Réponses: 5
    Dernier message: 23/02/2006, 16h47
  4. Réponses: 3
    Dernier message: 31/01/2005, 23h18

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