Les Snippets

Connexion

Calculer une expression simple

Niveau requis pour utiliser/comprendre cette source : 1 ( Débutant )
Créé le 25/03/2006 23:43:08 et initié par EBArtSoft [Liste]
Date de mise à jour : 05/11/2008 17:51:29
Vue : 10548
Catégorie(s) : Maths, Trucs & Astuces, Algorithme, Chaîne de caractères
Langages dispo pour ce code :
- VB6, VBA
- Javascript
- Windev
- VBA
- VB6



Langage : VB6 , VBA
Date ajout : 25/03/2006
Posté par EBArtSoft [Liste]

Private Function CalcEx(ByVal Text As String)
    '------------------------
    'Buffer de charactere
    Dim Char As String * 1
    'Mot temporaire
    Dim Word As String
    'Operateur en cours
    Dim Oprd As String
    '------------------------
    'Tableau d'operateurs indentés
    Dim Opr() As String
    'Tableau de valeurs indentées
    Dim Res() As Double
    'Valeur en cours
    Dim Value As Double
    '------------------------
    'Compteur d'indentation
    Dim j As Long
    'Variable de boucle
    Dim i As Long
    
    ReDim Res(0)
    ReDim Opr(0)
    
    Text = Text & " "
    For i = 1 To Len(Text)
        'Recuperation du charactere
        Char = Mid(Text, i, 1)
        'Selection en fonction de la valeur du charactere
        Select Case Char
        'Si c'est un chiffre ajoute dans le buffer
        Case "0" To "9": Word = Word & Char
        'Si c'est un point fait de meme /!\ regional settings /!\
        Case ".": Word = Word & Char
        'Si c'est un espace calcule l'expression
        Case " ": GoSub Calc
        'Si c'est une operation calcule et conserve l'operation en memoire
        Case "+": GoSub Calc: Oprd = Char
        Case "-": GoSub Calc: Oprd = Char
        Case "*": GoSub Calc: Oprd = Char
        Case "/": GoSub Calc: Oprd = Char
        Case "^": GoSub Calc: Oprd = Char
        Case "\": GoSub Calc: Oprd = Char
        'Si c'est une debut paranthese indente la valeur
        Case "(":
            'Redimentionne le tableau
            ReDim Preserve Res(j)
            ReDim Preserve Opr(j)
            'Sauve la valeur et l'operande
            Res(j) = Value
            Opr(j) = Oprd
            'Increment
            j = j + 1
            'Initialize les variables temporaires
            Value = 0
            Word = ""
            Oprd = ""
            
        'Si c'est une fin de paranthere decremente la hierarchie
        Case ")"
            'Si on n'est en indentation "positive"
            If j Then
                'Calcule l'expression
                GoSub Calc
                'Decremente
                j = j - 1
                'Si on dispose d'un operateur
                If Opr(j) = "" Then
                    'NOP
                Else
                    'Calcule
                    Select Case Opr(j)
                    Case "+": Value = Res(j) + Value
                    Case "-": Value = Res(j) - Value
                    Case "*": Value = Res(j) * Value
                    Case "/": Value = Res(j) / Value
                    Case "\": Value = Res(j) \ Value
                    Case "^": Value = Res(j) ^ Value
                    '-----------------------------------
                    'Extra fonction
                    Case "MOD": Value = Res(j) Mod Value
                    Case "AND": Value = Res(j) And Value
                    Case "XOR": Value = Res(j) Xor Value
                    Case "OR": Value = Res(j) Or Value
                    '-----------------------------------
                    End Select
                End If
            Else
                'NOP
            End If
        
        'Sinon recupere la valeur pour analyse ulterieure
        Case Else: Word = Word & Char
        End Select
    Next
    
    'That it ! Renvoi le resultat ! (En double precision)
    CalcEx = Value

Exit Function

Calc:
    'Si on dispose d'un operateur
    If Oprd = "" Then
        'Si le mot est un chiffre
        If IsNumeric(Word) Then
            'La valeur egale le mot
            Value = CDbl(Word)
        Else
            'L'operateur egale le mot
            If Len(Word) Then Oprd = UCase(Word)
        End If
        'Initialise le mot (buffer d'expression)
        Word = ""
    Else
        'Si le mot est numerique
        If IsNumeric(Word) Then
            'Calcule
            Select Case Oprd
            Case "+": Value = Value + CDbl(Word)
            Case "-": Value = Value - CDbl(Word)
            Case "*": Value = Value * CDbl(Word)
            Case "/": Value = Value / CDbl(Word)
            Case "\": Value = Value \ CDbl(Word)
            Case "^": Value = Value ^ CDbl(Word)
            '---------------------------------------
            'Extra fonction
            Case "MOD": Value = Value Mod CDbl(Word)
            Case "AND": Value = Value And CDbl(Word)
            Case "XOR": Value = Value Xor CDbl(Word)
            Case "OR": Value = Value Or CDbl(Word)
            '---------------------------------------
            End Select
            'Initialise l'operateur
            Oprd = ""
        Else
            'L'operateur prend la valeur du mot
            If Len(Word) Then Oprd = UCase(Word)
        End If
        'Initialise le mot
        Word = ""
    End If
