Accueil > Forum > > > > [VB.Net 2003] Expression littérales
[VB.Net 2003] Expression littérales
mardi 19 septembre 2006 à 17:28:37 |
[VB.Net 2003] Expression littérales

MoiDebutantVB
|
Bonjour, Est il possible de, sans dévelloper un moteur d'analyse complet, d'interpréter une expression littérale en VB.Net ? Par exemple, l'utilisateur tape 2x^2+3x+5 et entre x=5 dans une autre case et le programme calcule 2x^2+3x+5 en utilisant la valeur de x (5) entrée. Sinon, Savez vous si des codes similaires existent ? Et finalement, si non, pourriez vous me donner des pistes pour écrire moi-même un analyseur ? Merci beacoup en tout cas, CFP Essayez les   ReyComponents   de renfield !!!
|
|
mardi 19 septembre 2006 à 23:27:25 |
Re : [VB.Net 2003] Expression littérales

RedDog
|
Salut, Essaye avec des expressions régulières (Regex), voilà l'indice. Comme ça tu pourras repérer des expressions types et les résoudre assez facilement avec les formules de maths que tu as appris. Sinon, cherche un peu sur ce site ou ailleurs.... Courage 
|
|
mercredi 20 septembre 2006 à 17:16:07 |
Re : [VB.Net 2003] Expression littérales

MoiDebutantVB
|
Je comprend pas vraiment... Essayez les   ReyComponents   de renfield !!!
|
|
mercredi 20 septembre 2006 à 21:40:12 |
Re : [VB.Net 2003] Expression littérales

