Pagini recente » Cod sursa (job #1992933) | Cod sursa (job #2128189) | Cod sursa (job #3244342) | Cod sursa (job #844486) | Cod sursa (job #2899257)
/// always:
#include <cstdio>
#include <string>
/// optional:
#include <cassert>
#include <cstring>
#include <iostream>
bool home = 1;
using namespace std;
const string TASKNAME="evaluare";
const int N=100000+7;
int p=0;
char s[N];
int n;
int read_term();
int get();
int solve();
int read_term() {
int term;
if (s[p]=='(') {
p++;
term=solve();
assert(s[p]==')');
p++;
}else{
int sgn=+1,num=0;
bool is=0;
while(s[p]=='-'||s[p]=='+') {
if (s[p]=='-') sgn*=-1;
p++;
}
while('0'<=s[p]&&s[p]<='9') {
num=10*num+s[p]-'0';
p++;
is=1;
}
num*=sgn;
if (!is) {
assert(0);
}
term=sgn*num;
}
return term;
}
int get() {
int sol=read_term();
while (s[p]=='*'||s[p]=='/') {
char op=s[p];
p++;
int term=read_term();
if (op=='*') sol*=term;
else sol/=term;
}
return sol;
}
int solve() {
if (p==n) return 0;
assert(p<n);
int sol=get();
while (s[p]=='+'||s[p]=='-') {
char op=s[p];
p++;
int term=get();
if (op=='+') sol+=term;
else sol-=term;
}
return sol;
}
signed main() {
#ifdef INFOARENA
home = 0;
#endif
if(!home) {
freopen((TASKNAME + ".in").c_str(), "r", stdin);
freopen((TASKNAME + ".out").c_str(), "w", stdout);
}else{
freopen ("I_am_iron_man", "r", stdin);
}
scanf("%s",&s);
n=strlen(s);
printf("%d\n", solve());
}