Question bug en Visual Basic
Répondre à la discussion
Affichage des résultats 1 à 18 sur 18

Question bug en Visual Basic



  1. #1
    Iron-Sim

    Question bug en Visual Basic


    ------

    Bonjour à tous,

    Dans la cadre de ma formation, je dois tâcher de faire un exercice qui me permet de trouver les deux valeurs maxi et les deux mini d'un tableau de variables aléatoires en visual basic. Je suis parvenu à faire le programme mais j'ai un petit bug dans la seconde valeur minimale qui s'affiche toujours égale à 0.

    Je ne demande pas la solution mais pouvez-vous m'expliquer pourquoi c'est égal à zéro. Je suis parti de la même formule que pour le maxi qui lui fonctionne.

    Code:
    Dim T(100) As Integer
            Randomize()
            For I = 0 To 100
                T(I) = 999 * Rnd()
    
            Next I
            ListBox.Items.Clear()
    
            For I = 0 To 100
                ListBox.Items.Add(T(I))
            Next I
    
            'lancement de la recherche du plus grand et plus petit
            Dim max1, max2, min1, min2 As Integer
            max1 = T(0)
            For I = 1 To 100
    
                If T(I) > max1 Then
                    max1 = T(I)
                End If
    
                If max1 > T(I) And T(I) > max2 Then
                    max2 = T(I)
                End If
            Next I
    
            min1 = T(100)
            For I = 0 To 99
                If T(I) < min1 Then
                    min1 = T(I)
                End If
    
                If min1 < T(I) And min2 > T(I) Then
                    min2 = T(I)
                End If
    
            Next I
            tbMax1.Text = max1
            tbMin1.Text = min1
            tbMax2.Text = max2
            tbMin2.Text = min2
    Merci par avance.

    -----

  2. #2
    azad

    Re : Question bug en Visual Basic

    Salut.
    Essaies de placer un break de façon à voir évoluer via le débogueur, les variables max2 et min2. Je ne connais pas VB mais es-tu certain que ces variables se voient attribuer une valeur (zéro, je suppose) simplement en les déclarant par un Dim max2,min2 ?

  3. #3
    cherbe

    Re : Question bug en Visual Basic

    Bonsoir
    On sait que rnd() génère un nombre >= 0 et < 1
    Puisque tu génères les nombres aléatoires avec la formule : T(I) = 999 * Rnd(),
    le min possible est : 999 * 0 = 0
    le max possible est : 999 * 0.9 = 899.1.
    Tu devrais donc initialiser le min à 900
    et le max à 0
    Dernière modification par cherbe ; 30/10/2015 à 00h42.

  4. #4
    Bluedeep

    Re : Question bug en Visual Basic

    Petite optim au passage :
    Code:
          min1 = T(100)
            For I = 0 To 100 'Une seule boucle      
                If I > 0 Then
                    If T(I) > Max1 Then
                        Max1 = T(I)
                    Else  ' Pas utile d'examiner le cas contraire. 
                        If Max1 > T(I) And T(I) > Max2 Then
                            Max2 = T(I)
                        End If
                    End If
                End If
    
                'Deuxième boucle inutile ==> on supprime. 
                If I < 100 Then
                    If T(I) < Min1 Then
                        Min1 = T(I)
                    Else ' Pas utile d'examiner le cas contraire.
                        If Min1 < T(I) And Min2 > T(I) Then
                            Min2 = T(I)
                        End If
                    End If
                End If
            Next I
    Dernière modification par Jack ; 02/11/2015 à 12h31.

  5. A voir en vidéo sur Futura
  6. #5
    Iron-Sim

    Re : Question bug en Visual Basic

    Bonjour,

    Merci pour vos corrections et commentaires, je pense avoir trouvé, je n'ai pas initialisé min2 et max2 ^^

    Mon code donne cela, j'ai l'impression que cela fonctionne correctement. L'un de vous saurait-il comment classer mes valeurs aléatoires en ordre croissant ?

    Code:
         Dim T(100) As Integer
            Randomize()
            For I = 0 To 100
                T(I) = 999 * Rnd()
    
            Next I
            ListBox.Items.Clear()
    
            For I = 0 To 100
                ListBox.Items.Add(T(I))
            Next I
    
            'lancement de la recherche du plus grand et plus petit
            Dim max1, max2, min1, min2 As Integer
            max1 = 0
            min1 = 999
            max2 = 0
            min2 = 999
            For I = 0 To 100
                If I > 0 Then
                    If T(I) > max1 Then
                        max1 = T(I)
                    Else
                        If max1 > T(I) And T(I) > max2 Then
                            max2 = T(I)
                        End If
                    End If
                End If
    
                If I < 100 Then
                    If T(I) < min1 Then
                        min1 = T(I)
                    Else
                        If min1 < T(I) And min2 > T(I) Then
                            min2 = T(I)
                        End If
                    End If
                End If
    
            Next I
            tbMax1.Text = max1
            tbMin1.Text = min1
            tbMax2.Text = max2
            tbMin2.Text = min2
    
        End Sub

  7. #6
    cherbe

    Re : Question bug en Visual Basic

    Citation Envoyé par Iron-Sim Voir le message
    Mon code donne cela, j'ai l'impression que cela fonctionne correctement. L'un de vous saurait-il comment classer mes valeurs aléatoires en ordre croissant ?
    VB te propose :
    Code:
    Array.Sort(mon_tableau)
    Un fonction de tri, c'est l'action de chercher des min et max successifs et de les classer donc, il était inutile d'écrire ta fonction si c'était pour trier les données ensuite puisqu'un tableau trié contient le min en 1ère valeur et le max en dernière (si classement croissant) !

  8. #7
    Iron-Sim

    Re : Question bug en Visual Basic

    Merci pour ce morceau de code, je vais tâcher de trouver des infos sur internet pour voir comment l'incorporer dans mon programme. Si quelqu'un connait un site correct sur le VB, je suis preneur.

    Je souhaite les trier afin de vérifier directement si c'est bien les deux valeur maxi et mini qu'il prend. (et aussi par curiosité)

  9. #8
    Bluedeep

    Re : Question bug en Visual Basic

    Citation Envoyé par Iron-Sim Voir le message
    Merci pour ce morceau de code, je vais tâcher de trouver des infos sur internet pour voir comment l'incorporer dans mon programme. Si quelqu'un connait un site correct sur le VB, je suis preneur.
    Sur VB ou sur tout autre langage courant http://developpez.net reste un site de référence

    Sinon, pour le tri , on ne sait du tout quelle version de VB tu utilises; on ne sait même pas si c'est du VB ou du VB.Net; donc pas de réponse correcte possible. (la réponse correcte avec un VB.Net actuel est d'utiliser le "order by" de Linq ).
    Dernière modification par Bluedeep ; 01/11/2015 à 12h48.

  10. #9
    Iron-Sim

    Re : Question bug en Visual Basic

    Bonjour,

    Merci pour le lien. J'utilise Visual Basic 2010 Express et c'est du VB classique.

    J'ai trouvé ce lien (https://msdn.microsoft.com/en-us/lib...rray.sort.aspx) mais je ne vois pas où insérer le morceau de code qui je pense doit être "array.sort(T)"

  11. #10
    Bluedeep

    Re : Question bug en Visual Basic

    Bonjour

    Citation Envoyé par Iron-Sim Voir le message
    J'utilise Visual Basic 2010 Express et c'est du VB classique.
    Impossible : VB 2010 c'est du VB.Net

  12. #11
    Iron-Sim

    Re : Question bug en Visual Basic

    Ah OK. Bon, bien cela prouve bien mon niveau de débutant ^^

  13. #12
    Iron-Sim

    Re : Question bug en Visual Basic

    Bonsoir, je ne m'em étais pas aperçu au début mais en relancant le programme, il ne me prend pas tout le temps la seconde valeur minimale, parfois la troisième. Quelqu'un saurait-il pourquoi ?

    Merci par avance !

    Voici mon code.

    Code:
    Public Class Form1
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim T(100) As Integer
            Randomize()
            For I = 0 To 99
                T(I) = 999 * Rnd()
    
            Next I
            ListBox.Items.Clear()
    
            For I = 0 To 99
                ListBox.Items.Add(T(I))
            Next I
    
            'lancement de la recherche du plus grand et plus petit
            Dim max1, max2, min1, min2 As Integer
            max1 = 0
            min1 = 999
            max2 = 0
            min2 = 999
            For I = 0 To 99
                If I > 0 Then
                    If T(I) > max1 Then
                        max1 = T(I)
                    Else
                        If max1 > T(I) And T(I) > max2 Then
                            max2 = T(I)
                        End If
                    End If
                End If
    
                If I < 100 Then
                    If T(I) < min1 Then
                        min1 = T(I)
                    Else
                        If min1 < T(I) And T(I) < min2 Then
                            min2 = T(I)
                        End If
                    End If
                End If
    
            Next I
            tbMax1.Text = max1
            tbMin1.Text = min1
            tbMax2.Text = max2
            tbMin2.Text = min2
    
        End Sub

  14. #13
    Iron-Sim

    Re : Question bug en Visual Basic

    Idem pour la valeur maximale, c'est très aléatoire.

  15. #14
    Jack
    Modérateur

    Re : Question bug en Visual Basic

    Je n'ai pas bien compris à quoi sert le "if I>0 then" vu que I va de 0 à 99.


    Quelqu'un saurait-il pourquoi ?
    Oui, c'est ici que ça ne va pas:
    Code:
                    If T(I) > max1 Then
                        max1 = T(I)
                    Else
    c'est très aléatoire.
    C'est normal, vu que le jeu d'essai est tiré aléatoirement.
    Dernière modification par Jack ; 21/11/2015 à 12h25.

  16. #15
    Iron-Sim

    Re : Question bug en Visual Basic

    Tout à fait, le If I>0 et If <99 ne servent à rien. Cependant, j'ai trouvé la solution, j'ai restructuré le code par partie plutôt que de faire des "Then If".

    Merci encore !

    Code:
    Public Class Form1
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim T(100) As Integer
            Randomize()
            For I = 0 To 99
                T(I) = 999 * Rnd()
    
            Next I
            ListBox.Items.Clear()
    
            For I = 0 To 99
                ListBox.Items.Add(T(I))
            Next I
    
            'lancement de la recherche du plus grand et plus petit
            Dim max1, max2, min1, min2 As Integer
            max1 = 0
            min1 = 999
            max2 = 0
            min2 = 999
            For I = 0 To 99
                If T(I) > max1 Then
                    max1 = T(I)
                End If
            Next I
    
            For I = 0 To 99
                If max1 > T(I) And T(I) > max2 Then
                    max2 = T(I)
                End If
            Next I
    
            For I = 0 To 99
                If T(I) < min1 Then
                    min1 = T(I)
                End If
            Next I
    
            For I = 0 To 99
                If min1 < T(I) And T(I) < min2 Then
                    min2 = T(I)
                End If
    
            Next I
            tbMax1.Text = max1
            tbMin1.Text = min1
            tbMax2.Text = max2
            tbMin2.Text = min2
    
        End Sub
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            End
        End Sub
    End Class

  17. #16
    Jack
    Modérateur

    Re : Question bug en Visual Basic

    j'ai restructuré le code par partie plutôt que de faire des "Then If".
    Je n'en vois pas trop l'intérêt et tu n'as toujours pas corrigé l'erreur que j'avais relevée dans ton algorithme.

    Cette partie du code est donc toujours fausse
    Code:
            For I = 0 To 99
                If T(I) > max1 Then
                    max1 = T(I)
                End If
            Next I
    Dernière modification par Jack ; 21/11/2015 à 17h43.

  18. #17
    Iron-Sim

    Re : Question bug en Visual Basic

    Bonjour,

    Je ne comprend pas pourquoi elle serait fausse. D'après ce que j'ai compris, cette fonction recherche les valeurs maximales dans le tableau en cherchant le supérieur à mon initialisation de max1 à 0.

    Pouvez-vous m'expliquer svp ?

  19. #18
    Jack
    Modérateur

    Re : Question bug en Visual Basic

    Je ne comprend pas pourquoi elle serait fausse
    Est-ce que ton programme te renvoie bien les 2 plus grandes et 2 plus petites valeurs? Vu les lignes que j'ai indiquées, ça ne doit pas être systématiquement le cas.
    Pouvez-vous m'expliquer svp ?
    Ca serait te priver de la satisfaction d'avoir trouvé la solution tout seul. Essaie ton programme "à la main" avec papier, crayon gomme, ou sa version moderne à l'aide du debogueur de VB en affichant l'état des variables au fur et à mesure de l'exécution des lignes de ton programme.

Discussions similaires

  1. Problème de réception port série visual basic ( visual studio 2012)
    Par extremgear dans le forum Programmation et langages, Algorithmique
    Réponses: 9
    Dernier message: 30/07/2013, 22h44
  2. visual basic
    Par alzon dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 03/05/2012, 16h55
  3. visual basic 6
    Par geniant dans le forum Programmation et langages, Algorithmique
    Réponses: 4
    Dernier message: 22/06/2011, 08h21
  4. Visual Basic
    Par punky591 dans le forum Programmation et langages, Algorithmique
    Réponses: 21
    Dernier message: 31/03/2011, 17h15
  5. Question sur Visual Basic
    Par invitebdd9f800 dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 07/11/2009, 09h45