Cod sursa(job #1267309)
| Utilizator | Data | 19 noiembrie 2014 19:19:24 | |
|---|---|---|---|
| Problema | Evaluarea unei expresii | Scor | 90 |
| Compilator | cpp | Status | done |
| Runda | Arhiva educationala | Marime | 2.01 kb |
#include <cstdio>
#include <cstring>
using namespace std;
char p[100000];
int nr,i;
int eval();
bool is(char x)
{
if(x<'0') return 0;
if(x>'9') return 0;
return 1;
}
int termen()
{
int f=0;
int fact;
if(p[i]=='(')
{
i++;
fact=eval();
}
else
while(is(p[i]))
{
{
f=f*10+p[i]-'0';
i++;
}
fact=f;
}
while(p[i]=='*' || p[i]=='/')
{
if(p[i]=='*')
{
i++;
f=0;
if(p[i]=='(')
{
i++;
fact*=eval();
continue;
}
while(is(p[i]))
{
f=f*10+p[i]-'0';
i++;
}
fact*=f;
}
else
{
i++;
f=0;
if(p[i]=='(')
{
i++;
fact/=eval();
continue;
}
while(is(p[i]))
{
f=f*10+p[i]-'0';
i++;
}
fact/=f;
}
}
return fact;
}
int eval()
{
int nr=0;
while(p[i]=='(') i++;
nr=termen();
while(p[i]=='+' || p[i]=='-' )
{
if(p[i]=='+')
{
i++;
nr+=termen();
}
else if(p[i]=='-')
{
i++;
nr-=termen();
}
}
++i;
return nr;
}
int main()
{
freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
i=0;
gets(p);
int n=strlen(p);
nr=0;bool semn=true;
int rasp=0;int z;
while(i<n)
{
z=termen();
if(semn==true) rasp+=z;
else rasp-=z;
if(p[i]=='+') semn=true;
else semn=false;
++i;
}
printf("%d\n",rasp);
return 0;
}
