Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

INTERPRÈTEUR DE FORMULE


Information sur la source

Catégorie :Maths Classé sous : evaluer, calculer, formule, fonction, mathématique Niveau : Initié Date de création : 10/08/2005 Date de mise à jour : 10/08/2005 12:34:05 Vu : 5 570

Note :
10 / 10 - par 3 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

Description

Je cherchais quelque chose pour pouvoir dessiner des fonctions, mon problèmes résidait dans l'interprétation de la formule (par exemple l'utilisateur devait pouvoir entrer tel quel "y=3*x^5+2*x^4-3*x^2+5" et le prog dessine) et je trouvais pas. J'ai d'abord bricolé un système ou mon prog écrivait une page html avec un vbscript dedans, le vbscript devant renvoyer comme titre du doc la réponse de la formule, et ensuite, je le récupérais grâce au controle dhtmledit, mais mon problème était alors que c'était TRES lent. Donc je me suis lancé dans une fonction permettant d'analyser une formule et de renvoyer son résultat. J'avais posé une question ici pour savoir si ca n'avait pas déjà été fait mais j'ai pas trouvé...

C'est mon premier code, soyez indulgents, mais si vous avez des idées pour aller plus vite, faites m'en part...
 

Source

  • Type Operator
  • Op As String
  • Prior As Integer
  • Location As Long
  • End Type
  • Function Eval(Formule As String) As Double
  • Dim f As String, i As Long, NOp As Long, buf As String
  • Dim Oper() As Operator, BufOp As Operator, CrntC As Long, Ordered As Boolean
  • Dim RStr As String, LStr As String, h As Long
  • f = Replace(Formule, " ", "")
  • f = Replace(f, "pi", "3.1415926535897932")
  • If InStr(1, f, "sin(") > 0 Then 'Interprétation de la fonction sinus
  • h = 1
  • i = InStr(1, f, "sin(")
  • While Mid(f, i, 1) <> ")" And h <> 0
  • If Mid(f, i, 1) = "(" Then h = h + 1
  • If Mid(f, i, 1) = ")" Then h = h - 1
  • i = i + 1
  • If i > Len(f) Then
  • MsgBox "Erreur de parenthèses..."
  • Exit Function
  • End If
  • Wend
  • i = i - InStr(1, f, "sin(")
  • Eval = Eval(Left(f, InStr(1, f, "sin(") - 1) & Str2(Sin(Eval(Mid(f, InStr(1, f, "sin(") + 4, i - 4)))) & Right(f, Len(f) - (i + InStr(1, f, "sin("))))
  • Exit Function
  • End If
  • If InStr(1, f, "cos(") > 0 Then 'Interprétation de la fonction cosinus
  • h = 1
  • i = InStr(1, f, "sin(")
  • While Mid(f, i, 1) <> ")" And h <> 0
  • If Mid(f, i, 1) = "(" Then h = h + 1
  • If Mid(f, i, 1) = ")" Then h = h - 1
  • i = i + 1
  • If i > Len(f) Then
  • MsgBox "Erreur de parenthèses..."
  • Exit Function
  • End If
  • Wend
  • i = i - InStr(1, f, "sin(")
  • Eval = Eval(Left(f, InStr(1, f, "sin(") - 1) & Str2(Cos(Eval(Mid(f, InStr(1, f, "sin(") + 4, i - 4)))) & Right(f, Len(f) - (i + InStr(1, f, "sin("))))
  • Exit Function
  • End If
  • If InStr(1, f, "tan(") > 0 Then 'Interprétation de la fonction tangeante
  • h = 1
  • i = InStr(1, f, "sin(")
  • While Mid(f, i, 1) <> ")" And h <> 0
  • If Mid(f, i, 1) = "(" Then h = h + 1
  • If Mid(f, i, 1) = ")" Then h = h - 1
  • i = i + 1
  • If i > Len(f) Then
  • MsgBox "Erreur de parenthèses..."
  • Exit Function
  • End If
  • Wend
  • i = i - InStr(1, f, "sin(")
  • Eval = Eval(Left(f, InStr(1, f, "tan(") - 1) & Str2(Cos(Eval(Mid(f, InStr(1, f, "sin(") + 4, i - 4)))) & Right(f, Len(f) - (i + InStr(1, f, "sin("))))
  • Exit Function
  • End If
  • NOp = 0
  • For i = 1 To Len(f) 'NOp = nombre d'opérateur, cette boucle les compte
  • buf = Mid(f, i, 1)
  • If buf = "*" Or buf = "-" Or buf = "+" Or buf = "/" Or buf = "^" Or buf = "(" Then NOp = NOp + 1
  • Next
  • If NOp = 1 Then
  • If InStr(1, f, "*") > 0 Then
  • Eval = Val(Left(f, InStr(1, f, "*") - 1)) * Val(Right(f, Len(f) - InStr(1, f, "*")))
  • ElseIf InStr(1, f, "-") > 0 Then
  • Eval = Val(Left(f, InStr(1, f, "-") - 1)) - Val(Right(f, Len(f) - InStr(1, f, "-")))
  • ElseIf InStr(1, f, "/") > 0 Then
  • Eval = Val(Left(f, InStr(1, f, "/") - 1)) / Val(Right(f, Len(f) - InStr(1, f, "/")))
  • ElseIf InStr(1, f, "+") > 0 Then
  • Eval = Val(Left(f, InStr(1, f, "+") - 1)) + Val(Right(f, Len(f) - InStr(1, f, "+")))
  • ElseIf InStr(1, f, "(") > 0 Then
  • Eval = Val(Mid(f, 2))
  • ElseIf InStr(1, f, "^") > 0 Then
  • Eval = Val(Left(f, InStr(1, f, "^") - 1)) ^ Val(Right(f, Len(f) - InStr(1, f, "^")))
  • End If
  • Exit Function
  • ElseIf NOp = 0 Then
  • Eval = Val(Formule)
  • Exit Function
  • Else
  • ReDim Oper(NOp)
  • CrntC = 1
  • For i = 1 To Len(f)
  • Select Case Mid(f, i, 1)
  • Case "("
  • BufOp.Location = i
  • BufOp.Op = "("
  • BufOp.Prior = 0
  • Oper(CrntC) = BufOp
  • CrntC = CrntC + 1
  • Case "^"
  • BufOp.Location = i
  • BufOp.Op = "^"
  • BufOp.Prior = 1
  • Oper(CrntC) = BufOp
  • CrntC = CrntC + 1
  • Case "/"
  • BufOp.Location = i
  • BufOp.Op = "/"
  • BufOp.Prior = 2
  • Oper(CrntC) = BufOp
  • CrntC = CrntC + 1
  • Case "*"
  • BufOp.Location = i
  • BufOp.Op = "*"
  • BufOp.Prior = 3
  • Oper(CrntC) = BufOp
  • CrntC = CrntC + 1
  • Case "+"
  • BufOp.Location = i
  • BufOp.Op = "+"
  • BufOp.Prior = 4
  • Oper(CrntC) = BufOp
  • CrntC = CrntC + 1
  • Case "-"
  • BufOp.Location = i
  • BufOp.Op = "-"
  • BufOp.Prior = 4
  • Oper(CrntC) = BufOp
  • CrntC = CrntC + 1
  • End Select
  • Next
  • 'TriBulle()
  • While Ordered = False
  • Ordered = True
  • For i = 1 To NOp - 1
  • If Oper(i).Prior > Oper(i + 1).Prior Then
  • BufOp = Oper(i)
  • Oper(i) = Oper(i + 1)
  • Oper(i + 1) = BufOp
  • Ordered = False
  • End If
  • Next
  • Wend
  • 'Localisation du premier bloc à traiter
  • If Oper(1).Op = "(" Then
  • h = 1
  • i = Oper(1).Location
  • While Mid(f, i, 1) <> ")" And h <> 0
  • If Mid(f, i, 1) = "(" Then h = h + 1
  • If Mid(f, i, 1) = ")" Then h = h - 1
  • i = i + 1
  • If i > Len(f) Then
  • MsgBox "Erreur de parenthèses..."
  • Exit Function
  • End If
  • Wend
  • i = i - Oper(1).Location
  • Eval = Eval(Left(f, Oper(1).Location - 1) & Str(Eval(Mid(f, Oper(1).Location + 1, i - 1))) & Right(f, Len(f) - (i + Oper(1).Location)))
  • Else
  • i = Oper(1).Location - 1
  • While Mid(f, i, 1) <> "+" And Mid(f, i, 1) <> "*" And Mid(f, i, 1) <> "-" And Mid(f, i, 1) <> "/" And Mid(f, i, 1) <> ")" And Mid(f, i, 1) <> "^" And i > 1
  • i = i - 1
  • Wend
  • LStr = Mid(f, i, Oper(1).Location - i)
  • i = Oper(1).Location + 1
  • While Mid(f, i, 1) <> "+" And Mid(f, i, 1) <> "*" And Mid(f, i, 1) <> "-" And Mid(f, i, 1) <> "/" And Mid(f, i, 1) <> ")" And Mid(f, i, 1) <> "^" And i < Len(f)
  • i = i + 1
  • Wend
  • RStr = Mid(f, Oper(1).Location + 1, i - Oper(1).Location - 1)
  • Select Case Oper(1).Op
  • Case "*"
  • Eval = Eval(Left(f, Oper(1).Location - 1 - Len(LStr)) & Str2(Val(LStr) * Val(RStr)) & Right(f, Len(f) - (Oper(1).Location + Len(RStr))))
  • Case "/"
  • Eval = Eval(Left(f, Oper(1).Location - 1 - Len(LStr)) & Str2(Val(LStr) / Val(RStr)) & Right(f, Len(f) - (Oper(1).Location + Len(RStr))))
  • Case "+"
  • Eval = Eval(Left(f, Oper(1).Location - 1 - Len(LStr)) & Str2(Val(LStr) + Val(RStr)) & Right(f, Len(f) - (Oper(1).Location + Len(RStr))))
  • Case "-"
  • Eval = Eval(Left(f, Oper(1).Location - 1 - Len(LStr)) & Str2(Val(LStr) - Val(RStr)) & Right(f, Len(f) - (Oper(1).Location + Len(RStr))))
  • Case "^"
  • Eval = Eval(Left(f, Oper(1).Location - 1 - Len(LStr)) & Str2(Val(LStr) ^ Val(RStr)) & Right(f, Len(f) - (Oper(1).Location + Len(RStr))))
  • End Select
  • End If
  • End If
  • End Function
  • Public Function Str2(Value As Double) As String 'pour éviter les . qui deviennent , etc
  • Str2 = Replace(Format(Value, "#0.##########################################"), ",", ".")
  • End Function