RedDog
|
Et bien pour une expression telle que: ax²+ bx+ cOn va par l'intermédiaire d'un pattern reconnaître la forme de l'équation et vouloir récupérer a, b et c afin de résoudre l'équation. Après, si on a x=5, on fait le calcul dans un fonction spécifique. De même, on aurait ax²+ bx+ c=0. Après, on peut appliquer les formules de maths dans une autre fonction. Pour identifier ax²+ bx+ c=0 avec c>0 par exemple, le pattern serait (je te laisse chercher pourquoi? et s'il y a une erreur, désolé): [0-9]*x²\+[0-9]*x\+[0-9]+=0 ou plus simplement: \d*x²\+\d*x\+\d+=0 Si dans l'équation ax²= b, on veut chercher a, on le prendrait comme çà (là aussi je te laisse chercher pourquoi?): (?<"variable">\d*)x²=\d*; a est récupéré à l'aide du mot clé. Une fois qu'on a notre 'variable' On peut faire les calculs qu'on veut. Un exemple qui vient d'une de mes dernières applications, j'ai mis un texte assez simple de façon à rendre l'exemple explicite, cela fait partie d'une méthode capable de calculer des expressions mathématiques avec parenthèses dans une phrase.
Imports System.Text.RegularExpressions (...) Dim texte AsString = "14*20" Dim reg As Regex Dim m As MatchCollection Try ' On fait une multiplication ' Le pattern représente une expression a*b et peut-être entre parenthèses
reg = New Regex( "\(?(?<1>-?\d+)\*(?<2>-?\d+)\)?") ' On recherche avec Match m = reg.Matches(texte) ' Ce bout de code est fait pour calculer toutes les multiplications qu'on ' aurait pu trouver dans une phrase, d'où la boucle (r1 et r2 sont des String) For i As Integer = m.Count - 1 To 0 Step -1 Dim rm As Match = m.Item(i) r1 = rm.Groups(1).ToString ' Récupère la valeur de (?<1>-?\d+) r2 = rm.Groups(2).ToString Dim ir As Integer = CInt(r1) * CInt(r2) ' Cast et multiplication (...) Next Catch ex As Exception MessageBox.Show(ex.StackTrace _ , "Erreur dans la méthode de calcul avec regex > multiplication" _ , MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1) End Try
Voilà, sinon expose-nous ton code si tu as des problèmes!
|
|
vendredi 22 septembre 2006 à 19:19:28 |
Re : [VB.Net 2003] Expression littérales

MoiDebutantVB
|
Ok mais comment je fais si l'expression c'est [(Cos(x) + x/2)^3]*(2x^2 - 1), par exemple... Merci de ton aide en tout cas...
|
|
vendredi 22 septembre 2006 à 20:38:10 |
Re : [VB.Net 2003] Expression littérales

RedDog
|
Comment faire si c'est pas une expression types? C'est ça? Si on maths on nous pose cette équation (cos(x) + x/2)3*(2x² - 1) et si on connait la valeur de x alors je préconiserais, à tord ou à raison j'en sais rien, d'essayer de traiter ça par bloc, de la même manière qu'en maths en repérant les expressions connues avec le pattern leur correspondant.
D'abord un bloc, puis ensuite l'autre,... et pour finir la multiplication, le tout en Single pour être précis.
Après, soit on gère les résultat et ce qui nous reste à calculer avec des variables, soit on choisit la méthodes feignant comme c'est le cas dans ma fonction récursive, en remplaçant dans la chaine d'origine l'opération effectué par son résultat et on tenant compte des signes "+" à rajouter si on doit encore calculer autre chose.
Si x n'est pas connue, pourquoi ne pas tenter une résolution graphique, comme en maths quoi.
|
|
mercredi 27 septembre 2006 à 19:45:07 |
Re : [VB.Net 2003] Expression littérales

MoiDebutantVB
|
J'ai fait ce code :
Public
Function Résoudre(ByVal Expression AsString, ByVal ValeurX AsSingle) AsSingle
Dim Résultat AsSingle = 0
Dim Exp AsNew Regex("[(](.[*/]?[x])[)]([+-*/])[(](.[*/]?[x])[)]")
je ne suis pas sur de mon expression : j'ai trouvé un article de wikipédia mais je dout quand même : Ce que je veux dire c'est que on a : un ensemble d'un nombre, d'un symbole * ou diviser, et d'un autre nombre, le tout entre () ; suivi de soit + soit - soit * soit / ; puis un autre ensemble équivalent au premier, lui aussi encadré par des parenthèses.
Ensuite je traite l'expression :
Dim Partie_Calculée AsSingle
If Exp.Matches(Expression).Count > 0 Then'Si il y a plusieurs parties...
For
Each SousExpression As Match In Exp.Matches(Expression) 'Pour chaque sous-partie
Select
Case SousExpression.Groups(2).ToString
Case "+"
Partie_Calculée = Résoudre(SousExpression.Groups(1).ToString, ValeurX) + Résoudre(SousExpression.Groups(3).ToString, ValeurX) 'A chaque fois on décompose le sous-ensemble
Case "-"
Partie_Calculée = Résoudre(SousExpression.Groups(1).ToString, ValeurX) - Résoudre(SousExpression.Groups(3).ToString, ValeurX)
Case "*"
Partie_Calculée = Résoudre(SousExpression.Groups(1).ToString, ValeurX) * Résoudre(SousExpression.Groups(3).ToString, ValeurX)
Case "/"
Partie_Calculée = Résoudre(SousExpression.Groups(1).ToString, ValeurX) / Résoudre(SousExpression.Groups(3).ToString, ValeurX)
End
Select
Résultat *= Partie_Calculée 'On ajoute au résultat la valeur du calcul de chaque partie
Next
End
If
Return Résultat 'On retourne le résultat
Pourriez-vous s'il vous plait corriger les éventuelles erreurs de mon code et de ma RegExp? Merci beaucoup pour votre aide à tous !
Essayez les  ReyComponents de renfield !!!
|
|
mercredi 27 septembre 2006 à 19:47:30 |
Re : [VB.Net 2003] Expression littérales

MoiDebutantVB
|
Désolé le code n'est ni coloré ni dans la bonne police pourtant ca marchait dans ma saisie du message... Essayez les   ReyComponents   de renfield !!!
|
|
jeudi 28 septembre 2006 à 04:45:50 |
Re : [VB.Net 2003] Expression littérales

RedDog
|
Bon d'abord, je décortique ton expression à ma manière:
le tout entre (): \(' Une parenthèse d'ouverture (avec obligation d'utiliser un backslash pour la déclarer)
un ensemble d'un nombre: \d+' Qui veut dire qu'on a un nombre >= 1
d'un symbole * ou diviser: [\*/]' Un multiplié (avec obligation d'utiliser un backslash pour le déclarer) ou un divisé
et d'un autre nombre: \d+' Qui veut dire qu'on a un nombre >= 1
le tout entre (): \)' Une parenthèse de fermeture (avec obligation d'utiliser un backslash pour la déclarer)
suivi de soit + soit - soit * soit / : [\*\+-/]' multiplication ou addition ou soustraction ou division
puis un autre ensemble équivalent au premier, lui aussi encadré par des parenthèses: \(\d+[\*/]\d+\)
ex:
Dim
r AsNew Regex("\(\d+[\*/]\d+\)[\*\+-/]\(\d+[\*/]\d+\)") Dim mc As MatchCollection = r.Matches("(3*6)+(2*3)-(4*20)*(2*10)") ForEach m As Match In mc Console.WriteLine("Chaine trouvé: " & m.ToString) Next
Retourne: Chaine trouvé: (3*6)+(2*3) Chaine trouvé: (4*20)*(2*10)
Après je regarde ton expression: [(](.[*/]?[x])[)]([+-*/])[(](.[*/]?[x])[)]
Bon déjà, il n'y a aucun backslash devant les caractères spéciaux qui sont de ce type: . $ ^ { [ ( | ) * + ? \ Va voir la documentation sur MSDN en anglais ou en français, à ton aise.
Ensuite quand on a un endroit avec un seul caractère à déclarer, il est inutile de l'encadrer: [(] devient ( mais devient également \( car c'est un caractère spécial, donc au début on a \( et à la fin on a \)
Si on simplifie l'expression avec ces considérations, on a: \((.[\*/]?x)\)([\*\+-/])\((.[\*/]?x)\) Cette expression marche déjà mieux que celle d'avant qui bloquait.
ex: Dim r As New Regex("\((.[\*/]?x)\)([\*\+-/])\((.[\*/]?x)\)") Dim mc As MatchCollection = r.Matches("(3*x)+(2*x)-(4/x)*(2*3x)") For Each m As Match In mc Console.WriteLine("Chaine trouvé: " & m.ToString) If m.Groups.Count <> 0 Then For i AsInteger = 0 To m.Groups.Count - 1 Console.WriteLine("Groupe n°" & i & " trouvé dans cette chaine: " & m.Groups(i).ToString) Next End If Next
Retourne: Chaine trouvé: (3*x)+(2*x) Groupe n°0 trouvé dans cette chaine: (3*x)+(2*x) Groupe n°1 trouvé dans cette chaine: 3*x Groupe n°2 trouvé dans cette chaine: + Groupe n°3 trouvé dans cette chaine: 2*x
On peut encore améliorer l'expression......
Et pour le code:
Au lieu d'appeler deux fois la fonction Matches (Exp.Matches(Expression).Count par exemple) met un objet MatchCollection, sinon elle marche pas vraiment cette fonction; on ne sait pas calculer 3x + 2x, il faut virer les termes x pour calculer ça, et le remettre après, et je vois pas de cast aussi.
A partir de là, soit la fonction récursive n'est pas bonne, soit le regex n'est pas bon, moi je dis que les deux sont à revoir. Pas le temps d'écrire plus, faut que je dorme..............
|
|
Cette discussion est classée dans : net, vb, 2x, expression, littérales
Répondre à ce message
Sujets en rapport avec ce message
Liste qui traduit les expression entre vb6 et vb.net [ par minifranki ]
Bonjour,Je suis taner de passer mes journee a essayer dapprendre vb net et s'est toujours sans succes, enfin presque. Je trouve tout plein de tuto sur
evaluer une chaine de String en commende avec vb.net [ par souma86 ]
J'ai un projet à travailler avec le vb.net. Dans mon code, l'utilisateur doit avoir la possibiliter d'entrer une expression dans un textbox (chaine) e
vb.net Evaluer une expression et avoir le nom d'une variable dans une variable [ par liquide ]
bonsoir,Comment coder l'evaluation d'une expression comme on peut le faire avec scriptcontrol en vb.netUn autre probleme se pose, Comment récupérer le
connexion sql server & vb net [ par ghmarisamira ]
slt si qlq'un peut m'aidé j'ai une erreur lors d'une connexion entre sql server et vb net mais tous mon travail est correct je sais pa pourquoi il me
Conversion de VBA Ms Access à Vb.Net [ par emayen01 ]
Bonjour , je débute en Vb.Net et j'ai a faire une migration d'une interface MS Access 2003 a Vb.Net avec du Vba , sous sql server 2000.je sais pas
snmp vb.net [ par team4ever ]
bonjour tous mondeje suis encours de préparer mon pfe et j'ai choisi de developper une application avec vb.net et snmpest ce que vous avez des documen
le nom d'une exception en vb.net [ par souma86 ]
<span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: -webkit-monospace; font-size: 13px; font-style: nor
affichage du résultat d'une requête dans une zone texte en vb.net [ par wassim0285 ]
Je suis encore débutant en vb.net, je veut afficher le résultat de la requête suivante (select ref_produit from produit where ref_produit =1) dans une
équivalent en vb .net [ par Billybobbonnet ]
Salut à tous,Je cherche comment écrire en vb .net response = String(100, " ")Qui est le remplissage d'une variable string avec 100 espaces.Merci!
Migration VBA [ par Jej51 ]
Bonjour, Je dois actuellement faire migrer une application en VBA/Access vers VB.NET ou C# (ces deux derniers étant au choix)Personnellement je connai
Livres en rapport
|
Derniers Blogs
TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Arnault Nouvel et Antoine Dongois Le processus à prendre : Apprendre (découvrir la plateforme) Préparer (documenter l'historique et choisir la méthode de MAJ) Test (Test de MAJ) Implémenter (Effectuer la MAJ) Valid...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|