コード例 #1
0
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;
    }
}