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;

    }
}
示例#4
0
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();
    }
}
示例#7
0
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;
    }
}
示例#8
0
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;
}
示例#9
0
double modC(Complexe arg1)//=reel²+imaginaire² sert surtout pour comparer
        {return arg1.getRe()*arg1.getRe()+arg1.getIm()*arg1.getIm();}
示例#10
0
Complexe::Complexe(const Complexe& arg):_re(arg.getRe()),_im(arg.getIm()){}
示例#11
0
Complexe Complexe::operator=(Complexe& e){delete &p_reelle;delete &p_imaginaire;p_reelle=*e.getPartieReelle();p_imaginaire=*e.getPartieImaginaire();return *this;}
示例#12
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;
        }
    }
}