Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Discussions


Index du Forum » Discussions » [Java] Un petit moteur de calcul.
Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

[Java] Un petit moteur de calcul.

Posté le 20/01/2015 18:49

Salut à tous

Aujourd'hui j'ai programmer en Java un petit moteur de calcul qui est capable de calculer :

Addition
Multiplication
Soustraction
Exposant
Cos
Sin
Variable
Constant

Exemple :
Cliquez pour découvrir
Cliquez pour recouvrir



public class Main2 {
    public static void main(String[] args)
    {
        Expression expression =
                new Multiplication(
                    new Addition(
                        new Constant(3)
                        ,
                        new Sinus(
                            new Exposant(
                                new Multiplication(
                                    new Constant(3)
                                    ,
                                    new Variable()
                                )
                                ,
                                new Constant(2)
                            )
                        )
                    )
                    ,
                    new Constant(2)
                );
        
        System.out.println(expression.ToString() + " = " + new Double (expression.calculer(0)).toString() );
        //résultat : ((3.0+sin(((3.0*x)^2.0)))*2.0) = 6.0
    }
}





Ce programme utilise le Design Pattern Composite, il est donc très facile à rajouter d'autres opérateurs.

Comment rajouter d'autres opérateurs ?
Cliquez pour découvrir
Cliquez pour recouvrir

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 "OperateurBinaire" 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]


Fichier joint


1, 2 Suivante
Eiyeron Hors ligne Ancien modérateur Points: 5525 Défis: 57 Message

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!
Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

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) )
Eiyeron Hors ligne Ancien modérateur Points: 5525 Défis: 57 Message

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
Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

Citer : Posté le 20/01/2015 18:58 | #


Eiyeron a écrit :
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.
Scientifix Hors ligne Membre Points: 762 Défis: 30 Message

Citer : Posté le 20/01/2015 19:00 | #


Génial Je vais regarder de plus près
JE SERAI ABSENT POUR 2 ANS A+

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

Calculatrice : Graph 75
-florian66- Hors ligne Ancien rédacteur Points: 2383 Défis: 20 Message

Citer : Posté le 20/01/2015 19:35 | #


Comment tu calcule ton cos ?
In Arch, I trust ! And you ?
Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

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)
}

Lephenixnoir En ligne Administrateur Points: 24228 Défis: 170 Message

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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Legolas Hors ligne Ancien rédacteur Points: 3266 Défis: 104 Message

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.
Mes programmes
Cacher les programmes
Mes défis
Cacher les défis



Dark storm Hors ligne Labélisateur Points: 11634 Défis: 176 Message

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.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Cartix Hors ligne Membre Points: 2748 Défis: 98 Message

Citer : Posté le 21/01/2015 00:13 | #


Legolas a écrit :
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
Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

Citer : Posté le 21/01/2015 19:23 | #


Lephenixnoir a écrit :
J'ai été un peu surpris, je pensais que tu analysais les expressions pour en sortir le résultat en respectant les priorités.
Le plus difficile est fait, j'ai l'algorithme en tête.
Scientifix Hors ligne Membre Points: 762 Défis: 30 Message

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 SERAI ABSENT POUR 2 ANS A+

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

Calculatrice : Graph 75
Lephenixnoir En ligne Administrateur Points: 24228 Défis: 170 Message

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
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

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.
Scientifix Hors ligne Membre Points: 762 Défis: 30 Message

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 SERAI ABSENT POUR 2 ANS A+

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

Calculatrice : Graph 75
Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

Citer : Posté le 21/01/2015 19:49 | #


Expression expression = new Multiplication( new Constant(3) , new Constant(2) );
expression.ToString(); // retourne la chaîne"3*2"
expression.Caculer(0); // retourne l'entier 6 (3*2)


Expression expression = new Multiplication( new Variable() , new Constant(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 expression = new Multiplication( new Variable() , new Addition( new Variable() , new Constant(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))


Expression expression =
                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.
Lephenixnoir En ligne Administrateur Points: 24228 Défis: 170 Message

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é ?
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

Citer : Posté le 22/01/2015 15:24 | #


Lephenixnoir a écrit :
Y a-t-il moyen de définir plusieurs variables en donnant plusieurs paramètres ?
Tu veux dire par exemple :


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)

Btw, on est d'accord que l'analyse serait l'inverse de toString(), e.g. avec un constructeur surchargé ?

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);

Lephenixnoir En ligne Administrateur Points: 24228 Défis: 170 Message

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++.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
1, 2 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 81 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd