Option Explicit Rem 1 TextBox --> TxtNb affichage du nombre à trouver Rem 6 TextBox --> TxtPlaque groupe de contrôle index de 1 à 6 Rem 1 Label --> LblInfo afichage du résultat Rem 1 Button --> CmdLancer Rem 1 Button --> CmdQuitter ' Définition d'une plaque Private Type Plaque Nb As Double ' Nombre associé à la plaque Op As String ' Opérateur associé a la plaque Pos As Long ' Position d'ordre dans le calcul du compte End Type Dim Tirage(6) As Plaque Dim nbUtil As Long Private Sub CmdLancer_Click() ' Lancer la recherche CmdLancer.Enabled = False LblInfo.Caption = "" ' Initialise les variables pour la recherche Call InitTirage ' Si le compte est trouvé, on affiche le résultat If CompteBon(1) Then Call AfficheResultat Else LblInfo.Caption = "Pas trouvé!" End If CmdLancer.Enabled = True End Sub Private Sub InitTirage() ' Initialise les variables... Dim lgFor As Long nbUtil = 1 ' La plaque 0 contient le résultat à obtenir Tirage(0).Nb = Val(TxtNb.Text) ' Affecte les valeurs des 6 plaques For lgFor = 1 To 6 Tirage(lgFor).Nb = Val(TxtPlaque(lgFor).Text) Tirage(lgFor).Op = "" Tirage(lgFor).Pos = 0 Next End Sub Private Sub AfficheResultat() Dim inFor As Integer Dim inPlus As Integer Dim stResult As String LblInfo.Caption = "Résultat :" & vbCrLf ' On tourne autant de fois que l'on a utilisé de plaque For inFor = 1 To nbUtil - 1 ' On regarde toutes les plaques à chaque fois For inPlus = 1 To 6 ' Et si c'est celle qui a été utilisé à ce moment là, on l'ajoute à la chaîne de résultat If Tirage(inPlus).Pos = nbUtil - inFor Then ' Si c'est la première plaque, on ne fait qu'ajouter son chiffre If inFor = 1 Then stResult = Tirage(inPlus).Nb Else ' Sinon, on regarde le type d'opérateur auquel on a affaire. Car la multiplication et la division représentent ' des cas particuliers... If (Tirage(inPlus).Op "*") Or (Tirage(inPlus).Op "/") Then ' Si on se trouve sur la deuxième plaque, pas de cas particulier, If inFor = 2 Then ' on augmente la chaîne résultat de l'opérateur et du chiffre. stResult = stResult & Tirage(inPlus).Op & Tirage(inPlus).Nb Else ' sinon, on met des parenthèses parce que l'opération précédente est effectuée ' avant la multiplication ou la division que l'on va ajouter stResult = "(" & stResult & ")" & Tirage(inPlus).Op & Tirage(inPlus).Nb End If Else ' Dans les autres cas ("+" et "-") pas la peine de s'occuper des parenthèses, ' on augmente juste la chaîne résultat de l'opérateur et du chiffre. stResult = stResult & Tirage(inPlus).Op & Tirage(inPlus).Nb End If End If End If Next inPlus Next inFor LblInfo.Caption = LblInfo.Caption & stResult End Sub Public Function CompteBon(inPos As Long) As Boolean Dim inTMP As Long inTMP = inPos If Tirage(0).Nb 0 Then CompteBon True: Exit Function If nbUtil = 7 Then Exit Function Do While inTMP <= 6 If (Tirage(inTMP).Op = "") Then If SoustraitPossible(inTMP) Then Call Soustraction(inTMP) If CompteBon(1) Then CompteBon = True: Exit Function Call RetireSoustraction(inTMP) End If If DivisePossible(inTMP) Then Call Division(inTMP) If CompteBon(1) Then CompteBon = True: Exit Function Call RetireDivision(inTMP) End If Call Addition(inTMP) If CompteBon(1) Then CompteBon = True: Exit Function Call RetireAddition(inTMP) Call Multiplication(inTMP) If CompteBon(1) Then CompteBon = True: Exit Function Call RetireMultiplication(inTMP) End If inTMP = inTMP + 1 Loop End Function Public Sub Addition(inPlaque As Long) Tirage(inPlaque).Pos = nbUtil nbUtil = nbUtil + 1 Tirage(inPlaque).Op = "-" Tirage(0).Nb = Tirage(0).Nb + Tirage(inPlaque).Nb End Sub Public Sub Soustraction(inPlaque As Long) Tirage(inPlaque).Pos = nbUtil nbUtil = nbUtil + 1 Tirage(inPlaque).Op = "+" Tirage(0).Nb = Tirage(0).Nb - Tirage(inPlaque).Nb End Sub Public Sub Multiplication(inPlaque As Long) Tirage(inPlaque).Pos = nbUtil nbUtil = nbUtil + 1 Tirage(inPlaque).Op = "/" Tirage(0).Nb = Tirage(0).Nb * Tirage(inPlaque).Nb End Sub Public Sub Division(inPlaque As Long) Tirage(inPlaque).Pos = nbUtil nbUtil = nbUtil + 1 Tirage(inPlaque).Op = "*" Tirage(0).Nb = Tirage(0).Nb / Tirage(inPlaque).Nb End Sub Public Sub RetireAddition(inPlaque As Long) Tirage(inPlaque).Pos = 0 nbUtil = nbUtil - 1 Tirage(inPlaque).Op = "" Tirage(0).Nb = Tirage(0).Nb - Tirage(inPlaque).Nb End Sub Public Sub RetireSoustraction(inPlaque As Long) Tirage(inPlaque).Pos = 0 nbUtil = nbUtil - 1 Tirage(inPlaque).Op = "" Tirage(0).Nb = Tirage(0).Nb + Tirage(inPlaque).Nb End Sub Public Sub RetireMultiplication(inPlaque As Long) Tirage(inPlaque).Pos = 0 nbUtil = nbUtil - 1 Tirage(inPlaque).Op = "" Tirage(0).Nb = Tirage(0).Nb / Tirage(inPlaque).Nb End Sub Public Sub RetireDivision(inPlaque As Long) Tirage(inPlaque).Pos = 0 nbUtil = nbUtil - 1 Tirage(inPlaque).Op = "" Tirage(0).Nb = Tirage(0).Nb * Tirage(inPlaque).Nb End Sub Public Function SoustraitPossible(inPlaque As Long) As Boolean SoustraitPossible = ((Tirage(0).Nb - Tirage(inPlaque).Nb) >= 0) End Function Public Function DivisePossible(inPlaque As Long) As Boolean Dim sgTMP As Single sgTMP = (Tirage(0).Nb / Tirage(inPlaque).Nb) DivisePossible = ((sgTMP >= 1) And (sgTMP = Int(sgTMP)) And (Tirage(inPlaque).Nb <> 1)) End Function Private Sub TxtNb_KeyPress(KeyAscii As Integer) Select Case KeyAscii Case 48 To 57: Case 8: Case Else: KeyAscii = 0 End Select End Sub Private Sub TxtPlaque_KeyPress(Index As Integer, KeyAscii As Integer) Select Case KeyAscii Case 48 To 57: Case 8: Case Else: KeyAscii = 0 End Select End Sub Private Sub cmdQuitter_Click() Unload Me End End Sub
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question