Cod sursa(job #1557386)

Utilizator ASTELOTudor Enescu ASTELO Data 27 decembrie 2015 13:53:57
Problema Evaluarea unei expresii Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.15 kb
#include<cstdio>
#include<cstring>
char s[100002];
int i=-1,j,n,m;
int eval();
int eval1();
int eval2();
int main ()
{
freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
gets(s);
n=strlen(s);
for(i=n;i>=1;i--)
    s[i]=s[i-1];
s[0]='+';
n++;
i=-1;
printf("%d",eval());
return 0;
}
int eval()
    {
    i++;
    int sum=0;
    int nr=0;
    if(s[i]=='(')
        {
        nr=eval2();
        i++;
        }
    while(i<n&&s[i]>='0'&&s[i]<='9')
        {
        nr=nr*10+s[i]-'0';
        i++;
        }
    while(i<n&&(s[i]=='+'||s[i]=='-'))
        {
        if(i<n&&s[i]=='+')
            {
            sum+=nr;
            nr=0;
            sum+=eval();
            }
        if(i<n&&s[i]=='-')
            {
            sum+=nr;
            nr=0;
            sum-=eval();
            }
        }
    while(s[i]=='/'||s[i]=='*')
        {
        if(i<n&&s[i]=='/')
            nr/=eval1();
        if(i<n&&s[i]=='*')
            nr*=eval1();
        if(s[i]==')')
            i++;
        }
    if(sum==0&&nr!=0)
        sum=nr;
    return sum;
    }
int eval1()
    {
    i++;
    int nr=0;
    while(i<n&&s[i]>='0'&&s[i]<='9')
        {
        nr=nr*10+s[i]-'0';
        i++;
        }
    if(i==n||s[i]=='-'||s[i]=='+'||s[i]=='*'||s[i]=='/')
        return nr;
    if(s[i]=='(')
        return eval2();
    }
int eval2()
    {
    i++;
    int sum=0;
    int nr=0;
    if(s[i]=='(')
        {
        nr=eval2();
        i++;
        }
    while(i<n&&s[i]>='0'&&s[i]<='9')
        {
        nr=nr*10+s[i]-'0';
        i++;
        }
    while(i<n&&(s[i]=='+'||s[i]=='-'))
        {
        if(i<n&&s[i]=='+')
            {
            sum+=nr;
            nr=0;
            sum+=eval2();
            }
        if(i<n&&s[i]=='-')
            {
            sum+=nr;
            nr=0;
            sum-=eval2();
            }
        }
    while(s[i]=='/'||s[i]=='*')
        {
        if(i<n&&s[i]=='/')
            nr/=eval1();
        if(i<n&&s[i]=='*')
            nr*=eval1();
        }
    if(sum==0&&nr!=0)
        sum=nr;
    return sum;
    }