Page 1 sur 1
[Func] Calcul
Posté : mar. 21 févr. 2012 20:52
par TT22
Bonjour,
Je vous poste aujourd'hui une petite fonction que j'ai créée pour mes propres besoins, et elle pourra peut-être servir à d'autre
Elle sert à faire un calcul à partir d'une chaine de caractère.
Par exemple, si on lui donne "
5 x 4 + 3 : 2", elle retourne "
21.5".
Elle fonctionne avec les signes : + (addition), - (soustration), : ou / (division) et x ou * (multiplication).
Mais elle ne prend pas en compte les parenthèses
Voici la fonction :
► Afficher le texte
Code : Tout sélectionner
$In = InputBox("","")
MsgBox(64,"Info",_Calcul($In))
Func _Calcul($In)
;Traitement de la chaine...
$In = StringReplace($In," ","")
$In = StringReplace($In,",",".")
$In = StringReplace($In,"x","*")
$In = StringReplace($In,":","/")
$In = StringReplace($In,"\","/")
While 1
If Not StringInStr($In,"*") And Not StringInStr($In,"/") And Not StringInStr($In,"+") Then
If Not StringInStr($In,"-") Then
ExitLoop
ElseIf StringLeft($In,1) = "-" Then
ExitLoop
EndIf
EndIf
$Split = StringSplit($In,"")
Dim $Return[16384]
$n = 0
For $i = 1 To StringLen($In) Step 1
If $Split[$i] = "*" Or $Split[$i] = "/" Or $Split[$i] = "-" Or $Split[$i] = "+" Then
$n += 1
$Return[$n] = $Split[$i]
$n += 1
Else
$Return[$n] &= $Split[$i]
EndIf
Next
For $i = 0 To 16383 Step 1
If $Return[$i] = "" Then ExitLoop
If $Return[$i] = "*" Then
$In = StringReplace($In,$Return[$i-1]&"*"&$Return[$i+1],$Return[$i-1]*$Return[$i+1])
$Return[$i+1] = $Return[$i-1]*$Return[$i+1]
EndIf
If $Return[$i] = "/" Then
$In = StringReplace($In,$Return[$i-1]&"/"&$Return[$i+1],$Return[$i-1]/$Return[$i+1])
$Return[$i+1] = $Return[$i-1]/$Return[$i+1]
EndIf
Next
For $i = 0 To 16383 Step 1
If $Return[$i] = "" Then ExitLoop
If $Return[$i] = "+" Then
$In = StringReplace($In,$Return[$i-1]&"+"&$Return[$i+1],$Return[$i-1]+$Return[$i+1])
$Return[$i+1] = $Return[$i-1]+$Return[$i+1]
EndIf
If $Return[$i] = "-" Then
$In = StringReplace($In,$Return[$i-1]&"-"&$Return[$i+1],$Return[$i-1]-$Return[$i+1])
$Return[$i+1] = $Return[$i-1]-$Return[$i+1]
EndIf
Next
WEnd
Return Number($In)
EndFunc
Voilà, je ne sais pas si ça vous sera utile, mais bon, on ne sais jamais

Re: [Func] Calcul
Posté : mar. 21 févr. 2012 21:20
par matwachich
Execute
Re: [Func] Calcul
Posté : mar. 21 févr. 2012 21:22
par TT22

Je connaissais pas ça.
Et quand j'ai cherché, je l'ai pas trouvé...
Re: [Func] Calcul
Posté : mar. 21 févr. 2012 23:12
par Iste
Haha, ou comment pourrir un long travail en un seul mot ^^
(et non, je viens pas pour raconter des trucs sur les réinventages de roue, d'autant qu'en ce moment c'est plutôt bien de voir comment parser du code)
avantage quand même pour la fonction de TT22 qui est plus safe. Execute() est beaucoup trop puissant pour faire cela, et peut poser des problèmes dans certain cas
Code : Tout sélectionner
$In = InputBox("","",'bug()')
MsgBox(64,"Info",Execute($In))
Func bug()
MsgBox('','','bug')
Exit
EndFunc
Re: [Func] Calcul
Posté : mer. 22 févr. 2012 01:40
par matwachich
Intéressant le bout de code!!!
Alors, on ne peut pas imbriquer un MsgBox dans un autre...
Re: [Func] Calcul
Posté : mer. 22 févr. 2012 10:21
par Iste
Si on peut, mais exécute est très puissant, et la j'ai fais appel a une fonction qui termine le code. Donc effectivement, notre 1ere MsgBox ne verra jamais son appel aboutir :'(
Par contre, ce qui est intéressant c'est de voir que Execute() s'en fout des bugs (faut forcer le lancement) :
Code : Tout sélectionner
Execute('bug()')
MsgBox(0,'', 'ca passe')
bug()
MsgBox(0,'', 'ca passe')
Func bug()
MsgBox(0,'', 'ici')
$a = $b
MsgBox(0,'', 'la')
EndFunc
Fonction vraiment tres puissante, qui ne doit selon moi pas etre utilisée pour faire de simple calcul ^^
Re: [Func] Calcul
Posté : mer. 22 févr. 2012 12:16
par TT22
C'est vrai que c'est intéressant...
Ça pourrait même régler des problèmes de variables qui n'existent pas

Re: [Func] Calcul
Posté : mer. 22 févr. 2012 12:24
par Iste
Naaaan ! On règle pas des problèmes en les ignorant

Re: [Func] Calcul
Posté : mer. 22 févr. 2012 20:56
par TommyDDR
+1 avec Iste, si vous avez besoin d'une variable qui n'existe pas... c'est qu'il y a un problème quelque part.