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