begin process at 2012 02 12 10:52:44
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths

 > EVALUATION D'UNE FORMULE DANS UNE CHAINE EX:"2+9*51-25/5"

EVALUATION D'UNE FORMULE DANS UNE CHAINE EX:"2+9*51-25/5"


 Information sur la source

Note :
5 / 10 - par 1 personne
5,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths Classé sous :evaluation, formule, mathematique Niveau :Débutant Date de création :26/06/2003 Date de mise à jour :26/06/2003 11:09:52 Vu :4 572

Auteur : psy4meuh

Ecrire un message privé
Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note

 Description

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

  • 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
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


 Sources du même auteur

Source avec Zip Source avec une capture LOGICIEL DE GESTION DE "BOUTS DE CODE"

 Sources de la même categorie

Source avec Zip Source avec une capture CONVERTISSEUR HEXAVIGÉSIMAL par shaeks
Source avec Zip Source avec une capture Source .NET (Dotnet) CRYPTOGRAPHIE AFFINE par Tigrou66
Source avec Zip Source avec une capture SCANNER FLEX par lajouad
Source avec Zip EQUATIONSECONDDEGRÉ,MATH,DEGRÉ par shadkitenge
Source avec Zip Source .NET (Dotnet) SOMME DE CHIFFRES CONTENUE DANS UN NOMBRE par alpha5

 Sources en rapport avec celle ci

FUNCTION ALGEBRIQUES POUR CALCUL SUR IMAGE par ccgousset
Source avec Zip Source .NET (Dotnet) CRYPTOGRAPHIE AMUSANTE par alpha5
Source avec Zip Source .NET (Dotnet) COMPILATEUR EN VB NET 2003 par alpha5
Source avec Zip Source avec une capture RATING-NOTE par NISANDSYSTEMS
Source avec Zip Source avec une capture EVALUATEUR DE FORMULES par JJDai

Commentaires et avis

Commentaire de Saros le 26/06/2003 14:23:15

Pourquoi ne pas mettre puissance ? C'est aussi un opérateur binairee de base...
De plus il traite mal la chaine : 25*2/4 = 0.5 ???
Il y a pas mal de choses à corriger.

Commentaire de orisa le 26/06/2003 15:37:51

Oui pour moi non plus ça ne marche pas. en plus dès qu'il y a des virgules le résultat passe du marant au navrant, mais c'est pas grave, persévère !

Commentaire de EBArtSoft le 26/06/2003 16:54:50 administrateur CS

regarde les sources suivantes :
http://www.vbfrance.com/article.aspx?Val=3728
http://www.vbfrance.com/article.aspx?Val=7310

by@

Commentaire de squalyl le 30/06/2003 18:44:31

Il faut gérer la priorité des opérations dans 3 boucles séparées: une pour les quotients, une pour les produits et une pour les sommes/différences. J'ai fait ca en info cet année, à part que c'était en C, mais l'algo est le même.

En plus cet algo n'a d'intérêt que s'il gère les parenthèses et les sin/cos/tan/exp/log/sqrt/etc..., ce qui est autrement plus difficile. Bon quand l'un est fait, ils sont tous faits.

Et t'as oublié de sortir une erreur dans les cas où:
- tu divises par zéro;
- t'as deux opérateurs qui se suivent.

Finalement si on met un espace dans ta chaine, c'est mort.

Note: la TI89/92+ ne gère pas ca direct.
2+9*51-25/5

devient:
"5 25 / 51 9 * - 2 +"

soit:
[ [ [5 25]/ [51 9]* ]- 2]+
ou []x représente l'opération x appliquée aux deux args précédents.
Les priorités ne posent plus de pb.
Il suffit alors de parser ta formule (parenthèses comprises) pour aboutir à cette forme[chiant] puis de calculer le résultat numérique [facile].

Commentaire de Saros le 30/06/2003 21:25:58

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) ?

Commentaire de revivall le 30/06/2003 22:17:49

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à ... ;)

Commentaire de squalyl le 01/07/2003 00:49:19

>À 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...

Commentaire de Saros le 01/07/2003 13:52:28

>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...

Commentaire de k_wa le 05/04/2005 13:02:32

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é...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Formule Mathematique [ par VBSkinou ] Bonjour tous le monde voila c ma première participation au forum : Dans le Cadre de ma PFE (VoIP) d'ingéniorat en réseaux informatique et télécommun Calcul d'une formule dans une cellule excel [ par mfaure ] Bonjour a tousJ'ai cree une macro qui rempli des cellules, soit avec des donnes chifrees renseignees a partir de userforms, soit avec des formules sim Formule d'une somme en Crystal Report [ par TrafMaxime ] Salut à tous, j'espère que vous êtes inspirés aujourd'hui...Voilà j'ai un petit problème avec Crystal Report..A chaque groupe et suivant certains para tracage d'une courbe mathematique [ par sansri ] salut les amis comme d'hab les problem sont touj les prob; alors je vous pris de m'éxpliqué le travail de tracer une courbe math dans picturbox et si crystal report 8.5 et la formule count [ par carmella ] Bonjour, comment utilise la formule count(champ,champconditionnel, condition) en crystal report 8.5?Merci.cari Nommer et un tableau et l'utiliser dans une formule. [ par SHUN2007 ] Bonjour à tous,Je suis entrain de m'arracher les cheveux sur le problème suivant et j'ai besoin d'aide / d'une macro...Imaginons:Je fais un vlookup da mettre Formule excel en Vba [ par lispo ] Bonjour,je desire mettre une formule excel en Vbaex:Private sub Button_Click()dim  nom as stringma formule excel  = OFFSET(C1;MATCH(G19;C2:C20;0);1))n Ecrire une formule excel depuis vba [ par xavtry ] Salut à tous, un petit truc a deux balle: je crée depuis vba des nouvelle feuille qui prennent le nom de ma variable x, ca ok.Je voudrai que  ma cellu VB & formule EXCEL avec guillemet [ par Xabixu ] Je souhaite avec vb 2005 mettre une formule dans une feuille EXCEL. Hélas la formule compote des " qui je pense doit gêner. La formule EXCEL est =TEXT macro??? [ par utelec02 ] Bonjour,Je voulais savoir comment faire une macro qui ne copie que les valeurs.Car en faite j ai un petit probleme je dois recuperer la valeur d une c


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,560 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales