Calculatrice avec priorité récursive
Publié : jeu. 09/août/2012 15:57
Ce code de calculatrice est certainement encore bogué (bugger ? bugué ?) mais il illustre la récursivité sous purebasic et un algorithme de calculatrice (ainsi que le traitement de la touche [Entrée] dans une fenêtre).
Les fonctions %, Sin, etc. ne sont pas traitées et je ne pense pas le réaliser (je suis sur mon projet domotique) mais quand j'ai retrouvé ce vieux code qui ne marchait pas, je n'ai pas pu m'empêcher d'essayer de trouver une solution (pour ne pas rester sur un échec
)...
Donc avis aux améliorateurs
Les fonctions %, Sin, etc. ne sont pas traitées et je ne pense pas le réaliser (je suis sur mon projet domotique) mais quand j'ai retrouvé ce vieux code qui ne marchait pas, je n'ai pas pu m'empêcher d'essayer de trouver une solution (pour ne pas rester sur un échec

Donc avis aux améliorateurs

Code : Tout sélectionner
; PureBasic Visual Designer v3.93 build 1480 (PB4Code)
;- Window Constants
;
Enumeration
#Window_0
EndEnumeration
;- Gadget Constants
;
Enumeration
#String_0
#String_1
#Listview_0
#Listview_1
#Button_0
EndEnumeration
; My constant
#CLAVIER_RETURN = 15
Procedure Open_Window_0()
If OpenWindow(#Window_0, 223, 6, 153, 41, "Euro'G 2.0 (beta1)", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
StringGadget(#String_0, 0, 0, 125, 20, "")
GadgetToolTip(#String_0, "Champ de saisie initiale")
StringGadget(#String_1, 0, 20, 125, 20, "0",#PB_String_ReadOnly)
GadgetToolTip(#String_1, "Champ de valeur convertie")
ButtonGadget(#Button_0, 130, 0, 20, 20, "?")
EndIf
EndProcedure
Procedure.s ChercheOperation(Texte$)
operation$="+-*x/:%"
If Len(Texte$)
oldposition = Len(Texte$)
For t=1 To Len(operation$)
o$=Mid(operation$,t,1)
position=FindString(Texte$,o$,1)
If position<oldposition And position > 0
oldposition = position
EndIf
Next t
If oldposition < Len(Texte$)
op$ = Mid(Texte$,oldposition,1)
ProcedureReturn op$
EndIf
EndIf
ProcedureReturn ""
EndProcedure
Procedure.d Calc(Texte$)
Protected A$, B$, op$
Protected resultat.d
; 1 - on recherche un symbole d'opération
If Len(Texte$)
op$=ChercheOperation(Texte$)
; S'il y a une opération
If op$>""
; je connais : A - operation - B
;CallDebugger
A$ = StringField(Texte$,1,op$)
B$ = RemoveString(Texte$, A$+op$, #PB_String_CaseSensitive, 1, 1)
Debug Str(level)+": "+texte$+" -> ["+A$+"]"+op$+"["+B$+"]"
If B$ > "" And ChercheOperation(Right(B$,1))=""
Select op$
Case "+"
Resultat = ValF(A$) + Calc(B$)
Case "-"
Resultat = ValF(A$) - Calc(B$)
Case "*", "x"
C$ = StringField(B$,1,ChercheOperation(B$))
B$ = RemoveString(B$, C$+op$, #PB_String_CaseSensitive, 1, 1)
resultat.d = ValD(A$) * ValF(C$)
resultat.d = Calc(StrD(resultat)+b$)
Case "/", ":"
If calc(b$) = 0
resultat.d = 9e+9
Else
C$ = StringField(B$,1,ChercheOperation(B$))
B$ = RemoveString(B$, C$+op$, #PB_String_CaseSensitive, 1, 1)
resultat.d = ValD(A$) / ValD(C$)
resultat.d = Calc(StrD(resultat)+b$)
EndIf
Case "%"
Case "s","S"
Resultat = Sin(Val(A$))
EndSelect
ProcedureReturn Resultat
EndIf
Else
If op$="" And Texte$>""
Debug Texte$+" = Fin de récursivité"
ProcedureReturn ValD(Texte$)
EndIf
EndIf
EndIf
EndProcedure
Open_Window_0()
AddKeyboardShortcut(0, #PB_Shortcut_Return,#CLAVIER_RETURN)
SetActiveGadget(#String_0)
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_Menu
Evnt = EventMenu()
If Evnt = #CLAVIER_RETURN
Valeur.d = Calc(GetGadgetText(#String_0))
EndIf
EndIf
If EventID = #PB_Event_Gadget
Select EventGadget()
Case #String_0
Debug "--------------------------------------"
Valeur.d = Calc(GetGadgetText(#String_0))
;If Int(ValD(GetGadgetText(#String_1))) = ValD(GetGadgetText(#String_1))
; SetGadgetText(#String_1,Str(Valeur))
;Else
v$=RTrim(RTrim(StrD(valeur.d),"0"),".")
SetGadgetText(#String_1,v$)
;EndIf
EndSelect
EndIf
Until EventID = #PB_Event_CloseWindow