Cod sursa(job #1557904)

Utilizator ipus1Stefan Enescu ipus1 Data 28 decembrie 2015 14:07:36
Problema Evaluarea unei expresii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include<cstdio>
#include<cstring>
using namespace std;
char v[100001];
int c,n;
int eval();
int adun();
int inmult();
int eval()
    {int k=0,rez=0;
    for(c=c+1;c<n&&v[c]!=')';c++)
        {if(v[c]=='(')
            rez=eval();
        else
            if(v[c]>='0'&&v[c]<='9')
                {while(v[c]>='0'&&v[c]<='9')
                    {k=k*10+v[c]-'0';
                    c++;
                    }
                rez=k;
                c--;
                }
            else
                if(v[c]=='+')
                    rez+=adun();
                else
                    if(v[c]=='-')
                        rez-=adun();
                    else
                        if(v[c]=='*')
                            rez*=inmult();
                        else
                            rez/=inmult();
        }
    if(v[c+1]==')'||c+1>=n||v[c+1]=='+'||v[c+1]=='-')
        return rez;
    else
        if(v[c+1]=='*')
            {c++;
            return rez*inmult();
            }
        else
            {c++;
            return rez/inmult();
            }
    }
int adun()
    {int k=0;
    c++;
    if(v[c]>='0'&&v[c]<='9')
        {while(v[c]>='0'&&v[c]<='9')
            {k=k*10+v[c]-'0';
            c++;
            }
        if(c==n||v[c]==')')
            {c--;
            return k;
            }
        else
            if(v[c]=='*')
                return k*inmult();
            else
                if(v[c]=='/')
                    return k/inmult();
                else
                    if(v[c]=='+'||v[c]=='-')
                        {c--;
                        return k;
                        }
        }
    else
        return eval();
    }
int inmult()
    {int k=0;
    c++;
    if(v[c]>='0'&&v[c]<='9')
        {while(v[c]>='0'&&v[c]<='9')
            {k=k*10+v[c]-'0';
            c++;
            }
        c--;
        return k;
        }
    else
        return eval();
    }
int main ()
{freopen ("evaluare.in","r",stdin);
freopen ("evaluare.out","w",stdout);
scanf("%s",&v);
n=strlen(v);
c=-1;
printf("%d",eval());
return 0;
}