Il s'agit d'une fonction qui analyse une chaine de caractères et renvoi la valeur numérique de cette chaîne en traitant les fonctions usuelles (cos,sin,exp..) et permet d'introduire une variable (à l'origine X mais peut être changée facilement) que la fonction remplace par sa valeur.
Source / Exemple :
Const Liste_Fonctions As String = "cos sin tan sqr log abs int atn exp sgn fct"
Const Signe As String = "+-*/^"
'ATTENTION!!! CETTE FONCTION EST RéCURSIVE
'Renvoit la valeur d'une chaine de caractères comprenant des fonctions et au plus une inconue notée x
'V(optionelle)=variable, ici c'est x.dès que la fonction tombe sur X, elle la remplace par la valeur de V
'N(optionelle)=caractère où la fonction doit s'arrêter d'analyser. Ne JAMAIS utiliser ce paramêtre amoins d'être sur de ce que l'on fait
Function Analyse(Chaine As String, Optional V As Single, Optional n As Integer) As Single
Dim Lng As Integer, N1 As Integer, C1 As String, Ch As String, Ch1 As String, Fn As Integer
Erreur = 0
On Error GoTo ERRR
Lng = Len(Chaine)
For X = 1 To Lng
C1 = Mid(Chaine, X, 1)
If X >= n And n <> 0 Then Exit Function
If C1 = "(" Then
Ch1 = Right(Chaine, Lng - X)
N1 = Paranthèses(Ch1)
Analyse = Analyse(Ch1, V, N1)
ElseIf C1 < "0" Or C1 > "9" And C1 <> "," Then
If InStr(Signe, C1) <= 0 Then
If C1 <> "x" Then 'Changer "x" par la variable désirée
'Sous-Chaîne=Fonction (cf Const=Liste_Fonctions)
Ch = Mid(Chaine, X, 3)
Fn = InStr(Liste_Fonctions, Ch)
If Fn = 0 And C1 = ")" Then GoTo SUIVANT
X = X + 3
Ch1 = Right(Chaine, Lng - X)
N1 = Paranthèses(Ch1)
Select Case Fn
Case 1
Analyse = Cos(Analyse(Right(Chaine, Lng - X), V, N1))
Case 5
Analyse = Sin(Analyse(Right(Chaine, Lng - X), V, N1))
Case 9
Analyse = Tan(Analyse(Right(Chaine, Lng - X), V, N1))
Case 13
Analyse = Sqr(Analyse(Right(Chaine, Lng - X), V, N1))
Case 17
Analyse = Log(Analyse(Right(Chaine, Lng - X), V, N1))
Case 21
Analyse = Abs(Analyse(Right(Chaine, Lng - X), V, N1))
Case 25
Analyse = Int(Analyse(Right(Chaine, Lng - X), V, N1))
Case 29
Analyse = Atn(Analyse(Right(Chaine, Lng - X), V, N1))
Case 33
Analyse = Exp(Analyse(Right(Chaine, Lng - X), V, N1))
Case 37
Analyse = Sgn(Analyse(Right(Chaine, Lng - X), V, N1))
Case 41
Analyse = Factorielle(Analyse(Right(Chaine, Lng - X), V, N1))
End Select
X = X + N1
Else ' Sous-Chaîne="X"
Analyse = V
End If
Else 'Sous-Chaine=Signe (Cf Const=Signes)
Fn = InStr(Signe, C1)
Ch1 = Right(Chaine, Lng - X)
If Mid(Ch1, 1, 1) = "(" Then N1 = Paranthèses(Right(Chaine, Lng - X - 1)): X = X + 1 Else N1 = Paranthèses(Ch1)
Select Case Fn
Case 1
Analyse = Analyse + Analyse(Right(Chaine, Lng - X), V, N1)
Case 2
Analyse = Analyse - Analyse(Right(Chaine, Lng - X), V, N1)
Case 3
Analyse = Analyse * Analyse(Right(Chaine, Lng - X), V, N1)
Case 4
Analyse = Analyse / Analyse(Right(Chaine, Lng - X), V, N1)
Case 5
Analyse = Analyse ^ Analyse(Right(Chaine, Lng - X), V, N1)
End Select
X = X + N1
End If
Else 'Sous-Chaine=Chiffre
y = 1
While Est_Chif(Mid(Chaine, X + y, 1))
y = y + 1
Wend
Analyse = Val(Mid(Chaine, X, y))
X = X + y - 1
End If
SUIVANT:
Next
Exit Function
ERRR:
'Au cas où il y aurait un problème supprimer la ligne ON ERROR GOTO
End Function
'Factorielle n'existe pas (que je sache) en VB, alors:
Function Factorielle(X As Double) As Double
Dim a As Double
On Error GoTo fin
Factorielle = 1
a = 1
While a <= X
Factorielle = Factorielle * a
a = a + 1
Wend
fin:
End Function
Function Est_Chif(C As String) As Boolean
If (C >= "0" And C <= "9") Or C = "." Then Est_Chif = True Else Est_Chif = False
End Function
'Renvoi la position de la paranthèse fermante de même niveau
Function Paranthèses(C As String)
Dim N As Integer, Ch As String
N = 1
For X = 1 To Len(C)
Ch = Mid(C, X, 1)
If Ch = ")" Then N = N - 1
If Ch = "(" Then N = N + 1
If N = 0 Then Paranthèses = X: Exit Function
Next
Paranthèses = X
End Function
Conclusion :
ATTENTION!!! Elle est associative à droite il est donc important de mettre des paranthèses pour lui indiquer la priorité du calcul.
Pour ajouter d'autres fonctions il suffit de rajouter un Case dans la partie adéquate et rajouter dans la déclaration de la constante Liste_Fonctions la syntaxe à utiliser.
(le pas du Case est 4, par conséquent la prochaine fonction sera 'Case 41')
les fonctions doivent avoir 3 caractères de long!!
Les fonctions 'Est_Chif' et 'Paranthèses' sont indispensable!!
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.