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
    @+

  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 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 274
    Points : 2 477
    Points
    2 477
    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.

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. [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, 17h12
  3. Réponses: 0
    Dernier message: 27/08/2009, 16h18
  4. Supprimer les espaces consécutifs dans une chaîne
    Par aymenet1 dans le forum Pascal
    Réponses: 12
    Dernier message: 27/11/2007, 22h21
  5. suppression des caratères spéciaux dans une table
    Par syl221 dans le forum Access
    Réponses: 6
    Dernier message: 31/08/2005, 09h20

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