[déplacé VB6 -> VB.NET] Probléme tri croissant

Résolu
kijx Messages postés 45 Date d'inscription mercredi 30 décembre 2009 Statut Membre Dernière intervention 2 avril 2014 - 30 déc. 2009 à 11:49
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 13 janv. 2010 à 16:51
Bonjour ,
Je debute en programmation visual basic et j'aimerai savoir comment est ce que l'on fait pour trier 10 valeurs en ordre croissant , c'est valeur on était saisie via un compteur dans 10 zones differentes et je dois les reportées dans un tableau.
Voila le code que j'ai :

Function fct_chiffre(ByVal pvaleur As Integer) As String

Dim wchemin As String
fct_chiffre = wchemin
If pvaleur = 1 Then
wchemin = 1
End If
If pvaleur = 2 Then
wchemin = 2
End If
If pvaleur = 3 Then
wchemin = 3
End If
If pvaleur = 4 Then
wchemin = 4
End If
If pvaleur = 5 Then
wchemin = 5
End If
If pvaleur = 6 Then
wchemin = 6
End If
If pvaleur = 7 Then
wchemin = 7
End If
If pvaleur = 8 Then
wchemin = 8
End If
If pvaleur = 9 Then
wchemin = 9
End If
If pvaleur = 10 Then
wchemin = 10
End If
End Function
Sub compteur()

Randomize()
cht1.Text = Int(Rnd(1) * 10)
wresult cht1.Text fct_chiffre(cht1.Text)
cht2.Text = Int(Rnd(1) * 10)
wresult cht2.Text fct_chiffre(cht2.Text)
cht3.Text = Int(Rnd(1) * 10)
wresult cht3.Text fct_chiffre(cht3.Text)
cht4.Text = Int(Rnd(1) * 10)
wresult cht4.Text fct_chiffre(cht4.Text)
cht5.Text = Int(Rnd(1) * 10)
wresult cht5.Text fct_chiffre(cht5.Text)
cht6.Text = Int(Rnd(1) * 10)
wresult cht6.Text fct_chiffre(cht6.Text)
cht7.Text = Int(Rnd(1) * 10)
wresult cht7.Text fct_chiffre(cht7.Text)
cht8.Text = Int(Rnd(1) * 10)
wresult cht8.Text fct_chiffre(cht8.Text)
cht9.Text = Int(Rnd(1) * 10)
wresult cht9.Text fct_chiffre(cht9.Text)
cht10.Text = Int(Rnd(1) * 10)
wresult cht10.Text fct_chiffre(cht10.Text)
End Sub
Sub affichage()
Dim montableau(10)
montableau(1) = cht1.Text
'chListBox1.Text = cht1.Text
montableau(2) = cht2.Text
'chListBox1.Text = cht2.Text
montableau(3) = cht3.Text
'chListBox1.Text = cht3.Text
montableau(4) = cht4.Text
'chListBox1.Text = cht4.Text
montableau(5) = cht5.Text
'chListBox1.Text = cht5.Text
montableau(6) = cht6.Text
'chListBox1.Text = cht6.Text
montableau(7) = cht7.Text
'chListBox1.Text = cht7.Text
montableau(8) = cht8.Text
'chListBox1.Text = cht8.Text
montableau(9) = cht9.Text
'chListBox1.Text = cht9.Text
montableau(10) = cht10.Text
'chListBox1.Text = cht10.Text

chListBox1.Items.Add(montableau)

End Sub

Si quelqu'un pouvais m'aider ce serai hyper cool , Merci

16 réponses

PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
13 janv. 2010 à 12:09

Sub compteur()
Randomize()
cht1.Text = Int(Rnd(1) * 10)
(...)


*pourquoi compteur est public?
*randomize est une commande VB6 et non VB.NET
décoche la référence microsoft.visualbasic dans les propriétés de ton projet
*cht1.Text Int... string entier? alors à quoi sert la fonction fct_chiffre, il faut l'utiliser
*int est une commande VB6 et non VB.NET
*rndest une commande VB6 et non VB.NET



