evaluateur d'expression calcul simple
Publié : jeu. 16/févr./2017 0:43
pour le fun , je me suis mis a essayer un evaluateur d'expression mathematique simple
c'est a dire que l'expression ne dois pas avoir de parenthese (pour le moment)
et je me contente des 4 opérations ....
voici le code :
j'utilise une ruse de sioux pour mettre a jour l'expression au fur et a mesure des calcul
(Tracez le code pour vous amuser a comprendre l'astuce )
c'est chaud quand meme a faire, au dernier moment j'ai été confronté aux priorité de calcul
je me suis servi de l'exemple donné sur ce site pour tester
http://www.lelivrescolaire.fr/#!manuel/ ... rite/lecon
ce code devrai pouvoir s'en sortir sur des calculs simple genre
5*8/2+8 =28
j'essaierai d'ajouter les parentheses plus tard... mais il faut que j'y reflechisse d'abords
c'est a dire que l'expression ne dois pas avoir de parenthese (pour le moment)
et je me contente des 4 opérations ....
voici le code :
j'utilise une ruse de sioux pour mettre a jour l'expression au fur et a mesure des calcul
(Tracez le code pour vous amuser a comprendre l'astuce )

c'est chaud quand meme a faire, au dernier moment j'ai été confronté aux priorité de calcul
je me suis servi de l'exemple donné sur ce site pour tester
http://www.lelivrescolaire.fr/#!manuel/ ... rite/lecon
ce code devrai pouvoir s'en sortir sur des calculs simple genre
5*8/2+8 =28
j'essaierai d'ajouter les parentheses plus tard... mais il faut que j'y reflechisse d'abords

Code : Tout sélectionner
;***********************************************
;Titre :*evaluateur_expression
;Auteur : Zorro
;Date :16/02/2017
;Heure :00:35:06
;Version Purebasic : PureBasic 5.50 (Windows - x86)
;Version de l'editeur :EPB V2.64
; Libairies necessaire : Aucune
;***********************************************
Enumeration
#file
EndEnumeration
Declare.f recherche_arriere(pos)
Declare.f recherche_avant(pos)
Global expression.s="20-2*3+12/6" ; ok pour ce type de calcul
For i=1 To len(expression.s)
extrait.s=mid(expression.s,i,1)
Pos=i
Select extrait.s
Case "*"
gauche.f=recherche_arriere(pos)
droite.f=recherche_avant(pos)
sortie.f=gauche.f*droite.f
expression.s=replacestring(expression.s,"z*z",strf(sortie.f))
expression.s=removestring(expression.s,"z")
EndSelect
Next i
For i=1 To len(expression.s)
extrait.s=mid(expression.s,i,1)
Pos=i
Select extrait.s
Case "/"
gauche.f=recherche_arriere(pos)
droite.f=recherche_avant(pos)
sortie.f=gauche.f/droite.f
expression.s=replacestring(expression.s,"z/z",strf(sortie.f))
expression.s=removestring(expression.s,"z")
EndSelect
Next i
For i=1 To len(expression.s)
extrait.s=mid(expression.s,i,1)
Pos=i
Select extrait.s
Case "-"
gauche.f=recherche_arriere(pos)
droite.f=recherche_avant(pos)
sortie.f=gauche.f-droite.f
expression.s=replacestring(expression.s,"z-z",strf(sortie.f))
expression.s=removestring(expression.s,"z")
EndSelect
Next i
For i=1 To len(expression.s)
extrait.s=mid(expression.s,i,1)
Pos=i
Select extrait.s
Case "+"
gauche.f=recherche_arriere(pos)
droite.f=recherche_avant(pos)
sortie.f=gauche.f+droite.f
expression.s=replacestring(expression.s,"z+z",strf(sortie.f))
expression.s=removestring(expression.s,"z")
EndSelect
Next i
Debug "le resultat est :"+strf(sortie.f)
Procedure.f recherche_arriere(pos)
;By Dobro
For i=pos-1 To 1 Step-1
Extrait.s=mid(expression.s,i,1)
If asc(Extrait.s)=46 Or (asc(Extrait.s)>=48 And asc(Extrait.s)<=57 ) ; c'est un chiffre
; if asc(Extrait.s)=46
; pos=pos-1
; Endif
mot.s=mot.s+Extrait.s ; on recupere
expression.s=replacestring(expression.s,Extrait.s,"z",#PB_String_NoCase,i,1)
Else ; c'est pas un chiffre , on arrete
mot.s=ReverseString(mot.s)
ProcedureReturn valf(mot.s)
Endif
Next i
mot.s=ReverseString(mot.s)
ProcedureReturn valf(mot.s)
EndProcedure
Procedure.f recherche_avant(pos)
;By Dobro
For i=pos+1 to len(expression.s)
Extrait.s=mid(expression.s,i,1)
if asc(Extrait.s)=46 or (asc(Extrait.s)>=48 and asc(Extrait.s)<=57) ; c'est un chiffre
; if asc(Extrait.s)=46
; pos=pos+1
; Endif
mot.s=mot.s+Extrait.s ; on recupere
expression.s=replacestring(expression.s,Extrait.s,"z",#PB_String_NoCase,i,1)
Else ; c'est pas un chiffre , on arrete
ProcedureReturn valf(mot.s)
Endif
Next i
ProcedureReturn valf(mot.s)
EndProcedure