Trier par ordre alphabétique un tableau.

Nohlan - 27 nov. 2012 à 22:23
 Nohlan - 29 nov. 2012 à 22:31
Bonsoir,
Ceci est mon 1er message, je vais donc me présenter vite fais. Je m’appelle Jérémy, 25 ans, je suis étudiant en Dut Info S1 et j'ai débuté par Access en base de donnée.

Je tombe sur un petit problème que je n'arrive pas a régler. J'ai déjà essayé pas mal d’algorithme, mais rien ne fonctionne.

C'est pourtant simple, je souhaiterai trier un tableau de 2 colonne par ordre alphabétique.

Mon tableau ce présente telle quel :

For i = 1 To UBound(T_client_index)
                    
                    Line Input #fichier_client_index, enreg_clients
                    T_client_index(i, 1) = Mid(enreg_clients, 1, 3)
                    T_client_index(i, 2) = Mid(enreg_clients, 4)
                    
Next


1WISSOCQ
2ASCONE
3BENCTEUX
4CANNY
5CUVILLIER
6DUPONCHEL
7GODON
8LEFEBVRE
9LEMAITRE
10PAPEGAY
11RAVAUX
12SOUXDORF
13THOREZ
14VASTRA

Je n'ai mis qu'une petit parti bien sur ( il y a 132 noms)

Je ne demande pas un algorithme ou code tout fait. Je souhaite comprendre le fonctionnement du tri d'un tableau pour en faire un code.

D'avance merci !

51 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 nov. 2012 à 19:12
Non. Laisse tomber (lis mon dernier message) ===>> tu n'es pas dans le cas craint.
Mais il y a là un mystère que plus rien n'explique !
Si tout a été dit (en es-tu bien certain ?) le phénomène que tu dénonces ne devrait pas être là !
Peux-tu (on ne sait jamais) ouvrir ton fichier (celui traité) par le bloc-notes et jeter un oeil à son contenu ? Et me dire si "étrangetés" ?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
1WISSOCQ
2ASCONE
3BENCTEUX
4CANNY
5CUVILLIER
6DUPONCHEL
7GODON
8LEFEBVRE
9LEMAITRE
10PAPEGAY
11RAVAUX
12SOUXDORF
13THOREZ
14VASTRA
15LANNEZ
16MOTTET
.
.
.
.
.


Non rien de spécial.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 nov. 2012 à 19:33
ce que tu viens de montrer est EXACTEMENT ce que tu vois avec le bloc-notes ?
Etrange, surprenant, même, car alors ces lignes :
Line Input #fichier_client_index, enreg_clients
                    T_client_index(i, 1) = Mid(enreg_clients, 1, 3)
                    T_client_index(i, 2) = Mid(enreg_clients, 4)

ne feraient pas ce que tu dis qu'elles font (ce que tu as dans ton tableau) !!!
Tu ne me dis pas tout, je pense...
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Je suis autant surpris que toi, je suis depuis 1heures a la recherche de cette erreur. Je n'irai pas me coucher avant :)




Private Sub LISTERTOUS_Click()
    initialiser
    
    Open "H:\Cours\OMGL\OMGL 1\tpfichiers\client" For Random As fichier_client
    
    
    TEXTEFICHIER = ""
    nbrC = 0
    i = 1
    While Not EOF(fichier_client)
        ' 2/ Lecture des données du fichier client et transfére dans le champ TEXTEFICHIER.
        
        Get fichier_client, , enreg_client
                
                ' Format du numero pour avoir un truc bien aligné
                i = Format(i, "@@@")
                
                'Ajout au fur à mesure de la nouvelle chaine
                TEXTEFICHIER = TEXTEFICHIER & i & "|" & enreg_client.Numcli & "|" & enreg_client.Nom & "|" & enreg_client.Prenom & "|" & enreg_client.Cp & Chr(13) & Chr(10)
                
                ' Incrémentation du nombre de clients
                nbrC = nbrC + 1
                
                'ecriture dans le tableau
                '(i,1) -> colonne 1
                T_client_index(i, 1) = enreg_client.Nom
                '(i,2) -> colonne 2
                T_client_index(i, 2) = i
                'Boucle while donc incrementation du i
                i = i + 1
                
            
    Wend
    
    'Affichage du nombre de client
    NBRCLIENT = nbrC
    Close fichier_client
    
    'Ecriture du tableau sous forme d'un fichier séquentiel
    Open "H:\Cours\OMGL\OMGL 1\tpfichiers\client_index" For Output As fichier_client_index
        
                
                
                For i = 1 To UBound(T_client_index)
                
                    'A chaque tour de boucle on passe a la ligne ( au client ) suivant
                    'on met la ligne ( mais 2 colonnes ) dans la même chaine
                    client = T_client_index(i, 2) & T_client_index(i, 1)
                    
                    'Pour ecrire la chaine client dans un fichier "client_index"
                    'supprimer et créée automatiquement a chaque clic sur le bouton
                    Print #fichier_client_index, client
                    
                Next
                
           
        
    Close fichier_client_index
    