Sub affichage()
Dim montableau(10) As UInteger
montableau(10) = cht1.Text
montableau(10) = cht2.Text
montableau(10) = cht3.Text

(....)


*si tu types en uinteger faut mettre des uinteger, pourquoi mettre des string?
soit tu converties (convert.to...), soit tu fais un tableau de string ou même de char
*si seul l'item 10 reçoit une valeur, de 0 à 9 il n'y aura que des NULL


enfin la propriété datasource d'une listbox accepte un tableau.
donc soit :
lalistbox.datasource = montableau()

soit tu boucles sur chaque élément
with lalistbox
  .items.clear
  for i as integer =1 to 10
    .items.add tableau(i)
  next i
end with


NB : pour le RND à refaire, il y a (comme toujours) des exemples sur codyx.org
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 236
30 déc. 2009 à 12:48
Bonjour,

Quel est exactement ton problème ?

S'il est celui d'alimenter un tableau de valeurs, ta question est mal posée.
S'il est celui de trier un tableau de valeurs déjà alimentée ===>> tu as tout ce qu'il faut dans les sources déposées sur ce forum !

____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
kijx Messages postés 45 Date d'inscription mercredi 30 décembre 2009 Statut Membre Dernière intervention 2 avril 2014
30 déc. 2009 à 14:21
J'ai 10 Textbox avec un chiffre de 1a10 dedans , et je voudrai ranger c'est 10 valeurs dans un tableau ou une listbox n'importe .
J'aimerai simplement savoir comment on tri 10 valeurs en ordre croissant et comment on les reporte dans un autre module tel qu'un tableau .
0
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
30 déc. 2009 à 14:29
salut,

chListBox1.Items.Add(montableau)

çà ressemble à du vb.net, pas du vb6 !

[hr]
0

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

Posez votre question
Claiyah Messages postés 580 Date d'inscription mercredi 20 août 2008 Statut Membre Dernière intervention 20 avril 2010 3
30 déc. 2009 à 14:31
salut
comme ce sont des chiffres tu peut les comparer (<>=) et t'aura un tri croissant ou décroissant
ou les ajouter dans une liste comme tu veut avec le paramètre : sorted = true
si ce sont pas des chiffres tu peut utiliser leur code ascii pour les comparer



