lololilizozo
Messages postés28Date d'inscriptionjeudi 2 octobre 2008StatutMembreDernière intervention 2 octobre 2012 24 févr. 2011 à 21:46
mais de rien jouliana :-)
cs_jouliana
Messages postés2Date d'inscriptionmercredi 23 février 2011StatutMembreDernière intervention24 février 2011 24 févr. 2011 à 19:20
bon pogramme merci
lololilizozo
Messages postés28Date d'inscriptionjeudi 2 octobre 2008StatutMembreDerniè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és178Date d'inscriptionlundi 5 juin 2006StatutMembreDernière intervention30 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és132Date d'inscriptionmercredi 6 mars 2002StatutMembreDernière intervention27 novembre 20121 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és28Date d'inscriptionjeudi 2 octobre 2008StatutMembreDerniè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és14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 30 juil. 2010 à 12:22
Ok, pas pensé à ça.
Bien vu
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és132Date d'inscriptionmercredi 6 mars 2002StatutMembreDernière intervention27 novembre 20121 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 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és14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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és28Date d'inscriptionjeudi 2 octobre 2008StatutMembreDerniè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és28Date d'inscriptionjeudi 2 octobre 2008StatutMembreDerniè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és3253Date d'inscriptionjeudi 26 novembre 2009StatutMembreDernière intervention 3 décembre 201957 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és6063Date d'inscriptiondimanche 13 avril 2003StatutMembreDernière intervention15 juillet 201137 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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 "
24 févr. 2011 à 21:46
24 févr. 2011 à 19:20
2 août 2010 à 17:00
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+
2 août 2010 à 11:11
(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
1 août 2010 à 02:33
Commentaires suffisamment détaillés ni trop peu, ni pas assez.
J'adopte.
31 juil. 2010 à 08:38
maintenant il prend en compte le "-" en tant que signe !
bonne prog a tous
30 juil. 2010 à 12:22
Bien vu
30 juil. 2010 à 09:57
non, sinon VB utilisera les parametres regionnaux, et on aura fait:
test = Replace(chaine, ",", ".")
pour rien....
30 juil. 2010 à 09:54
----------------------------------------------------------------------------------------
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;
}
}
29 juil. 2010 à 18:30
Alors il faut utiliser CStr pour éviter cet espace en tête de chaîne lors de la conversion d'un nombre.
29 juil. 2010 à 18:13
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
29 juil. 2010 à 17:56
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.
29 juil. 2010 à 11:44
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
29 juil. 2010 à 10:28
# 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
29 juil. 2010 à 09:35
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
29 juil. 2010 à 09:29
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 "