End Sub


Private Sub TRIER_Click()
    
        'efface le contenu du tableau T_client_index
        Erase T_client_index
        
        'On relis fichier_client_index et on remplis le tableau
        Open "H:\Cours\OMGL\OMGL 1\tpfichiers\client_index" For Input As fichier_client_index
        
                
                For i = 1 To UBound(T_client_index)
                    
                    Line Input #fichier_client_index, enreg_clients
                    ' Pour chaque nouvelle ligne au decoupe avec Mid
                    'Pour le nom de 4 à la fin
                    T_client_index(i, 1) = Mid(enreg_clients, 4)
                    'Pour le numero de 1 à 3
                    T_client_index(i, 2) = Mid(enreg_clients, 1, 3)
                    
                Next
        
       
  
                'Boucle qui tri le tableau dans l'ordre alphabétique
                Dim rowword As Integer
                Dim row As Integer
                Dim word1, word2 As String
 
                row = UBound(T_client_index, 1) - 1
                
                For i = 1 To UBound(T_client_index, 1) - 1
 
                    For iter = 0 To row
                    'Comparaison des valeurs
                        If LCase(T_client_index(iter, 1) & T_client_index(iter, 2)) > LCase(T_client_index(iter + 1, 1) & T_client_index(iter + 1, 2)) Then
                            'On stock dans des variables temporaire pour intervertire
                            'Deja fait en Algo
                            word1 = T_client_index(iter, 1)
                            word2 = T_client_index(iter, 2)
                            
                            'On remplace par les nouvelles
                            T_client_index(iter, 1) = T_client_index(iter + 1, 1)
                            T_client_index(iter, 2) = T_client_index(iter + 1, 2)
                            
                            'On affecte la valeur la plus grande a la suite
                            T_client_index(iter + 1, 1) = word1
                            T_client_index(iter + 1, 2) = word2
                        End If
                    Next iter
                    row = row - 1
                Next i
       
       
                'Affichage dans TEXTETRIER du tableau
                
                TEXTETRIER = ""
                For i = 1 To UBound(T_client_index)
                    
                    If T_client_index(i, 1) <> "" Then
                        TEXTETRIER = TEXTETRIER & T_client_index(i, 1) & "|" & T_client_index(i, 2) & Chr(13) & Chr(10)
                        nbrL = nbrL + 1
                    End If
                Next
        'Nombre total de client
        NBRELEMENT = nbrL
        
        Close fichier_client_index
        
End Sub
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 nov. 2012 à 21:07
Hé, l'ami !
1) nous ne sommes plus du tout sur la même méthode de lecture des lignes de ton fichier ...
2) cette ligne :
 Print #fichier_client_index, client

modifie ton fichier
L'ensemble : utilise une acrobatie inutile pour alimenter ton tableau*
3) on ne sait pas à quel moment tu lances le tri (pas automatiquement, apparemment).

Je me doutais déjà de l'existence de choses dont tu ne parlais pas. Il y en a peut-être d'autres ...
Voilà toutefois des décennies que je ne joue plus au poker javanais (tu sais ? ce jeu dont on apprend les conventions - qui peuvent changer en cours de jeu - au fur et à mesure de l'avancement du jeu et au gré d'un seul des deux joueurs ... )
Voilà ce que te proposes donc le vieux crouton que je suis :
1) tu mets sur un site de dépôt le fichier texte à traiter, TEL qu'il est au départ (en .txt ou en zip de txt)
2) si je l'ai avant 22 heures, tu auras ici avant minuit un code simple, jusq'au tri et à l'affichage du résultat dabns une textbox

