
ou bien forcer a ce que les variable soit en 2 lettres minimum !?
mais bon je cause sans savoir j'ai mem pas encore essaye la calculette

Code : Tout sélectionner
Dim operateur$(8)
Dim fonction$(17)
Global nboperateur.b, nbfonction.b,nom_fonc$,nomb_fonc$,calcul$,replace_fonction$,deg.b,nomb_fonc.f,res.f,ope.b,nomb_gauche$,nomb_droite$
nboperateur=8
nbfonction=13
#Pi=3.1415926
deg=1
; tableau des opérateurs
operateur$(1)="^"
operateur$(2)="/"
operateur$(3)="*"
operateur$(4)="<="
operateur$(5)=">="
operateur$(6)="="
operateur$(7)=">"
operateur$(8)="<"
;tableau des fonction
fonction$(1)="cos"
fonction$(2)="sin"
fonction$(3)="tan"
fonction$(4)="sqr"
fonction$(5)="exp"
fonction$(6)="ln"
fonction$(7)="log"
fonction$(8)="abs"
fonction$(9)="atn"
fonction$(10)="int"
fonction$(11)="mod"
fonction$(12)="asin"
fonction$(13)="acos"
Procedure Calcul(nb1$,nb2$,oper$)
nb1.f=ValF(nb1$)
nb2.f=ValF(nb2$)
Select oper$
Case"*"
res=nb1*nb2
ProcedureReturn res
Case"/"
res=nb1/nb2
ProcedureReturn res
EndSelect
EndProcedure
Procedure cherche_operateur(operation$)
Repeat
nomb_gauche$="":nomb_droite$="":nbi$=""
pos_op=FindString(operation$,operateur$(1+ope),1)
If pos_op=0 And ope<nboperateur-1
ope+1
EndIf
If pos_op<>0
For n=pos_op-1 To 1 Step -1;reconstitue le chiffre à gauche de l'opérateur
gauche$=Mid(operation$,n,1)
If Asc(gauche$)>=48 And Asc(gauche$)<=57
nomb_gauche$=nomb_gauche$+gauche$
ElseIf Asc(gauche$)=46
nomb_gauche$=nomb_gauche$+gauche$
Else
Break
EndIf
Next n
If Len(nomb_gauche$)>1
For n=Len(nomb_gauche$) To 1 Step-1
a$=Mid(nomb_gauche$,n,1)
nbi$=nbi$+a$
Next n
nomb_gauche$=nbi$
EndIf
For n=pos_op+1 To Len(operation$);reconstitue le chiffre à droite de l'opérateur
droite$=Mid(operation$,n,1)
If Asc(droite$)>=48 And Asc(droite$)<=57
nomb_droite$=nomb_droite$+droite$
Else
Break
EndIf
Debug nomb_droite$
Next n
If nomb_gauche$<>"" And nomb_droite$<>""
oper_replas$=nomb_gauche$+operateur$(1+ope)+nomb_droite$
Calcul(nomb_gauche$,nomb_droite$,operateur$(1+ope))
operation$=ReplaceString(operation$,oper_replas$,StrF(res),1)
Else
ope+1
EndIf
;Debug operation$
EndIf
Until ope=nboperateur-1
calcul$=operation$
EndProcedure
Procedure extraction_fonction(eval$,posf)
pasl=0:a$="":replace_fonction$="":nom_fonc$="":nomb_fonc$=""
Repeat
a$=Mid(eval$,posf+pasl,1)
If Asc(a$)>=97 And Asc(a$)<=122
nom_fonc$=nom_fonc$+a$
EndIf
If Asc(a$)>=48 And Asc(a$)<=57
nomb_fonc$=nomb_fonc$+a$
EndIf
If Asc(a$)=46
nomb_fonc$=nomb_fonc$+a$
EndIf
pasl+1
replace_fonction$=replace_fonction$+a$
Until a$=")"
nomb_fonc=ValF(nomb_fonc$)
Debug nomb_fonc
EndProcedure
Procedure.f deg_rad(valeur.f)
nomb_fonc=(valeur*#Pi)/180
ProcedureReturn nomb_fonc
EndProcedure
Procedure recherche_fonction()
Repeat
posfonc=FindString(calcul$,fonction$(1+nfonc.b),1)
If posfonc=0 And nfonc<nbfonction-1
nfonc+1
EndIf
If posfonc<>0
extraction_fonction(calcul$,posfonc)
Select fonction$(1+nfonc)
Case "sin"
If deg=1
nomb_fonc=deg_rad(nomb_fonc)
EndIf
nomb_fonc=Sin(nomb_fonc)
replas$=StrF(nomb_fonc)
calcul$=ReplaceString(calcul$,replace_fonction$,replas$,1)
Debug calcul$
Case "cos"
If deg=1
nomb_fonc=deg_rad(nomb_fonc)
EndIf
nomb_fonc=Cos(nomb_fonc)
replas$=StrF(nomb_fonc)
calcul$=ReplaceString(calcul$,replace_fonction$,replas$,1)
Case "tan"
If deg=1
nomb_fonc=deg_rad(nomb_fonc)
EndIf
nomb_fonc=Tan(nomb_fonc)
replas$=StrF(nomb_fonc)
calcul$=ReplaceString(calcul$,replace_fonction$,replas$,1)
Case "atn"
If deg=1
nomb_fonc=deg_rad(nomb_fonc)
EndIf
nomb_fonc=ATan(nomb_fonc)
replas$=StrF(nomb_fonc)
calcul$=ReplaceString(calcul$,replace_fonction$,replas$,1)
Case "asin"
If deg=1
nomb_fonc=deg_rad(nomb_fonc)
EndIf
nomb_fonc=ASin(nomb_fonc)
replas$=StrF(nomb_fonc)
calcul$=ReplaceString(calcul$,replace_fonction$,replas$,1)
Case "acos"
If deg=1
nomb_fonc=deg_rad(nomb_fonc)
EndIf
nomb_fonc=ACos(nomb_fonc)
replas$=StrF(nomb_fonc)
calcul$=ReplaceString(calcul$,replace_fonction$,replas$,1)
Case "int"
nomb_fonc.f=ValF(nomb_fonc$)
nomb_fonc=Int(nomb_fonc)
replas$=StrF(nomb_fonc)
calcul$=ReplaceString(calcul$,replace_fonction$,replas$,1)
Case "sqr"
nomb_fonc.f=ValF(nomb_fonc$)
nomb_fonc=Sqr(nomb_fonc)
replas$=StrF(nomb_fonc)
calcul$=ReplaceString(calcul$,replace_fonction$,replas$,1)
EndSelect
EndIf
Until nfonc=nbfonction-1
EndProcedure
Procedure verifie_Parenthese(soper$)
For nboucle=1 To Len(soper$)
If Mid(soper$,nboucle,1)="("
nopen+1
ElseIf Mid(soper$,nboucle,1)=")"
nclose+1
EndIf
Next nboucle
If nclose=nopen
ProcedureReturn
ElseIf nopen<>nclose
MessageRequester("Alerte","Attention vous avez une erreur dans les parenthèses",#PB_MessageRequester_Ok)
EndIf
EndProcedure
Procedure filtrer_signes(eval$)
termine.b=#False
Repeat
If FindString(eval$,"++",1)
eval$=ReplaceString(eval$,"++","+",1)
ElseIf FindString(eval$,"--",1)
eval$=ReplaceString(eval$,"--","+",1)
ElseIf FindString(eval$,"+-",1)
eval$=ReplaceString(eval$,"+-","-",1)
ElseIf FindString(eval$,"-+",1)
eval$=ReplaceString(eval$,"-+","-",1)
ElseIf FindString(eval$,"()",1)
MessageRequester("Alerte","Erreur parenthèses !",#PB_MessageRequester_Ok)
eval$="1"
Else
termine=#True
EndIf
Until termine
EndProcedure
calcul$="12*45-(sin(45)+int(10/3))/sqr(4)"; chaine à calculer
verifie_Parenthese(calcul$)
filtrer_signes(calcul$)
cherche_operateur(calcul$)
recherche_fonction()
Debug calcul$