Commit 1e5513d4 authored by Hernandez Francois's avatar Hernandez Francois

instances

parent 79c2dbc5
......@@ -22,9 +22,6 @@ Nombre::Nombre(double valeur){
this->valeur_ = valeur;
}
Nombre::~Nombre(){
}
void Nombre::affiche(std::ostream & o) const{
o << valeur_;
......@@ -55,9 +52,6 @@ Variable::Variable(char nom){
this->nom_ = nom;
}
Variable::~Variable(){
}
void Variable::affiche(std::ostream & o) const{
o << nom_;
......@@ -87,6 +81,8 @@ Expression * Variable::simplifie() const{
// OPERATEUR
Operateur::Operateur(Expression * gauche, Expression * droite){
this->gauche_ = gauche->clone();
this->droite_ = droite->clone();
}
......@@ -97,18 +93,14 @@ Operateur::~Operateur(){
// PLUS
Plus::Plus(Expression * gauche, Expression * droite) : Operateur(gauche, droite){
this->gauche_ = gauche->clone();
this->droite_ = droite->clone();
//delete gauche;
//delete droite;
}
Plus::Plus(Expression * gauche, Expression * droite) : Operateur(gauche, droite){}
Expression * Plus::derive(char nom) const{
Expression * res;
Plus * rep = new Plus(gauche_->derive(nom), droite_->derive(nom));
res = rep;
//delete rep;
Expression * dg = gauche_->derive(nom);
Expression * dd = droite_->derive(nom);
Plus * res = new Plus(dg, dd);
delete dg;
delete dd;
return res;
}
......@@ -132,39 +124,39 @@ Expression * Plus::simplifie() const{
Expression * ds = droite_->simplifie();
Nombre *cg = dynamic_cast<Nombre*>(gs);
Nombre *cd = dynamic_cast<Nombre*>(ds);
if(cg != nullptr && cd != nullptr){
Nombre *rep = new Nombre(cg->getValue()+cd->getValue());
res = rep;
delete rep;
delete gs;
delete ds;
return rep;
}else if(cg != nullptr && cg->getValue() == 0){
res = ds;
delete gs;
return ds;
}else if(cd != nullptr && cd->getValue() == 0){
res = gs;
delete ds;
return gs;
} else {
Plus * rep = new Plus(gs,ds);
res = rep;
delete gs;
delete ds;
return rep;
}
//delete this;
//delete gs;
//delete ds;
//delete cg;
//delete cd;
delete gs;
delete ds;
return res;
}
// MOINS
Moins::Moins(Expression * gauche, Expression * droite) : Operateur(gauche, droite){
this->gauche_ = gauche->clone();
this->droite_ = droite->clone();
//delete gauche;
//delete droite;
}
Moins::Moins(Expression * gauche, Expression * droite) : Operateur(gauche, droite){}
Expression * Moins::derive(char nom) const{
Expression * res;
Moins * rep = new Moins(gauche_->derive(nom), droite_->derive(nom));
res = rep;
Expression * dg = gauche_->derive(nom);
Expression * dd = gauche_->derive(nom);
Moins * res = new Moins(dg, dd);
delete dg;
delete dd;
return res;
}
......@@ -190,32 +182,42 @@ Expression * Moins::simplifie() const{
Nombre *cd = dynamic_cast<Nombre*>(ds);
if(cg != nullptr && cd != nullptr){
Nombre *rep = new Nombre(cg->getValue()-cd->getValue());
res = rep;
delete gs;
delete ds;
return rep;
}else if(cg != nullptr && cg->getValue() == 0){
Nombre * mun = new Nombre(-1);
Multiplier * rep = new Multiplier(mun, ds);
res = rep;
delete mun;
delete gs;
delete ds;
return rep;
} else if(cd != nullptr && cd->getValue() == 0){
res = gs;
delete ds;
return gs;
} else {
Moins * rep = new Moins(gs, ds);
res = rep;
delete gs;
delete ds;
return rep;
}
return res;
}
// MULTIPLIER
Multiplier::Multiplier(Expression * gauche, Expression * droite) : Operateur(gauche, droite){
this->gauche_ = gauche->clone();
this->droite_ = droite->clone();
}
Multiplier::Multiplier(Expression * gauche, Expression * droite) : Operateur(gauche, droite){}
Expression * Multiplier::derive(char nom) const{
Expression * res;
Multiplier * mg = new Multiplier(gauche_->derive(nom), droite_);
Multiplier * md = new Multiplier(gauche_, droite_->derive(nom));
Expression * dg = gauche_->derive(nom);
Expression * dd = droite_->derive(nom);
Multiplier * mg = new Multiplier(dg, droite_);
Multiplier * md = new Multiplier(gauche_, dd);
Plus * rep = new Plus(mg, md);
delete mg;
delete md;
delete dg;
delete dd;
res = rep;
return res;
}
......@@ -242,25 +244,31 @@ Expression * Multiplier::simplifie() const{
Nombre *cd = dynamic_cast<Nombre*>(ds);
if(cg != nullptr && cd != nullptr){
Nombre *rep = new Nombre(cg->getValue()*cd->getValue());
res = rep;
delete gs;
delete ds;
return rep;
}else if(cg != nullptr && cg->getValue() == 0){
Nombre * rep = new Nombre(0);
res = rep;
delete gs;
delete ds;
return rep;
} else if(cd != nullptr && cd->getValue() == 0){
Nombre * rep = new Nombre(0);
res = rep;
delete gs;
delete ds;
return rep;
} else {
Multiplier * rep = new Multiplier(gs,ds);
res = rep;
delete gs;
delete ds;
return rep;
}
return res;
}
// DIVISER
Diviser::Diviser(Expression * gauche, Expression * droite) : Operateur(gauche, droite){
Nombre *cd = dynamic_cast<Nombre*>(droite);
/*Nombre *cd = dynamic_cast<Nombre*>(droite);
try{
if(cd != nullptr && cd->getValue() == 0){
throw new int(10); // Detection de l'erreur
......@@ -270,17 +278,23 @@ Diviser::Diviser(Expression * gauche, Expression * droite) : Operateur(gauche, d
}
}catch(int const * i){
std::cerr << "Division par zero !" << std::endl; // Erreur, arrêt du programme
}
}*/
}
Expression * Diviser::derive(char nom) const{
Expression * res;
Multiplier * mg = new Multiplier(gauche_->derive(nom), droite_);
Multiplier * md = new Multiplier(gauche_, droite_->derive(nom));
Expression * dg = gauche_->derive(nom);
Expression * dd = droite_->derive(nom);
Multiplier * mg = new Multiplier(dg, droite_);
Multiplier * md = new Multiplier(gauche_, dd);
Moins * m = new Moins(mg, md);
Multiplier * mm = new Multiplier(droite_, droite_);
Diviser * rep = new Diviser(m, mm);
res = rep;
Diviser * res = new Diviser(m, mm);
delete mg;
delete md;
delete m;
delete mm;
delete dg;
delete dd;
return res;
}
......@@ -299,28 +313,32 @@ void Diviser::affiche(std::ostream & o) const{
}
Expression * Diviser::simplifie() const{
Expression * res;
Expression * gs = gauche_->simplifie();
Expression * ds = droite_->simplifie();
Nombre *cg = dynamic_cast<Nombre*>(gs);
Nombre *cd = dynamic_cast<Nombre*>(ds);
if(cg != nullptr && cd != nullptr){
Nombre *rep = new Nombre(cg->getValue()/cd->getValue());
res = rep;
delete gs;
delete ds;
return rep;
}
else if(cg != nullptr && cg->getValue() == 0)
{
Nombre * rep = new Nombre(0);
res = rep;
delete gs;
delete ds;
return rep;
} else if(cd != nullptr && cd->getValue() == 0){
std::cout << "Division par 0";
delete gs;
delete ds;
} else {
Diviser * rep = new Diviser(gs, ds);
res = rep;
delete gs;
delete ds;
return rep;
}
return res;
}
......
......@@ -9,7 +9,7 @@
class Expression {
public:
Expression(); // Constructeur
~Expression(); // Destructeur
virtual ~Expression(); // Destructeur
virtual void affiche(std::ostream & o) const = 0;
virtual Expression * derive(char nom) const = 0;
virtual Expression * clone() const = 0;
......@@ -28,7 +28,6 @@ class Nombre : public Expression {
public:
Nombre(double valeur); // Constructeur
~Nombre(); // Destructeur
void affiche(std::ostream & o) const;
Expression * derive(char nom) const;
Expression * clone() const;
......@@ -43,7 +42,6 @@ class Variable : public Expression {
public:
Variable(char nom); // Constructeur
~Variable(); // Destructeur
void affiche(std::ostream & o) const;
Expression * derive(char nom) const;
Expression * clone() const;
......@@ -58,7 +56,6 @@ class Operateur : public Expression {
public:
Operateur(Expression *gauche, Expression *droite); // Constructeur
~Operateur(); // Destructeur
virtual void affiche(std::ostream & o) const = 0;
virtual Expression * derive(char nom) const = 0;
virtual Expression * clone() const = 0;
......@@ -73,7 +70,6 @@ class Plus : public Operateur {
public:
Plus(Expression *gauche, Expression *droite); // Constructeur
~Plus(); // Destructeur
void affiche(std::ostream &o) const;
Expression * derive(char nom) const;
Expression * clone() const;
......@@ -86,7 +82,6 @@ class Moins : public Operateur {
public:
Moins(Expression *gauche, Expression *droite); // Constructeur
~Moins(); // Destructeur
void affiche(std::ostream &o) const;
Expression * derive(char nom) const;
Expression * clone() const;
......@@ -99,7 +94,6 @@ class Multiplier : public Operateur {
public:
Multiplier(Expression *gauche, Expression *droite); // Constructeur
~Multiplier(); // Destructeur
void affiche(std::ostream &o) const;
Expression * derive(char nom) const;
Expression * clone() const;
......@@ -113,7 +107,6 @@ class Diviser : public Operateur {
public:
Diviser(Expression *gauche, Expression *droite); // Constructeur
~Diviser(); // Destructeur
void affiche(std::ostream &o) const;
Expression * derive(char nom) const;
Expression * clone() const;
......
File added
......@@ -5,6 +5,8 @@
#include "Derivation.hpp"
using namespace std;
int main()
{
Nombre * zero = new Nombre(0);
......@@ -50,7 +52,63 @@ int main()
//Diviser * divzero = new Diviser(un, zero);
//std::cout << *divzero << std::endl;
std::cout << test->nb_instances() << std::endl;
delete testys;
delete testy;
delete testxs;
delete testx;
delete test;
delete unpx;
delete xsury;
delete x;
delete y;
delete zero;
delete un;
delete deux;
delete trois;
/* TEST INSTANCES
Nombre * un = new Nombre(1);
Nombre * deux = new Nombre(2);
Variable * x = new Variable('x');
std::cout << Expression::nb_instances()<<std::endl;
Diviser * p = new Diviser(deux,x);
std::cout << Expression::nb_instances()<<std::endl;
Expression * d = p->derive('x');
std::cout << *d << std::endl;
std::cout << Expression::nb_instances()<<std::endl;
Expression * s = d->simplifie();
std::cout << Expression::nb_instances()<<std::endl;
delete s;
std::cout << Expression::nb_instances()<<std::endl;
delete d;
std::cout << Expression::nb_instances()<<std::endl;
delete p;
std::cout << Expression::nb_instances()<<std::endl;
delete un;
delete deux;
delete x;
*/
std::cout << Expression::nb_instances()<<std::endl;
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment