IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Access Discussion :

[VBA] Calcul du PGDC --> Problème de résultat


Sujet :

Access

  1. #1
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut [VBA] Calcul du PGDC --> Problème de résultat
    Bonjour ...

    J'utilise en ce moment Office XP et je suis en train de réaliser une petite application VBA qui peut me calculer le PGDC de 2 nombres.

    Mon code est un peu long ( avec les commentaires ) mais je vous le met pour que vous puissiez l'analyser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    Sub PGDC()
     
    'Définition des variables
     
    Dim a As Long ' Premier nombre
    Dim b As Long ' Deuxième nombre
    Dim pg As Long ' Plus grand nombre
    Dim pp As Long ' Plus petit nombre
    Dim res As Long ' Résultat
     
    'Message lorsque l'on ouvre le programme
    MsgBox ("Ce programme calcul le PGDC de 2 nombres")
     
    'On met dans une variable ce que l'utilisateur va rentrer.
    a = InputBox("Entrer le 1er nombre")
    b = InputBox("Entrer le 2ème nombre")
     
    'Si a est plus petit que b alors
    If (a < b) Then
    ' le plus petit nombre est a et le plus grand est b ( stockage dans les variables )
    pp = a And pg = b
    'sinon
    Else
        'Si b est plus petit que a alors
        If (b < a) Then
        ' le plus petit nombre est b et le plus grand est a ( stockage dans les variables )
        pp = b And pg = a
        'sinon
        Else
        'Par défaut le plus grand nombre est a et le plus petit est b
        pg = a And pp = b
        End If
    'Fin de la boucle principale
    End If
     
    'Si a est égal à b alors
    If a = b Then
        'On affiche que le pgdc est a car c'est de toute façon le même nombre
        MsgBox ("Le pgdc du nombre " & a & "et du nombre" & b & " est : " & a)
     
        'Tant que a est plus grand que b
        While (a > b)
            'res sera égal au résultat du plus grand nombre - le plus petit.
            res = pg - pp
            'Si le plus petit nombre est différent du plus grand alors
            If (pp <> pg) Then
                'On affiche le résultat
                MsgBox res
            'Sinon
            Else
             'Si le contenu de res est plus petit que le plus petit nombre alors
             If res < pp Then
                'Le plus grand nombre est égal au plus petit et le plus petit est égal au plus grand
                pg = pp And pp = res
            'Sinon
            Else
                'le plus petit nombre est égal au res et les plus grand nombre est égal au plus petit
                pp = res And pg = pp
     
            End If
            End If
        'Din de la boucle WHILE
        Wend
        End If
    'Affichage du PGDC des 2 nombres
    MsgBox "Le PGDC de " & a & " et de " & b & " est " & pp&
     
    'Si le rsultat est = à 1 alors c'est que c'est des nombres premiers.
    If res = 1 Then
        MsgBox " Ces 2 nombres sont premiers "
    End If
     
    End Sub
    Le problème que j'ai c'est que peut importe les nombres que je rentres, j'ai toujours le résultat "0" qui s'affiche. Je sais que j'ai du faire une erreur mais je ne la trouve pas car je n'ai pas d'erreur de compilation.

    Es ce que quelqu'un pourrait m'aider ???

    Je vous remercie tous et à tout bientôt ...


  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Debugge ton programme en pas a pas.

    Place un point d'arret et fait defiler les instructions une à une, tu peux regarder le contenu de tes variables en laissant ton pointeur dessus.

  3. #3
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut
    J'ai essayé de voir en mettant des points d'arrêt mais je ne comprends pas où es ce qu'il y a une erreur ...

    En fait maintenant j'ai une boucle infinie ... Donc je pense que le problème doit venir de la boucle WHILE ... mais je ne sais pas ou`...

    Je suis débutante en VBA ... Merci de votre aide ...

    A tout bientôt ...

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    C'est pas un problème de VBA mais d'algorithmie... L'algo du PGCD doit etre connu et reconnu et trouvable partout.

    Compares en un avec le tien et debugge.

  5. #5
    Membre averti Avatar de pmboutteau
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2005
    Messages : 601
    Points : 420
    Points
    420
    Par défaut
    pourquoi tu test a et b dans ton While alors qu'après tun e leur affecte pas de nouvelles valeurs puisque tu bosses avec pp, pg et res?

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 236
    Points : 310
    Points
    310
    Par défaut
    Ton problème vient du fait que tu utilises AND quand tu affectes a et b à pg et pp.

    essayes ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    'Si a est plus petit que b alors
    If (a < b) Then
    ' le plus petit nombre est a et le plus grand est b ( stockage dans les variables )
    pp = a
    pg = b
    'sinon
    Else
        'Si b est plus petit que a alors
        If (b < a) Then
        ' le plus petit nombre est b et le plus grand est a ( stockage dans les variables )
        pp = b
        pg = a
        'sinon
        Else
        'Par défaut le plus grand nombre est a et le plus petit est b
        pg = a
        pp = b
        End If
    'Fin de la boucle principale
    End If

  7. #7
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut
    Merci de vos réponses ...

    Voici maintenant la présentation de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    Sub PGDC()
     
    'Définition des variables
     
    Dim a As Long ' Premier nombre
    Dim b As Long ' Deuxième nombre
    Dim pg As Long ' Plus grand nombre
    Dim pp As Long ' Plus petit nombre
    Dim res As Long ' Résultat
     
    'Message lorsque l'on ouvre le programme
    MsgBox ("Ce programme calcul le PGDC de 2 nombres")
     
    'On met dans une variable ce que l'utilisateur va rentrer.
    a = InputBox("Entrer le 1er nombre")
    b = InputBox("Entrer le 2ème nombre")
     
    'Si a est plus petit que b alors
    If (a < b) Then
    ' le plus petit nombre est a et le plus grand est b ( stockage dans les variables )
    pp = a
    pg = b
    'sinon
    Else
        'Si b est plus petit que a alors
        If (b < a) Then
        ' le plus petit nombre est b et le plus grand est a ( stockage dans les variables )
        pp = b
        pg = a
        'sinon
        Else
        'Par défaut le plus grand nombre est a et le plus petit est b
        pg = a
        pp = b
        End If
    'Fin de la boucle principale
    End If
     
     
     
    'Si a est égal à b alors
    If a = b Then
        'On affiche que le pgdc est a car c'est de toute façon le même nombre
        MsgBox ("Le pgdc du nombre " & a & "et du nombre" & b & " est : " & a)
     
    End If
     
        'Tant que a est plus grand que b
     
        While (a > b)
            'res sera égal au résultat du plus grand nombre - le plus petit.
            res = pg - pp
            'Si le plus petit nombre est différent du plus grand alors
            If (pp <> pg) Then
                'On affiche le résultat
     
            'Sinon
            Else
             'Si le contenu de res est plus petit que le plus petit nombre alors
             If res < pp Then
                'Le plus grand nombre est égal au plus petit et le plus petit est égal au plus grand
                pg = pp And pp = res
            'Sinon
            Else
                'le plus petit nombre est égal au res et les plus grand nombre est égal au plus petit
                pp = res And pg = pp
     
            End If
            End If
        'Din de la boucle WHILE
        Wend
        MsgBox res
         MsgBox res
    'Affichage du PGDC des 2 nombres
    MsgBox "Le PGDC de " & a & " et de " & b & " est " & pp&
     
    'Si le rsultat est = à 1 alors c'est que c'est des nombres premiers.
    If res = 1 Then
        MsgBox " Ces 2 nombres sont premiers "
    End If
     
    End Sub
    Cela me donne toujours une boucle infini ... je ne sais pas pourquoi ... Je suis obligée de presser CTRL + PAUSE pour arrêter l'exécution du programme ...



    Comment puis-je faire pour que cela marche ???

    Merci de vos réponses ...

  8. #8
    Membre averti Avatar de pmboutteau
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2005
    Messages : 601
    Points : 420
    Points
    420
    Par défaut
    ton while va boucler indéfiniment vu que tu regarde a>b. derrière tun e modifies pas leur valeur alors çà boucle!

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    voici ma méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    Function pgdc(x As Long, y As Long) As Long
    Dim grand  As Long
    Dim petit As Long
    Dim rep As Long
    If x * y = 0 Then
    MsgBox ("un des deux vaut 0")
    Exit Function
    End If
    grand = Abs(x)
    petit = Abs(y)
    If petit > grand Then
    grand = Abs(y)
    petit = Abs(x)
    End If
    rep = grand Mod petit
    Do Until rep = 0
    grand = petit
    petit = rep
    rep = grand Mod petit
    rep = grand Mod petit
    Loop
    pgdc = petit
    End Function
    si ca peut aider[/code]

  10. #10
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut
    Merci pour ta solution ... je m'excuse de te poser cette question mais j'ai utilisé ta fonction comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Sub test()
    Call pgdc2(50, 15)
    MsgBox ("le pgdc est : " & rep)
    End Sub
    En ce qui concerne le nom de ta fonction je l'ai appelé pgdc2 pour pas qu'il y ait d'ambiguité dans mon code ...

    Mais le problème c'est que cela ne me retourne rien ... oui je suis débutante et je m'y suis peut être mal prise ...

    Peux-tu m'aider encore un ptit coup ???

    merci pour tout ..

  11. #11
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    sub testeu()
    MsgBox ("solution par la méthode d'Euclide " & pgdc2(50, 15) )
    end sub

  12. #12
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut
    OKi merci ...

    Mais es ce que c'est normal que j'ai la réponse 0 pour 50 et 15 ??? A moins que je suis vraiment nulle en math, je crois que le PGDC de 15 et de 50 c'est 5 ... non ???

    Es ce que c'est normal alors ??? Merci de ta réponse et de ton aide ...

  13. #13
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    je ne sais pas ce que tu as fait chez moi ca donne 5
    comme chez feu Euclide himself

  14. #14
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut
    Oki alors attend je vais refaire un nouveau module et je recommence tout ... je te tiens au courant dès que cela est fait ...

    merci pour tout ..

    Et sorry

  15. #15
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut
    Alors voici ce que j'ai dans mon nouveau module :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Option Compare Database
     
    Function pgdc2(x As Long, y As Long) As Long
    Dim grand  As Long
    Dim petit As Long
    Dim rep As Long
    If x * y = 0 Then
    MsgBox ("un des deux vaut 0")
    Exit Function
    End If
    grand = Abs(x)
    petit = Abs(y)
    If petit > grand Then
    grand = Abs(y)
    petit = Abs(x)
    End If
    rep = grand Mod petit
    Do Until rep = 0
    grand = petit
    petit = rep
    rep = grand Mod petit
    rep = grand Mod petit
    Loop
    pgdc = petit
    End Function
     
    Sub testeu()
    MsgBox ("solution par la méthode d'Euclide : " & pgdc2(100, 20))
    End Sub
    Et cela me donne 0 ... Ouais c'est mon pc qui doit débloquer alors ??? ...

  16. #16
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    si vous renommez pgdc en pgdc2

    il faut mettre à jour pdc2 dans la fonction et remplacer
    pgdc = petit

    par pgdc2 = petit

    j'ai testé avec ma fonction

  17. #17
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut
    Eh ouais ... c'était tout simple et je n'y avais pas pensé ... Maintenant cela marche parfaitement ... merci beaucoup pour l'aide que vous m'avez offerte ...

    Ce forum est vraiment bien ...

    Merci à tout le monde ...







+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VxiR2] Problème avec résultat de calcul sur 2 requêtes liées.
    Par mouchou77 dans le forum Deski
    Réponses: 8
    Dernier message: 27/09/2010, 17h37
  2. [BO 5.1.8] problème de résultat d'un calcul
    Par moun_moun dans le forum Deski
    Réponses: 1
    Dernier message: 02/07/2010, 22h22
  3. Problème de résultat
    Par Mephisto08 dans le forum C
    Réponses: 21
    Dernier message: 28/09/2005, 08h57
  4. problème avec résultat de recherche multi-critères
    Par audrey_desgres dans le forum Access
    Réponses: 2
    Dernier message: 23/06/2005, 11h00
  5. Calcul dans un triggers : problème du +
    Par eXiaNazaire dans le forum Oracle
    Réponses: 3
    Dernier message: 07/01/2005, 10h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo