Cod sursa(job #1296142)
Utilizator | Bako Bence bence21 | Data | 20 decembrie 2014 16:33:28 |
---|---|---|---|
Problema | Evaluarea unei expresii | Scor | 60 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 4.27 kb |
#include<fstream>
#include<string.h>
using namespace std;
char s[100000];
long i,n,j,d;
long szamol(long& e,long v)
{
long x=0;
for(i=e;i<=v;i++)
{
if(s[i]=='(')
{
j=i;
bool jo=1;
d=0;
while(jo)
{
j++;
if(s[j]=='(')
d++;
else if(s[j]==')')
{
if(d==0)
jo=0;
else d--;
}
}
j--;
i++;
x+=szamol(i,j);
}
else if(strchr("0123456789",s[i])!=NULL)
{
while(strchr("0123456789",s[i])!=NULL&&i<=v)
{
x=x*10+s[i]-'0';
i++;
}
i--;
if(i==v)
{
i++;
return x;
}
}
else if(s[i]=='+')
{
i++;
return x+=szamol(i,v);
}
else if(s[i]=='-')
{
j=i;
bool jo=1;
d=0;
while(jo)
{
j++;
if(s[j]=='(')
d++;
else if(s[j]==')')
{
d--;
if(d==0)
{
jo=0;
i++;
if(j!=v)
x=x-szamol(i,j-1);
else return x-=szamol(i,j);
}
}
else if((s[j]=='+'||s[j]=='-'||j==v)&&d==0)
{
i++;
if(j!=v)
{
x=x-szamol(i,j-1);
i--;
}
else return x-=szamol(i,j);
jo=0;
}
}
}
else if(s[i]=='*'){
j=i;
bool jo=1;
d=0;
while(jo)
{
j++;
if(s[j]=='(')
d++;
else if(s[j]==')')
{
d--;
if(d==0)
{
jo=0;
i++;
if(j!=v)
{
x=x*szamol(i,j-1);
i--;
}
else return x*=szamol(i,j);
}
}
else if((s[j]=='+'||s[j]=='-'||j==v)&&d==0)
{
i++;
if(j!=v)
{
x=x*szamol(i,j-1);
i--;
}
else return x*=szamol(i,j);
jo=0;
}
}
}
else if(s[i]=='/'){
j=i;
bool jo=1;
d=0;
while(jo)
{
j++;
if(s[j]=='(')
d++;
else if(s[j]==')')
{
d--;
if(d==0)
{
jo=0;
i++;
if(j!=v)
{
x=x/szamol(i,j-1);
i--;
}
else return x/=szamol(i,j);
}
}
else if((s[j]=='+'||s[j]=='-'||j==v)&&d==0)
{
i++;
if(j!=v)
{
x=x/szamol(i,j-1);
i--;
}
else return x/=szamol(i,j);
jo=0;
}
}
}
if(i==v)
return x;
}
}
int main()
{
ifstream f("evaluare.in");
ofstream g("evaluare.out");
f>>s;
n=strlen(s);
long i=0;
g<<szamol(i,n-1);
f.close();
g.close();
return 0;
}