ORDRE ALPHABÉTIQUE

cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 - 25 nov. 2010 à 22:23
cs_goc Messages postés 19 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 21 avril 2011 - 20 déc. 2010 à 19:16
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/52520-ordre-alphabetique

cs_goc Messages postés 19 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 21 avril 2011
20 déc. 2010 à 19:16
@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("?")
cs_jcbouli Messages postés 9 Date d'inscription mardi 17 février 2009 Statut Membre Dernière intervention 28 mai 2012
20 déc. 2010 à 18:43
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.
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
4 déc. 2010 à 22:30
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
cs_goc Messages postés 19 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 21 avril 2011
4 déc. 2010 à 21:59
"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
NHenry Messages postés 15143 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 17 juillet 2024 159
2 déc. 2010 à 18:57
"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.
NHenry Messages postés 15143 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 17 juillet 2024 159
2 déc. 2010 à 18:55
@GOC

Par acquit de conscience, j'ai regardé, en 2003 (au moins), Array.Sort existe, donc a moins d'avoir un VS.NET 2002 (.NET 1.0), la technique fonctionne.

Le version de .NET n'a rien à voir.
cs_goc Messages postés 19 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 21 avril 2011
2 déc. 2010 à 14:04
@ nhenry
"C'est une source .NET, donc pas de VB6 ici."

tu as oublié de préciser quelle version de .net

non parce que si c'est pour faire de l'ostracisme, autant le faire jusqu'au bout et refuser tout commentaire qui ne correspondrait pas à la bonne version

A bon entendeur, salut!
NHenry Messages postés 15143 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 17 juillet 2024 159
1 déc. 2010 à 15:43
@GOC
"l'avantage de la listebox c'est d'etre compatible vb6"
C'est une source .NET, donc pas de VB6 ici.
Si c'est du VB6, il y a d'autres sources qui traite ce sujet.

Concernant .NET, ayant eu besoin il y a moins de 5 minutes de cela, il y a nettement plus simple et rapide :
Dim ltStr() as String=MaFonctionRetourneTableau()

Array.Sort(ltStr)

Pas plus, ça suffit, donc je l'avoue, pour mon premier commentaire sur la source, je n'avais pas recherché de ce coté.
Certes, ça ne retire pas les chaines vides, mais c'est nettement plus court et plus rapide (pas de code VB.NET en exécution, mais des instructions d'avantages optimisée et codées par des personnes qui ont plus l'expérience de ces sujets).

Concernant les GOTO et consort, je n'ai jamais dit que GOTO était inutile, mais les cas où on en a besoin sont relativement restreint en VB.NET (un Exit For a l'avantage par exemple, de sortir proprement d'un boucle For).
cs_goc Messages postés 19 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 21 avril 2011
1 déc. 2010 à 14:59
@ nhenry
l'avantage de la listebox c'est d'etre compatible vb6
d'ailleurs ça commence à gonfler grave ces co...eries de .net, si pour éviter d'écrire 3 lignes de plus, on doit se farcir 200mo de librairies inutiles, je ne vois pas bien l'intérêt, et surtout quand on sait qu'un programme, c'est 10% d'écriture, et 90% de mise au point, "sous-traiter" des fonctions complexes, c'est la garantie de passer 3 fois plus de temps à déboguer un soft dont on perd le contrôle assez rapidement.
Et je ne parle pas du masochisme consistant à se donner pieds et poings liés a une entreprise extérieure (Microsoft pour ne pas la nommer) dont on connait les pratiques plus que douteuses quand il s'agit d'obliger les développeurs à passer à la caisse (voir évolutions des prix des abonnements MSDN, depuis windows 2.0)

quand au problème d'illisibilité des programmes, que tu utilise ou non un goto, cela ne change rien au problème, quand tu programme comme un pied, un programme restera toujours illisible, même si tu respecte les dogmes de mandarins qui ne vivent pas de leurs programmes mais qui se permettent de donner des leçons, et meme si tu y mets 50 lignes de commentaire à chaque instruction.
tiefedan Messages postés 2 Date d'inscription dimanche 29 décembre 2002 Statut Membre Dernière intervention 1 décembre 2010
1 déc. 2010 à 11:03
juste pour NHenry et ceux que ça intéresse
tu as raison mais il faut encore préciser que du point de vue de l'algo pure, "exit for" c'est pas bien. En effet utiliser une boucle for, suppose que l'on connait à l'avance le nombre d'itération. La sortie avec "exit for", goto, ou la manipulation de l'indice sont à proscrire, dans certain langage (ADA) c'est même impossible à faire. Pour résumer quant on ne connait pas le nombre d'itérations, on utilise un "While" qui est la mère de toutes les boucles. ;)
NHenry Messages postés 15143 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 17 juillet 2024 159
29 nov. 2010 à 13:04
@GOC
Le GOTO est une "abération" dans les langages de haut niveau (Je ne parle pas des langages plus bas niveau, car ceux-ci ont plus souvent besoin de cela soit pour des raisons fonctionnelles (ASM), soit pour des questions de vitesse (C par exemple) ), il créé du code spaghetti qui devient rapidement illisible, parfois, il est nécessaire, mais c'est extrêmement rare, ici il n'est pas utile.

concernant ta proposition de ListBox triée, cela est plus lourd quye de traiter par SortedList, cette dernière ne générant pas de controle.
cs_goc Messages postés 19 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 21 avril 2011
29 nov. 2010 à 06:06
@Nhenry
le coup du "jamais de goto", faut arrêter le talibanisme des écoles de programmation. un goto n'a rien de dégradant, et évite de générer du code machine inutile

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

sinon, il existe une solution simple: tu cree une listbox "sorted"
tu ajoute chacune de tes phrases dans la liste box (fonction additem)
et tu n'as plus qu'a lire ta listebox, bon ce n'est pas des plus joli, mais ca permet d'ajouter une fonction de tri sans se prendre la tête
michael59330 Messages postés 30 Date d'inscription dimanche 27 janvier 2008 Statut Non membre Dernière intervention 29 octobre 2023
26 nov. 2010 à 16:50
Merci beaucoup pour vos idées d'amélioration!!
NHenry Messages postés 15143 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 17 juillet 2024 159
26 nov. 2010 à 13:04
Je note pour commencer :
Function ordre_alphabetique(ByVal tableau_de_string() As String) as Boolean

TOUJOURS mettre Option Strict et Option Explicit à On

JAMAIS de GOTO
GoTo mot_suivant
Peut être remplacé par Exit For

Si dans ton tableau il y a que des chaines différentes, tu peux encore faire plus simple :
Function ordre_alphabetique(ByVal tableau_de_string() As String) as Boolean
Dim ltDict as New SortedList(Of String, String)

For Each lStr As String In tableau_de_string
If lStr.Trim.Length>0 Then
ltDict.Add(lStr.ToLower(),lStr)
End If
Next

Dim i as Integer=0
For Each lStr In ltDict.Values
tableau_de_string(i)=lStr
i+=1
Next

Return True
End Function
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 36
26 nov. 2010 à 09:26
Le sort sur les lists de string ne fonctionne pas ???
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 36
26 nov. 2010 à 09:24
compare_2_strings peut surement etre optimisé.
Avec des indexOf par exemple et contains
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
25 nov. 2010 à 22:23
* Programme VB.NET, merci de l'indiquer
* Pas besoin de If à la ligne 56 (Return direct)
* position_dans_alphabet à supprimer. Utilise les fonctions de la classe Convert
* Exit Function après Return inutile
* N'utilise pas les fonctions de la classe Strings mais taChaine.Substring() pour un Mid, etc.