Commit 6ed7e11b authored by Hernandez Francois's avatar Hernandez Francois

test

parent 1210c278
......@@ -90,17 +90,25 @@ Operateur::Operateur(Expression * gauche, Expression * droite){
}
Operateur::~Operateur(){
delete this->gauche_;
delete this->droite_;
}
// PLUS
Plus::Plus(Expression * gauche, Expression * droite) : Operateur(gauche, droite){
this->gauche_ = gauche->clone();
this->droite_ = droite->clone();
//delete gauche;
//delete droite;
}
Expression * Plus::derive(char nom) const{
Expression * res;
Plus * rep = new Plus(gauche_->derive(nom), droite_->derive(nom));
res = rep;
//delete rep;
return res;
}
......@@ -122,33 +130,25 @@ Expression * Plus::simplifie() const{
Expression * res;
Expression * gs = gauche_->simplifie();
Expression * ds = droite_->simplifie();
if(typeid(*gs) == typeid(Nombre) && typeid(*ds) == typeid(Nombre)){
Nombre *cg = dynamic_cast<Nombre*>(gs);
Nombre *cd = dynamic_cast<Nombre*>(ds);
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;
}else if(typeid(*gs) == typeid(Nombre)){
Nombre *cast = dynamic_cast<Nombre*>(gs);
if (cast->getValue() == 0){
res = ds;
} else {
Plus * rep = new Plus(gs,ds);
res = rep;
}
} else if(typeid(*ds) == typeid(Nombre)){
Nombre *cast = dynamic_cast<Nombre*>(ds);
if (cast->getValue() == 0){
res = gs;
}else {
Plus * rep = new Plus(gs,ds);
res = rep;
}
delete rep;
}else if(cg != nullptr && cg->getValue() == 0){
res = ds;
}else if(cd != nullptr && cd->getValue() == 0){
res = gs;
} else {
Plus * rep = new Plus(gs,ds);
res = rep;
}
//delete this;
//delete gs;
//delete ds;
//delete cg;
//delete cd;
return res;
}
......@@ -157,6 +157,8 @@ Expression * Plus::simplifie() const{
Moins::Moins(Expression * gauche, Expression * droite) : Operateur(gauche, droite){
this->gauche_ = gauche->clone();
this->droite_ = droite->clone();
//delete gauche;
//delete droite;
}
Expression * Moins::derive(char nom) const{
......@@ -184,38 +186,22 @@ Expression * Moins::simplifie() const{
Expression * res;
Expression * gs = gauche_->simplifie();
Expression * ds = droite_->simplifie();
if(typeid(*gs) == typeid(Nombre) && typeid(*ds) == typeid(Nombre)){
Nombre *cg = dynamic_cast<Nombre*>(gs);
Nombre *cd = dynamic_cast<Nombre*>(ds);
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;
}else if(typeid(*gs) == typeid(Nombre)){
Nombre *cast = dynamic_cast<Nombre*>(gs);
if (cast->getValue() == 0){
Nombre * mun = new Nombre(-1);
Multiplier * rep = new Multiplier(mun, ds);
res = rep;
}else {
Moins * rep = new Moins(gs, ds);
res = rep;
}
} else if(typeid(*ds) == typeid(Nombre)){
Nombre *cast = dynamic_cast<Nombre*>(ds);
if (cast->getValue() == 0){
res = gs;
} else {
Moins * rep = new Moins(gs, ds);
res = rep;
}
}else if(cg != nullptr && cg->getValue() == 0){
Nombre * mun = new Nombre(-1);
Multiplier * rep = new Multiplier(mun, ds);
res = rep;
} else if(cd != nullptr && cd->getValue() == 0){
res = gs;
} else {
Moins * rep = new Moins(gs, ds);
res = rep;
}
return res;
}
// MULTIPLIER
......@@ -252,45 +238,39 @@ Expression * Multiplier::simplifie() const{
Expression * res;
Expression * gs = gauche_->simplifie();
Expression * ds = droite_->simplifie();
if(typeid(*gs) == typeid(Nombre) && typeid(*ds) == typeid(Nombre)){
Nombre *cg = dynamic_cast<Nombre*>(gs);
Nombre *cd = dynamic_cast<Nombre*>(ds);
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;
}else if(typeid(*gs) == typeid(Nombre)){
Nombre *cast = dynamic_cast<Nombre*>(gs);
if (cast->getValue() == 0){
Nombre * rep = new Nombre(0);
res = rep;
} else {
Multiplier * rep = new Multiplier(gs,ds);
res = rep;
}
} else if(typeid(*ds) == typeid(Nombre)){
Nombre *cast = dynamic_cast<Nombre*>(ds);
if (cast->getValue() == 0){
Nombre * rep = new Nombre(0);
res = rep;
} else {
Multiplier * rep = new Multiplier(gs,ds);
res = rep;
}
}else if(cg != nullptr && cg->getValue() == 0){
Nombre * rep = new Nombre(0);
res = rep;
} else if(cd != nullptr && cd->getValue() == 0){
Nombre * rep = new Nombre(0);
res = rep;
} else {
Multiplier * rep = new Multiplier(gs,ds);
res = rep;
}
return res;
}
// DIVISER
Diviser::Diviser(Expression * gauche, Expression * droite) : Operateur(gauche, droite){
this->gauche_ = gauche->clone();
this->droite_ = droite->clone();
Nombre *cd = dynamic_cast<Nombre*>(droite);
try{
if(cd != nullptr && cd->getValue() == 0){
throw new int(10); // Detection de l'erreur
} else {
this->gauche_ = gauche->clone();
this->droite_ = droite->clone();
}
}catch(int const * i){
std::cerr << "Division par zero !" << std::endl; // Erreur, arrêt du programme
}
}
Expression * Diviser::derive(char nom) const{
......@@ -322,33 +302,18 @@ Expression * Diviser::simplifie() const{
Expression * res;
Expression * gs = gauche_->simplifie();
Expression * ds = droite_->simplifie();
if(typeid(*gs) == typeid(Nombre) && typeid(*ds) == typeid(Nombre))
{
Nombre *cg = dynamic_cast<Nombre*>(gs);
Nombre *cd = dynamic_cast<Nombre*>(ds);
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;
}
else if(typeid(*gs) == typeid(Nombre))
else if(cg != nullptr && cg->getValue() == 0)
{
Nombre *cast = dynamic_cast<Nombre*>(gs);
if (cast->getValue() == 0){
Nombre * rep = new Nombre(0);
res = rep;
} else {
Diviser * rep = new Diviser(gs,ds);
res = rep;
}
} else if(typeid(*ds) == typeid(Nombre)){
Nombre *cast = dynamic_cast<Nombre*>(ds);
if (cast->getValue() == 0){
std::cout << "Division par 0";
} else {
Diviser * rep = new Diviser(gs, ds);
res = rep;
}
Nombre * rep = new Nombre(0);
res = rep;
} else if(cd != nullptr && cd->getValue() == 0){
std::cout << "Division par 0";
} else {
Diviser * rep = new Diviser(gs, ds);
res = rep;
......
......@@ -57,7 +57,7 @@ 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;
......
......@@ -7,231 +7,28 @@
int main()
{
Nombre * zero = new Nombre(0);
std::cout << zero->nb_instances() << std::endl;
/*Nombre * zero = new Nombre(0);
Nombre * un = new Nombre(1);
Nombre * deux = new Nombre(2);
Nombre * trois = new Nombre(3);
Variable * x = new Variable('x');
Variable * y = new Variable('y');
Plus * p = new Plus(un, deux);
Moins * m = new Moins(deux, x);
std::cout << *m << std::endl;
Expression * mc = m->clone();
std::cout << *mc << std::endl;
Expression * ms = m->simplifie();
std::cout << *ms << std::endl;
Diviser * d = new Diviser(p,m);
std::cout << *d << std::endl;
Expression * ds = d->simplifie();
std::cout << *ds << std::endl;
Diviser * deuxsurx = new Diviser(deux, x);
Expression * ddeuxsurx = deuxsurx->derive('x');
std::cout << *deuxsurx << std::endl;
std::cout << *ddeuxsurx << std::endl;
Expression * deuxsurxs = deuxsurx->simplifie();
Expression * ddeuxsurxs = ddeuxsurx->simplifie();
std::cout << *deuxsurxs << std::endl;
std::cout << *ddeuxsurxs << std::endl;
Plus * deuxplusx = new Plus(deux,x);
Moins * deuxmoinsx = new Moins(deux,x);
Multiplier * prod = new Multiplier(deuxplusx,deuxmoinsx);
Expression * prodd = prod->derive('x');
std::cout << *prodd << std::endl;
/*Expression * prodds = prodd->simplifie();
std::cout << *prodds << std::endl;
*/
/*
Plus * zeropun = new Plus(zero, un);
Moins * deuxmx = new Moins(deux, x);
Multiplier * test = new Multiplier(zeropun, deuxmx);
Moins * zeromun = new Moins(zero, un);
Multiplier * test2 = new Multiplier(deuxplusx, zeromun);
std::cout << * test << std::endl;
Expression * tests = test->simplifie();
std::cout << * tests << std::endl;
std::cout << * test2 << std::endl;
Expression * test2s = test2->simplifie();
std::cout << * test2s << std::endl;
Expression * ttt = zeromun->simplifie();
std::cout << * ttt << std::endl;
Expression * tttt = deuxplusx->simplifie();
std::cout << * tttt << std::endl;*/
/*
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');
std::cout << "Affiche le nombre 2" << std::endl;
std::cout << "n = " << *nb << std::endl;
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');
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');
std::cout << "Dérivée de x par rapport à x : " << *dv << std::endl;
// Affichage du nombre d'instances
std::cout << "Nombre d'instances : " << dv->nb_instances() << std::endl;
// Test du comportement de Plus
Plus * p = new Plus(nb, v);
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();
std::cout << *sdp << std::endl;
Plus * pp = new Plus(nb,nb);
std::cout << *pp << std::endl;
Expression * pps = pp->simplifie();
std::cout << *pps << std::endl;
Plus * ppp = new Plus(pp,pp);
std::cout << *ppp << std::endl;
Expression *ppps = ppp->simplifie();
std::cout << *ppps << std::endl;
// 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;
std::cout << "Simplifie : " << std::endl;
Expression * sdm = dm->simplifie();
std::cout << *sdm << std::endl;
Moins * ppm = new Moins(nb,nb);
std::cout << *ppm << std::endl;
Expression * ppms = ppm->simplifie();
std::cout << *ppms << std::endl;
Moins * pppm = new Moins(pp,pp);
std::cout << *pppm << std::endl;
Expression *pppms = pppm->simplifie();
std::cout << *pppms << 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;
std::cout << "Simplifie : " << std::endl;
Expression * dmmms = dmmm->simplifie();
std::cout << *dmmms << 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 * ddds = ddd->simplifie();
std::cout << *ddds << std::endl;
Diviser * divn = new Diviser(nb,nb);
std::cout << *divn << std::endl;
Expression * divns = divn->simplifie();
std::cout << *divns << std::endl;
Expression * dddd = ddd->derive('x');
std::cout << "Dérivée de ((2 + x) * (2 - x)) : " << std::endl;
std::cout << *dddd << std::endl;
std::cout << "Simplifie : " << std::endl;
Expression * dddds = dddd->simplifie();
std::cout << *dddds << std::endl;
*/
Nombre * un = new Nombre(1);
Nombre * deux = new Nombre(2);
Nombre * trois = new Nombre(3);
std::cout << zero->nb_instances() << std::endl;
Variable * x = new Variable('x');
Variable * y = new Variable('y');
std::cout << zero->nb_instances() << std::endl;
Plus * unpx = new Plus(un, x);
std::cout << zero->nb_instances() << std::endl;
Diviser * xsury = new Diviser(x,y);
std::cout << zero->nb_instances() << std::endl;
Multiplier * test = new Multiplier(unpx,xsury);
std::cout << zero->nb_instances() << std::endl;
std::cout << "Expression à dériver : " << std::endl;
std::cout << *test << std::endl;
......@@ -250,8 +47,10 @@ int main()
std::cout << "Simplification : " << std::endl;
std::cout << *testys << std::endl;
//Diviser * divzero = new Diviser(un, zero);
//std::cout << *divzero << std::endl;
std::cout << test->nb_instances() << 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