Tu me diras à cette occasion si tu tiens vraiment à un dimensionnement "forfaitaire" à 199 (si ton prof l'impose ainsi) ou si tu veux du plus orthodoxe (dimensionnement exact). Moi, je saurais faire tant dans un cas que dans l'autre, mais tiens à ce que ce soit là TON choix (pas le mien).

Aller au-delà (jouer à découvrir), je n'en ai plus la force

Voilà.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
1 Je peux te donner ça bien sur, le truc particulier de ce tp c'est que l'on démarre avec un fichier relatif, que l'on affiche et dans la même boucle on écrit dans un tableau le NOM et NUMÉRO.

2 Ensuite on écrit le tableau sous forme d'un fichier séquentiel

3 Puis on efface le tableau

4 On relis le fichier crée en 2 et on rempli le tableau

5 On tri le tableau et on réécrie un fichier avec les clients trié

6 Afficher le tableau dans le champ TEXTETRIER

On doit jouer avec les relatif, séquentiel et séquentiel indexé
0
Au cas ou :
Mon fichier access

http://www.mediafire.com/?7y925vy1548n03c
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 nov. 2012 à 21:36
Ensuite on écrit le tableau sous forme d'un fichier séquentiel

Gné ?
On relis le fichier crée en 2 et on rempli le tableau

je ne sais pas qui est ton prof, mais : si ce que je devine est vrai :
soit tu ne l'as pas compris du tout (notamment en ce qui concerne ce qu'il entend par fichier séquentiel = pseudo base de données), soit tu l'as compris mais il passerait alors par un drôle de tremplin bien inutile pour alimenter le tableau comme tu le fais, avant même son tri).
Je vais préférer te laisser là, car on va considérablement s'éloigner, selon moi, de ce que t'a demandé ton prof.
Le tri d'un tableau dynamique à deux dimensions a été traité. C'était le sujet de cette discussion.
Bonne nuit.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 nov. 2012 à 22:04
Je vais tenter de te mettre sur la voie que je devine (celle de ton prof) :
regarde deux petits extraits de l'aide :

Type Record ' Désigne un type défini par l'utilisateur.
ID As Integer
Name As String * 20
End Type

Dim MyRecord As Record, RecordNumber ' Déclare les variables.
' Ouvre le fichier en accès aléatoire.
Open "FICHTEST" For Random As #1 Len = Len(MyRecord)
For RecordNumber = 1 To 5 ' Effectue la boucle 5 fois.
MyRecord.ID = RecordNumber ' Définit l'identificateur.
MyRecord.Name = "Mon nom" & RecordNumber ' Crée une chaîne.
' Écrit l'enregistrement dans le fichier.
Put #1, RecordNumber, MyRecord
Next RecordNumber
Close #1 ' Ferme le fichier.



Get, instruction, exemple
Cet exemple utilise l'instruction Get afin de lire les données d'un fichier et de les écrire dans une variable. Nous supposons que FICHTEST est un fichier contenant cinq enregistrements de type Record défini par l'utilisateur .

Type Record    ' Désigne un type défini par l'utilisateur.
    ID As Integer
    Name As String * 20
End Type

Dim MyRecord As Record, Position    ' Déclare les variables.
' Ouvre l'exemple de fichier en accès aléatoire.
Open "FICHTEST" For Random As #1 Len = Len(MyRecord)
' Lit l'exemple de fichier à l'aide de l'instruction Get.
Position = 3    ' Définit le numéro d'enregistrement.
Get #1, Position, MyRecord    ' Lit le troisième enregistrement.
Close #1    ' Ferme le fichier.


Ils devraient te conduire à plusieurs réflexions plus que utiles.
Ajoutons ceci : une fois ton fichier texte plat transformé (par put) et la structure d'accompagnement en fichier structuré ===>> Get te permet d'en extraire les enregistrements (tous).
Cette extraction te permet d'alimenter facilement un pseudo recordset (appelons-le RS)
RS peur être trié par une simple requête. Ce tri peut alimenter un tableau (si tu le veux), mais également directement un contrôle d'affichage (y compris une textbox).
Rien ne t'empêche (en sens inverse) d'abonder ton fichier séquentiel à partir des données ainsi triées.

Par ailleurs : inutile de formater (tes "@@@") d'abord le fichier plat originel pour y revenir ensuite et en séparer le préfixe numérique et le reste.
Ex :
toto = "1234567BLABLA"
  nume = Val(toto)
  reste = Mid(toto, Len(CStr(nume)) + 1)
  MsgBox reste & vbCrLf & nume

tu vois bien : une seule lecture suffit.

Reste qu'il est assez vraisemblable, comme tu l'as toi-même déjà dit, que les autres de ta classe ne seront pas bien plus "avancés" que toi.
Si tu as le temps de réfléchir à nouveau sur ces bases et de tout reprendre, tu seras le "caïd". Sinon : sois sans crainte : tu ne seras pas le dernier.
Amitiés et bonne nuit.
Je te laisse là.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Je suis sur de moi en disant que je suis le seul a faire la fin de ce tp.
Sinon je vais pour le seul jour ( vendredi ) qu'il me reste avant mon ds me concentrer sur les choses vue en cours, mais toutes tes explications mon beaucoup aidé, et je ne manquerai pas de venir revoir tout ça une fois passé ce test.

Encore un grand merci a toi pour ta patience qui est sur les forums fasse a des novices comme moi mise a rude épreuve
0
Rejoignez-nous