Pagini recente » Cod sursa (job #1568531) | Cod sursa (job #1714885) | Cod sursa (job #2425886) | Cod sursa (job #1685294) | Cod sursa (job #1233166)
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int n, i;
char s[110005];
int evalDefault();
int getNumber();
int evalDivide(int, int);
int nextChar();
int main()
{
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
gets(s+1);
n=1;
while((s[n]>='0'&&s[n]<='9')||s[n]=='+'||s[n]=='-'||s[n]=='*'||s[n]=='/'||s[n]=='('||s[n]==')') n++;
i=0;
printf("%d", evalDefault());
return 0;
}
/// MainEnd
int evalDefault()
{
int sum=0, x=0, sign=1;
while(1)
{
i++;
int nxt=nextChar();
if(nxt==6) break;
if(i>n) break;
if(nxt==-1) break;
if(nxt==0)
{
i--;
x=getNumber();
continue;
}
if(nxt==1)
{
if(sign==1)
sum=sum+x;
else
sum=sum-x;
sign=1;
continue;
}
if(nxt==2)
{
if(sign==1)
sum=sum+x;
else
sum=sum-x;
sign=2;
continue;
}
if(nxt==3) {x=evalDivide(x, 1); continue;}
if(nxt==4) {x=evalDivide(x, 2); continue;}
if(nxt==5) {x=evalDefault(); continue;}
}
if(sign==1)
sum=sum+x;
else
sum=sum-x;
return sum;
}
int evalDivide(int y, int sign)
{
int prod=y, x=0;
while(1)
{
i++;
int nxt=nextChar();
if(nxt==-1) break;
if(nxt==6)
{
i--;
break;
}
if(nxt==0) {i--;x=getNumber(); continue;}
if(nxt==1||nxt==2) {i--; break;}
if(nxt==3)
{
if(sign==1)
prod=prod*x;
else
prod=prod/x;
sign=1;
continue;
}
if(nxt==4)
{
if(sign==1)
prod=prod*x;
else
prod=prod/x;
sign=2;
continue;
}
if(nxt==5) {x=evalDefault(); continue;}
}
if(sign==1)
prod=prod*x;
else
prod=prod/x;
return prod;
}
int nextChar()
{
if(s[i]>='0'&&s[i]<='9') return 0;
if(s[i]=='+') return 1;
if(s[i]=='-') return 2;
if(s[i]=='*') return 3;
if(s[i]=='/') return 4;
if(s[i]=='(') return 5;
if(s[i]==')') return 6;
return -1;
}
int getNumber()
{
int nr=0;
while(1)
{
i++;
int nxt=nextChar();
if(i>n) break;
if(nxt>0) break;
if(nxt==-1) break;
nr=nr*10+s[i]-'0';
}
i--;
return nr;
}