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

Turbo Pascal Discussion :

[TP] Problème avec les intervalles de char


Sujet :

Turbo Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Par défaut [TP] Problème avec les intervalles de char
    Bonjour à tous,
    Je viens de m'enregistrer, mais ça fait pas mal de temps que j'utilise vos cours sur TP7, et je tiens à vous féliciter pour la clarté et l'ergonomie du site .
    Actuellement, un problème me hante jour et nuit jusqu'à dans mon sommeil . J'ai cherché absolument partout sans trouver ...
    En fait, je veux utiliser la procédure de trim, mais j'aimerais qu'elle soit active à l'intérieur du mot, contrairement à la fonction première d'un trim qui est de virer les espace (#32) au début ou à la fin d'un mot.
    Mais j'aimerais également qu'elle ne supprime pas que les espaces .....
    mais toutes ponctuations possible, c'est à dire les caractères d'intervalles
    [#0;#47], [#58..#64], [#91..#96] et [#123..#255].

    En fait pour que cela soit plus clair, voici la fonction(obligatoire pour mon programme ...) que j'ai créée mais qui ne marche pas :
    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
     
    Function TrimIn(var t:string):string;
       var j:byte; x:integer; z:[chr(0)..chr(47)];
           y:[#58..#64]; w:[#91..#96];
           v:[#123..#255];
       Begin
       x:=length(t);
       for j:=1 to length(t) do
          begin
          while (length(t)>0) and (t[j]=z) or (t[j]=y) or (t[j]=w) or
          (t[j]=v) do
     
             delete(t,j,1);
             x:=x-1;
          end;
       End;
    En fait, je suppose que c'est un peu plus complexe que mon idée, mais ça fait un paquet de temps que je cherche la réponse à ce problème, en vain...

    Merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    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
    Function TrimIn(t : string) :string;
       var j:byte; x:integer; z:[chr(0)..chr(47)];
           y:[#58..#64]; w:[#91..#96];
           v:[#123..#255];
           temp : byte;
       Begin
     
       tab := copie_locale(t);
       x:=length(tab);
       for j:=1 to x do
          begin
              temp = ord(t[j]);
              if ((temp in 58..64) and ...) then begin 
                 delete(tab,j,1);
                 x:=x-1;
              end;
          end;
     
          TrimIn := tab;
       End;

    bien sûr faut que tu complétes...
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Par défaut ..
    To Gorgonite ---> Merci pour ta réponse et ton idée,
    seulement le problème, le voici :
    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
    Function BalayageIn(t:string):string;
       var j:byte; x:integer; z:chr(0)..chr(47); y:#58..#64; w:#91..#96;
           v:#123..#255; temp:byte; tab:string;
     
       Begin
       tab:=t;
       x:=length(tab);
       for j:=1 to x do
          begin
             temp:=ord(t[j]);
             if((temp in #58..#64) and (temp in #91..#96) and (temp in #0..#47)
             and (temp in #123..#255) then 
             begin;
                delete(t,j,1);
                x:=x-1;
             end;
          end;
          TrimIn:=tab;
       End;
    Quand je lance le compilateur, l'erreur se produit dans l'expression Temp in, dès le premier..., en disant "Operand types do not match opérator".
    Ne faut il pas plutôt mettre while au lieu de if ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Par défaut
    Alcatîz, ton idée fonctionne !!!
    Mais en fait, je crois qu'elle n'est pas appropriée à mon programme (dsl je débute en TurboPascal ... ).
    En fait ce programme doit demander un numéro de 10 chiffres, séparé ou non de ponctuation plus ou moins régulière, mais qui ne contient pas de lettres. Si le numéro est correct, il le renvoie formaté "00.00.00.00.00". Voici donc le code de mon programme (avec tes modifications ):
    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
    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
    program Téléphone;
    uses crt;
    var
       s:string;
       i,k,j:byte;
     
     
    Function BalayageIn(chaine:string):string;
       var Resultat:string;
           IndexChaine, IndexResultat: byte;
    Begin
       IndexChaine := 1;
       IndexResultat := 0;
       while IndexChaine <= Length(chaine) do
          begin
             if not (Chaine[IndexChaine] in [#0..#47,#58..#64,#91..#96,#123..#255])
             then
                begin;
                   Inc(IndexResultat);;
                   Resultat[IndexResultat] := Chaine[IndexChaine];
                end;
             Inc(IndexChaine);
          end;
       Resultat[0] := Char(IndexResultat);
       BalayageIn := Resultat;
    End;
     
     
    Procedure Test(f:string);
       var n:byte;
       Begin
          if length(f)<10 then
                writeln('Pas assez de chiffre ! ')
     
          else
          if length(f)>10 then
             writeln('Trop de chiffre ! ')
       End;
     
     
    Procedure Format_Points(var t:string; a:string);
       begin
       a:='.';
       t:='0000000000';
       insert(a,t,3); insert(a,t,6); insert(a,t,9); insert(a,t,12);
       write(t);
       end;
     
    Begin
     
    clrscr;
    k:=1; i:=10;
     
    repeat
     
          writeln('Saisir le numéro de téléphone : ');
          readln(s);
     
          BalayageIn(s);
          length(balayageIn(s)):=length(s);
          Test(s);
     
     
    until length(s)=i;
     
    Format_Points(s,'.');
    readln;
     
    End.
    Je n'arrive pas à cerner l'erreur ...... Et une partie du programme me reste inconnue .. Comment reconnaître les lettres et les chiffres de la chaîne 's' ?
    Même procédé que le Trim ??

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Par défaut svp....
    je viens de me rendre compte que le temps m'était compté pour la résolution de ce programme ..... j'espère qu'au moins l'un d'entre vous saura bientôt m'éclairer la voie !!..............

    En tout cas, la seule erreur que je remarque est à la ligne :
    "length(balayage(s)):=length(s)"

    Je pense que la syntaxe est incorrecte, puisque la longueur de la chaine (s) "balayée" ne devient pas celle de la chaine (s) d'origine ... en gros :

    → Comment rédiger "length(balayage(s)):=length(s)" en syntaxiquement correct ...

    → Comment peut-on différencier les chiffres et les lettres dans une variable string ???

    Merci d'avance et merci de ce que vous avez déjà fait

  6. #6
    Membre très actif
    Avatar de diden138
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    714
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 714
    Par défaut Re:
    salut je veux bien t'aider mais explique clairement ton probléme parceque je n'ai rien compris dis moi si jeme trompe tu dois faire un prog qui demande à l'uilisateur d'entrer un numéro de telephone qui ne depasse pas 10 chiffres et si il y'a un espace ou une quelconque marque de ponctuation il enleve .et ensuite il retourne ca 00.00.00.00.00
    au passage dans ton code je te signale une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    length(balayageIn(s)):=length(s);//tu peux pas affecter une longeur de chaine à une autre chaine :?

  7. #7
    Responsable Pascal, Lazarus et Assembleur


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

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 049
    Billets dans le blog
    2
    Par défaut
    Bonjour et bienvenue !

    Pour des raisons de performances, il n'est pas indiqué d'utiliser des fonctions de traitement de chaînes comme Delete.
    Parmi plusieurs possibilités, tu peux par exemple recopier, octet par octet, les caractères permis de la chaîne source vers la chaîne résultat. Ca peut donner quelque chose comme ceci :
    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
    Function TrimIn (Chaine : String) : String;
    Var Resultat : String;
        IndexChaine, IndexResultat : Byte;
    Begin
      IndexChaine := 1;
      IndexResultat := 0;
      while IndexChaine <= Length(Chaine) do
        begin
          if not (Chaine[IndexChaine] in [#0..#47,#58..#64,#91..#96,#123..#255])
             then
               begin
                 Inc(IndexResultat);
                 Resultat[IndexResultat] := Chaine[IndexChaine];
               end;
          Inc(IndexChaine);
        end;
      Resultat[0] := Char(IndexResultat);
      TrimIn := Resultat;
    End;
    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]

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/11/2012, 08h24
  2. Erreur de compilation avec les string et char*
    Par number9 dans le forum C++
    Réponses: 3
    Dernier message: 30/04/2012, 09h58
  3. [XL-2007] Probl formule avec des intervales de dates
    Par alexandrek dans le forum Excel
    Réponses: 0
    Dernier message: 09/02/2011, 11h56
  4. Problème avec les tableaux de char.
    Par Letinono dans le forum Débuter
    Réponses: 3
    Dernier message: 29/05/2008, 16h24
  5. probl. avec les tableaux d'indices de sommets
    Par kagemusha dans le forum OpenGL
    Réponses: 2
    Dernier message: 04/07/2006, 19h41

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