Tableau d'integer et valeur max [Résolu]

olivier857
Messages postés
188
Date d'inscription
mardi 21 décembre 2004
Dernière intervention
10 avril 2008
- 17 févr. 2007 à 17:02 - Dernière réponse : olivier857
Messages postés
188
Date d'inscription
mardi 21 décembre 2004
Dernière intervention
10 avril 2008
- 18 févr. 2007 à 14:05
Bonjour à tous,

Je cherche à créer un tableau d'integer, a y stocker des données dans une boucle puis récupérer la valeur max du tableau de données.

Mais je ne sais pas comment écrire ce code.

Si quelqu'un pouvait me donner un exemple ca serait sympa.

Merci d'avance
Afficher la suite 

Votre réponse

16 réponses

Meilleure réponse
cs_casy
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
- 17 févr. 2007 à 18:47
3
Merci
Voila mon code, et j'ai revérifier chez moi il marche

Pour t'en persuader, prend une feuille de papier, oublie completement vb et tout autre langage, et pose sur le papier l'algorithme de recherche d'un max. Tu verra qu'il est nul besoin de plusieurs boucle.

Subtilité supplémentaire, dans la même boucle, tu peut rajouter la recherche du min ;)

Private Function ValMax(ByRef Liste() As Long) As
Long
Dim i As Integer

ValMax = Liste(LBound(Liste))
For i = LBound(Liste) + 1 To UBound(Liste)
    If Liste(i) > ValMax Then ValMax = Liste(i)
Next

End Function

Private Sub Form_Load()
    Dim i As Long
    Dim MyList(1 To 10) As Long
   
    MyList(1) = "1"
    MyList(2) = "2"
    MyList(3) = "4"
    MyList(4) = "8"
    MyList(5) = "7"
    MyList(6) = "3"
    MyList(7) = "9"
    MyList(8) = "5"
    MyList(9) = "0"
    MyList(10) = "6"
   
    MsgBox ValMax(MyList)  'retourne 9
End Sub

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #

Merci cs_casy 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de cs_casy
jmfmarques
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Dernière intervention
22 août 2014
- 17 févr. 2007 à 17:47
0
Merci
A quel étape rencontres-tu une difficulté ?

- pour créer un tableau ?
- pour alimenter le tableau ?
- pour le redimensionner en cas de besoin ?
- pour lire dans le tableau la valeur la plus grande ?

Je voudrais déjà te faire remarquer qu'il serait adroit, pour déterminer la valeur la plus grande, de ne pas attendre d'avoir rempli ton tableau pour y relire dans une boucle !

Il te suffit d'une variable dont la valeur ne change que si la nouvelle donnée lue (avant même de mettre dans un tableau) est d'une valeur supérieure à celle déjà donnée à la variable !
Commenter la réponse de jmfmarques
mortalino
Messages postés
6812
Date d'inscription
vendredi 16 décembre 2005
Dernière intervention
21 décembre 2011
- 17 févr. 2007 à 18:03
0
Merci
Salut, voici une fonction, t'as qu'à juste modifier la Sub Exemple :

Sub Exemple()
    Dim i As Long
    Dim MyList(1 To 10) As String
   
    MyList(1) = "1"
    MyList(2) = "2"
    MyList(3) = "4"
    MyList(4) = "8"
    MyList(5) = "7"
    MyList(6) = "3"
    MyList(7) = "9"
    MyList(8) = "5"
    MyList(9) = "0"
    MyList(10) = "6"
   
    MsgBox ValMax(MyList)  'retourne 9
End Sub

Function ValMax(ByRef Liste() As String) As Long
    Dim i           As Long, j As Long
    Dim Temp        As String
    Dim ListeTemp() As String: ListeTemp = Liste
   
        For i = LBound(ListeTemp) To UBound(ListeTemp) - 1
            For j = i + 1 To UBound(Liste)
                If ListeTemp(i) > ListeTemp(j)
Then
                    Temp = ListeTemp(j)
                    ListeTemp(j) = ListeTemp(i)
                    ListeTemp(i) = Temp
                End If
            Next j
        Next i
        ValMax = ListeTemp(UBound(ListeTemp))
End Function


~ <small>[code.aspx?ID=39466 Mortalino] ~
Colorisation automatique</small>

@++

<hr size="2" width="100%" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
<!--
Commenter la réponse de mortalino
cs_casy
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
- 17 févr. 2007 à 18:16
0
Merci
Je ne comprend pas ta double boucle Mortalino ???

Pour cherche le max, une seule boucle suffit :

ValMax = ListeTemp(LBound(ListeTemp))
For i = LBound(ListeTemp) +1 to UBound(ListeTemp)
    if ListeTemp(i) > ValMax then ValMax = ListeTemp(i)
