Cod sursa(job #1557801)

Utilizator ASTELOTudor Enescu ASTELO Data 28 decembrie 2015 12:20:10
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include<cstdio>
#include<cstring>
char s[100002];
int i=-1,j,n,m,pp;
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++;
int nr=0;
int sum=0;
for(i=0;i<n;)
    {
    while(s[i]>='0'&&s[i]<='9')
        {
        nr=nr*10+s[i]-'0';
        i++;
        }
    if(s[i]=='+')
        {
        if(pp==0)
            sum+=nr;
        else
            {
            sum-=nr;
            pp=0;
            }
        nr=0;
        i++;
        }
    if(s[i]=='-')
        {
        if(pp==0)
            {
            sum+=nr;
            pp=1;
            }
        else
            sum-=nr;
        nr=0;
        i++;
        }
    if(s[i]=='*')
        nr*=eval1();
    if(s[i]=='/')
        nr/=eval1();
    if(s[i]=='(')
        {
        nr=eval2();
        i++;
        }
    }
if(pp==0)
    sum+=nr;
else
    sum-=nr;
printf("%d",sum);
return 0;
}
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]=='/'||s[i]==')')
        return nr;
    if(s[i]=='(')
        return eval2();
    }
int eval2()
    {
    if(s[i]=='(')
        s[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;
            i++;
            sum+=eval2();
            }
        if(i<n&&s[i]=='-')
            {
            sum+=nr;
            nr=0;
            i++;
            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;
    }