Pagini recente » Cod sursa (job #624422) | Cod sursa (job #2765426) | Cod sursa (job #2706610) | Cod sursa (job #2132033) | Cod sursa (job #2739043)
#include <stdio.h>
#include <bits/stdc++.h>
#define rep(i, n) for(int i = 0; i < (int)(n); i++)
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
ifstream fin {"evaluare.in"};
ofstream fout {"evaluare.out"};
string s;
int eval(size_t &pos);
int termen(size_t &pos);
int factor(size_t &pos);
inline int calc(int a, int b, char op) {
int res = 0;
switch(op) {
case '+':
res = a+b; break;
case '-':
res = a-b; break;
case '*':
res = a*b; break;
case '/':
res = a/b; break;
}
return res;
}
int eval(size_t &pos) {
int res = termen(pos);
while(pos < s.size() && (s[pos] == '+' || s[pos] == '-')) {
char op = s[pos];
++pos;
res = calc(res, termen(pos), op);
}
return res;
}
int termen(size_t &pos) {
int res = factor(pos);
while(pos < s.size() && (s[pos] == '*' || s[pos] == '/')) {
char op = s[pos];
++pos;
res = calc(res, factor(pos), op);
}
return res;
}
int factor(size_t &pos) {
int res = 0;
if (pos >= s.size()) { return res; /* this is an error */ }
if ('0' <= s[pos] && s[pos] <= '9') {
while(pos < s.size() && '0' <= s[pos] && s[pos] <= '9') {
res = res * 10 + s[pos] - '0';
++pos;
}
} else if (s[pos] == '(') {
++pos;
res = eval(pos);
++pos;
}
return res;
}
int main(void) {
// freopen("evaluare.in", "r", stdin);
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
fin >> s;
size_t pos = 0;
auto ans = eval(pos);
fout << ans << '\n';
return 0;
}