Evaluation d'une formule dans une chaine ex:"2+9*51-25/5"

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 767 fois - Téléchargée 35 fois

Contenu du snippet

Cette fonction recoit en paramètre une chaine contenant une formule de math simple (4 opérateurs).. du type : "2+9*51-25/5", et renvoie le résultat (ici 456)...
Pour faire ca, j'isole chaque sous-partie (Nombre, Separateur, Nombre), je la calcule, et la ré-insère dans la formule une fois calulée... puis au suivant.. tant qu'il y a un separateur...

Source / Exemple :


Public Function Evaluate(Formule As String) As Double

    Dim PosCour, PosSep, PosAV, PosAP, Av, Ap, Res
    Dim Separateurs(3), NumSep, Formule2
    
    'liste des separateurs
    
    Separateurs(0) = "/"
    Separateurs(1) = "*"
    Separateurs(2) = "+"
    Separateurs(3) = "-"

    For NumSep = 0 To 3
        
        PosSep = InStr(1, Formule, Separateurs(NumSep))
        While PosSep > 0
            'on determine le nombre AVANT le separateur
            PosCour = PosSep - 1
            While (IsNumeric(Mid(Formule, PosCour, 1)))
                PosCour = PosCour - 1
                If PosCour = 0 Then GoTo suite:
            Wend
suite:
            PosAV = PosCour + 1
            Av = Mid(Formule, PosAV, PosSep - PosAV)
            'on determine le nombre APRES le separateur
            PosCour = PosSep + 1
            While IsNumeric(Mid(Formule, PosCour, 1))
                PosCour = PosCour + 1
            Wend
            PosAP = PosCour
            Ap = Mid(Formule, PosSep + 1, PosAP - PosSep - 1)
            
            'On calcule la sous-partie isolée
            Select Case NumSep
                Case 0: '/
                    Res = Val(Av) / Val(Ap)
                Case 1: '*
                    Res = Val(Av) * Val(Ap)
                Case 2:  '+
                    Res = Val(Av) + Val(Ap)
                Case 3:  '-
                    Res = Val(Av) - Val(Ap)
            End Select
            
            'on réécrit la formule avec la sous-partie calculée
            Formule = Left(Formule, PosAV - 1) & Trim(Str(Res)) & Mid(Formule, PosAP)
            PosSep = InStr(1, Formule, Separateurs(NumSep))
        Wend
    Next
    Evaluate = Val(Formule)
End Function

Conclusion :


Bon, le code est pas parfait, loin de là, mais c'est l'algo qui compte non... ;)
N'hésitez pas a m'insulter parceque je gère pas les erreurs, j'utilise un goto, et parce que je gère pas les parenthèses aussi...
m'enfin voilà koi... si vous pouvez le completer, n'hezitez pas...
Merci à DoDoDODo ;p

A voir également

Ajouter un commentaire Commentaires
Messages postés
32
Date d'inscription
lundi 6 novembre 2000
Statut
Membre
Dernière intervention
20 septembre 2006

tu inséère le composant control script
et tu tape result=controlscript1.eval("5+3*2/9-2")
ce contrôle fonctionne très bien et n'a pas besoin d'être réinventé...
Messages postés
921
Date d'inscription
vendredi 20 décembre 2002
Statut
Membre
Dernière intervention
23 septembre 2010

>Tu peux me dire la différence que tu trouves entre les 2?

Non justement il n'y en a pas (x / y = x * (y ^ -1)) mais tu dis qu'il faut une boucle pour les quotients et une autre pour les multiplications...
Messages postés
26
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
30 décembre 2003

>À propos, les quotients etles divisions ont la même priorité, non ?

Tu peux me dire la différence que tu trouves entre les 2?

Allez,un indice: au lieu d'un automate, tu mets une fonction récursive qui s'apelle quand elle trouve des parenthèses à traiter...
Messages postés
24
Date d'inscription
mercredi 5 septembre 2001
Statut
Membre
Dernière intervention
7 août 2003

la méthode optimale est je pense de faire une analyse lexicale avec génération d'automate à état fini déterministe puis le transformer en algo
c ce que fait vb ou tt autre langage de programmation pour lire le code source
mais j'ai pas dit que c simple, loin de là ... ;)
Messages postés
921
Date d'inscription
vendredi 20 décembre 2002
Statut
Membre
Dernière intervention
23 septembre 2010

Le mieux est de convertir la chaîne en RPN (ce que tu disais avec les TI 89/92(II)(+))... Et là c'est encore autrement plus dur.
À propos, les quotients etles divisions ont la même priorité, non ? Alors pourquoi faire quotient PUIS multiplication PUIS addtion (soustraction) ?
Afficher les 9 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.