Cod sursa(job #911005)

Utilizator thewildnathNathan Wildenberg thewildnath Data 11 martie 2013 11:33:24
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include<stdio.h>
#include<string.h>
char v[100010];
int l;

int eval(int &i);
int numar(int &i)
{
    int nr=0;
    if(v[i]=='(')
    {
        return eval(++i);
    }
    while(v[i]>='0'&&v[i]<='9')
    {
        nr=nr*10+v[i]-'0';
        i++;
    }
    return nr;
}

int eval(int &i)
{
    int a,b,c;
    char o1,o2;
    a=0;
    b=0;
    o1=o2='+';
    c=numar(i);
    while(i<l)
    {
        //printf("%.6lf %c %.6lf %c %.6lf\n",a,o1,b,o2,c);
        if(o2=='+'||o2=='-')
        {
            if(o1=='+')
                a=a+b;
            else
                a=a-b;
            b=c;
            o1=o2;
        }
        else
        {
            if(o2=='*')
                b=b*c;
            else
                b=b/c;
        }
        if(v[i]==')')
        {
            o2='+';
            c=0;
            i++;
            break;
        }
        o2=v[i];
        c=numar(++i);
    }
    ///////////////
    //printf("%.6lf %c %.6lf %c %.6lf\n",a,o1,b,o2,c);
    if(o2=='+'||o2=='-')
    {
        if(o1=='+')
            a=a+b;
        else
            a=a-b;
        b=c;
        o1=o2;
    }
    else
    {
        if(o2=='*')
            b=b*c;
        else
            b=b/c;
    }
    if(o1=='+')
        a=a+b;
    else
        a=a-b;
    //printf("%.5lf\n",a);
    return a;
}


int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    int i=0;
    int a;
    scanf("%s",&v);
    l=strlen(v);
    a=eval(i);
    printf("%d\n",a);
    return 0;
}