Je veux que ce programme soit capable de calculer des modulo, l'opérateur modulo est un opérateur
binaire (contrairement à tan() qui est un opérateur unaire), donc je crée une classe "Modulo" qui hérite de la classe "Operateur
Binaire" et qui implémente la classe "Expression", on obtient :
public class Modulo extends OperateurBinaire implements Expression {
Modulo( Expression fg, Expression fd) { //constructeur, ne rien changer
super(fg,fd);
}
@Override
public double calculer(int var) {
}
@Override
public String ToString() {
}
}
Maintenant il suffit juste de compléter les méthodes calculer() et ToString() :
//fg représente l'expression à gauche de l'opérateur %
//fd représente l'expression à droite de l'opérateur %
public double calculer(int var) {
return getFg().calculer(var) % getFd().calculer(var);//on reconnait que cette méthode calcule de manière récursive
}
[code]
public String ToString() {
String chaine = "(" + getFg().ToString() + " mod " + getFd().ToString() + ")";
return chaine;
}
[/code]
Voilà, la classe Modulo est maintenant implémenté, on peut maintenant l'utiliser :)
[code]
public static void main(String[] args)
{
Expression expression = new Modulo ( new Constant(2) , new Constant(3) )
expression.calculer(0); //retourne 2 mod 3, càd 2
}
[/code]
Le paramètre de la méthode "calculer" représente la valeur de la variable, exemple :
[code]
public static void main(String[] args)
{
Expression expression = new Modulo ( new Variable() , new Constant(3) )
expression.calculer(0); //retourne x mod 3 = 0 mod 3 = 0
expression.calculer(2); //retourne x mod 3 = 2 mod 3 = 2
}
[/code]
[/spoiler]
[/spoiler]
[b][u]Pourquoi publier ce code sur P-C ?[/u][/b]
[spoiler]
Ce code a été programmé en Java, il est donc très facile à adapter ce code en C++, vous pouvez donc vous en servir pour vos projets sur calculatrice (par exemple pour un moteur CAS). :)
[/spoiler]
[b][u]Licence[/u][/b]
[spoiler]
Pas de licence, faite ce que vous voulez avec. ^^
[/spoiler]
Citer : Posté le 20/01/2015 18:51 | #
Tiens, j'avais fait un truc semblable pour un TP en PCOO. Comme quoi les programmes se ressemblent!
Citer : Posté le 20/01/2015 18:52 | #
Le code est en fichier joint, dans le topic.
SI vous voulez, vous pouvez créer une méthode qui convertit une chaîne de caractère en une expression, par exemple 3+2 devient new Addition ( new Constant(2) , new Constant(3) )
Citer : Posté le 20/01/2015 18:54 | #
Les programmes des études, je veux dire. A présent, tu devrais mettre en place le parser de fonctions mathématiques si tu veux faire un moteur de calcul fonctionnel
Citer : Posté le 20/01/2015 18:58 | #
Tiens, j'avais fait un truc semblable pour un TP en PCOO. Comme quoi les programmes se ressemblent!
J'ai programmé ceci en TD de Java, ce matin.
Citer : Posté le 20/01/2015 19:00 | #
Génial Je vais regarder de plus près
Je suis fan de Mathématiques et de Sciences en général (d'où mon nom ). Consultez mes programmes en rapport avec les Maths
Tableau de variations
Equations Diophantiennes
Conversion d'un nombre décimal en fraction
Citer : Posté le 20/01/2015 19:35 | #
Comment tu calcule ton cos ?
Citer : Posté le 20/01/2015 19:41 | #
//getF() = je récupère l'expression
//getF().calculer(var) = je calcule l'expression
//cos (getF().calculer(var)) = je fais le cos du résultat
public double calculer(int var) {
return Math.cos(getF().calculer(var)); //cos(expression)
}
Citer : Posté le 20/01/2015 20:06 | #
J'ai été un peu surpris, je pensais que tu analysais les expressions pour en sortir le résultat en respectant les priorités.
Citer : Posté le 20/01/2015 22:08 | #
Du Java !
Heu, ce programme sert un peu à rien, il suffit d'un import java.util.Maths.* pour avoir tout cela.
Pong400
PierrePaCiseaux (CP400)
Les Triangles
Menu
ASCII
Nombres premiers
Citer : Posté le 20/01/2015 22:08 | #
Si : il sert à l'adapter sur ta G35++ et à s'exercer sur un problème relativement complexe.
Citer : Posté le 21/01/2015 00:13 | #
Du Java !
Heu, ce programme sert un peu à rien, il suffit d'un import java.util.Maths.* pour avoir tout cela.
C'est le projet et la méthode de fonctionnement qui est interressante. Smash n'as pas codé ça pour avoir des fonctions mathématiques
Citer : Posté le 21/01/2015 19:23 | #
J'ai été un peu surpris, je pensais que tu analysais les expressions pour en sortir le résultat en respectant les priorités.
Citer : Posté le 21/01/2015 19:25 | #
Tu comptes faire quelque chose avec ce programme (après traduction bien sûr ) pour calto ?
Je suis fan de Mathématiques et de Sciences en général (d'où mon nom ). Consultez mes programmes en rapport avec les Maths
Tableau de variations
Equations Diophantiennes
Conversion d'un nombre décimal en fraction
Citer : Posté le 21/01/2015 19:27 | #
Si tu analyses les expressions, alors je serais intéressé pour avoir un petit module qui convertir les formules TeX en expressions que tu peux lire comme ça, je pourrais faire un moteur de calcul avec écriture naturelle
Citer : Posté le 21/01/2015 19:30 | #
@Scientifix : Non, mais si quelqu'un veut faire un moteur CAS en se basant sur ce code, il peux le faire, c'est pour cette raison que j'ai mis ce programme sur P-C.
Citer : Posté le 21/01/2015 19:36 | #
J'ai déjà commencé à regarder le code (même si je suis nul en JAVA ) Peux tu donner des exemples concrets de ses utilisation ?
Je suis fan de Mathématiques et de Sciences en général (d'où mon nom ). Consultez mes programmes en rapport avec les Maths
Tableau de variations
Equations Diophantiennes
Conversion d'un nombre décimal en fraction
Citer : Posté le 21/01/2015 19:49 | #
expression.ToString(); // retourne la chaîne"3*2"
expression.Caculer(0); // retourne l'entier 6 (3*2)
expression.ToString(); // retourne la chaîne"x*2"
expression.Caculer(0); // retourne l'entier 0 (0*2)
expression.Caculer(5); // retourne l'entier 10 (5*2)
expression.ToString(); // retourne la chaîne"x*(x+2)"
expression.Caculer(0); // retourne l'entier 0 ( =0*(0+2))
expression.Caculer(5); // retourne l'entier 35 ( =5*(5+2))
new Multiplication(
new Addition(
new Constant(3)
,
new Sinus(
new Exposant(
new Multiplication(
new Constant(3)
,
new Variable()
)
,
new Constant(2)
)
)
)
,
new Constant(2)
);
expression.ToString(); // retourne la chaîne"((3.0+sin(((3.0*x)^2.0)))*2.0)"
expression.Caculer(0); // retourne l'entier 6 (on remplace x par 0 dans l'expressions ((3.0+sin(((3.0*x)^2.0)))*2.0) et on fait le calcul).
En gros :
->Multiplication, Addition... prennent deux expressions en paramètres : new Multiplication(Exp1 , Exp2) équivaut à (Exp1) * (Exp2) , new Addition( Exp1 , Exp2) équivaut à (Exp1) + (Exp2) etc.
->Cos, sinus ... ne prennent qu'une seule paramètre : new Cos(Expr) équivaut à ... "Cosinus du résultat de Expr".
Je ne vais pas détailler tout le code, car c'est un peu compliqué à expliquer, j'utilise le DP Composite.
Citer : Posté le 21/01/2015 20:25 | #
Y a-t-il moyen de définir plusieurs variables en donnant plusieurs paramètres ?
Btw, on est d'accord que l'analyse serait l'inverse de toString(), e.g. avec un constructeur surchargé ?
Citer : Posté le 22/01/2015 15:24 | #
Y a-t-il moyen de définir plusieurs variables en donnant plusieurs paramètres ?
expression.calculer(2,3,4) //remplace x par 2, y par 4 et z par 5
Je n'y avait pas pensé, mais c'est une bonne idée, c'est assez facile à faire, il suffit juste de remplacer calculer(double val) par calculer(List<double> val)
Oui, ça serait l'inverse de tostring()
Je ne peux pas mettre de constructeur dans Expression, car c'est une interface (on ne peux pas instancier les interfaces), je vais donc créer une classe contenant :
->Un attribut de type Expression
->Un constructeur qui prend en paramètre un String.
Dans ce cas le main ressemblerait donc à :
NomDeLaClasse exp = new NomDeLaClasse("x+2")
exp.Calculer(0);
Citer : Posté le 22/01/2015 16:14 | #
Pour ma propre information, qu'est-ce qu'une interface ? Je ne crois pas que ce concept existe en C++.