Element& Complexe::operator*(Element& e) { if(typeid(e)==typeid(Expression)) { return *(new Expression(this->toQString() + " " + e.toQString() + ' * ')); } else { Complexe c = e.toComplexe(); Constante* c1 = this->getRe()->clone(); Constante* c2 = this->getIm()->clone(); Constante* cr = c.getRe()->clone(); Constante* ci = c.getIm()->clone(); /* (aa' - bb') + (ab' + a'b)*/ Constante& resr = dynamic_cast<Constante&>((c1->operator *(*cr)).operator -(c2->operator *(*ci))); Constante& resi = dynamic_cast<Constante&>((c1->operator *(*ci)).operator +(c2->operator *(*cr))); Complexe* res = new Complexe(&resr,&resi); qDebug()<<resr.toQString(); delete &c; delete c1; delete c2; delete cr; delete ci; return *res; } }
Element& Complexe::operator-(Element& e) { if(typeid(e)==typeid(Expression)) { return *(new Expression(this->toQString() + " " + e.toQString() + ' - ')); } else { Complexe* c = e.toComplexe(); Constante* c1 = this->getRe()->clone(); Constante* c2 = this->getIm()->clone(); Constante* c3 = c->getRe()->clone(); Constante* c4 = c->getIm()->clone(); Constante& c5 = dynamic_cast<Constante&>(c1->operator-(*(c3))); Constante& c6 = dynamic_cast<Constante&>(c2->operator -(*(c4))); Complexe* c7 = new Complexe(&c5,&c6); delete c; delete c1; delete c2; delete c3; delete c4; return *c7; } }
Element& Complexe::operator/(Element& e) { if(typeid(e)==typeid(Expression)) { return *(new Expression( this->toQString() + " " + e.toQString() + ' / ')); } else { Complexe* c = e.toComplexe(); Complexe* c_bar = c->conjugue(); Constante* c1 = this->getRe()->clone(); Constante* c2 = this->getIm()->clone(); Constante* c_barr = c_bar->getRe()->clone(); Constante* c_bari = c_bar->getIm()->clone(); Constante* module = c->module(); /*(Z1/Z2) = Z1*Z2bar / |Z2| */ Constante& resr = dynamic_cast<Constante&>(((c1->operator *(*c_barr)).operator -(c2->operator *(*c_bari))).operator /(module->operator *(*module))); Constante& resi = dynamic_cast<Constante&>(((c1->operator *(*c_bari)).operator +(c2->operator *(*c_barr))).operator /(module->operator *(*module))); Complexe* res = new Complexe(&resr,&resi); delete c; delete c_bar; delete c1; delete c2; delete c_barr; delete c_bari; delete module; return *res; } }
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; } }
bool Reel::egal(const LitteraleNombre& lit) const { const Complexe* ptComplexe = dynamic_cast<const Complexe*>(&lit); if (ptComplexe == nullptr) { const Entier* ptEntier = dynamic_cast<const Entier*>(&lit); // int + int = int if (ptEntier == 0) { //int + rationnel = rationnel const Rationnel* ptRationnel = dynamic_cast<const Rationnel*>(&lit); if (ptRationnel == 0) { //int + reel = reel const Reel* ptReel = dynamic_cast<const Reel*>(&lit); if (ptReel == 0) { CALCULATRICE_EXCEPTION("ERREUR: Dynamic_cast"); } else { if (this->value == ptReel->getValue()){ return true; } else { return false; } } } else { if (this->value == (static_cast<float>(ptRationnel->getNumerateur())/ptRationnel->getDenominateur())){ return true; } else { return false; } } } else { if (this->value == ptEntier->getValeur()){ return true; } else { return false; } } } else { Complexe* cplx = this->toComplexe(); if (cplx->getPartEnt()->egal(*ptComplexe->getPartEnt()) && cplx->getPartIm()->egal(*ptComplexe->getPartIm())){ return true; } else { return false; } } }
Element* Calculateur::sqr() { if(typeid(*this->pileC->top()) == typeid(Expression)) { throw std::logic_error("L'élément du huat de la pile est une expression"); } if(typeid(*this->pileC->top()) == typeid(Complexe)) { /*!< (a + bi)² = a² - b² + 2bai */ qDebug()<<"Complexe sqr"; Complexe* c = dynamic_cast<Complexe*>(this->pileC->pop()); this->pileC->push(c->getRe()->clone()); this->sqr(); this->pileC->push(c->getIm()->clone()); this->sqr(); this->sign(); this->pileC->push(c->getIm()->clone()); this->pileC->push(c->getRe()->clone()); this->pileC->push(new Entier(2)); delete c; this->multiplication(); this->multiplication(); qDebug()<<this->pileC->top()->toQString(); Complexe* im = dynamic_cast<Complexe*>(this->pileC->pop()); this->push(new Complexe(new Entier(0),im->getRe()->clone())); delete im; this->addition(); this->addition(); } else { Entier* e = new Entier(2); this->pileC->push(e); return pow(); } }
Complexe::Complexe(const Complexe & a) { complexe_type_contenu = a.complexe_type_contenu; genre = a.genre; switch(a.complexe_type_contenu) { case entier:{ _reel = new Entier(a.getReel()->getChain()); _img = new Entier(a.getIm()->getChain()); break; } case rationnel:{ _reel = new Rationnel(dynamic_cast<Rationnel*>(a.getReel())->getChain()); _img = new Rationnel(dynamic_cast<Rationnel*>(a.getIm())->getChain()); break; } case reel:{ _reel = new Reel(a.getReel()->getChain()); _img = new Reel(a.getIm()->getChain()); break; } default: break; } }
bool Pile::traitement(QString commande) // algo la plus difficile ! { if (commande.contains(QRegExp("\'")))// si on a une expression avec << ' >> { Element.push(new Constant(commande));// insere une valeur au sommet de la pile ??? Afficheur.push(commande); } else { QStringList list; // list est une liste de strings list = commande.split(QRegExp("\\s+")); // formation d'une liste de chaines separees par un espace for (int i=0;i<list.size();i++) // list.size() donne le nombre de strings de notre commande { //complexe Complexe* c; double tmp0; double tmp1; //QString s; if (list[i].contains("$")) { QStringList str=list[i].split("$"); // liste des chaines qui composent un complexe //le complexe contient des rationnels if (str[0].contains("/")|| str[1].contains("/")) { if(str[0].contains("/")) { if (str[1].contains("/")) // str[0] et str[0] contiennent '/' { QStringList vration0=str[0].split("/"); QStringList vration1=str[1].split("/"); tmp0=((vration0[0].toDouble())/(vration0[1].toInt())); tmp1=((vration1[0].toDouble())/(vration1[1].toInt())); } else // str[1] ne contient pas '/' { QStringList vration0=str[0].split("/"); tmp0=((vration0[0].toDouble())/(vration0[1].toInt())); if (str[1].contains(",")) { str[1].replace(",","."); } tmp1 = str[1].toDouble(); } } else { QStringList vration1=str[1].split("/"); tmp1=((vration1[0].toDouble())/(vration1[1].toInt())); if (str[0].contains(",")) { str[0].replace(",","."); } tmp0=str[0].toDouble(); } } //sans rationnel else { if (str[0].contains(",")) { str[0].replace(",","."); } if (str[1].contains(",")) { str[1].replace(",","."); } tmp0=str[0].toDouble(); tmp1=str[1].toDouble(); } c = new Complexe(tmp0,tmp1); Element.push(c); // Afficheur.push(c->getPropriete()); } else if(list[i].contains("/")) { QStringList str=list[i].split("/"); // str est Rationnel* r=new Rationnel(str[0].toInt(),str[1].toInt()); Element.push(r); Afficheur.push(r->getPropriete()); } else if(list[i].contains(",")) { QString str=list[i].replace(",","."); Reel *r=new Reel(str.toDouble()); Element.push(r); Afficheur.push(r->getPropriete()); } else if (list[i].contains(QRegExp("^[0-9]+$"))) { Entier* e=new Entier(list[i].toInt()); Element.push(e); // insere une valeur a la fin du <vector> Afficheur.push(e->getPropriete()); } else if(list[i].contains("+")) { OperationBinaire *op=new OperationBinaire(Element.pop(),Element.pop(),1); this->depiler_Aff(); this->depiler_Aff(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); } else if(list[i].contains("-")) { OperationBinaire *op=new OperationBinaire(Element.pop(),Element.pop(),2); Afficheur.pop(); Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); } else if(list[i].contains("*")) { OperationBinaire *op=new OperationBinaire(Element.pop(),Element.pop(),3); Afficheur.pop(); Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); } else if(list[i].contains("div")) { OperationBinaire *op=new OperationBinaire(Element.pop(),Element.pop(),4); Afficheur.pop(); Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); } else if(list[i].contains(QRegExp("(POW)"))) { Expression* ex1 = Element.pop(); // 1ere expression depilee Expression* ex2 = Element.pop(); // 2eme expression depilee OperationBinaire* op=new OperationBinaire(ex1,ex2,5); Afficheur.pop(); Afficheur.pop(); Element.push( op->evaluer2()); // QString s=op->evaluer2(); Afficheur.push(op->getResult()); /* *op=new OperationBinaire(Element.pop(),Element.pop(),5); Afficheur.pop(); Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult());*/ // delete op; // delete ex1; // delete ex2; } else if(list[i].contains(QRegExp("(POW)"))) { Expression* ex1 = Element.pop(); // 1ere expression depilee Expression* ex2 = Element.pop(); // 2eme expression depilee OperationBinaire* op=new OperationBinaire(ex1,ex2,5); Afficheur.pop(); Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); delete op; delete ex1; delete ex2; } /*else if(list[i].contains(QRegExp("(MOD)"))) { OperationBinaire *op=new OperationBinaire(Element.pop(),Element.pop(),6); Afficheur.pop(); Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); } */ else if(list[i].contains(QRegExp("(MOD)"))) { OperationBinaire *op=new OperationBinaire(Element.pop(),Element.pop(),6); Afficheur.pop(); Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); } else if(list[i] =="MOD") { OperationBinaire *op=new OperationBinaire(Element.pop(),Element.pop(),6); Afficheur.pop(); Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); } else if(list[i].contains(QRegExp("(SIGN)")))// inversion signe: choix 7 { OperationUnaire *op=new OperationUnaire(Element.pop(),7); Afficheur.pop(); //Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); } else if(list[i].contains(QRegExp("(SIN)")))// inversion signe: choix 7 { OperationUnaire *op=new OperationUnaire(Element.pop(),8); Afficheur.pop(); //Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); } else if(list[i].contains(QRegExp("(COS)")))// inversion signe: choix 7 { OperationUnaire *op=new OperationUnaire(Element.pop(),9); Afficheur.pop(); //Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); } else if(list[i].contains(QRegExp("(TAN)")))// inversion signe: choix 7 { OperationUnaire *op=new OperationUnaire(Element.pop(),10); Afficheur.pop(); //Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); } else if(list[i].contains(QRegExp("(SINH)")))// inversion signe: choix 7 { OperationUnaire *op=new OperationUnaire(Element.pop(),11); Afficheur.pop(); //Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); } else if(list[i].contains(QRegExp("(COSH)")))// inversion signe: choix 7 { OperationUnaire *op=new OperationUnaire(Element.pop(),12); Afficheur.pop(); //Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); } else if(list[i].contains(QRegExp("(TANH)")))// inversion signe: choix 7 { OperationUnaire *op=new OperationUnaire(Element.pop(),13); Afficheur.pop(); //Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); } else if(list[i].contains(QRegExp("(LN)")))// inversion signe: choix 7 { OperationUnaire *op=new OperationUnaire(Element.pop(),14); Afficheur.pop(); //Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); } else if(list[i].contains(QRegExp("(LOG)")))// inversion signe: choix 7 { OperationUnaire *op=new OperationUnaire(Element.pop(),15); Afficheur.pop(); //Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); } else if(list[i].contains(QRegExp("(INV)")))// inversion signe: choix 7 { OperationUnaire *op=new OperationUnaire(Element.pop(),16); Afficheur.pop(); //Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); } else if(list[i].contains(QRegExp("(SQRT)")))// inversion signe: choix 7 { OperationUnaire *op=new OperationUnaire(Element.pop(),17); Afficheur.pop(); //Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); } else if(list[i].contains(QRegExp("(SQR)")))// inversion signe: choix 7 { OperationUnaire *op=new OperationUnaire(Element.pop(),18); Afficheur.pop(); //Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); } else if(list[i].contains(QRegExp("(CUBE)")))// inversion signe: choix 7 { OperationUnaire *op=new OperationUnaire(Element.pop(),19); Afficheur.pop(); //Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); } else if(list[i].contains(QRegExp("(fact)")))// inversion signe: choix 7 { OperationUnaire *op=new OperationUnaire(Element.pop(),20); Afficheur.pop(); //Afficheur.pop(); Element.push( op->evaluer2()); Afficheur.push(op->getResult()); } else { //QLabel msg; // msg.setText("Erreur inconnue"); // msg.show(); //qDebug() << QString(" Erreur : on a une erreur dans l'algorithme") ; throw("erreur: le traitement n'a pas marché"); return false; } }// fin pour } // fin si return true; }
double modC(Complexe arg1)//=reel²+imaginaire² sert surtout pour comparer {return arg1.getRe()*arg1.getRe()+arg1.getIm()*arg1.getIm();}
Complexe::Complexe(const Complexe& arg):_re(arg.getRe()),_im(arg.getIm()){}
Complexe Complexe::operator=(Complexe& e){delete &p_reelle;delete &p_imaginaire;p_reelle=*e.getPartieReelle();p_imaginaire=*e.getPartieImaginaire();return *this;}
// 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; } } }