void CommandeDivision::execute()throw(LogMessage){ savePileAvtExe(); Constante* c1; Constante* c2; try{ c1 = _pileCourante->depiler(); c2 = _pileCourante->depiler(); if(typeid(*c1)==typeid(Expression) && typeid(*c2)==typeid(Expression)){ throw LogMessage("addition(): impossible d'appliquer un operateur sur 2 expressions",1); } if (typeid(*c1)==typeid(Expression)){ Expression* oldExpr=dynamic_cast<Expression*>(c1); QString oldChaine=oldExpr->getExp(); QString newChaine; if(typeid(*c2)!=typeid(Complexe)){ Nombre* nb=dynamic_cast<Nombre*>(c2); newChaine = nb->toQString(); } else{ Complexe* nb=dynamic_cast<Complexe*>(c2); newChaine = nb->toQString(); } oldChaine.remove(oldChaine.length()-1,1); _pileCourante->empilerExpression(oldChaine.append(" "+newChaine+" "+'/'+'\'')); } else if (typeid(*c2)==typeid(Expression)){ Expression* oldExpr=dynamic_cast<Expression*>(c2); QString oldChaine=oldExpr->getExp(); QString newChaine; if(typeid(*c1)!=typeid(Complexe)){ Nombre* nb=dynamic_cast<Nombre*>(c1); newChaine = nb->toQString(); } else{ Complexe* nb=dynamic_cast<Complexe*>(c1); newChaine = nb->toQString(); } oldChaine.remove(oldChaine.length()-1,1); _pileCourante->empilerExpression(oldChaine.append(" "+newChaine+" "+'/'+'\'')); } else{ if(_utilisateur->useComplexe()){ Complexe *co1; Complexe *co2; if(typeid(*c1)==typeid(Complexe)) co1 =dynamic_cast<Complexe*>(c1); else if(typeid(*c1)==typeid(Entier)){ Entier* nb = dynamic_cast<Entier*>(c1); co1 = nb->toComplexe(); } else if(typeid(*c1)==typeid(Rationnel)){ Rationnel* nb = dynamic_cast<Rationnel*>(c1); co1 = nb->toComplexe(); } else if(typeid(*c1)==typeid(Reel)){ Reel* nb = dynamic_cast<Reel*>(c1); co1 = nb->toComplexe(); } if(typeid(*c2)==typeid(Complexe)) co2 = dynamic_cast<Complexe*>(c2); else if(typeid(*c2)==typeid(Entier)){ Entier* nb = dynamic_cast<Entier*>(c2); co2 = nb->toComplexe(); } else if(typeid(*c2)==typeid(Rationnel)){ Rationnel* nb = dynamic_cast<Rationnel*>(c2); co2 = nb->toComplexe(); } else if(typeid(*c2)==typeid(Reel)){ Reel* nb = dynamic_cast<Reel*>(c2); co2 = nb->toComplexe(); } if(_utilisateur->useEntier()){ co1->attrToEntier(); co2->attrToEntier(); } else if(_utilisateur->useRationnel()){ co1->attrToRationnel(); co2->attrToRationnel(); } else if(_utilisateur->useReel()){ co1->attrToReel(); co2->attrToReel(); } if(co1->getReel()==0 && co2->getImg()==0) throw LogMessage("division(): impossible de diviser par 0",1); else{ Complexe * res = *(co1)/co2; _pileCourante->empilerConstante(res); savePileApresExe(); } } else{ if(typeid(*c1)==typeid(Complexe) || typeid(*c2)==typeid(Complexe)) throw LogMessage("division(): impossible de convertir un complexe en un autre type de constante, cochez complexe",1); if(_utilisateur->useEntier()){ Entier *e1; Entier *e2; int choix=QMessageBox::Ok; if(typeid(*c1)!=typeid(Expression)&& typeid(*c2)!=typeid(Expression)){ if(typeid(*c1)==typeid(Reel) || typeid(*c1)==typeid(Rationnel) || typeid(*c2)==typeid(Reel) || typeid(*c2)==typeid(Rationnel)){ choix=continuer(); } if(choix==QMessageBox::Ok){ Nombre * n1 = dynamic_cast<Nombre*>(c1); e1 = n1->toEntier(); Nombre * n2 = dynamic_cast<Nombre*>(c2); e2 = n2->toEntier(); if (e2->getNb()==0) throw LogMessage("division(): impossible de diviser par 0",1); else{ Entier * res = *(e1)/e2; _pileCourante->empilerConstante(res); savePileApresExe(); } } else{ _pileCourante->empilerConstante(c2); _pileCourante->empilerConstante(c1); } } else{ _pileCourante->empilerConstante(c2); _pileCourante->empilerConstante(c1); throw LogMessage("division() : La constante doit être un nombre",1); } } else if(_utilisateur->useRationnel()){ Rationnel *ra1; Rationnel *ra2; int choix=QMessageBox::Ok; if(typeid(*c1)!=typeid(Expression) && typeid(*c2)!=typeid(Expression)){ if(typeid(*c1)==typeid(Reel) || typeid(*c2)==typeid(Reel)){ choix=continuer(); } if(choix==QMessageBox::Ok){ Nombre * n1 = dynamic_cast<Nombre*>(c1); Nombre * n2 = dynamic_cast<Nombre*>(c2); ra1 = n1->toRationnel(); ra2 = n2->toRationnel(); } else{ _pileCourante->empilerConstante(c2); _pileCourante->empilerConstante(c1); throw LogMessage("division() : La constante doit être un nombre",1); } if(ra2->getNum()==0) throw LogMessage("division(): impossible de diviser par 0",1); else{ Rationnel * res = *(ra1)/ra2; _pileCourante->empilerConstante(res); savePileApresExe(); } } } else if(_utilisateur->useReel()){ Reel *re1; Reel *re2; int choix=QMessageBox::Ok; if(typeid(*c1)!=typeid(Expression) && typeid(*c2)!=typeid(Expression)){ if(typeid(*c1)==typeid(Rationnel) || typeid(*c2)==typeid(Rationnel)){ choix=continuer(); } if(choix==QMessageBox::Ok){ Nombre * n1 = dynamic_cast<Nombre*>(c1); Nombre * n2 = dynamic_cast<Nombre*>(c2); re1 = n1->toReel(); re2 = n2->toReel(); } else{ _pileCourante->empilerConstante(c2); _pileCourante->empilerConstante(c1); throw LogMessage("division() : La constante doit être un nombre",1); } if(re2->getReel()==0) throw LogMessage("division(): impossible de diviser par 0",1); else{ Reel * res = *(re1)/re2; _pileCourante->empilerConstante(res); savePileApresExe(); } } } else{ _pileCourante->empilerConstante(c2); _pileCourante->empilerConstante(c1); throw LogMessage("Type utilisé non reconnu",1); } } } } catch(LogMessage msg){ //La pile ne contenait pas au moins 2 éléments if(c2!=0) _pileCourante->empilerConstante(c2); if(c1!=0) _pileCourante->empilerConstante(c1); throw; } }