[C con Clase] operaciones combinadas en c

Gilberto Cuba Ricardo gilbert en hlg.rimed.cu
Sab Mayo 15 16:17:37 CEST 2010


estudiante escribió:

> Ya veo amigo, quizas el ejemplo que puse fue muy largo (es que me
> puse en el lugar de mi profesor y como el tiene que probar el programa supongo que
> ingresara las operaciones mas enredadas:-p)

Es lo más claro en todo el proceso de evaluación, que el profesor
tenga que hacer sus pruebas.

> pero creo que empezemos por algo sencillo para poder entender lo mas complejo
> Con la misma idea que me diste he ido haciendo lo basico haber si
> podemos irlo armando de a poco :-)

Bueno, lo del tratamiento de una pila te lo dejo de estudio
independiente, esto ni lo obvservé bien, no obstante ví cosas que no
me agradaron. :-)

> bueno tengo qe ir a casa ya que ando sin internet jeje haber si
> porfavor ves el codigo y me dices si ando mal o bien

Bueno, realmente lo único que hiciste fue lo del trabajo en la pila y
dos o tres cositas del código. La verdad es que no sé si este código
lo estabas probando en un compilador, porque el hecho es que tiene
varios problemas, que por cuestiones éticas no comento. :-)

No obstante encontré el tiempo, y te hice algo, aunque veo que ya te
han dado dos respuestas más.

> saludos :-)

-- 
Salu2,
 Gilbert

--- cortar aquí ---
#include <iostream>
#include <string>
#include <stack>
#include <queue>

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>

using namespace std;

typedef queue <string> queue_str;

int order(const char ch)
{
    switch ( ch )
    {
        case '^':
            return 1;

        case '*':
        case '/':
            return 2;

        case '+':
        case '-':
            return 3;

        default:
            return 100;

    } // switch
}

bool isOperator(char ch)
{
    return (ch == '^' || ch == '*' || ch == '/' ||
            ch == '+' || ch == '-' );
}

queue_str infija2postfija(string infija)
{
    queue_str postexpr;
    stack <char> opts;
    string num;
    infija += ")";

    opts.push('(');

    for(unsigned int i = 0; i < infija.size(); ++i) {

        if( infija[i] == '.' || isdigit( infija[i] ) ) {
            num += infija[i];
            continue;
        }

        if( !num.empty() )
            postexpr.push( num );
        num = "";

        if( infija[i] == '(' ) {
            opts.push('(');

        } else
        if( infija[i] == ')' ) {
            while( opts.top() != '(' ) {
                string stChar;
                stChar += opts.top();
                postexpr.push( stChar );
                opts.pop();
            }
            opts.pop();

        } else
        if( isOperator( infija[i] ) ) {
            while( order( opts.top() ) < order( infija[i] ) ) {
                string stChar;
                stChar += opts.top();
                postexpr.push( stChar );
                opts.pop();
            }
            opts.push( infija[i] );
        }
    }

    return postexpr;
}

float evaluate(queue_str postfija)
{
    stack <string> opds;

    while ( !postfija.empty() ) {

        string element = postfija.front();

        if( isOperator( element[ element.size() - 1 ] ) ) {

            float operand1 = atof( opds.top().c_str() );
            opds.pop();

            float operand2 = atof( opds.top().c_str() );
            opds.pop();

            float result = 0;

            switch( element[0] )
            {
                case '+':
                    result = operand2 + operand1;
                    break;

                case '-':
                    result = operand2 - operand1;
                    break;

                case '*':
                    result = operand2 * operand1;
                    break;

                case '/':
                    if(operand1)
                        result = operand2 / operand1;
                    break;

                case '^':
                    result = pow(operand2, operand1);
                    break;

                default:
                    break;
            } // switch

            char caResult[20];
            sprintf(caResult, "%f", result);

            opds.push( caResult );

        } else {
            opds.push( element );
        }

        postfija.pop();
    }

    return atof( opds.top().c_str() );
}

int main()
{
    string expr_infija;
    queue_str expr_postfija;

    //expr_infija = "5*(4-2)";
    //expr_infija = "5+6*(4+(5+7)*(6-(5*4)))";

    //expr_infija = "(3*2)^3";
    expr_infija = "3*2^3";

    //std::cout << "Entre la expresión a evaluar: " << std::endl;
    //std::cin >> expr;

    expr_postfija = infija2postfija( expr_infija );

    queue_str epostfija = expr_postfija;
    while( !epostfija.empty() ) {
        cout << epostfija.front() << ",";
        epostfija.pop();
    }
    cout << endl;

    cout << evaluate( expr_postfija ) << endl;

    return 0;
}
--- cortar aquí ---





Más información sobre la lista de distribución Cconclase