Exemplo n.º 1
0
/* routine for the "iran[low,high]" ascanf syntax	*/
int dm_example_irandom ( ASCB_ARGLIST )
{ ASCB_FRAME
  int r;
  int av= ascanf_verbose;
  double rnd;
 
	ascanf_verbose= 1;
  	r= ascanf_random( ASCB_ARGUMENTS );
	rnd= *result;
	*result= Entier( *result );
	if( av ){
		fputc( '\n', StdErr );
	}
	fprintf( StdErr, "#I%d: \tEnt[ ran", *level );
	if( ascanf_arguments ){
	  int i;
		fputc( '[', StdErr );
		fprintf( StdErr, "%s", ad2str( args[0], d3str_format, 0) );
		for( i= 1; i< ascanf_arguments; i++ ){
			fprintf( StdErr, ",%s", ad2str( args[i], d3str_format, 0) );
		}
		fputc( ']', StdErr );
	}
	fprintf( StdErr, "== %s ]== ", ad2str( rnd, d3str_format,0) );
	if( !av ){
		fprintf( StdErr, "%s\n", ad2str( *result, d3str_format,0) );
	}
	ascanf_verbose= av;
	return(r);
}
Exemplo n.º 2
0
Nombre& Entier::division(const Nombre& n) const {
    // Nombre -> Entier
    const Entier* ptEntier = dynamic_cast<const Entier*>(&n);
    if (ptEntier == 0) {
        // Nombre -> Reel
        const Reel* ptReel = dynamic_cast<const Reel*>(&n);
        if (ptReel == 0) {
            // Nombre -> Rationnel
            const Rationnel* ptRationnel = dynamic_cast<const Rationnel*>(&n);
            if (ptRationnel == 0) {
                throw CalculatriceException("Entier : division : Impossible d'effectuer le dynamic cast!");
            } else { //  Entier / Rationnel
                if (ptRationnel->getNum().getX()/ptRationnel->getDen().getX()==0) {
                    throw CalculatriceException("Entier : division : Division par 0");
                }
                Entier num = Entier(mX  * ptRationnel->getDen().getX());
                Entier den = Entier(ptRationnel->getNum().getX());
                Rationnel* res= new Rationnel(num.toEntier(), den.toEntier());
                res->simplifier();
                Nombre& ref = *res;
                return(ref);
            }
        } else { // Entier / Reel
            if (ptReel->getX()==0) {
                throw CalculatriceException("Entier : division : Division par 0");
            }
            Nombre& ref = this->division(ptReel->toRationnel());
            return(ref);
        }
    } else { // Entier / Entier
        if (ptEntier->getX()==0) {
            throw CalculatriceException("Entier : division : Division par 0");
        }
        Reel* res = new Reel(mX / ptEntier->getX());
        Nombre& ref = *res;
        return(ref);
    }
}
Exemplo n.º 3
0
Expression::operator Complexe()const
{
    //exception
    return Complexe(&Entier(0), &Entier(0));
}
Exemplo n.º 4
0
Expression::operator Entier()const
{
    //exception
    return Entier(0);
}
Exemplo n.º 5
0
void OperateurBinaire::Calculer(Pile* stack){

    Donnee* dB= stack->depiler();                           // On commence par depiler les 2 dernieres donnees entrees. B est la derniere donne empile, donc le second membre de l'operation. La seconde donne empile est le premier membre, A.
    Donnee* dA= stack->depiler();

    Expression* testExA =dynamic_cast<Expression*>(dA);     // On verifie d'abord si l'une des 2 donnees n'est pas une expression. Il faudra alors cancatener l'expression avec l'autre donnee et l'operateur.
    Expression* testExB =dynamic_cast<Expression*>(dB);

    if (testExA) {
        testExA->enfiler_fin(dB);
        testExA->enfiler_fin(this);                           // Si le premier membre est une expression, il faut enfiler le second membre et l'operateur à la fin successivement.
        stack->empiler(testExA);
    }

    else if (testExB) {
           testExB->enfiler_debut(dA);
           testExB->enfiler_fin(this);                          // Si le second membre est une expression et que le premier ne l'est pas, il faut enfiler le premier membre au début de B, et l'operateur à la fin.
           stack->empiler(testExB);
         }
    else {

    Complexe* testC1 = dynamic_cast< Complexe*>(dA);
    Complexe* testC2 = dynamic_cast< Complexe*>(dB);
    Reel* test1 = dynamic_cast< Reel*>(dA);
    Reel* test2 = dynamic_cast< Reel*>(dB);
    Rationnel* test3 = dynamic_cast< Rationnel*>(dA);
    Rationnel* test4 = dynamic_cast< Rationnel*>(dB);
    Entier* testE1 = dynamic_cast< Entier*>(dA);
    Entier* testE2 = dynamic_cast< Entier*>(dB);


    if ( testC1 || testC2){                 //On a au moins un complexe. On travaille donc avec des complexes.

        Complexe A= Complexe(dA);           // constructeur de complexe a partir de donnee.
        Complexe B= Complexe(dB);

            switch (typeoperation) {        // Switch selon le type de l'operation, attribut de l'operateurBinaire.

                case (PLUS):
                {
                    Complexe *X= new Complexe(A+B);
                    stack->empiler(X);
                }

                    break;

                case(MINUS):
                {
                    Complexe *X= new Complexe(A-B);
                    stack->empiler(X);
                }
                    break;


                case(DIV):
                {
                if (B.CNull()){                                         // Cas ou une division par zero est tentée.
                                     stack->empiler(dA);
                                     stack->empiler(dB);
                                     throw CalculException("Division par zero impossible.");
                               }

                else {

                        Complexe *X= new Complexe(A/B);
                        stack->empiler(X);
                     }
                }
                    break;

                case (MULT):
                {
                    Complexe *X= new Complexe(A*B);
                    stack->empiler(X);
                }
                    break;

                case(MODULO):
                {
                    stack->empiler(dA);                         // Modulo inappliquable sur complexes. On re-empile donc les donnees dans le bon ordre.
                    stack->empiler(dB);
                    throw CalculException("Modulo inappliquable pour Complexe.\nFonction utilisable avec Entier uniquement.");
                }
                    break;

                case (POW):
                {
                    stack->empiler(dA);
                    stack->empiler(dB);
                    throw CalculException("POW inappliquable pour Complexe.");
                }

                    break;

            }
    }

    else if ( test1 || test2 ) {     //Au moins un reel

        Reel A=Reel(dA);
        Reel B=Reel(dB);

        Reel* dC = new Reel;

        switch (typeoperation) {
            case (PLUS):
                        {
                                    *dC=(A+B);
                                    stack->empiler(dC);
                        }
                break;

            case(MINUS):
                        {
                                    *dC=(A-B);
                                    stack->empiler(dC);
                        }

                break;

            case(DIV):
                        {

                            if (B.getVal()==0){                                         //Cas ou une division par zero est tentée.
                                                stack->empiler(dA);
                                                stack->empiler(dB);
                                                throw CalculException("Division par zero impossible.");
                                            }

                            else {
                                *dC=(A/B);
                                stack->empiler(dC);
                                }
                        }

                break;

            case (MULT):
                        {
                                    *dC=(A*B);
                                    stack->empiler(dC);
                        }

                break;

            case(MODULO):
        {
            stack->empiler(dA);
            stack->empiler(dB);
            throw CalculException("Modulo inappliquable pour Reel.\nFonction utilisable avec Entier uniquement.");
        }

                break;

            case (POW):
        {
                    *dC=(A*B);
                    *dC=Reel(pow(A.getVal(),B.getVal()));
                    stack->empiler(dC);
        }

                break;

        }
    }

    else if ( test3 || test4 ) {        //Au moins un rationnel

        Rationnel A=Rationnel(dA);
        Rationnel B=Rationnel(dB);

        Rationnel* dC = new Rationnel;

            switch (typeoperation) {
            case (PLUS):
                       {

                            *dC=(A+B);
                            stack->empiler(dC);
                       }
                break;
            case(MINUS):
                        {
                             *dC=(A-B);
                             stack->empiler(dC);
                        }

                break;

            case(DIV):
                        {

                             if (B.getNumerateur().getVal()==0){
                                                 stack->empiler(dA);
                                                 stack->empiler(dB);
                                                 throw CalculException("Division par zero impossible.");
                                             }

                             else {
                                 *dC=(A/B);
                                 stack->empiler(dC);
                                 }
                        }

                break;

            case (MULT):
                        {
                             *dC=(A*B);
                             stack->empiler(dC);
                        }

                break;

            case(MODULO):
                        {
                            stack->empiler(dA);
                            stack->empiler(dB);
                            throw CalculException("Modulo inappliquable pour Rationnel.\nFonction utilisable avec Entier uniquement.");
                        }
                break;

            case (POW):
                        {
                             *dC=Rationnel(pow(A.getNumerateur(),float(B)),pow(A.getDenumerateur(),float(B)));
                             stack->empiler(dC);
                        }

                break;

        }
    }

    else if ( testE1 || testE2){    //On a forcément deux entiers

                Entier* C = new Entier;

                // Il est inutile de creer des variables locales entieres et de proceder a une conversion a partir de donnee, puisque testE1 et testE2 sont tout les 2 forcéments des entiers. Nous pouvons donc les utiliser dans le calcul.

            switch (typeoperation) {

                case (PLUS):
                            {
                                *C = *testE1 + *testE2;
                                stack->empiler(C);
                            }

                    break;

                case(MINUS):
                            {
                                *C = *testE1 - *testE2;
                                stack->empiler(C);

                            }
                    break;


                case(DIV):

                            {
                            if (testE2->getVal()==0){
                                                stack->empiler(testE1);
                                                stack->empiler(testE2);
                                                throw CalculException("Division par zero impossible.");
                                            }

                            else {
                                    *C = *testE1 / *testE2;
                                    stack->empiler(C);
                                }



                            }
                    break;

                case (MULT):

                            {
                                *C = *testE1 * *testE2;
                                stack->empiler(C);
                            }
                    break;

                case(MODULO):

                            {
                                if (testE2->getVal()==0){
                                                            stack->empiler(testE1);
                                                            stack->empiler(testE2);
                                                            throw CalculException("Modulo: Division par zero impossible.");
                                                        }

                                else {
                                        *C = *testE1 % *testE2;
                                        stack->empiler(C);
                                     }

                            }
                    break;

                case (POW):
                            {
                                *C = Entier(pow(testE1->getVal(),testE2->getVal()));
                                stack->empiler(C);
                            }

                    break;

            }

    }

    else throw CalculException("Echec de la reconnaissance du type de 2 variables entrees.\nSource: Operateurbinaire.cpp. ");

    }
}
Exemplo n.º 6
0
/*! \sa Entier */
Rationnel::operator Entier()const
{
    return Entier(num/den);
}
Exemplo n.º 7
0
Constante* CUBE::application(const Constante& c1){
       return POW::application(c1,Entier(3));
}
Exemplo n.º 8
0
Rationnel::operator Complexe()const
{
    return Complexe(&Rationnel(num, den), &Entier(0));
}
Constante* Analyseur::ToConstante(QString s) const
{
    Historique* h =Historique::GetInstance();


    if (EstConstante(s))
    {
        if (!(h->ModeComplexe()))//Dans ce cas, il ne faut pas utiliser les complexes
        {


            if (EstExpression(s))
            {
                /* Il faut retirer les '*/
                s=s.left(s.length()-1);
                s=s.right(s.length()-1);
                return new Expression(s);

            }



            if (EstComplexe(s))
            {
                Reel temp(0);
                Reel temp2(0);
                QStringList list=s.split("$", QString::SkipEmptyParts);

                if (EstRationnel(list[0]))
                {
                    QStringList tempList=list[0].split("/", QString::SkipEmptyParts);
                    Rationnel rat(tempList[0].toInt(),tempList[1].toInt());
                    temp=Reel(rat);


                }

                else
                {
                    temp=Reel(VirguleToPoint(list[0]).toDouble());
                }

                if (EstRationnel(list[1]))
                {
                    QStringList tempList2=list[1].split("/", QString::SkipEmptyParts);

                    Rationnel rat(tempList2[0].toInt(),tempList2[1].toInt());
                    temp2=Reel(rat);


                }

                else
                {
                    temp2=Reel(VirguleToPoint(list[1]).toDouble());
                }



                return new Complexe(temp,temp2);


            }



            if (EstReel(s))
            {
                return new Reel(VirguleToPoint(s).toDouble());

            }



            if (EstRationnel(s))
            {
                QStringList list=s.split("/", QString::SkipEmptyParts);
                Entier temp=list[0].toInt();
                Entier temp2=list[1].toInt();

                return new Rationnel(temp,temp2);


            }




            if (EstEntier(s))
            {
                return new Entier(s.toInt());

            }

        }

        else//Il faut tout couvertir en Complexe!!!
        {
            Entier entierNull(0);
            if (EstExpression(s))
            {
                /* Il faut retirer les '*/
                s=s.left(s.length()-1);
                s=s.right(s.length()-1);
                return new Expression(s);

            }



            if (EstComplexe(s))
            {
                Reel temp(0);
                Reel temp2(0);
                QStringList list=s.split("$", QString::SkipEmptyParts);

                if (EstRationnel(list[0]))
                {
                    QStringList tempList=list[0].split("/", QString::SkipEmptyParts);
                    Rationnel rat(tempList[0].toInt(),tempList[1].toInt());
                    temp=Reel(rat);


                }

                else
                {
                    temp=Reel(VirguleToPoint(list[0]).toDouble());
                }

                if (EstRationnel(list[1]))
                {
                    QStringList tempList2=list[1].split("/", QString::SkipEmptyParts);

                    Rationnel rat(tempList2[0].toInt(),tempList2[1].toInt());
                    temp2=Reel(rat);


                }

                else
                {
                    temp2=Reel(VirguleToPoint(list[1]).toDouble());
                }



                return new Complexe(temp,temp2);


            }



            if (EstReel(s))
            {
                return new Complexe(Reel(VirguleToPoint(s).toDouble()),entierNull);

            }



            if (EstRationnel(s))
            {
                QStringList list=s.split("/", QString::SkipEmptyParts);
                Entier temp=list[0].toInt();
                Entier temp2=list[1].toInt();

                return new Complexe(temp/temp2,entierNull);


            }




            if (EstEntier(s))
            {
                return new Complexe(Entier(s.toInt()),entierNull);

            }


        }





    }

        else
        {
            throw Exception("Ce n'est pas une instruction !");
        }

      return 0;

}