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 :

Suppression des espaces consécutifs dans une chaîne de caractères


Sujet :

Pascal

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Points : 80
    Points
    80
    Par défaut Suppression des espaces consécutifs dans une chaîne de caractères
    Bonjour suite à l'élaboration d'un algorithme pour supprimer des espaces consécutif dans une chaine de caractères j'ai écrit le code en pascal pour delphi
    a priori l'algo est bon la compilation passe mais j'ai un message d'erreur type violation d'accès est ce que vous pouvez me dire ce qui provoque cette erreur?
    l'algo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    pour i<-1 à longueur(chaine) faire
           si (chaine[i]<>' ') alors
                  chaine2[j]<-chaine[i]
           fsi
           si (chaine[i]=' ') et (chaine[i+1]<>' ') alors
                  chaine2[j]<-' '
           fsi
           j=j+1
    fpour
    le code pascal :
    Code pascal : 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
     
    var
    i,j:integer;
    chaine,chaine2:string;
     
    for i:=1 to (max-1) do //max est la variable stockant la longueur de la chaine
        begin
            if chaine[i]<>' ' then
            begin
                chaine2[j]:=chaine[i];
            end;
            if ((chaine[i]=' ') and (chaine[i+1]<>' ')) then
            begin
                chaine2[j]:=' ';
            end;
        j:=j+1;
        end;

  2. #2
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    As tu initialiser j avant de l' utiliser ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Points : 80
    Points
    80
    Par défaut
    oui j'ai initialisé j avant le début du code que j'ai mis

  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
    Bonjour
    J'espere que tu n' appeles pas ça un code complet en pascal ,
    Tu peux mettre tout le code pour qu'on voit réelement ce que tu fais de tes variables non declarées ici ?
    En ce qui concerne par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        if chaine[i]<>' ' then
            begin
                chaine2[j]:=chaine[i];
            end;
    Quand une seule instruction est concerné par une condition ,il n'est pas nécessaire de mettre un "begin end"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      if chaine[i]<>' ' then
               chaine2[j]:=chaine[i];
    et n'oublies pas aussi que "else if " existe
    @+
    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
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Points : 80
    Points
    80
    Par défaut
    alors voici tout le code mon programme doit apartir d'une phrase mettre chaque mot dans une liste box et supprimer les espaces inutiles
    Code pascal : 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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    var
      Form1: TForm1;
      i,j:integer;
      bi,bs:integer;
      chaine:string;
      chaine2:string;
      mot:string;
      max,posi:integer;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
     
    begin
    listbox1.Clear;                          //initialisation de la listbox
    i:=1;
    j:=1;
    bi:=1;
    chaine:=trim(edit1.text);  //copie dans chaine de la phrase de edit1
    max:=length(chaine);       //stocke logueur de la chaine
    edit2.text:=inttostr(max); //affiche dans edit2 la longueur de la chaine
     
    if chaine<>'' then
        begin
        for i:=1 to (max-1) do
        begin
            if chaine[i]<>' ' then
            begin
                chaine2[j]:=chaine[i]
            else
            if ((chaine[i]=' ') and (chaine[i+1]<>' ')) then
            begin
                chaine2[j]:=' ';
            end;
        j:=j+1;
        end;   
     
        edit3.Text:=chaine2;        //stocke la chaine purgée des espaces au extrémité
     
          for i:=1 to max do
            begin
    	      if (chaine[i]=' ')  then
    		      begin
              mot:=copy(chaine,bi,i);            //copie le mot
              bi:=i+1;                           //saut de l'espace pour arriver sur le premier caracrère du mot suivant
              posi:=pos(' ',mot);                //stock dans posi la position de l'espace sinon renvoie 0
                if posi<> 0 then                   // si <> 0 alors
                delete(mot,posi,length(mot));      // supprime tout ce qu'il y a après
              listbox1.Items.Add(trim(mot));     // affiche dans la listbox le resultat
              end;
            end;
    //pour afficher le dernier mot
        j:=max;
        bs:=max;
     
          while (chaine[j]<>' ') do
            begin
              bi:=j;
              mot:=copy(chaine,bi,max);
              j:=j-1;
              //showmessage(mot);
            end;
        listbox1.Items.Add(trim(mot));
        end
        else
        showmessage('saisir phrase');//oblige une saisi de caractère sinon quitte
    end;

    je précise je n'ai pas encore adapté chaine2 au programme principale parce que la suppression d'espace inutile ne fonctionne pas

  6. #6
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 234
    Points : 2 337
    Points
    2 337
    Par défaut
    Perso, je vois au moins une erreur d'algorithme :
    quoi qu'il arrive, tu incrémentes j alors que si tu as deux espaces consécutives (oui, l'espace typographique est féminine), tu dois incrémenter i mais pas j.

    Un conseil : donne à tes variables des noms explicites : bi ou toto c'est bien pour rigoler, mais quand il faut comprendre le fonctionnement d'un programme, c'est plus facile si on sait, à la lecture de son nom, à quoi sert une variable, une procédure ...

    Et tu as le droit de mettre des begin & des end même s'ils ne sont pas obligatoires. Ça peut améliorer la lisibilité, surtout avec des if imbriqués.
    « Un peuple qui est prêt à sacrifier un peu de liberté contre un peu de sécurité, ne mérite ni l'une, ni l'autre, et finira par perdre les deux. »
    Attribué indistinctement à :
    Thomas Jefferson
    Benjamin Franklin
    Albert Einstein !

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, 18h15
  2. [WebI XiR2] Suppression d'un espace dans une chaîne de caractères
    Par SGA99 dans le forum Débuter
    Réponses: 6
    Dernier message: 02/12/2010, 18h12
  3. Réponses: 0
    Dernier message: 27/08/2009, 17h18
  4. Supprimer les espaces consécutifs dans une chaîne
    Par aymenet1 dans le forum Pascal
    Réponses: 12
    Dernier message: 27/11/2007, 23h21
  5. suppression des caratères spéciaux dans une table
    Par syl221 dans le forum Access
    Réponses: 6
    Dernier message: 31/08/2005, 10h20

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