Type Operator
    Op As String
    Prior As Integer
    Location As Long
End Type

Function Eval(Formule As String) As Double
    Dim f As String, i As Long, NOp As Long, buf As String
    Dim Oper() As Operator, BufOp As Operator, CrntC As Long, Ordered As Boolean
    Dim RStr As String, LStr As String, h As Long
    f = Replace(Formule, " ", "")
    
    f = Replace(f, "pi", "3.1415926535897932")
    
    If InStr(1, f, "sin(") > 0 Then 'Interprétation de la fonction sinus
        h = 1
        i = InStr(1, f, "sin(")
        While Mid(f, i, 1) <> ")" And h <> 0
            If Mid(f, i, 1) = "(" Then h = h + 1
            If Mid(f, i, 1) = ")" Then h = h - 1
            i = i + 1
            If i > Len(f) Then
                MsgBox "Erreur de parenthèses..."
                Exit Function
            End If
        Wend
        i = i - InStr(1, f, "sin(")
        Eval = Eval(Left(f, InStr(1, f, "sin(") - 1) & Str2(Sin(Eval(Mid(f, InStr(1, f, "sin(") + 4, i - 4)))) & Right(f, Len(f) - (i + InStr(1, f, "sin("))))
        Exit Function
    End If
    
    If InStr(1, f, "cos(") > 0 Then  'Interprétation de la fonction cosinus
        h = 1
        i = InStr(1, f, "sin(")
        While Mid(f, i, 1) <> ")" And h <> 0
            If Mid(f, i, 1) = "(" Then h = h + 1
            If Mid(f, i, 1) = ")" Then h = h - 1
            i = i + 1
            If i > Len(f) Then
                MsgBox "Erreur de parenthèses..."
                Exit Function
            End If
        Wend
        i = i - InStr(1, f, "sin(")
        Eval = Eval(Left(f, InStr(1, f, "sin(") - 1) & Str2(Cos(Eval(Mid(f, InStr(1, f, "sin(") + 4, i - 4)))) & Right(f, Len(f) - (i + InStr(1, f, "sin("))))
        Exit Function
    End If
    
    If InStr(1, f, "tan(") > 0 Then  'Interprétation de la fonction tangeante
        h = 1
        i = InStr(1, f, "sin(")
        While Mid(f, i, 1) <> ")" And h <> 0
            If Mid(f, i, 1) = "(" Then h = h + 1
            If Mid(f, i, 1) = ")" Then h = h - 1
            i = i + 1
            If i > Len(f) Then
                MsgBox "Erreur de parenthèses..."
                Exit Function
            End If
        Wend
        i = i - InStr(1, f, "sin(")
        Eval = Eval(Left(f, InStr(1, f, "tan(") - 1) & Str2(Cos(Eval(Mid(f, InStr(1, f, "sin(") + 4, i - 4)))) & Right(f, Len(f) - (i + InStr(1, f, "sin("))))
        Exit Function
    End If
    
    NOp = 0
    For i = 1 To Len(f)  'NOp = nombre d'opérateur, cette boucle les compte
        buf = Mid(f, i, 1)
        If buf = "*" Or buf = "-" Or buf = "+" Or buf = "/" Or buf = "^" Or buf = "(" Then NOp = NOp + 1
    Next
    If NOp = 1 Then
        If InStr(1, f, "*") > 0 Then
            Eval = Val(Left(f, InStr(1, f, "*") - 1)) * Val(Right(f, Len(f) - InStr(1, f, "*")))
        ElseIf InStr(1, f, "-") > 0 Then
            Eval = Val(Left(f, InStr(1, f, "-") - 1)) - Val(Right(f, Len(f) - InStr(1, f, "-")))
        ElseIf InStr(1, f, "/") > 0 Then
            Eval = Val(Left(f, InStr(1, f, "/") - 1)) / Val(Right(f, Len(f) - InStr(1, f, "/")))
        ElseIf InStr(1, f, "+") > 0 Then
            Eval = Val(Left(f, InStr(1, f, "+") - 1)) + Val(Right(f, Len(f) - InStr(1, f, "+")))
        ElseIf InStr(1, f, "(") > 0 Then
            Eval = Val(Mid(f, 2))
        ElseIf InStr(1, f, "^") > 0 Then
            Eval = Val(Left(f, InStr(1, f, "^") - 1)) ^ Val(Right(f, Len(f) - InStr(1, f, "^")))
        End If
        Exit Function
    ElseIf NOp = 0 Then
        Eval = Val(Formule)
        Exit Function
    Else
        ReDim Oper(NOp)
        CrntC = 1
        For i = 1 To Len(f)
            Select Case Mid(f, i, 1)
            Case "("
                BufOp.Location = i
                BufOp.Op = "("
                BufOp.Prior = 0
                Oper(CrntC) = BufOp
                CrntC = CrntC + 1
            Case "^"
                BufOp.Location = i
                BufOp.Op = "^"
                BufOp.Prior = 1
                Oper(CrntC) = BufOp
                CrntC = CrntC + 1
            Case "/"
                BufOp.Location = i
                BufOp.Op = "/"
                BufOp.Prior = 2
                Oper(CrntC) = BufOp
                CrntC = CrntC + 1
            Case "*"
                BufOp.Location = i
                BufOp.Op = "*"
                BufOp.Prior = 3
                Oper(CrntC) = BufOp
                CrntC = CrntC + 1
            Case "+"
                BufOp.Location = i
                BufOp.Op = "+"
                BufOp.Prior = 4
                Oper(CrntC) = BufOp
                CrntC = CrntC + 1
            Case "-"
                BufOp.Location = i
                BufOp.Op = "-"
                BufOp.Prior = 4
                Oper(CrntC) = BufOp
                CrntC = CrntC + 1
            End Select
        Next
        
        'TriBulle()
        While Ordered = False
            Ordered = True
            For i = 1 To NOp - 1
                If Oper(i).Prior > Oper(i + 1).Prior Then
                    BufOp = Oper(i)
                    Oper(i) = Oper(i + 1)
                    Oper(i + 1) = BufOp
                    Ordered = False
                End If
            Next
        Wend
        
        'Localisation du premier bloc à traiter
        If Oper(1).Op = "(" Then
            h = 1
            i = Oper(1).Location
            While Mid(f, i, 1) <> ")" And h <> 0
                If Mid(f, i, 1) = "(" Then h = h + 1
                If Mid(f, i, 1) = ")" Then h = h - 1
                i = i + 1
                If i > Len(f) Then
                    MsgBox "Erreur de parenthèses..."
                    Exit Function
                End If
            Wend
            i = i - Oper(1).Location
            Eval = Eval(Left(f, Oper(1).Location - 1) & Str(Eval(Mid(f, Oper(1).Location + 1, i - 1))) & Right(f, Len(f) - (i + Oper(1).Location)))
        Else
            i = Oper(1).Location - 1
            While Mid(f, i, 1) <> "+" And Mid(f, i, 1) <> "*" And Mid(f, i, 1) <> "-" And Mid(f, i, 1) <> "/" And Mid(f, i, 1) <> ")" And Mid(f, i, 1) <> "^" And i > 1
                i = i - 1
            Wend
            LStr = Mid(f, i, Oper(1).Location - i)
            i = Oper(1).Location + 1
            While Mid(f, i, 1) <> "+" And Mid(f, i, 1) <> "*" And Mid(f, i, 1) <> "-" And Mid(f, i, 1) <> "/" And Mid(f, i, 1) <> ")" And Mid(f, i, 1) <> "^" And i < Len(f)
                i = i + 1
            Wend
            RStr = Mid(f, Oper(1).Location + 1, i - Oper(1).Location - 1)
            Select Case Oper(1).Op
            Case "*"
                Eval = Eval(Left(f, Oper(1).Location - 1 - Len(LStr)) & Str2(Val(LStr) * Val(RStr)) & Right(f, Len(f) - (Oper(1).Location + Len(RStr))))
            Case "/"
                Eval = Eval(Left(f, Oper(1).Location - 1 - Len(LStr)) & Str2(Val(LStr) / Val(RStr)) & Right(f, Len(f) - (Oper(1).Location + Len(RStr))))
            Case "+"
                Eval = Eval(Left(f, Oper(1).Location - 1 - Len(LStr)) & Str2(Val(LStr) + Val(RStr)) & Right(f, Len(f) - (Oper(1).Location + Len(RStr))))
            Case "-"
                Eval = Eval(Left(f, Oper(1).Location - 1 - Len(LStr)) & Str2(Val(LStr) - Val(RStr)) & Right(f, Len(f) - (Oper(1).Location + Len(RStr))))
            Case "^"
                Eval = Eval(Left(f, Oper(1).Location - 1 - Len(LStr)) & Str2(Val(LStr) ^ Val(RStr)) & Right(f, Len(f) - (Oper(1).Location + Len(RStr))))
            End Select
        End If
    End If
