예제 #1
0
void CommandeSqr::execute()throw(LogMessage){
    savePileAvtExe();
    Constante * c;
    try{
        c =_pileCourante->depiler();
        if(typeid(*c)!=typeid(Complexe) && typeid(*c)!=typeid(Expression)){
            //clone la constante pour pas la modifier et empiler la rempiler la mauvaise version s'il y a un problème
            Constante* clone = c->clone();
            Nombre * nbClone = dynamic_cast<Nombre*>(clone);
            nbClone->sqr_();
            if(empilerNombre(nbClone))
                savePileApresExe();
            else
                _pileCourante->empilerConstante(c);
        }
        else if(typeid(*c)==typeid(Complexe)){
            Constante* clone = c->clone();
            Complexe* coClone = dynamic_cast<Complexe*>(clone);
            coClone->sqr();
            if(empilerComplexe(coClone))
                savePileApresExe();
            else
                _pileCourante->empilerConstante(c);
        }
        else{
            _pileCourante->empilerConstante(c);
            throw LogMessage("Impossible de faire un carré sur une Expression, Il faut d'abord l'évaluer",1);
        }
    }
    catch(LogMessage &msg){
        throw;
    }
}
예제 #2
0
void CommandeLn::execute()throw(LogMessage){
    savePileAvtExe();
    Constante * c;
    try{
        c=_pileCourante->depiler();
        if(typeid(*c)!=typeid(Complexe) && typeid(*c)!=typeid(Expression)){
            //clone la constante pour pas la modifier et empiler la rempiler la mauvaise version s'il y a un problème
            Constante* clone = c->clone();
            Nombre * n = dynamic_cast<Nombre*>(clone);
            n->ln_();
            if(empilerNombre(n))
                savePileApresExe();
            else
                _pileCourante->empilerConstante(c);
        }
        else{
            _pileCourante->empilerConstante(c);
            throw LogMessage("Impossible de faire un logarithme neperien sur un Complexe ou une Expression",1);
        }
    }
    catch(LogMessage &msg){
        throw;
    }
}
void OperateurPile::Execution()
{
    if (operation=="SWAP")
    {

        Constante * c1;
        Constante * c2;
        c1=Historique::GetInstance()->GetPileCalcul().Depiler();
        c2=Historique::GetInstance()->GetPileCalcul().Depiler();
        this->SWAP(c1, c2);

        QString opG=c1->ToQString();
        QString opD=c2->ToQString();


        LogSystem::GetInstance()->Publier(LogMessage("Echange de l'élément "+opG+" avec "+opD,2));
        delete c1;
        delete c2;


    }
    if (operation=="SUM")
    {
        Constante * c1=Historique::GetInstance()->GetPileCalcul().Depiler();
        Historique::GetInstance()->GetPileCalcul().Empiler(this->SUM(c1));

        QString opG=c1->ToQString();
        LogSystem::GetInstance()->Publier(LogMessage("Somme des "+opG+" premiers éléments",2));
        delete c1;

    }
    if (operation=="MEAN")
    {
        Entier * c1 =  dynamic_cast<Entier *>(Historique::GetInstance()->GetPileCalcul().Depiler());
        if (c1==NULL)
        {
            throw Exception("Erreur : Impossible de faire la moyenne d'un nombre non entier d'éléments.");
        }
        else
        {
            Constante * temp = this->SUM(c1);
            Historique::GetInstance()->GetPileCalcul().Empiler(temp->operator/(c1));
            delete temp;
            QString opG=c1->ToQString();
            LogSystem::GetInstance()->Publier(LogMessage("Moyenne des"+opG+" premiers éléments",2));
            delete c1;
        }

    }

    if (operation=="CLEAR")
    {
        /* Il faut penser à liberer la memoire quand on vide la pile*/

        PileCalcul& p=Historique::GetInstance()->GetPileCalcul();

        p.Vider();

        LogSystem::GetInstance()->Publier(LogMessage("La pile est vidée",2));



    }

    if (operation=="DUP")
    {
        Constante * temp = Historique::GetInstance()->GetPileCalcul().Depiler();
        Constante * cpy = temp->clone();
        Constante * cpy2 = temp->clone();
        delete temp;
        Historique::GetInstance()->GetPileCalcul().Empiler(cpy2);
        Historique::GetInstance()->GetPileCalcul().Empiler(cpy);

        LogSystem::GetInstance()->Publier(LogMessage("Dédoublement du premier élément de la Pile",2));
    }

    if (operation=="DROP")
    {
         delete Historique::GetInstance()->GetPileCalcul().Depiler();
        LogSystem::GetInstance()->Publier(LogMessage("Le premier élément de la pile a été effacé",2));
    }

}