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