End Function

Public Function Str2(Value As Double) As String 'pour éviter les . qui deviennent , etc 
    Str2 = Replace(Format(Value, "#0.##########################################"), ",", ".")
End Function

Conclusion

Bon heu j'ai été vite, y'a peu de traitement d'erreurs, fo pas lui envoyer autre chose que prévu (surtout qu'en utilisant cette technique de fonction récurente, votre espace pile souffrira vite du moindre bug...)
 

Historique

10 août 2005 12:34:05 :
Tites fautes dans les commentaires corrigées

Commentaires et avis

signaler à un administrateur
Commentaire de us_30 le 10/08/2005 21:16:08

Bonjour,

Quand tu dis : "C'est mon premier code, soyez indulgents". Tu veux dire que c'est ton premier déposé sur VBFrance, car au vu de l'emploi des fonctions utilisées et de la strucutre employée, c'est plus tout à fait du niveau débutant...

Afin, bon, je voulais juste dire que sur ce site, d'autres personnes ont déposé des sources similaires. Cela pourrait peut être intéressant d'étudier les astuces et les structures, pour en retirer les bonnes idées...

Et enfin, je me pose une question. Puisque tu es prêt à utiliser plusieurs application utilisant VB (avec vbscript, comme tu l'expliques), pourquoi ne pas utiliser directement la fonction EVAL() présent dans Excel en VBA, qui réalise exactement la même chose...

Amicalement,
Us.

signaler à un administrateur
Commentaire de us_30 le 10/08/2005 21:45:28

Oupsss... Lire "Evaluate()" au lieu de Eval()...

Us.

signaler à un administrateur
Commentaire de Julien237 le 11/08/2005 09:01:31

Oh Parce que je ne savais pas qu'elle existait ! merci, je vais faire un tour par VBA.

Oui c'est mon premier code sur VBFrance pas mon premier code tout court...

Quant aux autres codes similaires, tu as un exemple à me fournir ? J'avais déjà posé (2X) la question et j'ai pas eu de réponses, j'ai un peu cherché aussi mais j'ai rien trouvé...

Merci pour tes comms..

Bonne Prog

Julien.

signaler à un administrateur
Commentaire de rambc le 11/08/2005 10:14:19

Pour voir des sources similaires, il suffit de regarder du côté des calculatrices proposées. Tu auras différentes méthodes et niveaux d'efficacité.

signaler à un administrateur
Commentaire de Warny le 11/08/2005 10:26:34

J'avais fait la même chose que toi quand la fonction Eval n'existait pas.
Pour les parenthèse je fabriquais un arbre en gros :

(a+b)*(c+d) me donne

(*)
|
+- a+b
|
+- c+d

ensuite je décompose les calculs en fonction de leur priorité toujours en décomposant en arbre.
Ensuite tu descends l'arbre en faisant les calculs.
Renseigne toi sur la notation polonaise. C'est ça qui m'avait donné cette idée


signaler à un administrateur
Commentaire de Pingouin le 11/08/2005 13:33:46

Sans vouloir faire de l'auto-promo j'ai déposé une calculatrice scientifique qui devrait répondre à ton probleme (désolé de n'avoir jms vu tes questions sur le sujet ). Elle gère de nombreuses fonctions mathematiques, les parentheses, les priorités. Peut etre n'est elle pas 100% fiables mais bon ... Tout ca est regroupé dans un module facilement réutilisable et je crois assez bien commenté.
Voila si jamais ca peut t'aider j'en serais heureux mais si c'est seulement quelques bricoles :

http://vbfrance.com/code.aspx?id=6666

@+
Pingouin

signaler à un administrateur
Commentaire de Olilefou le 11/08/2005 20:49:31

Il y a plusieurs interpréteurs tout prêt, voici un exemple :

Private Sub Form_Load()
' quelques exemples
MsgBox Evaluer("21 / 321 * 3221 - 32 + 343432 / 43243.5454 / 54354 * 345 / (543 - 45 / 43 + 343)")
MsgBox Evaluer("sin(3.14159/4)")
MsgBox Evaluer("now")
MsgBox Evaluer("weekdayname(2, False, vbMonday)")
MsgBox Evaluer("""une longueur : "" & len(""azerty"")")
Unload Me
End Sub

Public Function Evaluer(Exp As String) As String
Dim X As New MSScriptControl.ScriptControl
X.Language = "VBScript"

On Error GoTo E:
  Evaluer = X.Eval(Exp)
  
Exit Function
E:
  Evaluer = "Expression invalide."
End Function

Il ne faut pas oublier de référencer 'Microsoft Script Control 1.0'.

Sinon, va voir ici :
http://vbfrance.com/code.aspx?ID=2869

bye.

signaler à un administrateur
Commentaire de Julien237 le 11/08/2005 20:56:50

Merci pour tout... Mais vous avez pas aussi des coms sur ma source en passant ? lol...

Julien.

signaler à un administrateur
Commentaire de us_30 le 11/08/2005 23:22:19

Salut,

Bien, comme je pense utiliser plus tard un interprètateur de formule, pour l'utiliser avec mes fonctions sur les grands nombres (peut-être le tient), je me suis lancé dans la recherche des sources sur vbfrance... Je ne prétend pas avoir tout vu, et je n'ai rien choisi non plus... j'ai recensé tous ceux que j'ai trouvé, c'est tout... De plus, j'ai pas beaucoup regardé du côté des calculatrices, ni des construteurs de courbes qui parfois possèdent un interprètateur...

Voici donc la liste (échantillon), répondant à ta première question :

http://www.vbfrance.com/code.aspx?ID=558
http://www.vbfrance.com/code.aspx?ID=559
http://www.vbfrance.com/code.aspx?ID=1048
http://www.vbfrance.com/code.aspx?ID=1297
http://www.vbfrance.com/code.aspx?ID=1973
http://www.vbfrance.com/code.aspx?ID=2209
http://www.vbfrance.com/code.aspx?ID=6666
http://www.vbfrance.com/code.aspx?ID=6955
http://www.vbfrance.com/code.aspx?ID=7713
http://www.vbfrance.com/code.aspx?ID=8009
http://www.vbfrance.com/code.aspx?ID=8418
http://www.vbfrance.com/code.aspx?ID=8495
http://www.vbfrance.com/code.aspx?ID=19166
http://www.vbfrance.com/code.aspx?ID=20949
http://www.vbfrance.com/code.aspx?ID=27437 *
http://www.vbfrance.com/code.aspx?ID=28412
http://www.vbfrance.com/code.aspx?ID=28590
http://www.vbfrance.com/code.aspx?ID=30368

(* Celui-ci, est original, à mon sens...)

=

Pour ton code, comme je l'avais déjà dit, il me semble, pour ma part bien construit. Donc pas de pb de structure... Si, maintenant je force un peu dans la critique (en toute amitié), je pense que j'essayerai de rassembler les lignes de code similaire dans une fonction. Par exemple, je vois :

Eval = Val(Left(f, InStr(1, f, "*") - 1)) * Val(Right(f, Len(f) - InStr(1, f, "*")))

avec les autres qui suivent, qui ont comme seul différence, le signe... Faire une fonction semble plus indiqué, pour la clarté...

Ensuite dans cette même partie de code, pourrait-on pas utiliser un Select case, plutôt que If ? En effet, l'expression de test InStr(1, f, "*") pourrait être mise dans une variable unique... par exemple, OPERATION = mid... , puis Select case OPERATION ... etc... C'est plus ou moins, ce que tu as fait à la fin du code...

Ensuite, j'ai pas analysé en détail... mais une chose encore me gêne, c'est de voir (en quelque sorte) 3 parties du code qui traitent les mêmes opérations, avec :

If InStr(1, f, "*") > 0 Then  ... etc...

Select Case Mid(f, i, 1) .... Case "*" ....

Select Case Oper(1).Op ... Case "*" ....

Pourrait-on pas regrouper plus ou moins tout cela ?

Enfin, voilà c'est juste qlq remarques, j'ai pas regardé en détail le fonctionnement, peut-être que cela n'est pas possible...

Amicalement,
Us.

signaler à un administrateur
Commentaire de shivhack le 04/10/2005 02:43:47

slt julien

ton sujet a beaucoup attiré mon attention car je pensais faire la meme chose, mais la complexité de la tache m'a bloqué. J'avais télécharger Mathematica 5.2 et j'ai beaucoup aimé son intérpreteur et il m'a beaucoup inspiré (en fait je te conseille de la télécharger sur réseau P2P comme eMule et Gnutella),par exemple:
-Tu traite les fonctions mathématiques et logiques avec "[" et "]" et tu oblige la première lettre en majuscule .

-Tu traite les intervalle avec <var,from,to>
-Tu utilise un arbre de résolution de formule comme l'as dis Warny (brillante idée, bravo), mais la meilleure façon de le faire est de traiter instantanément chaque bloc trouvé et de vider la mémoire allouée aux valeurs calculés (vider le buffer),mais il faut commencer avec les fonctions puis de s'attarder au variables(fonctions basiques comme +,-,*,/,^,mod,%), exemple:

<x,0,Pi><y,-Pi,Pi>((a^b)*(c*Cos(y)+d*Sin(x)+(78 mod 3))/Log(e,f))
La, tu va traiter comme suit:

1)-Tu déclare une boucle For (par exemple tu peut limiter le nombre par défaut à 8 intervalles) avec deux compteurs: x et y.
2)-dans l'arbre d'intérpretation, tu met tous les noeuds (chaque noeud contient ce qu'il y a dans les parenthèses) sans modification et sans traitement
3)-Puis tu commence par traiter les formules mathèmatiques.
4)-Ensuite les formules logiques.
5)-Et enfin les opérations de base.

Tu peux ajouter beaucoup de structures comme:
#) If. ex: If[expression,true_part,false_part]
#) {} pour les ensembles. ex:{expr1;expr2;expr3}
                              ou {exp1 And exp2 Or exp3}
                             {commande1;commande2}
                             {1,2,4,7,89,100,Pi}

Je te souhaite bonne chance, répond-moi ici pour savoir si tu as reçu mon commentaire.

Enfin, je suis en train un intérpreteur intégrant tou ce que je viends de dire et il sera disponible dès aue possible.

Pour plus d'infos, contactez moi sur: minouche_stingo@hotmail.com
ou: 0021262765427 (Pour les collègues marocains).

Bonn chance à tous. @+

signaler à un administrateur
Commentaire de philheiz le 01/12/2005 09:26:23

allez voir:

http://digilander.libero.it/foxes/mathparser/MathExpressionsParser6.htm

il s'agit d'une classe qui à mon sens est vraiment intéressante.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

utiliser une fonction [ par cire2003 ] Salut, Est-ce que qqn c comment utiliser une fonction, car on ma dit que pour n'écrire qu'une seul fois une formule, exemple: bf10 au lieu de b Fonction! [ par couriousous ] ben c assez simple et en même temp compliqueé je voudrait savoir comment décoder une fonction que tappe un utilisateur dans une zone de text afin de fonction Sub [ par coucou ] J'ai un travail dans lequel je dois calculer le taux de change (je rentre le montant et une devise et je la veux dans une autre devise.Et mon résultat calculer le temps !! aidez moi svp ! [ par tibo830 ] Dans un programe que je devrait pr&#233;senter en examen la semaine prochaine, je dois utiliser un fonction qui calcul le temps s&#233;parant une heur formule mathématique.. [ par peug ] J'ai ne chaine de caract&#232;re comme cela :sFormule = "2+3"J'aimerai avoir le r&#233;sultat.Si je faitval(sFormule) VB me retourne 2 car il analyse Anlyser une fonction mathématique pour ensuite la desiner [ par ggolp ] Bonjour a tous,Je suis actuellement en train de coder un programme qui me déssine une fonction mathématique dans un repère xy (en VB6).J'ai tout d'abo Conversion d'une Chaîne de Charactères en Formule Mathématique [ par Dragho ] Salut, Je suis en train de réalisé un petit projet sur Access et je me retrouve coincé avec quelque chose qui semble simple à réaliser mais je ne conn une fonction pour calculer un chiffre [ par seiya01 ] voila je suis en train de me faire un petit logiciel pour calculer un numero fetiche mais je voudrais savoir s'il existe une fonction pour que le logi Calculer le contenu d'une variable URGENT plz [ par letrucaso ] Bonjour/Bonsoir,Voila mon probleme , mon programe reduit des intervalle pour trouver l'endroit ou la droite d'une fonction passe par les abscisses... Comment fonctionne la fonction FormulaR1C1 [ par razmokets ] Bonjour,Je débute la programmation sous Visual et j'ai besoin d'utiliser une formule pour transférer des données de Visual vers Excel. Quelqu'un peut-


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,749 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.