Next

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Commenter la réponse de cs_casy
mortalino
Messages postés
6812
Date d'inscription
vendredi 16 décembre 2005
Dernière intervention
21 décembre 2011
- 17 févr. 2007 à 18:27
0
Merci
et non Casy, double boucle obligatoire.
Une boucle pour prendre la première valeur, et l'autre boucle pour faire le test avec le restant, ensuite, la première boucle passe à la deuxième valeur, puis le seconde boucle effectue à nouveau une comparaison avec le restant, et ainsi de suite..

Fait le test avec ta boucle, concours de circonstances je pense pour le 0 (en tant que plus petite valeur), mais 6 en tant que plus grande valeur, ça le fait pas trop  ;)

Pour info, il n'apparait pas encore, mais j'en ai fait un snippet (déposé), avec la plus grande ou la plus petite valeur :

Function ExtremValue(ByRef Liste() As String, bValMax As Boolean) As String
' Si bValMax est à True,
c'est la plus grande valeur de la liste
' qui est
donnée, à false c'est donc la plus petite valeur
    Dim i           As Long, j As Long
    Dim Temp        As String
    Dim ListeTemp() As String: ListeTemp = Liste
    ' ici je
double le tableau pour ne pas affecter le tableau
d'origine
    
        For i = LBound(ListeTemp) To UBound(ListeTemp) - 1
            For j = i + 1 To UBound(Liste)
                If ListeTemp(i) > ListeTemp(j)
Then
                    Temp = ListeTemp(j)
                    ListeTemp(j) = ListeTemp(i)
                    ListeTemp(i) = Temp
                End If
            Next j
        Next i
        If bValMax = True Then ExtremValue = ListeTemp(UBound(ListeTemp)) Else ExtremValue =
ListeTemp(LBound(ListeTemp))
End Function

Sub Exemple()
    Dim MyList(1 To 10) As String
    
    MyList(1) = "1"
    MyList(2) = "2"
    MyList(3) = "4"
    MyList(4) = "8"
    MyList(5) = "7"
    MyList(6) = "3"
    MyList(7) = "9"
    MyList(8) = "5"
    MyList(9) = "0"
    MyList(10) = "6"
    
    MsgBox ExtremValue(MyList, True)   'retourne 9
    MsgBox ExtremValue(MyList, False)    'retourne 0
End Sub


~ <small>[code.aspx?ID=39466 Mortalino] ~
Colorisation automatique</small>

@++

<hr size="2" width="100%" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
<!--
Commenter la réponse de mortalino
cs_casy
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
- 17 févr. 2007 à 18:35
0
Merci
Ben chez moi, ma fonction marche nickel, à la différence que je travaille sur des nombres et non pas sur des chaines de caractères

Pour déterminer une valeur max, c'est quand même mieux des nombres. Travaillez sur des chaines ça pervertie le système . Déjà qu'il est assez pervert comme ça......

Ta double boucle est valable si tu veux trier un tableau. Pour récupérer uniquement la (première) valeur max, la double boucle n'est pas utile.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Commenter la réponse de cs_casy
jmfmarques
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Dernière intervention
22 août 2014
- 17 févr. 2007 à 18:41
0
Merci
Ouais...


Attendons qu'Olivier revienne ...
Si ça se trouve, il n'a même pas besoin d'un tableau ...
A moins que ce tableau ne doive lui servir à d'autres choses (bien évidemment), il n'est nul besoin d'en dresser un pour aller chercher la plus grande valeur de données qu'il serait bien forcé de lire quelque part pour alimenter son tableau.
Une autre fois : si tableau destiuné à d'autres fins, oui, sinon : NON ...

Maintenant, tableau pour tableau, je suis d'accord avec Casy, : une seulz boucle suffit, accompagnée d'une variable..


 
Commenter la réponse de jmfmarques
mortalino
Messages postés
6812
Date d'inscription
vendredi 16 décembre 2005
Dernière intervention
21 décembre 2011
- 17 févr. 2007 à 18:41
0
Merci
Désolé mais j'ai remplacé mon tableau String en Long, c'est pareil, 6 est le gagnant avec ta simple boucle.
As tu bien mélangé les nombres ?
C'est mathématique, il en faut deux.

Voici ce que j'avais avec ta proposition :

Function ExtremValue(ByRef Liste() As Long, bValMax As Boolean) As Long
' Si bValMax est à True,
c'est la plus grande valeur de la liste
' qui est
donnée, à false c'est donc la plus petite valeur
    Dim i           As Long, j As Long
    Dim Temp        As String
    Dim ListeTemp() As Long: ListeTemp = Liste
    ' ici je
double le tableau pour ne pas affecter le tableau
d'origine
    
