Pagini recente » Cod sursa (job #1587901) | Cod sursa (job #442116) | Cod sursa (job #1896758) | Cod sursa (job #305269) | Cod sursa (job #2599613)
#include <stdio.h>
#include <bits/stdc++.h>
#define rep(i, n) for(int i = 0; i < n; i++)
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
const int INF = 0x3f3f3f3f;
ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");
string A;
// indirect recursion. split expression into terms separated by '+', '-'
int eval(const string &A, int &p, int lvl);
// a combination of factors separated by '', '/'
int termen(const string &A, int &p, int lvl);
// factor can be either a number or an expression enclosed in parentheses: '(', ')'
int factor(const string &A, int &p, int lvl);
int eval(const string &A, int &p, int lvl) {
// cout << string(lvl*2, '-') << "Eval. p=" << p << endl;
int r = termen(A, p, lvl);
while(p < A.size() && (A[p] == '-' || A[p] == '+')) {
if (A[p] == '-') {
p++;
r -= termen(A, p, lvl);
} else { // A[p] == '+'
p++;
r += termen(A, p, lvl);
}
}
// cout << string(lvl*2, '-') << "Eval. p="<< p << "; r=" << r << endl;
return r;
}
int termen(const string &A, int &p, int lvl) {
// cout << string(lvl*2, '-') << "Termen. p=" << p << endl;
int r = factor(A, p, lvl);
while(p < A.size() && (A[p] == '*' || A[p] == '/')) {
if (A[p] == '*') {
p++;
r *= factor(A, p, lvl);
} else { // A[p] == '/'
p++;
r /= factor(A, p, lvl);
}
}
// cout << string(lvl*2, '-') << "Termen. p="<< p << "; r=" << r << endl;
return r;
}
int factor(const string &A, int &p, int lvl) {
// cout << string(lvl*2, '-') << "Factor. p=" << p << endl;
if (p >= A.size()) { return 0; }
int r = 0;
if (A[p] == '(') {
p++;
r = eval(A, p, lvl+1);
p++; // A[p] == ')' here
} else {
while(p < A.size() && A[p] - '0' >= 0 && A[p] - '0' < 10) {
r = r*10 + A[p] - '0';
p++;
}
}
// cout << string(lvl*2, '-') << "Factor. p="<< p << "; r=" << r << endl;
return r;
}
int main(void) {
fin >> A;
int p = 0;
int res = eval(A, p, 0);
fout << res << endl;
return 0;
}