Forum Liberty Basic France

Général » Trier une liste avec doublons Petit défi, faites chauffer les claviers !
Le 11/08/2017 à 21h03

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 516
Voici une petite mésaventure qui m'a laissé chercher un bout de temps tellement j'avais confiance dans mon tri, alors que c'est lui qui semait la pagaille dans le projet où je voulais l'inclure...

En cause, les doublons dans la liste à trier, qui entraînent une boucle while difference=0 dans les affres de l'infini...

J'ai résolu le problème en ajoutant une étape de filtrage dans la boucle : on ne compare que des mots différents. Puis une fois le tri fait, je supprime les cases restées vides, celles qui remplacent les doublons, avec une série de boucles for/next. ça fait le job que j'attend pour ma base de données et je n'ai pas la prétention de développer davantage, mais il y a sûrement plus élégant : supprimer les doublons et trier la liste au sein de la même boucle. Possible ?

La liste à trier :

Code VB :
 
[mots] data "guidage","fleur","armure","armoire","fleur","voile","armoire","armoire","guidage","volontaire","zephir"
nbmots=11
 



Hors concours, on peut aussi y mettre nos solutions perso :
Code VB :
 
[mots] data "guidage","fleur","armure","armoire","fleur","voile","armoire","armoire","guidage","volontaire","zephir"
nbmots=11
 
restore [mots]
dim liste$(nbmots):dim tri$(nbmots)
for a=0 to nbmots-1:read mot$:liste$(a)=mot$:next
 
for ref=0 to nbmots-1
    motRef$=liste$(ref)
 
    for compare=0 to nbmots-1
        if ref<>compare then
            motCompare$=liste$(compare)
 
            'si les mots sont différents
            if motRef$<>motCompare$ then
 
                'on compare lettre à lettre le mot référence et le mot comparé
                lettre=1
                difference=0
                while difference=0
 
                    'codes ascii des lettres
                    a=asc(mid$(motRef$,lettre,1))
                    b=asc(mid$(motCompare$,lettre,1))
 
                    'on supprime la distinction majuscules-minuscules
                    if a>96 then a=a-32
                    if b>96 then b=b-32
 
                    'pour quitter l'analyse lorsque les lettres seront différentes
                    if a=b then lettre=lettre+1 else difference=1
 
                wend
 
                if a>b then apres=apres+1 else avant=avant+1
 
            end if
 
        end if
 
    next
 
    tri$(apres)=motRef$ 'tri dans l'ordre conventionnel
    'tri$(avant)=motRef$ 'tri dans l'ordre inverse
    avant=0:apres=0
 
next
 
'suppression des cases vides
'comptage des cases vides pour dimensionner le tableau définitif
for a=0 to nbmots-1
    if tri$(a)="" then casevide=casevide+1
next
 
nbcases=nbmots-casevide
dim definitif$(nbcases)
 
'transfert des cases non vides dans le tableau définitif
actuel=0
for a=0 to nbmots-1
    if tri$(a)<>"" then definitif$(actuel)=tri$(a):actuel=actuel+1
next
 
'controle du résultat
for a=0 to actuel-1:print definitif$(a):next
 
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Général » Trier une liste avec doublons Petit défi, faites chauffer les claviers !  

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie