Alternative très intéressante à val()

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 105 fois - Téléchargée 63 fois

Contenu du snippet

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!!

A voir également

Ajouter un commentaire

Commentaires

ce n'est pas si complexe en débrouissaillant bien ce source (à condition d'etre plutot matheux ;-) bien sur)
...en tout cas, c'est assez intéressant!
Rassure toi, je l'ai vue, en premier même!
J'avoue qu'elle est pas mal compliquée (du moins a première vue, je n'ai pas encore essayé de l'étudier;)
au fait, en parlant de fonction récursive, je ne parlais pas du calcul de factorielle !! :) mais du "PETIT EXEMPLE DE RECURSIVITE" dans la rubrique API (celle ci est déja plus intéressante!)
Pour avoir un exemple d'utilisation de cette fonction chercher ma Traceur dans la rubrique `Maths`
Je m'en vais de ce pas voir tes "exemples de récursivité" ; c'est un domaine que j'affectionne tout particulièrement! <|:0)
Afficher les 6 commentaires

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.