Affecter un opérateur mathématique à une variable

Signaler
Messages postés
17
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
14 novembre 2010
-
Messages postés
13
Date d'inscription
jeudi 20 août 2009
Statut
Membre
Dernière intervention
24 août 2010
-
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

Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
31
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.
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
30
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
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
31
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.
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
30
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
Messages postés
17
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
14 novembre 2010

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 !
Messages postés
13
Date d'inscription
jeudi 20 août 2009
Statut
Membre
Dernière intervention
24 août 2010

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