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

Delphi Discussion :

Problème de tri


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2003
    Messages : 422
    Par défaut Problème de tri
    bonjour,

    j'ai un problème avec un tri de fichier ci-dessous le morceau de procédure concernée

    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
     
           pro:='xxxx9999';
           for i:=1 to nb_lig do
           begin
                seek(fichier,i); read(fichier,enregcollec);
                tab_base[i,2]:= Trim(enregcollec.num);
           end;
     
           lig:=0;
           for i:=1 to nb_lig do
           begin
              for j:=1 to nb_lig do
              begin
               test:=tab_base[j,2];
              if test<pro then
                     begin
                      pro:=test;
                      lig:=j;
                     end;
              end;
              tab_base[lig,2]:='xxxx9999';
              seek(fichier,lig);read(fichier,enregcollec);
              tab_resu[i]:=enregcollec; pro:='xxxx9999';lig:=0;
           end;
    Les éléments à trier sont comme ceci
    BF100
    BF12
    BF10
    BF08
    BF09
    BF11
    BF101

    et voici le résultat

    BF08
    BF09
    BF10
    BF100
    BF101
    BF11
    BF12

    Apparemment le tri se fait sur le premier chiffre mais je souhaite avoir ceci comme résultat

    BF08
    BF09
    BF10
    BF11
    BF12
    BF100
    BF101

    Merci de votre aide

  2. #2
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Par défaut

    j'ai vu un topic similaire récemment sur ce même forum.
    en fait le tri que tu effectue actuellemnt est alphanumérique et le résultat que tu obtient est bien normal.
    je constate aussi que le préfixe de tes chaine est constant (2 lettres BF). à toi donc de créer un algorithme qui te permettra d'extraire la partie numérique de la chaine, convertir la chaine en nombre et puis effectuer les comparaisons.
    ca ne devrait pas être trop difficile

  3. #3
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2003
    Messages : 422
    Par défaut
    Merci, j'y avais pensé, mais j'espérai qu'il y avait une solution plus simple !! car le problème c'est la variable alphanumérique n'est pas constante dans sa forme.http://www.developpez.net/forums/ima...s/icon_sad.gif

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 80
    Par défaut
    Si tous tes caractères alpha sont en début de variable, tu peux y aller par dichotomie (je crois qu'on appelle ça comme ça, le fait d'un aller pas à pas...), genre :

    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
     
    procedure convert_var(aVar:string;var prefix:string;var suffix:integer);
    var
      lsortboucle : boolean ;
      i :integer ;
    begin
      lsortboucle := false ;
      i := -1;
      while not lsortboucle and (i<=Length(aVar)) do
        try
          i:=i+1;
          prefix := copy(aVar,1,i);
          suffix := StrToInt(copy(aVar,i+1,length(aVar)));
          lsortboucle := true ;      
        except
        end;
    end
    en gros, le but, c'est d'essayer de convertir tous les derniers caractères en un entier.
    Tu commences avec tous les caractères c'est à dire du premier au dernier, puis du deuxième au dernier, puis du troisième au dernier, etc... jusqu'à ce que la conversion ne lève plus d'erreur et que donc l'instruction lsortboucle:=true passe, et que tu sorte donc de la boucle...

    Un peu violent, mais généralement efficace...

    (c'est un peu pondu à chaud, donc nécessitera sans doute des corrections...)

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

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 10h00
  2. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 21h25
  3. [VBA-E] [Excel] Tri automatique
    Par bovi dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/10/2002, 11h19
  4. [] Tri d'un tableau par ordre alphabétique
    Par cafeine dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/09/2002, 09h43
  5. ListView->Items->Clear() !!! Qques probl de perf
    Par Nicolas_a69 dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/08/2002, 12h49

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