CALCUL D'APRES UN TEXTBOX

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 29 juil. 2010 à 09:29
lololilizozo Messages postés 28 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 2 octobre 2012 - 24 févr. 2011 à 21:46
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/52117-calcul-d-apres-un-textbox

lololilizozo Messages postés 28 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 2 octobre 2012
24 févr. 2011 à 21:46
mais de rien jouliana :-)
cs_jouliana Messages postés 2 Date d'inscription mercredi 23 février 2011 Statut Membre Dernière intervention 24 février 2011
24 févr. 2011 à 19:20
bon pogramme merci
lololilizozo Messages postés 28 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 2 octobre 2012
2 août 2010 à 17:00
salut vicosta,
deja c'est une bonne nouvelle si mon code fait les bons calculs :-)
par contre tu peux enlever les "(0-...)" puisque maintenant mon code gere les "-" en tant que signe et pas seulement en operateur.
si j'ai pu aider quelqu'un avec mon code, je suis content.
a+
vicosta Messages postés 178 Date d'inscription lundi 5 juin 2006 Statut Membre Dernière intervention 30 novembre 2011
2 août 2010 à 11:11
j'ai vu une calculette sur lorisoft.org qui fait exactement le même travail. j'a testé la ligne
(0-5)((0-8)^5*sin(cos(5+8))-((0-45)-9)56/((0-8)+4*8))sin(0-4)*(0-78)
et le resultat est identique (em mode radians), donc ton code fonctionne bien au départ. Bonne continuation
BarthOlivier Messages postés 132 Date d'inscription mercredi 6 mars 2002 Statut Membre Dernière intervention 27 novembre 2012 1
1 août 2010 à 02:33
J'ai testé un peu et porté le code en C# c'est assez rapide, et résultats cohérents (pour les différents tests que j'ai faits)
Commentaires suffisamment détaillés ni trop peu, ni pas assez.
J'adopte.
lololilizozo Messages postés 28 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 2 octobre 2012
31 juil. 2010 à 08:38
je me suis un peu enerve hier et voila la nouvelle mouture du module.
maintenant il prend en compte le "-" en tant que signe !
bonne prog a tous
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
30 juil. 2010 à 12:22
Ok, pas pensé à ça.
Bien vu
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
30 juil. 2010 à 09:57
CStr ?
non, sinon VB utilisera les parametres regionnaux, et on aura fait:
test = Replace(chaine, ",", ".")

pour rien....
BarthOlivier Messages postés 132 Date d'inscription mercredi 6 mars 2002 Statut Membre Dernière intervention 27 novembre 2012 1
30 juil. 2010 à 09:54
Perso avec le C# j'utilisais la compilation a la volée, mais je le trouve lent ... Je vais tester ton algo en en C# pour voir ce que ca donne ... mais ca a pas l'air mal.

----------------------------------------------------------------------------------------

public class FormuleParser
{
private string strInstruction = "public static double eval(double x)";
public object myobj = null;
public ArrayList errorMessages;
public FormuleParser()
{
errorMessages = new ArrayList();
}
public bool init(string expr,int NbVAR)
{
expr = expr.ToLower();
CodeDomProvider cp = CodeDomProvider.CreateProvider("C#");
CompilerParameters cpar = new CompilerParameters();
cpar.GenerateInMemory = true;
cpar.GenerateExecutable = false;
cpar.ReferencedAssemblies.Add("system.dll");
CheckExpression(ref expr);

strInstruction = "public static double eval(";
for (byte i = 1; i < NbVAR; i++)
strInstruction += "double var" + i + ",";
strInstruction += "double ValueDT)";

string src = "using System;" + // construction de la classe
"class myclass" +
"{" +
"public myclass(){}" +
#region fonctions compilée a la voléee
"static public double dT = 0.0F;" +
"static public double OldIntegral = 0.0F;" +
"static public int intCONV = 0;" +
"static public int intFILTRE = 0;" +
"static public int intDERIVEE = 0;" +
"static public double[] TabCONV = new double[] {0,0,0,0,0,0,0,0,0,0};" +
"static public double[] TabFILTRE = new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };" +
"static public double[] Coef = new double[] { 0.1F, 0.1F, 0.1F, 0.1F, 0.1F, 0.1F, 0.1F, 0.1F, 0.1F, 0.1F };" +
"static public Random Rnd = new Random();" +
"static public double nextNextGaussian = 0;" +
"static public bool haveNextNextGaussian = false;" +
//--------------------------------------------------------
strInstruction +
"{" +
"dT = ValueDT;" +
"try" +
"{return " + expr + ";}" +
"catch" +
"{return 0;}" +
"}" +
//--------------------------------------------------------
"static public double pos(double x)" +
"{" +
" if (x < 0) x = 0;" +
" return x;" +
"}" +
//--------------------------------------------------------
"static public double neg(double x)" +
"{" +
" if (x > 0) x = 0;" +
" return x;" +
"}" +
//--------------------------------------------------------
"static public double rac(double x)" +
"{" +
" if (x < 0)" +
" x = -Math.Sqrt(-x);" +
" else" +
" x = Math.Sqrt(x);" +
" return x;" +
"}" +
//--------------------------------------------------------
"static public double sqr(double x)" +
"{" +
" if (x >= 0)" +
" return Math.Sqrt(x);" +
" else" +
" return 0;" +
"}" +
//--------------------------------------------------------
"static public double deg(double x)" +
"{" +
" return x * 180.0F / Math.PI;" +
"}" +
//--------------------------------------------------------
"static public double rad(double x)" +
"{" +
" return x * Math.PI / 180.0F;" +
"}" +
//--------------------------------------------------------
"static public double itg(double x)" +
"{" +
" OldIntegral += x;" +
" return OldIntegral * dT;" +
"}" +
//--------------------------------------------------------
"static public double itgd(double x)" +
"{" +
" OldIntegral += x;" +
" return OldIntegral * dT;" +
"}" +
//--------------------------------------------------------
"static public double noise(double x)" +
"{" +
" double returnValue;"+
" double v1=1;"+
" double v2=1;"+
" double s=0;"+
" double multiplier;"+
" if (haveNextNextGaussian == true)"+
" {"+
" haveNextNextGaussian = false;"+
" returnValue = nextNextGaussian;"+
" return returnValue;"+
" }"+
" else"+
" {"+
" do"+
" {"+
" v1 = 2 * Rnd.NextDouble() - 1;" +
" v2 = 2 * Rnd.NextDouble() - 1;" +
" s = v1 * v1 + v2 * v2;"+" } while (s >1 || s 0);"+

" multiplier = Math.Sqrt(- 2 * Math.Log(s) / s);"+
" nextNextGaussian = v2 * multiplier;"+
" haveNextNextGaussian = true;"+
" returnValue = v1 * multiplier;"+
" }"+
" return returnValue;"+
"}"+
//--------------------------------------------------------
"static private double filtread(double x)" +
"{" +
" int j;" +
" double Out, Erreur;" +
" if (intFILTRE < 9)" +
" TabFILTRE[9 - intFILTRE++] = x;" +
" else" +
" {" +
" TabFILTRE[9] = TabFILTRE[8];" +
" TabFILTRE[8] = TabFILTRE[7];" +
" TabFILTRE[7] = TabFILTRE[6];" +
" TabFILTRE[6] = TabFILTRE[5];" +
" TabFILTRE[5] = TabFILTRE[4];" +
" TabFILTRE[4] = TabFILTRE[3];" +
" TabFILTRE[3] = TabFILTRE[2];" +
" TabFILTRE[2] = TabFILTRE[1];" +
" TabFILTRE[1] = TabFILTRE[0];" +
" TabFILTRE[0] = x;" +
" }" +
" Out = 0;" +
" if (intFILTRE < 9)" +
" {" +
" for (j = 0; j < intFILTRE; j++) Out += 0.1 * TabFILTRE[9 - j];" +
" }" +
" else" +
" {" +
" for (j = 0; j < 10; j++) Out += 0.1 * TabFILTRE[9 - j];" +
" Erreur = x - Out;" +
" for (j = 0; j < 10; j++) Coef[j] += 0.4 * Erreur * TabFILTRE[9 - j];" +
" }" +
" return Out;" +
"}" +
//--------------------------------------------------------
#endregion
"}";

CompilerResults cr = cp.CompileAssemblyFromSource(cpar, src);
foreach (CompilerError ce in cr.Errors) // ajout des erreurs éventuelles
errorMessages.Add(ce.ErrorText);
if (cr.Errors.Count == 0 && cr.CompiledAssembly != null)
{
Type ObjType = cr.CompiledAssembly.GetType("myclass");
try
{
if (ObjType != null)
myobj = Activator.CreateInstance(ObjType);
}
catch (Exception ex)
{
errorMessages.Add(ex.Message);
}
return true;
}
else
return false;
}
private void CheckExpression(ref string expr)
{
// remplacements simple pour la syntaxe C#
expr = expr.Replace("pi", "Math.PI");
expr = expr.Replace("ln", "Math.Log");
expr = expr.Replace("exp", "Math.Exp");
expr = expr.Replace("log", "Math.Log");
expr = expr.Replace("sqrt", "Math.Sqrt");

expr = expr.Replace("cosh", "Math.Cosh");
expr = expr.Replace("sinh", "Math.Sinh");
expr = expr.Replace("tanh", "Math.Tanh");

expr = expr.Replace("arcsin", "Math.Asin");
expr = expr.Replace("arccos", "Math.Acos");
expr = expr.Replace("arctan", "Math.Atan");

expr = expr.Replace("tan", "Math.Tan");
expr = expr.Replace("sin", "Math.Sin");
expr = expr.Replace("cos", "Math.Cos");
expr = expr.Replace("abs", "Math.Abs");

expr = expr.Replace("int", "(int)");

}
//---------------------------------------------------------------------------------------//
public double eval(double[] TAB)
{
double val = 0.0;
Object[] myParams = new object[TAB.Length];
for (byte i = 0; i < TAB.Length; i++)
myParams[i] = (Object)TAB[i];

if (myobj != null)
{
MethodInfo evalMethod = myobj.GetType().GetMethod("eval");
val = (double)evalMethod.Invoke(myobj, myParams);
}
return val;
}
}
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
29 juil. 2010 à 18:30
Ok LoloLiliZozo
Alors il faut utiliser CStr pour éviter cet espace en tête de chaîne lors de la conversion d'un nombre.
lololilizozo Messages postés 28 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 2 octobre 2012
29 juil. 2010 à 18:13
re,
pour ShayW, en fait le bout de prog autour du module ne sert qu'a expliquer comment se servir du module, il n'a aucune vocation a etre une N'eme calculatrice.
le code c'est surtout le module qui permet de calculer une equation a partir d'une "string" et qui est facilement integrable dans un programme.
c'est juste que pour l'un de me prog j'ai un jour eu besoin d'entree une equation dans un textbox et j'ai ete embete pour faire le calcul et qu'apres avoir longtemps cherche partout je n'est rien trouver de concluant donc voila.
par contre, il y a peut etre des sources qui sont plus performantes que la mienne mais je n'ai pas trouver, si tu a de bonnes adresses, merci de me les communiques
bonne prog
lololilizozo Messages postés 28 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 2 octobre 2012
29 juil. 2010 à 17:56
bonjour a vous,
pour jack, Str(Atn(x) + 2 * Atn(1)) s'execute correctement et le resultat est une chaine qui contient la valeur!
le "replace" ne sert qu'a enlever l'espace en debut de chaine si le nombre est positif car la fonction "str" renvoi une chaine a partir d'un nombre qui contient un espace au debut si le nombre est positif ou sinon pas d'espace mais un "-" si le nombre est negatif voila la raison d'etre du "replace"

pour renfield & nhervagault, j'ai enleve pas mal de "case"
par contre je ne comprend pas le fait de faire une boucle pour simplifier les operateurs ?

pour ShayW, tu a raison, j'ai un peu oublie le renvoi d'une erreur selon la fin de la fonction, voila qui est fait

en tout cas, merci a vous et bonne prog.
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
29 juil. 2010 à 11:44
Bonjour
Ajoutes un bouton effacer bouton degré radian
les fonctions trigo sont en radian seulement
Si j'écris arcsin 4 j'obtiens invalid procedure ok
mais si j'écris 4arcsin ou 4 tan ou
nombre function j'obtiens runtime error 9
le debugger s'arrete à la function cacul
x = Val(c(operateur + 1))
Bonne prog
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
29 juil. 2010 à 10:28
Salut,

# Select Case car
# Case Chr$(200)
# If macro_test(car, car_avant) <> "ok" Then
# tableau = "erreur d'ecriture au caracteres n°" + Str$(x)
# End If
# Case Chr$(201)
# If macro_test(car, car_avant) <> "ok" Then
# tableau = "erreur d'ecriture au caracteres n°" + Str$(x)
# End If
..........

peut etre optomisé en
# Select Case car
# Case Chr$(200),Chr$(201)
# If macro_test(car, car_avant) <> "ok" Then
# tableau = "erreur d'ecriture au caracteres n°" + Str$(x)
# End If

idem pour les case
Case "/", "*"
If car_avant = ")" Or (Asc(car_avant) > 47 And Asc(car_avant) < 58) Then
Call nouveau(car)
Else
tableau = "erreur d'ecriture au caracteres n°" + Str$(x)
Exit Function
End If
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 juil. 2010 à 09:35
Pas mal...

faire une boucle sur:
test = Replace(test, "++", "+")
test = Replace(test, "+-", "-")
test = Replace(test, "-+", "-")
test = Replace(test, "--", "+")

dans tableau
c'est pas la joie tous tes case pour un code identique a l'interieur...
testes ca plus finement, ca simplifiera
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
29 juil. 2010 à 09:29
Petite lecture en diagonale.
Es-tu sûr que cette syntaxe soit correcte :
c(operateur) = Replace(Str(Atn(x) + 2 * Atn(1)), " ", "")
car
Str(Atn(x) + 2 * Atn(1))
revient à dire que le calcul Atn(x) + 2 * Atn(1) s'exécute et renvoie donc un chiffre. Dans ce cas, je vois mal l'intérêt de remplacer les espaces dans un chiffre.
Si tu dois travailler sur la chaine "Atn(x) + 2 * Atn(1)" , il te faut ajouter des "
Rejoignez-nous