Ordre alphabétique

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 363 fois - Téléchargée 17 fois

Contenu du snippet

cette fonction permet de trier un tableau de strings dans l'ordre alphabétique.

ps: on a besoin de 2 fonctions annexes

Source / Exemple :


Function ordre_alphabetique(ByVal tableau_de_string() As String)
    Dim nb As Integer = UBound(tableau_de_string, 1)
    'en premier on enlève les blancs éventuels:
    For i = 1 To nb
      If tableau_de_string(i) = "" Then
        For u = i To nb - 1
          tableau_de_string(u) = tableau_de_string(u + 1)
        Next
        tableau_de_string(nb) = ""
      End If
    Next
    Dim sortie(nb) As String
    sortie(1) = tableau_de_string(1)
    'on prend un mot de la liste (k)
    'on le compare a ceux de la liste de sortie (i)
    'et on l'insère
    For k = 2 To nb
      If tableau_de_string(k) = "" Then
        Return sortie
        Exit Function
      Else
        For i = 1 To nb 'on compare le texte a tous les textes de sortie
          If sortie(i) = "" Then
            sortie(i) = tableau_de_string(k)
            GoTo mot_suivant
          Else
            If compare_2_strings(tableau_de_string(k), sortie(i)) = True Then
              For u = nb - 1 To i Step -1
                sortie(u + 1) = sortie(u)
              Next
              sortie(i) = tableau_de_string(k)
              'on passe au suivant:
              GoTo mot_suivant
            End If
          End If
        Next
      End If
mot_suivant:
    Next
    Return sortie
  End Function

  Function compare_2_strings(ByVal string1 As String, ByVal string2 As String)
    'renvoi true si la 1ere est bien avant la seconde
    Dim reponse As Boolean
    For i = 1 To 40
      If Strings.Mid(string1, i, 1) = "" And Strings.Mid(string2, i, 1) <> "" Then
        Return True
        Exit Function
      End If
      If Strings.Mid(string1, i, 1) <> "" And Strings.Mid(string2, i, 1) = "" Then
        Return False
        Exit Function
      End If
      If Strings.Mid(string1, i, 1) <> Strings.Mid(string2, i, 1) Then
        If position_dans_alphabet(Strings.Mid(string1, i, 1)) > position_dans_alphabet(Strings.Mid(string2, i, 1)) Then
          Return False
          Exit Function
        Else
          Return True
          Exit Function
        End If
      End If
    Next
    Return True 's'ils sont identiques
  End Function

  Function position_dans_alphabet(ByVal lettre As String)
    lettre = LCase(lettre)
    Dim nb As Integer
    Select Case lettre
      Case "a"
        nb = 1
      Case "b"
        nb = 2
      Case "c"
        nb = 3
      Case "d"
        nb = 4
      Case "e"
        nb = 5
      Case "f"
        nb = 6
      Case "g"
        nb = 7
      Case "h"
        nb = 8
      Case "i"
        nb = 9
      Case "j"
        nb = 10
      Case "k"
        nb = 11
      Case "l"
        nb = 12
      Case "m"
        nb = 13
      Case "n"
        nb = 14
      Case "o"
        nb = 15
      Case "p"
        nb = 16
      Case "q"
        nb = 17
      Case "r"
        nb = 18
      Case "s"
        nb = 19
      Case "t"
        nb = 20
      Case "u"
        nb = 21
      Case "v"
        nb = 22
      Case "w"
        nb = 23
      Case "x"
        nb = 24
      Case "y"
        nb = 25
      Case "z"
        nb = 26
      Case Else
        nb = 0
    End Select
    Return nb
  End Function

A voir également

Ajouter un commentaire

Commentaires

Messages postés
19
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
21 avril 2011

@jcbouli

ton programme ne gère pas les espaces et autres ponctuations
et puis si on veut être rigoureux, il faudrait aussi gerer les caractères nationaux (comme les caractères accentués)

sinon on peut simplement completer ma ligne de code
n=ascw(ucase(lettre))-asc("?")
Messages postés
9
Date d'inscription
mardi 17 février 2009
Statut
Membre
Dernière intervention
28 mai 2012

Bonjour michael59330

Je trouve ta recherche de caractere un peu longue, les select case à répétition sont pratiques mais on peut réduire cela avec facilité voici une petite routine qui devrait marcher :
Function position_dans_alphabet(ByVal lettre As String)
Dim Caractere, Nb As Integer
Caractere = AscW(UCase(lettre))
Select Case Caractere
Case Is >= 65, Is <= 90
Nb = Caractere - 64
Case Else
Nb = 0
End Select
Return Nb
End Function
J'ai repris les même variables que toi et le résultat obtenu est identique.Si tu préfère travailler avec des minuscules Il faut changer le Ucase par Lcase puis mettre Case Is >=97, Is <=122 et changer le calcul par NB = Caractere - 96

@ GOC
ta fonction "position_dans_alpha",tu peut la remplacer par
n=asc(lettre)-asc("?")

Oui et non cela ne retourne pas exactement le même résultat qu sa routine.
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
Ton programme ne fonctionne pas sous toutes les versions de VB (t'explosera à la figure en VB6) et puis OSEF de la compatibilité avec .NET 1/1.1
Messages postés
19
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
21 avril 2011

"donc, GOC, dis-moi sur quelle(s) version de .NET ça ne fonctionne pas"

tu n'as rien compris

j'en ai rien a f.. que ça fonctionne sur 1.0 ou sur x.yy. moi je préfère avoir des prog qui puissent tourner sur toutes les version de Vb
et qui, ici au moins, puissent servir a tout le monde y compris (et surtout) aux debutants

surtout qu'il semblerait que vb6 pourrait passer en Open, et donc pourrait bine se refaire une jeunesse
Messages postés
14673
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
28 juin 2020
143
"donc a moins d'avoir un VS.NET 2002 (.NET 1.0)"
Je précise que n'ayant pas cette version je n'ai pas pu testé ni vérifier la présence de cela, donc, GOC, dis-moi sur quelle(s) version de .NET ça ne fonctionne pas.
Afficher les 17 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.