예제 #1
0
Pile<T>& Pile<T>::pileResultat() const{
    Pile<T> p = this->clone();
    Pile<T> res;
    for(int i=0;i<p.size();i++) {
        if(p.at(i).isOperateur()) {
            if(p.at(i).isBinaire()) {
                p.DROP();
                p.DROP();
                p.DROP();
            }
            else { // unaire
                p.DROP();
                p.DROP();
            }
        }
        else {
            res.addPile(p.pop());
        }
    }
    delete p;
    Pile<T>& ref = res;
    return ref;
}
예제 #2
0
// fabrique soit une constante soit un opérateur (et l'éxécute).
void Calculatrice::fabriquer(const QString& text, enumType type) const {
    Pile* p = &Pile::getInstance();
    PileAffichage* pA = &PileAffichage::getInstance();

    switch (type) {
        case ENTIER:{
            Constante* res = new Entier(text.toInt());
            p->push(res);

            // ajout log dans le fichier de log
            LogSystem::add("Push dans la pile : " + res->toString(),FAIBLE);

            // on push dans la pile d'affichage
            pA->push(text);

            break;
        }
        case REEL:{
            Constante* res = new Reel(text.toDouble());
            p->push(res);

            // ajout log dans le fichier de log
            LogSystem::add("Push dans la pile : " + res->toString(),FAIBLE);

            // on push dans la pile d'affichage
            pA->push(text);


            break;
        }
        case RATIONNEL:{
            // séparation num / den
            QStringList tmp = text.split("/");
            Constante* res = new Rationnel(tmp.value(0).toInt(), tmp.value(1).toInt());
            p->push(res);

            // ajout log dans le fichier de log
            LogSystem::add("Push dans la pile : " + res->toString(),FAIBLE);

            // on push dans la pile d'affichage
            pA->push(text);


            break;
        }
        case COMPLEXE:{
            // séparation re  $  im
            QStringList tmp = text.split("$");

            // push la partie réelle du complexe
            if (this->isEntier(tmp.value(0))) {
                this->fabriquer(tmp.value(0),ENTIER);
            } else if (this->isReel(tmp.value(0))) {
                this->fabriquer(tmp.value(0),REEL);
            } else if (this->isRationnel(tmp.value(0))) {
                this->fabriquer(tmp.value(0),RATIONNEL);
            }

            // push la partie imaginaire du complexe
            if (this->isEntier(tmp.value(1))) {
                this->fabriquer(tmp.value(1),ENTIER);
            } else if (this->isReel(tmp.value(1))) {
                this->fabriquer(tmp.value(1),REEL);
            } else if (this->isRationnel(tmp.value(1))) {
                this->fabriquer(tmp.value(1),RATIONNEL);
            }

            // pop les deux parties
            const NonComplexe* c1 = dynamic_cast<const NonComplexe*>(p->pop());
            const NonComplexe* c2 = dynamic_cast<const NonComplexe*>(p->pop());

            // construction du complexe et push.
            Complexe* res = new Complexe(*c2, *c1);
            p->push(res);

            // ajout log dans le fichier de log
            LogSystem::add("Push dans la pile : " + res->toString(),FAIBLE);

            // on push dans la pile d'affichage
            pA->push(text);

            break;

        }
        case OPERATEUR:{
            Operateur* res = new Operateur(text);

            // ajout log dans le fichier de log
            LogSystem::add("Traitement opération : " + text,FAIBLE);

            // on push dans la pile d'affichage
            pA->push(text);

            res->effectuerOperation();
            break;
        }
        case EXPRESSION:{
            QString tmp(text);
            tmp.replace(QString("'"), QString(""));
            Constante* res = new Expression(tmp);
            p->push(res);

            // ajout log dans le fichier de log
            LogSystem::add("Push dans la pile : " + res->toString(),FAIBLE);

            // on push dans la pile d'affichage
            pA->push(text);

            break;
        }
        default:{
            QMessageBox::critical(0,"Erreur !", "Fabrication d'objet impossible!");
            // ajout log dans le fichier de log
            LogSystem::add("Fabrication d'objet impossible",ELEVEE);
            break;
        }
    }
}