Cod sursa(job #680864)

Utilizator michael9ufoStanescu Mihai michael9ufo Data 16 februarie 2012 00:58:23
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 4.18 kb
/*
    w/o ( support . for tests
*/

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <stdlib.h>
#include <string.h>

using namespace std;

void calc(unsigned &pos, char &op, string expr, unsigned long &rezultat)
{

        string::iterator it = expr.begin();

        it += pos;

        int num, num2;

        unsigned pstart;

        unsigned long rez_sub = 0;

        char op_sub;

        char len[32], len2[32];

        size_t sl, s2;

        if(*it >= '0' && *it <= '9')
            {
                num = atoi(&*it);

                sprintf(len, "%d", num);

                sl = strlen(len);

                if((it + sl) < expr.end() || *(it + sl) == ')')
                {

                    pos += sl;

                    it += sl;

                }

                if(strchr("*/", *it))
                {

                    if(*it == '*')
                    {

                        if(*(it + 1) == '(')
                        {

                            pstart = pos;

                            ++pos;
                            ++it;

                            op_sub = '+';

                            while(*it != ')')
                            {

                                calc(pos, op_sub, expr, rez_sub);

                                ++it;
                                ++pos;

                            }

                            ++it;
                            --pos;

                            num2 = rez_sub;

                            s2 = pos - pstart;

                        }
                        else
                        {

                            num2 = atoi(&*(it + 1));

                            sprintf(len2, "%d", num2);

                            s2 = strlen(len2);

                        }

                        if(op == '+')
                            rezultat += (num * num2);
                        else if(op == '-')
                            rezultat -= (num * num2);
                        else if(op == '/')
                            rezultat /= (num * num2);
                        else if(op == '*')
                            rezultat *= (num * num2);

                       if((it + 1 + s2) < expr.end() || *(it + 1 + s2) == ')')
                       {

                            pos += s2 + 1;

                            it += s2 + 1;

                       }
                    }
                    else if(*it == '/')
                    {

                        num2 = atoi(&*(it + 1));

                        sprintf(len2, "%d", num2);

                        s2 = strlen(len2);

                        if(op == '+')
                            rezultat += (num / num2);
                        else if(op == '-')
                            rezultat -= (num / num2);
                        else if(op == '/')
                            rezultat /= (num / num2);
                        else if(op == '*')
                            rezultat *= (num / num2);

                       if((it + 1 + s2) < expr.end() || *(it + 1 + s2) == ')')
                       {

                            pos += s2 + 1;

                            it += s2 + 1;

                       }

                    }

                }
                else if(op == '+')
                    rezultat += num;
                else if(op == '-')
                    rezultat -= num;

                op = *it;

            }
            else if(strchr("+*-/", *it))
                op = *it;

}

int main()
{

        string expr;

        unsigned long rezultat = 0;

        freopen("evaluare.in", "r", stdin);

        while(!feof(stdin))
            expr.push_back(fgetc(stdin));

        fclose(stdin);

        string::iterator it;

        char op = '+';

        unsigned pos = 0;

        for(it=expr.begin();it<expr.end();++it,++pos)
            calc(pos, op, expr, rezultat);

        expr.clear();

    freopen("evaluare.out", "w", stdout);

    cout<<rezultat<<"\n";

    fclose(stdout);

    return 0;
}