Code : Tout sélectionner
;; ce programme affiche le resultat d'une expression arithmétique contenant des additions et des soustractions
;; extrait du livre :Algorithme en C++ - Collection Sybex - Pearson Education - ISBN : 2-7440-7173-0
;; convertit par Patrick88 le 29 / 08 / 07 pour le forum purebasic français
Enumeration
#FEN
#G_TXT_EXPRESSION
#G_STR_EXPRESSION
#G_BUT_CALCUL
#G_TXT_RESULTAT
#G_STR_RESULTAT
EndEnumeration
Procedure.s calcul(chaine_a_calculer.s)
nb.l = 0
indice.w=0
chiffre.b = 0
somme.l = 0
signe.s = "+"
caract.s = ""
For indice = 1 To Len(chaine_a_calculer) ;; on parcours la chaine du premier au dernier caractère
caract = Mid(chaine_a_calculer,indice,1) ;; pour chaque position dans la chaine
;; on extrait le caractère correspondant
Select Asc(caract ) ;; suivant le caractere faire
Case 43,45 ; "+" "-" ;; somme ou soustraction selon le signe précedent
;; il faut additionner le nombre qui vient d'être lu à la somme actuelle
;; pour produire la nouvelle somme
If signe= "+"
somme = somme + nb
Else
somme = somme - nb
EndIf
nb=0 ;; on remet nb à 0
signe = caract ;; on mémorise le signe actuel = correspond à la prochaine
;; opération à effectuer, quand le nombre suivant sera lu
Case 48 To 57 ; "0" To "9" ;; on recupère la valeur numérique
chiffre = Asc(caract) -48
;; il faut retrouver la valeur numérique correspondant au caractère et l'ajouter au nombre
;; cet ajout ressemble à une "concaténation" numérique , afin que ce chiffre soit ajouté en
;; tant qu'unité au nombre précédent, lequel doit être considéré comme une dizaine
nb = (nb*10)+chiffre ;; on calcul le nouveau nombre
EndSelect
Next
;; quand on somme la dernière somme n'est pas faite
If signe= "+"
somme = somme + nb
Else
somme = somme - nb
EndIf
ProcedureReturn Str(somme)
EndProcedure
Procedure Main()
quit.b = 0
event.l = 0
If OpenWindow(#FEN,0,0,300,65,"Calculette simple",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(#FEN))
TextGadget(#G_TXT_EXPRESSION,5,5,175,20,"Entrez une expression arithmétique :")
StringGadget(#G_STR_EXPRESSION,GadgetX(#G_TXT_EXPRESSION)+GadgetWidth(#G_TXT_EXPRESSION)+5,5,115,16,"123-76+14")
ButtonGadget(#G_BUT_CALCUL,10,30,100,20,"Calculer...")
TextGadget(#G_TXT_RESULTAT,GadgetX(#G_BUT_CALCUL)+GadgetWidth(#G_BUT_CALCUL)+10,35,45,20,"Resultat :")
StringGadget(#G_STR_RESULTAT,GadgetX(#G_TXT_RESULTAT)+GadgetWidth(#G_TXT_RESULTAT)+5,35,115,16,"")
EndIf
Repeat
event = WaitWindowEvent()
Select event
Case #PB_Event_CloseWindow
quit = 1
Case #PB_Event_Gadget
If EventGadget() = #G_BUT_CALCUL
SetGadgetText(#G_STR_RESULTAT,calcul(GetGadgetText(#G_STR_EXPRESSION)))
EndIf
EndSelect
Until quit > 0
EndIf
EndProcedure
Main()
End