'---------------------
' juste ta
boucle :
For i = LBound(ListeTemp) + 1 To UBound(ListeTemp)
    If ListeTemp(i) > ValMax Then ValMax =
ListeTemp(i)
Next
'---------------------
        If bValMax = True Then ExtremValue =
ListeTemp(UBound(ListeTemp)) Else ExtremValue = ListeTemp(LBound(ListeTemp))
End Function

Sub Exemple()
    Dim i As Long
    Dim MyList(1 To 10) As Long
    
    MyList(1) = 1
    MyList(2) = 2
    MyList(3) = 4
    MyList(4) = 8
    MyList(5) = 7
    MyList(6) = 3
    MyList(7) = 9
    MyList(8) = 5
    MyList(9) = 0
    MyList(10) = 6
    '                                  ---------------------
    MsgBox ExtremValue(MyList, True)   'retourne 6 ?????????
    '                                  ---------------------
    MsgBox ExtremValue(MyList, False)    'retourne 0
End Sub


~ <small>[code.aspx?ID=39466 Mortalino] ~
Colorisation automatique</small>

@++

<hr size="2" width="100%" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
<!--
Commenter la réponse de mortalino
mortalino
Messages postés
6812
Date d'inscription
vendredi 16 décembre 2005
Dernière intervention
21 décembre 2011
- 17 févr. 2007 à 18:53
0
Merci
je reconnais que je suis à côté de la plaque, ton code fonctionne nickel, et tu as raison sur la simple boucle.
Je suis resté ancré sur un code que j'avais, les deux boucles sont obligatoires pour trier les valeurs de la plus petite à la plus grande, et je suis parti de là en cherchant le plus grand ou plus petit indice de cette fameuse liste triée, mais là, pour la ValMax (ou ValMin), ta boucle fait le nécessaire.

Mille excuses !
(pas dormi depuis hier, promis, je sors..)

Ps : bien vu le coup du papier et du calcul à la main  ;)
@++

<hr size="2" width="100%" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
<!--
Commenter la réponse de mortalino
cs_casy
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
- 17 févr. 2007 à 19:00
0
Merci
"....Ps : bien vu le coup du papier et du calcul à la main  ;)..."

C'est la base de la programmation efficace. Et c'est par là qu'il faut commencer.

Hors langage, poser l'algorithme sur le papier.

Normalement, si elle est bien faite, l'étude algorithmique d'un projet peut representer jusqu'à 50% du temps total de codage voire plus. Le codage ne devrait normalement representer que la traduction dans le langage choisit de l'algorithmique. Au moment ou on débute le codage, l'etude et la recherche devrait etre terminer. Ce n'est pas en codant que l'on recherche normalement.

Et c'est un point à integrer obligatoirement pour pouvoir utiliser la programmation par modélisation, comme ça devient de plus en plus à la mode.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Commenter la réponse de cs_casy
olivier857
Messages postés
188
Date d'inscription
mardi 21 décembre 2004
Dernière intervention
10 avril 2008
- 17 févr. 2007 à 22:22
0
Merci
Ok alors me revoilà.

Et bein dis donc il s'en ai passé des échanges pdt mon absence. En tout cas
merci, la fonction avec la simple boucle renvoie bien la valeur max d'un
tableau comme je le souhaite.

J’ai donc maintenant ce qu’il me faut pour trouver la valeur
max de mon tableau.

Par contre par rapport à votre code exemple qui exploite la
fonction, mon cas est légèrement différent. Dans mon cas la taille du tableau
soumit à la fonction est variable.

Je ne peut donc pas déclarer mon tableau de
la manière suivante :

Dim MyList(1 To 10) As Long

Donc mon cas ca serait plutôt : Dim Mylist () as long



Voici mon code :

    Dim ligne As String
    Dim fichier As Variant
    Dim premier_decoupage() As String
    Dim nb As Integer
    Dim donnees() As String
    Dim detail_donnees()
    Dim taille As Integer
    Dim tab_nb() As Integer

    fichier = Application.GetOpenFilename("Fichiers texte, *.txt", , "Charger le fichier", , False)    If fichier "" Or fichier False Then Exit Sub

    Open fichier For Input As #1

    Do While Not EOF(1)
        'lecture d’une ligne
        Line Input #1, ligne
        'Premier découpage de la ligne
        premier_decoupage = Split(ligne, "///1///")
        'Deuxième découpage de la ligne
        donnees = Split(premier_decoupage(2), vbTab)
        'Récupération du nombre catégorie de données
        nb = UBound(Split(premier_decoupage(2), vbTab)) + 1
       
        'c'est ici que je veux mettre les donnes dans le tableau : tab_nb
        'le but est de mettre à chaque itération de la boucle do while la valeur de nb dans le tableau : tab_nb
       'Pour info le fichier texte peut atteindre un très grand nombre de ligne (plusieurs milliers)
       
        MsgBox ValMax(tab_nb)  'retourne la valeur max du tableau
    Loop

    Close #1

