Cod sursa(job #1415819)

Utilizator nnnmmmcioltan alex nnnmmm Data 6 aprilie 2015 15:36:04
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include<cstdio>
#include<cctype>
#include<cstring>
bool EROARE=false;
/*
Gramatica:
Expr -> Term (('+'|'-')Term)*
Term -> Fact (('*'|'/')Fact)*
Fact -> Int | ('+'|'-')Fact|'('Expr')'
Int -> ('0'|'1'|'2'|...|'9')+
*/
char sir[100001];
int cursor;
int Expresie();
int Factor()
{
 int rez=0;
 if(isdigit(sir[cursor]))
    {
     rez=rez*10+(sir[cursor++]-'0');
     while(isdigit(sir[cursor]))
           {
            rez=rez*10+(sir[cursor++]-'0');
           }
    }
 else
    if(sir[cursor]=='(')
       {
        cursor++;
        rez=Expresie();
        if(sir[cursor]!=')')
           EROARE=true;
        else
           cursor++;
       }
    else
       {
        if(sir[cursor]=='-')
           rez=-1;
        cursor++;
        rez*=Factor();
       }
 return rez;
}
int Termen()
{
 int rez=Factor();
 while(sir[cursor]=='*' || sir[cursor]=='/')
       {
        if(sir[cursor++]=='*')
           {
            rez*=Factor();
           }
        else
           {
            rez/=Factor();
           }
       }
 return rez;
}
int Expresie()
{
 int rez=Termen();
 while(sir[cursor]=='+' || sir[cursor]=='-')
       {
        if(sir[cursor++]=='+')
           {
            rez+=Termen();
           }
        else
           {
            rez-=Termen();
           }
       }
 return rez;
}
int main()
{
 freopen("evaluare.in","r",stdin);
 freopen("evaluare.out","w",stdout);
 gets(sir);
 printf("%d ",Expresie());
return 0;
}