Cod sursa(job #1267309)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 19 noiembrie 2014 19:19:24
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include <cstdio>
#include <cstring>
using namespace std;

char p[100000];
int nr,i;

int eval();

bool is(char x)
{
    if(x<'0') return 0;
    if(x>'9') return 0;
    return 1;

}

int termen()
{
    int f=0;
    int fact;

    if(p[i]=='(')
    {
        i++;
        fact=eval();
    }
    else

        while(is(p[i]))
        {
            {
                f=f*10+p[i]-'0';
                i++;
            }

            fact=f;
        }


    while(p[i]=='*' || p[i]=='/')
    {

        if(p[i]=='*')
        {
            i++;
            f=0;

            if(p[i]=='(')
            {
                i++;
                fact*=eval();
                continue;
            }

            while(is(p[i]))
            {
                f=f*10+p[i]-'0';
                i++;
            }
            fact*=f;

        }

        else
        {
            i++;
            f=0;

            if(p[i]=='(')
            {
                i++;
                fact/=eval();
                continue;
            }

            while(is(p[i]))
            {
                f=f*10+p[i]-'0';
                i++;
            }
            fact/=f;
        }


    }

    return fact;

}

int eval()
{

    int nr=0;
    while(p[i]=='(') i++;

    nr=termen();

    while(p[i]=='+' || p[i]=='-' )
    {

        if(p[i]=='+')
        {
            i++;
             nr+=termen();
        }
        else if(p[i]=='-')
        {
            i++;
            nr-=termen();
        }
    }
    ++i;
    return nr;

}

int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);

    i=0;

    gets(p);
    int n=strlen(p);
    nr=0;bool semn=true;
    int rasp=0;int z;

    while(i<n)
    {
        z=termen();
        if(semn==true) rasp+=z;
        else rasp-=z;
        if(p[i]=='+') semn=true;
        else semn=false;
        ++i;

    }

    printf("%d\n",rasp);

    return 0;
}