Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 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 | | Calendrier |
|
|
| SORT sur une LIST | |
| | Auteur | Message |
---|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: SORT sur une LIST Sam 23 Nov 2013 - 1:27 | |
| Salut tout le monde. Je dispose d’une LIST dont les ITEMs sont les valeurs d’un tableau d’entiers aléatoires. Comment utilise-t-on la commande SORT pour trier cette LIST ? Et surtout où doit-on mettre cette commande ? J’ai beau inséré les commandes SORT_ON … SORT … SORT_OFF avant, pendant et après la construction de la LIST, mais je n’arrive pas à avoir ma LIST triée ! - Code:
-
dim n : n = 50 dim tableau(n) height 0, 800 list 10 : width 10,100 : height 10,700 : left 10,40 : top 10,50 Charger_Tableau() end
rem ============================================================================ ' Charger un tableau d'entiers aléatoires (entre 0 et 999) SUB Charger_Tableau() dim_local i for i = 1 to n tableau(i) = int(rnd(1000)) item_add 10, tableau(i) next i END_SUB rem ============================================================================
Je m’en suis sorti en écrivant une SUB de tri. - Code:
-
dim n : n = 50 dim tableau(n)
height 0, 800 alpha 1 : top 1,20 : left 1, 50 : caption 1,"Liste non triée" alpha 2 : top 2,20 : left 2,260 : caption 2,"Liste triée" list 10 : width 10,100 : height 10,700 : left 10,40 : top 10,50 list 20 : width 20,100 : height 20,700 : left 20,250: top 20,50
Charger_Tableau() Tri_Shell_Metzner() end rem ============================================================================ ' Charger une table d'entiers aléatoires (entre 0 et 999) SUB Charger_Tableau() dim_local i for i = 1 to n tableau(i) = int(rnd(1000)) item_add 10,tableau(i) next i END_SUB rem ============================================================================ ' Algorithme de tri rapide de Shell-Metzner SUB Tri_Shell_Metzner() dim_local ecart, i, j, permut, true, false, temp ecart = int(n/2) : true = 1 : false = 0 while ecart <> 0 for i = 1 to n - ecart j = i : permut = true while j > 0 and permut = true permut = false if tableau(j) > tableau(j + ecart) ' on permute tableau(j) et tableau(j+ecart) temp = tableau(j) tableau(j) = tableau(j+ecart) : tableau(j+ecart) = temp permut = true j = j - ecart end_if end_while next i ecart = int(ecart/2) end_while ' Afficher le tableau triée for i = 1 to n item_add 20, tableau(i) next i END_SUB rem ============================================================================
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: SORT sur une LIST Sam 23 Nov 2013 - 2:10 | |
| Tu fais comme ceci: - Code:
-
dim n : n = 50 dim tableau(n) height 0, 800 list 10 : width 10,100 : height 10,700 : left 10,40 : top 10,50 sort_on 10 : ' <================== Charger_Tableau() end
rem ============================================================================ ' Charger un tableau d'entiers aléatoires (entre 0 et 999) SUB Charger_Tableau() dim_local i for i = 1 to n tableau(i) = int(rnd(1000)) item_add 10, right$("00"+str$(tableau(i)),3) : ' <========== next i END_SUB rem ============================================================================
Tu y étais presque... | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: SORT sur une LIST Sam 23 Nov 2013 - 2:48 | |
| Merci Klaus. ça marche aussi avec SORT 10 à l’intérieur de la SUB, avant ou après NEXT i et ça marche aussi après l’appel de la SUB, mais pas avant !
Je récapitule : on utilise SORT_ON 10 avant l’appel de la SUB, ou bien on fait SORT 10 après ITEM_ADD 10 … que ce soit à l’intérieur ou à l’extérieur de la boucle FOR … NEXT ou même après l'appel de la SUB. Et dans tous les cas, on doit transformer le texte de l’ITEM en chaîne de caractères. (c’est ce que je n’avais pas soupçonné !)
Une fois encore, merci Klaus. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: SORT sur une LIST Sam 23 Nov 2013 - 10:59 | |
| Quelques précisions sur SORT:
1. SORT_ON ne fait aucun tril. Cette commande place somplement l'objet (LIST, DLIST) dans un mode où Windows fait automatiquement les ajouts ultérieurs (insertions ou ajouts en fin de liste) de façon triée.
2. SORT_OFF désactive ce mode trié, sans toucher à l'ordre actuel des lignes. Tout ajout (insertion ou ajout en fin de liste) se fait directement, sans changement d'ordre)
3. La commande SORT peut être donnée à n'importe quel moment, que l'objet soit en mode trié ou non. Toutes les lignes seront triées, mais si l'objet est en mode non trié, les ajouts ultérieurs pourront perturber l'ordre qui ne sera pas maintenu.
Conséquence: Si une liste doit être maintenue en mode triée, il est largement préférable de faire SORT_ON au début, puis d'utiliser uniquement ITEM_ADD pour les ajouts. L'ordre trié sera mainteni en permanence, et ce pour un surcoût en temps minimal. Faire la commande SORT à l'intérieur d'une boucle, c'est extrêmement coûteux en termes de performance. C'est à la limite acceptable pour de petites listes, mais la perte de performance deviendra vite prohibitive lorsque la liste grandit. Ceci est par exemple invivable avec une liste des codes postaux...
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: SORT sur une LIST Sam 23 Nov 2013 - 12:29 | |
| Merci Klaus pour ces éclaircissements.
Il faut ajouter qu’il est impératif de formater les valeurs si elles sont de type numérique, (c.à.d. les compléter par des zéros au début) car le tri se fait sur la valeur ASCII du 1er caractère, puis le second, etc. La chaîne la plus courte sera complétée par des espaces, ce qui a comme effet "324" < "52 " ! Pour retrouver un tri comme on peut s’y attendre, on doit modifier dans l’exemple précédent « 52 » par « 052 ». On obtient alors "052" < "324". | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: SORT sur une LIST Sam 23 Nov 2013 - 17:58 | |
| Exact. D'où l'expression, dans mon code: right$("00"+str$(tableau(i)),3) pour obtenir une valeur normalisée sur 3 caractères... | |
| | | Contenu sponsorisé
| Sujet: Re: SORT sur une LIST | |
| |
| | | | SORT sur une LIST | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |