Beispiel #1
0
Constante& Rationnel::operator^(const Constante& c)const//pas sûr
{
    const Entier* e = dynamic_cast<const Entier*>(&c);
    const Reel* r = dynamic_cast<const Reel*>(&c);
    const Rationnel* f = dynamic_cast<const Rationnel*>(&c);

    if(e!=0)
    {
        Rationnel* res = new Rationnel((int)pow((float)num, (int)*e), (int)pow((float)den, (int)*e));
        return *res;
    }
    else if(r!=0)
    {
        Reel* res = new Reel(pow((float)num/den, (float)*r));
        return *res;
    }
    else if(f!=0)
    {
        Reel* res = new Reel(pow(pow((float)num/den, f->GetNum()), -f->GetDen()));
        return *res;
    }
    else
    {
        throw CalcException("L'opération de puissance nécessite que l'exposant soit un entier, un rationnel ou un réel");
    }
}
Beispiel #2
0
void AtomeManager::removeAtome(Atome& e){
    unsigned int i=0;
    while(i<nb && ats[i]!=&e) i++;
    if (i==nb) throw CalcException("elimination d'une Atome inexistante");
    delete ats[i];
    i++;
    while(i<nb) { ats[i-1]=ats[i]; i++; }
    nb--;
}
Beispiel #3
0
Constante& Rationnel::inverse()const
{
    if(num!=0)
    {
        Rationnel* res = new Rationnel(den, num);
        return *res;
    }
    else
        throw CalcException("L'opération d'inverse est impossible avec zéro");
}
Beispiel #4
0
Constante& Rationnel::racine()const
{
    if((num>0 && den>0) || (num<=0 && den<=0))
    {
        Reel* res = new Reel(sqrt((float)num/den));
        return *res;
    }
    else
        throw CalcException("L'opération de racine carrée nécessite une valeur positive");
}
Beispiel #5
0
Expression::operator Complexe()const
{
    try
    {
        throw CalcException("Impossible de convertir une expression en un Complexe.");
    }
    catch (CalcException c)
    {
        c.alert();
    }
}
Beispiel #6
0
Expression::operator Rationnel()const
{
    try
    {
        throw CalcException("Impossible de convertir une expression en un Rationnel.");
    }
    catch (CalcException c)
    {
        c.alert();
    }
}
Beispiel #7
0
Constante& Rationnel::lognep()const
{
    if((num>0 && den>0) || (num<=0 && den<=0))
    {
        Reel* res = new Reel(log((float)num/den));
        return *res;
    }
    else
    {
        throw CalcException("L'opération de logarithme nécessite que l'opérateur soit positif");
    }
}
Beispiel #8
0
Constante& Rationnel::operator+(const Constante& c)const//ADAPTER A FAIRE
{
    const Rationnel* r = dynamic_cast<const Rationnel*>(&c);
    if(r!=0)
    {
        Rationnel* res = new Rationnel(num*r->GetDen() + r->GetNum()*den, den*r->GetDen());
        return *res;
    }
    else
    {
        throw CalcException("L'opération d'addition nécessite que les deux opérateurs soient de même type");
    }
}
Beispiel #9
0
Constante& Rationnel::operator/(const Constante& c)const
{
    const Rationnel* r = dynamic_cast<const Rationnel*>(&c);
    if(r!=0)
    {
        Rationnel* res = new Rationnel(num*r->GetDen(), den*r->GetNum());
        return *res;
    }
    else
    {
        throw CalcException("L'opération de division nécessite que les deux opérateurs soient de même type");
    }
}
Beispiel #10
0
// ----- Soustraction -----
LitteraleCalculable& Entier::diff(const LitteraleCalculable& l) const{
    const Entier* ptEntier = dynamic_cast<const Entier*>(&l);

    if (ptEntier != 0){
        // Entier - Entier
        Entier* res = new Entier(value - ptEntier->getValue());
        LitteraleCalculable& ref = *res;
        return ref;
    }
    else{
        const Rationnel* ptRationnel = dynamic_cast<const Rationnel*>(&l);
        if (ptRationnel!= 0){
            // Entier - Rationnel
            Entier num = (value*ptRationnel->getDen().getValue()-ptRationnel->getNum().getValue());
            Entier den = (ptRationnel->getDen().getValue());
            Rationnel* res = new Rationnel(num,den);

            LitteraleCalculable& ref = *res;
            return ref;
        }
        else {
            const Reel* ptReel = dynamic_cast<const Reel*>(&l);
            if (ptReel!=0){
                // Entier - Reel
                Reel* res= new Reel(value-ptReel->getValue());
                LitteraleCalculable& ref = *res;
                return ref;
            }else{
                const Expression* ptExpression=dynamic_cast<const Expression*>(&l);
                if (ptExpression!=0){
                        // Entier + Expression
                        LitteraleCalculable& ref = ptExpression->diff(*this);
                        return ref;
                   }else{
                    const Complexe* ptComplexe = dynamic_cast<const Complexe*>(&l);
                    if (ptComplexe!=0){
                            // Entier / Complexe
                            LitteraleCalculable& ref = ptComplexe->diff(*this);
                            return ref;
                    }
                }
            }
        }
    }
    throw CalcException("le type de l'argument 2 n'est pas reconnu");
    Entier* res = new Entier();
    LitteraleCalculable& ref = *res;
    return ref;
}
Beispiel #11
0
/*!
  On verifie que la valeur de l'argument implicite soit superieure a 0.
  \return Une reference sur une Constante contenant notre nouveau Rationnel.
  \sa CalcException
  \sa Reel
  \sa <a href = "http://www.cplusplus.com/reference/clibrary/cmath/log10/">log10</a>
*/
Constante& Rationnel::logdec()const
{
    try {
    if((num>0 && den>0) || (num<=0 && den<=0))
    {
        Reel* res = new Reel(log10((float)num/den));
        return *res;
    }
    else
    {
        throw CalcException("L'opération de logarithme nécessite que l'opérateur soit positif");
    }
    }
    catch (CalcException c)
    {
        c.alert();
    }
}
Beispiel #12
0
/*!
  On verifie que le numerateur de l'argument implicite soit differente de 0.
  \return Une reference sur une Constante contenant notre nouveau Rationnel.
  \sa CalcException
*/
Constante& Rationnel::inverse()const
{
    try
    {
        if(num!=0)
        {
            Rationnel* res = new Rationnel(den, num);
            res->simplifier();
            return *res;
        }
        else
            throw CalcException("L'opération d'inverse est impossible avec zéro");
    }
    catch (CalcException c)
    {
        c.alert();
    }
}
Beispiel #13
0
/*!
  \param c Une reference constante vers une Constante.
  \return Une reference sur une Constante contenant notre nouveau Rationnel.
  \sa CalcException
  \sa <a href="http://www.cplusplus.com/reference/clibrary/cmath/pow/">pow</a>
*/
Constante& Rationnel::operator^(const Constante& c)const
{
    try
    {
        const Rationnel* r = dynamic_cast<const Rationnel*>(&c);
        if(r!=0)
        {
            Rationnel* res = new Rationnel((int)pow((float)num, (float)(r->GetNum()/r->GetDen())), (int)pow((float)den, (float)(r->GetNum()/r->GetDen())));
            res->simplifier();
            return *res;
        }
        else
            throw CalcException("L'opération d'elevation à l'exposant nécessite que les deux opérandes soient de même type");
    }
    catch (CalcException c)
    {
        c.alert();
    }
}
Beispiel #14
0
/*!
  \param c Une reference constante vers une Constante.
  \return Une reference sur une Constante contenant notre nouveau Rationnel.
  \sa CalcException
*/
Constante& Rationnel::operator*(const Constante& c)const
{
    try
    {
        const Rationnel* r = dynamic_cast<const Rationnel*>(&c);
        if(r!=0)
        {
            Rationnel* res = new Rationnel(num*r->GetNum(), den*r->GetDen());
            res->simplifier();
            return *res;
        }
        else
        {
            throw CalcException("L'opération de multiplication nécessite que les deux opérateurs soient de même type");
        }
    }
    catch (CalcException c)
    {
        c.alert();
    }
}
Beispiel #15
0
Constante& Constante::operator*(const Constante&)const
{
    throw CalcException("On ne peut pas multiplier deux expressions");
}
Beispiel #16
0
Constante& Constante::operator/(const Constante&)const
{
    throw CalcException("On ne peut pas diviser deux expressions");
}
Beispiel #17
0
Constante& Constante::logdec()const
{
    throw CalcException("On ne peut pas appliquer le logarithme décimal à une expression ou à un complexe");
}
Beispiel #18
0
LitteraleCalculable& Entier::quotient(const LitteraleCalculable& l) const{
    const Entier* ptEntier = dynamic_cast<const Entier*>(&l);

    if (ptEntier != 0){
        // Entier / Entier
        //if(ptEntier->getValue() == 0)

        int type = simplifier(*this, *ptEntier);

        if (type == 0){//non simplifiable
            Rationnel* res = new Rationnel(value, ptEntier->getValue());

            LitteraleCalculable& ref = *res;
            return ref;
        }
        if (type == 1) {
            Entier* res = new Entier(value / ptEntier->getValue());
            LitteraleCalculable& ref = *res;
            return ref;
        }
    }else{
        const Rationnel* ptRationnel = dynamic_cast<const Rationnel*>(&l);

        if (ptRationnel!= 0){
            // Entier / Rationnel
            if(ptRationnel->getNum().getValue() == 0) throw CalcException("dividion par 0 impossible");

            Entier num = (value * ptRationnel->getDen().getValue());
            Entier den = (ptRationnel->getNum().getValue());
            Rationnel* res = new Rationnel(num, den);

           // res->simplifier();
            LitteraleCalculable& ref = *res;
            return ref;
        }
        else {
            const Reel* ptReel = dynamic_cast<const Reel*>(&l);

            if (ptReel!=0){
                // Entier / Reel
                if(ptReel->getValue() == 0) throw CalcException("division par 0 impossible");


                Reel* res = new Reel(value / ptReel->getValue());
                LitteraleCalculable& ref = *res;
                return ref;
            }else{
                const Expression* ptExpression=dynamic_cast<const Expression*>(&l);
                if (ptExpression!=0){
                        // Entier + Expression
                        LitteraleCalculable& ref = ptExpression->quotient(*this);
                        return ref;
                   }else{
                        const Complexe* ptComplexe = dynamic_cast<const Complexe*>(&l);
                        if (ptComplexe!=0){
                        // Entier / Complexe
                        LitteraleCalculable& ref = ptComplexe->quotient(*this);
                        return ref;
                        }
                    }
            }
        }
    }



    throw CalcException("le type de l'argument 2 n'est pas reconnu");
    Entier* res = new Entier();
    LitteraleCalculable& ref = *res;
    return ref;
}
Beispiel #19
0
Constante& Constante::operator^(const Constante&)const
{
    throw CalcException("On ne peut pas élever à la puissance deux expressions ou deux complexes");
}
Beispiel #20
0
Constante& Constante::sinus()const
{
    throw CalcException("On ne peut pas appliquer le sinus à une expression ou à un complexe");
}
Beispiel #21
0
Constante& Constante::cube()const
{
    throw CalcException("On ne peut pas appliquer le cube à une expression");
}
Beispiel #22
0
Constante& Constante::cosinush()const
{
    throw CalcException("On ne peut pas appliquer le cosinus hyperbolique à une expression ou à un complexe");
}
Beispiel #23
0
Constante& Constante::inverse()const
{
    throw CalcException("On ne peut pas appliquer l'inverse à une expression ou à un complexe");
}
Beispiel #24
0
Constante& Constante::operator-(const Constante&)const
{
    throw CalcException("On ne peut pas soustraire deux expressions");
}
Beispiel #25
0
Constante& Constante::lognep()const
{
    throw CalcException("On ne peut pas appliquer le logarithme népérien à une expression ou à un complexe");
}
Beispiel #26
0
Constante& Constante::operator-()const
{
    throw CalcException("On ne peut pas inverser le signe d'une expression");
}
Beispiel #27
0
LitteraleCalculable& Entier::mult(const LitteraleCalculable& l) const{
    const Entier* ptEntier = dynamic_cast<const Entier*>(&l);

    if (ptEntier != 0){
        // Entier * Entier
        Entier* res = new Entier(value * ptEntier->getValue());
        LitteraleCalculable& ref = *res;
        return ref;
    }
    else{
        const Rationnel* ptRationnel = dynamic_cast<const Rationnel*>(&l);

        if (ptRationnel!= 0){
            // Entier * Rationnel
            Entier num = (value * ptRationnel->getNum().getValue());
            Entier den = (ptRationnel->getDen().getValue());

            int type = simplifier(num, den);

            if (type == 0){
                Rationnel* res = new Rationnel(num,den);

                LitteraleCalculable& ref = *res;
                return ref;
            }
            if (type == 1) {
                Entier v = num.div(den);
                Entier* res = new Entier(v.getValue());
                LitteraleCalculable& ref = *res;//spl->simplifier(res);
                return ref;
            }
        }
        else {
            const Reel* ptReel = dynamic_cast<const Reel*>(&l);
            if (ptReel!=0){
                // Entier * Reel
                Reel* res= new Reel(value * ptReel->getValue());
                LitteraleCalculable& ref = *res;
                return ref;
            }else{
                const Expression* ptExpression=dynamic_cast<const Expression*>(&l);
                if (ptExpression!=0){
                        // Entier * Expression
                        LitteraleCalculable& ref = ptExpression->mult(*this);
                        return ref;
                   }else{
                    const Complexe* ptComplexe = dynamic_cast<const Complexe*>(&l);
                    if (ptComplexe!=0){
                            // Entier * Complexe
                            LitteraleCalculable& ref = ptComplexe->mult(*this);
                            return ref;
                    }
                }
            }
        }
    }
    throw CalcException("le type de l'argument 2 n'est pas reconnu");
    Entier* res = new Entier();
    LitteraleCalculable& ref = *res;
    return ref;
}
Beispiel #28
0
Constante& Constante::operator+(const Constante&)const
{
    throw CalcException("On ne peut pas ajouter deux expressions");
}
Beispiel #29
0
Constante& Constante::racine()const
{
    throw CalcException("On ne peut pas appliquer la racine carrée à une expression ou à un complexe");
}
Beispiel #30
0
Constante& Constante::tangenteh()const
{
    throw CalcException("On ne peut pas appliquer la tangente hyperbolique à une expression ou à un complexe");
}