Comme vous pouvait le voir ce que je n'arrive pas a faire c'est stocker les données dans mon tableau.
Commenter la réponse de olivier857
jmfmarques
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Dernière intervention
22 août 2014
- 17 févr. 2007 à 22:52
0
Merci
"Comme vous pouvait le voir ce que je n'arrive pas a faire c'est stocker les données dans mon tableau."


Voir mes questions, posées à 17 h 47 !
Il est maintenant près de 23 heures et je vais dormir...
Bonne nuit.
Commenter la réponse de jmfmarques
olivier857
Messages postés
188
Date d'inscription
mardi 21 décembre 2004
Dernière intervention
10 avril 2008
- 17 févr. 2007 à 23:15
0
Merci
Oui jmfmarques j'ai vu ton message et tu as raison. Cependant j'était pas présent d el'apres midi.

J'ai pas pu vous orienter avant.

Mais à la base mon pb était double. Je n'arrivai pas stocker les données dans le tableau et je ne savais pas non plus comment trouver la valeur max. C'est pour celà que j'ai poser ma question initiale come elle l'est et que je n'ai pas était plus précis.

Pour en revenir a mon pb actuelle, je vient de prendre consciense que ma démarche n'est pas la bonne a cause du nombre de ligne bcp trop élévé de mon fichier texte. En fait il faudrait que je test a chaque itération de la boucle si nb est plus plus grand et seulement si il est plus grand stocker sa valeur. De cette façon j'eviterai un tableau de taille énorme (taille qui aurait était = au nombre d eligne du fichier).
Commenter la réponse de olivier857
olivier857
Messages postés
188
Date d'inscription
mardi 21 décembre 2004
Dernière intervention
10 avril 2008
- 17 févr. 2007 à 23:47
0
Merci
Bon je crois que j'aurai sdu suivre le conseil de casy et ne pas foncer tête baissé dans le code, mais plutot prendre une feuille et un stylo pour faire un algorithme. Je me serait peut être aperçu qu epour obtenir ce que je veu c'était bcp plus imple que ce dans quoi je me suis embarqué.

En réfléchissant je me rend compte qu'il suffit de stocker la valeur nb - 1 a la valeur nb comme suit :

    Dim ligne As String
    Dim fichier As Variant
    Dim premier_decoupage() As String
    Dim nb As Integer
    Dim donnees() As String
    Dim detail_donnees()
    Dim taille As Integer
    Dim old_nb As Integer
    Dim nb_max As Integer

    fichier = Application.GetOpenFilename("Fichiers texte, *.txt", , "Charger le fichier texte", , False)    If fichier "" Or fichier False Then Exit Sub

    Open fichier For Input As #1
    old_nb = 0
    Do While Not EOF(1)
        'lecture d’une ligne
        Line Input #1, ligne
        'Premier découpage de la ligne
        premier_decoupage = Split(ligne, "///1///")
        'Deuxième découpage de la ligne
        donnees = Split(premier_decoupage(2), vbTab)
        'Récupération du nombre catégorie de données
        nb = UBound(Split(premier_decoupage(2), vbTab)) + 1
        'Calcul si nb de cette ligne est plus grand que celui de la ligne précédente
        If nb > old_nb Then nb_max = nb
    Loop
    Close #1
    MsgBox nb_max  'retourne la valeur max

Désolé pour le dérangement, je vous ai lancé dans une reflexion inutile pour mon code.
Je vais maintenant adapter ce petit bout de code a mon prog principal et verifier que celui-ci fonctionne bien.
Commenter la réponse de olivier857
jmfmarques
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Dernière intervention
22 août 2014
- 18 févr. 2007 à 07:49
0
Merci
Bonjour, olivier857,


Je te féliicite.


Et voilà, donc : plus de tableau et "ramassage" de la plus grande valeur directement à la lecture, c'est tout et c'est bien.
Commenter la réponse de jmfmarques
olivier857
Messages postés
188
Date d'inscription
mardi 21 décembre 2004
Dernière intervention
10 avril 2008
- 18 févr. 2007 à 14:05
0
Merci
Merci, mais je ne me félicite pas tant que çà.

car j'aurai quand même pu y penser avant au lieu de me compliquer la vie. surtout que j'y ai pensé grace a votre code.

Par contre j'ai oublié une ligne dans mon code. Le plus important en plus le moment ou je passe la valeur actuel en historique :
 
old_nb=nb

voilà voilà
Commenter la réponse de olivier857

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.