Return

End Function
' ==== Utilisation :
' CalcEx("1 + 2 - 3")

Langage : Javascript
Date ajout : 09/05/2006
Posté par Arglanir [Liste]
//on utilise directement une fonction existante
var resultat = eval("1 + 2 - 3");
Langage : Windev
Date ajout : 17/08/2006
Posté par fabienlaps [Liste]
// Variable global
sResultat est un rel

// Procédure de calcul de l'expression
PROCEDURE Calcul(pExp est une chane)
sSource est une chaine = [
sRes est un reel = %1
sResultat = sRes
]
sSource = ChaineConstruit(sSource,pExp)
Compile("Calc", sSource)
ExécuteTraitement("Calc",trtProcédure)
RENVOYER sResultat
// Test de la procédure
Trace(Calcul("((20+10)*2)+3"))  // renvoie 63

Langage : VBA
Date ajout : 09/09/2006
Posté par us_30 [Liste]

Function CalcEx(ByVal Text As String)
'Emploi de la fonction existante (toutes expressions math valides)
CalcEx = Evaluate(Text)
End Function

Sub test()
MsgBox CalcEx("1 + 2 - 3")
End Sub


Langage : VB6
Date ajout : 05/11/2008
Posté par jrivet [Liste]
DateMAJ : 05/11/2008
Public Function CalcEx(ByVal Txt As String)
'Constante qui représente la fonction de calcul
Const CODE As String = "Function Calcul(Fin): Fin=%1:End Function"
Dim SCalcul As Object
Dim ValDef
    Set SCalcul = CreateObject("MSScriptControl.ScriptControl.1")
    With SCalcul
        'Language utilise
        .Language = "VBScript"
        'Ajout du code
        Call .AddCode(Replace(CODE, "%1", Txt))
        'Execution du code ajouter (fonction Calcul)
        Call .Run("Calcul", ValDef)
        'Retourne la valeur
        CalcEx = CInt(ValDef)
    End With
    'Destruction de l'objet
    Set SCalcul = Nothing
End Function
Remarque :
Version VB6 utilisant le 'Microsoft Script Control 1.0'



Codes sources en rapport avec : Calcule, Expression, Interpreteur

{C / C++ / C++.NET} INTERPRETEUR BRAINFUCK
c'est ma troisieme source du genre. un interpreteur brainfuck, j'ai tente de le rendre "aux norme...

{PHP} INTERPRETEUR BRAINFUCK
sur cette source, je vous presente trois interpreteurs brainfuck. le premier sans preprocessing ...

{SQL} INTERPRETEUR BRAINFUCK
certains m'ont dit que le mysql n'etait pas un langage de programmation, mais seulement un langage d...

{PHP} MODULES DE TEST D'EXPRESSIONS RÉGULIÈRES À INTÉGRER DANS UNE PAGE [W3C]
Ce module à intégrer dans une page PHP permet de tester la validité d'une expression régulière grâce...

{JAVA / J2EE} JEXCEL (EN UTILISANT LES TECHNIQUES DE LA COMPILATION)
c'est un évaluateur d'expressions math,stat,logique... en utilisant la technique de compilation LL1...

{PHP} PHOENIX INTERPRETOR
voila c'est un petit interpreteur de langage phoenix, il est tres simple et open-source. son but...

{Delphi} ÉVALUATION EXPRESSIONS MATHÉMATIQUES
comme le dit le titre, ça évalue une expression mathématique en basculant l'expression parenthésée e...

{C / C++ / C++.NET} GENERATION DE L'EXPRESSION REGULIERE (REGEXP) POUR MANGER JUSQU'A UNE CHAINE
Bon je sais pas vous mais moi ça me gonfle de devoir écrire l'expression reguliere qui signifie : "m...

{C / C++ / C++.NET} INTERPRETEUR D'UN LANGAGE PROCHE DU RPN
Salut cette source presente un langage proche du rpn, c'est a dire que pour toute memoire, on a u...

{C / C++ / C++.NET} CALCUL : ANALYSE D'EXPRESSIONS ALGÉBRIQUES GRÂCE À LA RÉCURSIVITÉ (UTILISATION DES TEMPLATE ÉGALEMENT).
Voici un petit analyseur d'expressions algébriques. Il gère les opérateurs +-*/, la priorité, et les...