Quand on pose une question on est con 5 minutes,Quand on ne la pose pas on le reste toute sa vie
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 236
30 déc. 2009 à 14:35
Non...
On envoie d'abord dans un tableau et on trie ce dernier ensuite.
Ceci étant dit : tu viens maintenant d'ajoiuter "ou dans une listbox n'importe"
C'est alors plus simple car une listbox comporte une propriété Sorted (sous VB6 en espérant que tu développes bien sous VB6 - le présent thème - et non sous VBA) à mettre à True ===>> et tes rajouts s'y feront de manière triée, spontanément.
J'appelle par ailleurs ton attention sur le fait qu'une listbox contient des Strings et non des numériques. Or "11" est < "2" alors qu'en numériques, 11 est > 2. Le tri reszte possible, mais en ajoutant alors des "0" ou des espaces devant, de sorte à avoir toujours la même longueur de string (car "011" est alors > "002").... Joue donc avec la fonction Format...
Enfin et surtout, ce que tu nous montres de ton code laisse tranparaître que tu ignores encore ce que sont les groupes de contrôles indexés sous VB6 (n'existent pas soyus VBA).
Reviens en nous montrant un code tenant compte de tout cela.






____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
kijx Messages postés 45 Date d'inscription mercredi 30 décembre 2009 Statut Membre Dernière intervention 2 avril 2014
30 déc. 2009 à 15:42
Merci pour toutes ces infos , c'est vraiment sympa
Et comme je l'ai dit , je debute , ce qui fait que je n'y connais strictement rien .
PCPT tu me demande si c'est du vb.net ou du vb6 , je ne sais meme pas c'est quoi la difference .
Je travaille sous visual studio 2005 avec le programme Microsoft Visual Basic.

Ce que vous m'avez dit pour l'instant je n'y comprend pas grand chose , mais je vais me poser la dessus et essayer .
Quand j'aurai un resultat je reviendrai vous le montrer :)
0
kijx Messages postés 45 Date d'inscription mercredi 30 décembre 2009 Statut Membre Dernière intervention 2 avril 2014
31 déc. 2009 à 15:38
Pourquoi mon poste a-t-il était déplacer içi ?
Je travail sous visual basic pourtant , je ne comprends pas .
0
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
31 déc. 2009 à 15:53
parce qu'il n'y a pas que les tableaux qu'on doit parfois trier.... les forums aussi

tu est en VB.NET et non VB6, j'ai donc déplacé vers VB.NET

quant à ta question, tape "trier tableau" sur www.codyx.org, tu y trouveras plusieurs exemples

++
0
kijx Messages postés 45 Date d'inscription mercredi 30 décembre 2009 Statut Membre Dernière intervention 2 avril 2014
12 janv. 2010 à 13:34
Mais visual studio 2005 utilise bien du visual basic pourtant
0
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
12 janv. 2010 à 14:10
non, du VB2005 !
du vb.net, qui n'est pas du vb6

pas parce qu'il y a "vb" dedans que çà autorise à ne pas choisir une catégorie adéquate

certains hommes portent des vêtement en soie
les araignées font de la soie
donc certains hommes sont des araignées?

bref çà n'a plus aucun rapport et çà fait déjà 12 jours que j'ai "rangé" ton topic dans la bonne catégorie, tu es allé voir sur codyx.org depuis ???

parce que si c'est juste pour danser sur une queue de cerise, on va pas aller bien loin...

(euh... tu danses parfois donc tu es une cerise? )


IMPORTANT : voir le "NB" de ma SIGNATURE

[hr]
0
kijx Messages postés 45 Date d'inscription mercredi 30 décembre 2009 Statut Membre Dernière intervention 2 avril 2014
12 janv. 2010 à 16:31
eh bien , trés acceuillant .
Si tu remballe toujours tout le monde comme ça ( surtout si on DEBUTE, chose que j'ai precisé dans mon premier messages , mais tu ne dois pas lire les messages de debutant.) je crains le pire pour toi ...
et oui je suis allez voir sur codyx , sans succés malheureusement .
J'y comprends absolument rien .

Mais je te remercie tout de meme pour ton aide .
0
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
12 janv. 2010 à 16:59
je ne remballe pas, passer 15 jours sur "mais j'fais du vb alors je vois pas le problème" qui avait déjà été corrigé (la catégorie du post) dès le départ, au lieu de se concentrer sur la question réelle, y'a pas grand chose à ajouter

pis codyx, je tape "trier" et je tombe directement sur l'exemple de tri (chaines) croissant et/ou décroissant

http://www.codyx.org/snippet_trier-donnees-tableau-liste-as-string_278.aspx#895
http://www.codyx.org/snippet_trier-donnees-tableau-liste-as-string_278.aspx#912

4 secondes de recherches contre 15 jours d'attente, on parle pas de débutant là, juste d'oisiveté


maintenant que les choses sont recadrées, passons enfin à ton code (enfin, si tu le veux, après tout....)



Function fct_chiffre(ByVal pvaleur As Integer) As String

Dim wchemin As String
fct_chiffre = wchemin
If pvaleur = 1 Then
wchemin = 1

(...)

donc tu fais une fonction qui retourne rien du tout?
fct_chiffre = wchemin alors que wchemin n'est pas attribuée

on la refait :
Function fct_chiffre(ByVal pvaleur As Integer) As String
    if (pvaleur >0) and (pvaleur <11) then return pvaleur.tostring
    return string.empty
end function

rien de plus




Sub compteur()

Randomize()
cht1.Text = Int(Rnd(1) * 10)
wresult cht1.Text fct_chiffre(cht1.Text)
cht2.Text = Int(Rnd(1) * 10)
wresult cht2.Text fct_chiffre(cht2.Text)

(...)

donc tu attribues un INTEGER à un STRING
puis à une variable apparemment non-déclarée tu attribues... un boolean?
cht2.Text fct_chiffre(cht2.Text)> (avec la bonne fonction bien sûr) cht2 va recevoir la chaine de... elle même, dont tu n'as même pas besoin puisque tu lui passes une chaine et non un numérique, pour renvoyer la même chose
en gros tu fais txt = txt

et après, X txt txt, VB interprète X = [expression] (txt = txt ?)

bref, aucun sens. toujours pas le fait de débuter, on ne sait même pas ce que tu peux bien vouloir faire


tout çà pour un tableau? alors pourquoi utiliser des zones de texte...




ensuite

Dim montableau(10)
montableau(1) = cht1.Text
'chListBox1.Text = cht1.Text
montableau(2) = cht2.Text
'chListBox1.Text = cht2.Text
(...)


mais il n'est pas typé ce tableau...
alors des string? des integer? à VB de décider?

tout çà pour mettre dans une listbox? et tu veux trier le tableau alors que, simplement, elle a la propriété SORTED....
donc 0 ligne de code à taper

çà ok, débutant on peut pas deviner
pis c'est pas du tout écrit dans l'aide que tu as bien sûr consulter

et si tu n'as pas l'aide, quand on tape msdn trier listbox sur google on ne tombe pas EN PREMIER LIEN sur la msdn
http://msdn.microsoft.com/fr-fr/library/kh56dwh6(VS.80).aspx

page où il n'est donc pas clairement écrit

Pour trier la liste

*Affectez à la propriété Sorted la valeur true.

Ce paramètre repositionne tous les éléments de liste existants dans l'ordre de tri.




tu as raison, c'est surement pour moi que le pire est à craindre, merci de m'avoir ouvert les yeux




[hr]
0
kijx Messages postés 45 Date d'inscription mercredi 30 décembre 2009 Statut Membre Dernière intervention 2 avril 2014
13 janv. 2010 à 11:34
Ah ben c'est plus sympa comme ça =)
Desoler si je met hyper longtemp a repondre, mais je fais ça au boulot donc quand je suis en cour pendant 15j j'ai pas accés a mes données.

J'ai donc rectifier mon code , qui comme tu la si bien préciser ne voulais rien dire, mais j'y comprenais absolument rien , la ça va déjà un peu mieu.

Alors pour vous montrer mon soucis , voila mon code a présent :

Public Class Form1
    Function fct_chiffre(ByVal pvaleur As Integer) As String
        If (pvaleur > 0) And (pvaleur < 11) Then Return pvaleur.ToString
        Return String.Empty
    End Function

    Sub compteur()
        Randomize()
        cht1.Text = Int(Rnd(1) * 10)
        cht2.Text = Int(Rnd(1) * 10)
        cht3.Text = Int(Rnd(1) * 10)
        cht4.Text = Int(Rnd(1) * 10)
        cht5.Text = Int(Rnd(1) * 10)
        cht6.Text = Int(Rnd(1) * 10)
        cht7.Text = Int(Rnd(1) * 10)
        cht8.Text = Int(Rnd(1) * 10)
        cht9.Text = Int(Rnd(1) * 10)
        cht10.Text = Int(Rnd(1) * 10)
    End Sub
    Sub affichage()
        Dim montableau(10) As UInteger
        montableau(10) = cht1.Text
        montableau(10) = cht2.Text
        montableau(10) = cht3.Text
        montableau(10) = cht4.Text
        montableau(10) = cht5.Text
        montableau(10) = cht6.Text
        montableau(10) = cht7.Text
        montableau(10) = cht8.Text
        montableau(10) = cht9.Text
        montableau(10) = cht10.Text
    End Sub

    Private Sub bt_go_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bt_go.Click
        Call compteur()
    End Sub

    Private Sub bt_affichage_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bt_affichage.Click
        Call affichage()
    End Sub
End Class


Et voiçi ce que je veus faire :

Ma Form.

Je voudrais que mes 10 chiffres que j'ai en haut soit reporter dans la listbox en dessous dans l'ordre croissant.
Et j'ai bien mis l'option sorted de la listbox sur true.
0
kijx Messages postés 45 Date d'inscription mercredi 30 décembre 2009 Statut Membre Dernière intervention 2 avril 2014
13 janv. 2010 à 16:23
Genial , j'y suis arriver !!!
Bon certe en mélangeant le vb6 et le vb.net ,car j'ai gardais la fonction int et rnd , pis ma fonction du debut "fct_chiffre" en fait elle ne me sert a rien.

Mais le principal c'est que ça fonctionne .
Avec l'option True sur la listbox , mon tuteur ma dit que c'était trop facile , alor il voulait que je lui fasse le travail avec une boucle.

Voici le résultat :

Public Class Form1
    Function fct_chiffre(ByVal pvaleur As Integer) As String
        If (pvaleur > 0) And (pvaleur < 11) Then Return pvaleur.ToString
        Return String.Empty
    End Function
    Sub compteur()
        Randomize()
        cht1.Text = Int(Rnd(1) * 10)
        cht2.Text = Int(Rnd(1) * 10)
        cht3.Text = Int(Rnd(1) * 10)
        cht4.Text = Int(Rnd(1) * 10)
        cht5.Text = Int(Rnd(1) * 10)
        cht6.Text = Int(Rnd(1) * 10)
        cht7.Text = Int(Rnd(1) * 10)
        cht8.Text = Int(Rnd(1) * 10)
        cht9.Text = Int(Rnd(1) * 10)
        cht10.Text = Int(Rnd(1) * 10)
    End Sub
    Sub affichage()
        Dim montableau(10) As String
        Dim wcpt, wcptelement, wvaleur, wtempo As Integer
        montableau(1) = cht1.Text
        montableau(2) = cht2.Text
        montableau(3) = cht3.Text
        montableau(4) = cht4.Text
        montableau(5) = cht5.Text
        montableau(6) = cht6.Text
        montableau(7) = cht7.Text
        montableau(8) = cht8.Text
        montableau(9) = cht9.Text
        montableau(10) = cht10.Text

        For wcptelement = 1 To 10
            wvaleur = montableau(wcptelement)
            For wcpt = (wcptelement + 1) To 10
                If wvaleur > montableau(wcpt) Then
                    wtempo = montableau(wcpt)
                    montableau(wcpt) = wvaleur
                    wvaleur = wtempo
                End If
            Next wcpt
            chListBox1.Items.Add(wvaleur)
        Next wcptelement

    End Sub

    Private Sub bt_go_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bt_go.Click
        Call compteur()
    End Sub

    Private Sub bt_affichage_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bt_affichage.Click
        Call affichage()
    End Sub
End Class



Et la tout fonctionne , MERCI pour ton aide PCPT .
0
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
13 janv. 2010 à 16:51
bien

et pour le fun, le même code en VB2008

    Private Sub SetRandomBoxes()
        'random + affichage
        Dim rd As New Random
        For i As Integer = 1 To 10
            Me.Controls("cht" & i.ToString).Text = rd.Next(0, 9).ToString
        Next
        rd = Nothing
    End Sub

    Private Sub ShowSortedBoxes()
        'récup en tableau
        Dim lsValues As New System.Collections.Generic.List(Of String)
        For i As Integer = 1 To 10
            lsValues.Add(Me.Controls("cht" & i.ToString).Text)
        Next

        'tri, affichage
        lsValues.Sort()
        chListBox1.DataSource = lsValues
        lsValues.Clear()
    End Sub


++
0