Affecter un opérateur mathématique à une variable

giboudin Messages postés 17 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 14 novembre 2010 - 21 août 2010 à 03:56
bitangm Messages postés 13 Date d'inscription jeudi 20 août 2009 Statut Membre Dernière intervention 24 août 2010 - 24 août 2010 à 10:37
Bonjour à tous,

Je progresse dans mon apprentissage de VB2008 mais une nouvelle question se pose à moi. Je souhaiterais affecter un opérateur mathématique à une variable de sorte à pouvoir l'utiliser dans un calcul, mais je n'y parviens pas. Concrètement, une TextBox1 recueille un nombre, une seconde fait de même et une troisième l'opérateur mathématique (+,-,*,/).
Comment faire en sorte qu'une 4 ème textbox (ou autre) affiche le résultat après un clic de bouton par exemple ?
Car si (le contenu des TextBox a été préalablement déclaré comme variable) variable1 + ou - ou / ou * variable2 donne bien le résultat attendu, en revanche variable1 variable3 variable2 n'est pas une ligne de code correcte !! et là ben … je ne vois pas comment faire !
Merci par avance pour vos idées et/ou solutions.

6 réponses

Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
21 août 2010 à 09:55
Salut,

C'est tout à fait logique et ce que tu cherches à faire est tout bonnement impossible. Contrairement aux variables qui changes en cours d'exécution, le code saisi (que ce soit un opérateur, ou une instruction) est compilé pour formé un exécutable. Un code compilé ne change plus.

La compilation terminé, ce ne sont plus les sources qui s'exécutent mais le programme fini. Donc le code .Net disparait pour laisser place à un code intermédiaire.

Si c'était possible on saisirait des programmes complets dans des textbox...

Donc seul solution prévoir 4 boutons comme pour une calculette nommés respectivement * / + - puis déclarer une variable au sein de formulaire.

Chaque clic modifira la valeur de la variable et ton opération se fera selon son contenu.

Voila, @+


Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
Utilisateur anonyme
21 août 2010 à 12:49
C'est plus ou moins possible avec des pointeurs de fonctions
La variable operateur sera un pointeur vers la fonction d'operation voulu

Delegate Function Operation(ByVal a As Double, ByVal b As Double) As Double

Function Add(ByVal a As Double, ByVal b As Double) As Double
  Return a + b
End Function
Function Mult(ByVal a As Double, ByVal b As Double) As Double
  Return a * b
End Function
Function Div(ByVal a As Double, ByVal b As Double) As Double
  Return a / b
End Function
Function Subtract(ByVal a As Double, ByVal b As Double) As Double
  Return a - b
End Function

Sub Main()

  Dim op As Operation
  Dim res As Double

  op = New Operation(AddressOf Mult)
  res = op(2.0, 3.0)

End Sub



_____________
Kenji
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
21 août 2010 à 18:56
Charles Racaud>

Je ne saisi pas vraiment ce que ta réponse apporte ? Ce qu'il veut c'est saisir l'opérateur dans un textbox. La notion de pointeur n'est donc pas nécessaire. Un simple :

Function Add(ByVal a As Double, ByVal b As Double) As Double
  Return a + b
End Function
Function Mult(ByVal a As Double, ByVal b As Double) As Double
  Return a * b
End Function
Function Div(ByVal a As Double, ByVal b As Double) As Double
  Return a / b
End Function
Function Subtract(ByVal a As Double, ByVal b As Double) As Double
  Return a - b
End Function

Dim Res As Double = Mult(2.0, 3.0)


ferai l'affaire. Que tu précise l'adresse de la fonction ou son nom ne change rien à mon sens étant donné que cela doit rester au sein du code behind.

Après, il peut comme je l'ai di plus haut faire une variable opération qui changera de valeur et appliquer l'opération selon le contenu de la variable via un switch:

Select Case Op

       Case "+"
            TextBox1.Text = Add(CDbl(TextBox2.Text), CDbl(TextBox3.Text))
'....


Donc autant faire plus simple :

Select Case TextBox1.Text
       Case "+"
            TextBox5.Text = CDbl(TextBox2.Text) + CDbl(TextBox3.Text)
       Case "-"
            TextBox5.Text = CDbl(TextBox2.Text) - CDbl(TextBox3.Text)
       Case "*"
            TextBox5.Text = CDbl(TextBox2.Text) * CDbl(TextBox3.Text)
       Case "/"
            TextBox5.Text = CDbl(TextBox2.Text) / CDbl(TextBox3.Text)
End Select


Bien entendu il reste à gérer les erreurs mathématiques et les erreurs de saisies.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
Utilisateur anonyme
21 août 2010 à 23:33
Je propose seulement, son probleme n'est bien sûr par réalisable directement, il est obligé de faire des testes comme tu le dit.

_____________
Kenji
0

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

Posez votre question
giboudin Messages postés 17 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 14 novembre 2010
22 août 2010 à 12:18
Salut à vous deux et merci beaucoup de vos réponses. Par manque de temps pas eu la possibilité de me pencher sérieusement sur les codes proposés, mais en tout cas vous me donnez des pistes à explorer et c'est super sympa.. Encore un grand merci à vous. Je vous dirai ce qu'il en est lorsque j'aurai avancé un peu et quelle solution je retiens (mais certainement que je vais repenser et adapter un peu l'appli).
Merci encore !
0
bitangm Messages postés 13 Date d'inscription jeudi 20 août 2009 Statut Membre Dernière intervention 24 août 2010
24 août 2010 à 10:37
La fonction suivante résout ton problème.
N'oubli pas de d'ajouter la référence "COM Microsoft Script Control 1.0"

Public Function EvalString(ByVal str As String, Optional ByRef LastError As String = "") As Object
        On Error Resume Next

        'Projet de base
        Static sc As MSScriptControl.ScriptControl
        If sc Is Nothing Then
            sc = New MSScriptControl.ScriptControl
            sc.Language = "VBScript"
        End If

        'Module de code
        Static md As MSScriptControl.Module
        If md Is Nothing Then
            md = sc.Modules.Add("Fonctions")
            md.AddCode("Option Explicit                                                                     " & vbCrLf & _
                       "                                                                                    " & vbCrLf & _
                       "Function iif(Cond, TrueValue, FalseValue)                                           " & vbCrLf & _
                       "    If Cond Then                                                                    " & vbCrLf & _
                       "        iif = TrueValue                                                             " & vbCrLf & _
                       "    Else                                                                            " & vbCrLf & _
                       "        iif = FalseValue                                                            " & vbCrLf & _
                       "    End If                                                                          " & vbCrLf & _
                       "End Function")
        End If

        'Evaluation
        EvalString = md.Eval(str)
        LastError = sc.Error

        'Déchargeons les objets
        On Error Resume Next
        sc.Reset()
        md = Nothing
        sc = Nothing
    End Function



Exemple d'utilisation
================================
Dim d As Double EvalString("1 + 2") 'Renvoi 3


BITANG Marcel Yves
bitangm@yahoo.fr
+242 405 50 61
+242 650 46 47
0
Rejoignez-nous