Commit fd413742 authored by Hernandez Francois's avatar Hernandez Francois

Operateurs

parent 2a9a9f71
......@@ -37,6 +37,10 @@ Expression * Nombre::clone() const{
return res;
}
Expression * Nombre::simplifie() const{
}
Variable::Variable(char nom){
this->nom_ = nom;
}
......@@ -51,12 +55,12 @@ void Variable::affiche(std::ostream & o) const{
Expression * Variable::derive(char nom) const{
Nombre * res;
if(this->nom_ == nom){
res = new Nombre(1);
} else {
res = new Nombre(0);
}
return res;
if(this->nom_ == nom){
res = new Nombre(1);
} else {
res = new Nombre(0);
}
return res;
}
Expression * Variable::clone() const{
......@@ -64,17 +68,26 @@ Expression * Variable::clone() const{
return res;
}
Expression * Variable::simplifie() const{
}
Operateur::Operateur(Expression * gauche, Expression * droite){
}
// PLUS
Plus::Plus(Expression * gauche, Expression * droite) : Operateur(gauche, droite){
this->gauche_ = gauche->clone();
this->droite_ = droite->clone();
}
Expression * Plus::derive(char nom) const{
return this->droite_;
Expression * res;
Plus * rep = new Plus(gauche_->derive(nom), droite_->derive(nom));
res = rep;
return res;
}
......@@ -84,7 +97,138 @@ Expression * Plus::clone() const{
}
void Plus::affiche(std::ostream & o) const{
o << "(";
this->gauche_->affiche(o);
o << " + ";
this->droite_->affiche(o);
o << ")";
}
Expression * Plus::simplifie() const{
Expression * res;
if(typeid(*gauche_) == typeid(Nombre)){
Nombre * cast = static_cast<Nombre *>(*gauche_);
if (cast->valeur_ == 0){
res = droite_;
}
} else if(typeid(*droite_) == typeid(Nombre)){
Nombre * cast = static_cast<Nombre *>(*droite_);
if (cast->valeur_ == 0){
res = gauche_;
}
} else {
res = this;
}
return res;
}
// MOINS
Moins::Moins(Expression * gauche, Expression * droite) : Operateur(gauche, droite){
this->gauche_ = gauche->clone();
this->droite_ = droite->clone();
}
Expression * Moins::derive(char nom) const{
Expression * res;
Moins * rep = new Moins(gauche_->derive(nom), droite_->derive(nom));
res = rep;
return res;
}
Expression * Moins::clone() const{
Moins * res = new Moins(this->gauche_, this->droite_);
return res;
}
void Moins::affiche(std::ostream & o) const{
o << "(";
this->gauche_->affiche(o);
o << " - ";
this->droite_->affiche(o);
o << ")";
}
Expression * Moins::simplifie() const{
}
// MULTIPLIER
Multiplier::Multiplier(Expression * gauche, Expression * droite) : Operateur(gauche, droite){
this->gauche_ = gauche->clone();
this->droite_ = droite->clone();
}
Expression * Multiplier::derive(char nom) const{
Expression * res;
Multiplier * mg = new Multiplier(gauche_->derive(nom), droite_);
Multiplier * md = new Multiplier(gauche_, droite_->derive(nom));
Plus * rep = new Plus(mg, md);
res = rep;
return res;
}
Expression * Multiplier::clone() const{
Multiplier * res = new Multiplier(this->gauche_, this->droite_);
return res;
}
void Multiplier::affiche(std::ostream & o) const{
o << "(";
this->gauche_->affiche(o);
o << " * ";
this->droite_->affiche(o);
o << ")";
}
Expression * Multiplier::simplifie() const{
}
// DIVISER
Diviser::Diviser(Expression * gauche, Expression * droite) : Operateur(gauche, droite){
this->gauche_ = gauche->clone();
this->droite_ = droite->clone();
}
Expression * Diviser::derive(char nom) const{
Expression * res;
Multiplier * mg = new Multiplier(gauche_->derive(nom), droite_);
Multiplier * md = new Multiplier(gauche_, droite_->derive(nom));
Moins * m = new Moins(mg, md);
Multiplier * mm = new Multiplier(droite_, droite_);
Diviser * rep = new Diviser(m, mm);
res = rep;
return res;
}
Expression * Diviser::clone() const{
Multiplier * res = new Multiplier(this->gauche_, this->droite_);
return res;
}
void Diviser::affiche(std::ostream & o) const{
o << "(";
this->gauche_->affiche(o);
o << " / ";
this->droite_->affiche(o);
o << ")";
}
Expression * Diviser::simplifie() const{
}
// surcharge de l'opérateur <<
std::ostream & operator<<( std::ostream & out, const Expression & e ) {
e.affiche( out );
return out;
}
......@@ -12,7 +12,8 @@ public:
~Expression(); // Destructeur
virtual void affiche(std::ostream & o) const = 0;
virtual Expression * derive(char nom) const = 0;
virtual Expression* clone() const = 0;
virtual Expression * clone() const = 0;
virtual Expression * simplifie() const = 0;
static int nb_instances(){
return nb_instances_;
}
......@@ -30,7 +31,8 @@ public:
~Nombre(); // Destructeur
void affiche(std::ostream & o) const;
Expression * derive(char nom) const;
Expression* clone() const;
Expression * clone() const;
Expression * simplifie() const;
private:
double valeur_;
......@@ -43,7 +45,8 @@ public:
~Variable(); // Destructeur
void affiche(std::ostream & o) const;
Expression * derive(char nom) const;
Expression* clone() const;
Expression * clone() const;
Expression * simplifie() const;
private:
char nom_;
......@@ -53,13 +56,14 @@ class Operateur : public Expression {
public:
Operateur(Expression *gauche, Expression *droite); // Constructeur
//~Operateur(); // Destructeur
// ~Operateur(); // Destructeur
virtual void affiche(std::ostream & o) const = 0;
virtual Expression * derive(char nom) const = 0;
virtual Expression * clone() const = 0;
virtual Expression * simplifie() const = 0;
private:
protected:
Expression * gauche_;
Expression * droite_;
};
......@@ -72,12 +76,53 @@ public:
void affiche(std::ostream &o) const;
Expression * derive(char nom) const;
Expression * clone() const;
Expression * simplifie() const;
private:
};
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;
Expression * simplifie() const;
private:
Expression * gauche_;
Expression * droite_;
};
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;
Expression * simplifie() const;
private:
};
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;
Expression * simplifie() const;
private:
};
std::ostream & operator<<( std::ostream & out, const Expression & e );
#endif
No preview for this file type
......@@ -7,33 +7,104 @@
int main()
{
std::cout << "TEST DES FONCTIONNALITES" << std::endl;
// Création du nombre 2
Nombre * nb = new Nombre(2);
// Création de la variable x
Variable * v = new Variable('x');
nb->affiche(std::cout);
std::cout << "\n";
std::cout << "Affiche le nombre 2" << std::endl;
std::cout << "n = " << *nb << std::endl;
v->affiche(std::cout);
std::cout << "\n";
std::cout << "Affiche la variable x" << std::endl;
std::cout << "v = " << *v << std::endl;
// Dérivation du nombre 2 par rapport à x
Expression * dn = nb->derive('x');
dn->affiche(std::cout);
std::cout << "\n";
std::cout << "Dérivée de 2 par rapport à x : " << *dn << std::endl;
// Dérivation de la variable x par rapport à x
Expression * dv = v->derive('x');
dv->affiche(std::cout);
std::cout << "\n";
std::cout << "Dérivée de x par rapport à x : " << *dv << std::endl;
std::cout << dv->nb_instances();
// Affichage du nombre d'instances
std::cout << "\n";
std::cout << "Nombre d'instances : " << dv->nb_instances() << std::endl;
// Test du comportement de Plus
Plus * p = new Plus(nb, v);
p->affiche(std::cout);
std::cout << "Affiche 2 + x : " << std::endl;
std::cout << *p << std::endl;
Expression * dp = p->derive('x');
std::cout << "Dérivée de 2 + x : " << std::endl;
std::cout << *dp << std::endl;
std::cout << "Simplifie : " << std::endl;
Expression * sdp = dp->simplifie();
// Test du comportement de Moins
Moins * m = new Moins(nb, v);
std::cout << "Affiche (2 - x) : " << std::endl;
std::cout << *m << std::endl;
Expression * dm = m->derive('x');
std::cout << "Dérivée de (2 - x) : " << std::endl;
std::cout << *dm << std::endl;
// Test du comportement de Multiplier
Multiplier * mm = new Multiplier(nb, v);
std::cout << "Affiche (2 * x) : " << std::endl;
std::cout << *mm << std::endl;
Expression * dmm = mm->derive('x');
std::cout << "Dérivée de (2 * x) : " << std::endl;
std::cout << *dmm << std::endl;
Multiplier * mmm = new Multiplier(p, m);
std::cout << "Affiche ((2 + x) * (2 - x)) : " << std::endl;
std::cout << *mmm << std::endl;
Expression * dmmm = mm->derive('x');
std::cout << "Dérivée de ((2 + x) * (2 - x)) : " << std::endl;
std::cout << *dmmm << std::endl;
// Test du comportement de Diviser
Diviser * d = new Diviser(nb, v);
std::cout << "Affiche (2 / x) : " << std::endl;
std::cout << *d << std::endl;
Expression * dd = d->derive('x');
std::cout << "Dérivée de (2 / x) : " << std::endl;
std::cout << *dd << std::endl;
Diviser * ddd = new Diviser(p, m);
std::cout << "Affiche ((2 + x) / (2 - x)) : " << std::endl;
std::cout << *ddd << std::endl;
Expression * dddd = ddd->derive('x');
std::cout << "Dérivée de ((2 + x) * (2 - x)) : " << std::endl;
std::cout << *dddd << std::endl;
}
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