Pagini recente » Cod sursa (job #338341) | Cod sursa (job #2400801) | Cod sursa (job #3328532) | Cod sursa (job #433731) | Cod sursa (job #3335152)
#include <fstream>
using namespace std;
int expresie(const string& s, int& p);
int termen(const string& s, int& p);
int factor(const string& s, int& p);
int numar(const string& s, int& p);
int expresie(const string& s, int& p) {
// E = T +- T +- T ...
int result = termen(s, p);
while (p < s.size() && (s[p] == '+' || s[p] == '-')) {
int sign = (s[p] == '+' ? 1 : -1);
p++;
result += sign * termen(s, p);
}
return result;
}
int termen(const string& s, int& p) {
// T = F */ F */ F ...
int result = factor(s, p);
while (p < s.size() && (s[p] == '*' || s[p] == '/')) {
bool mul = (s[p] == '*');
p++;
int fact = factor(s, p);
if (mul) {
result *= fact;
} else {
result /= fact;
}
}
return result;
}
int factor(const string& s, int& p) {
// F = (E) | N
if (s[p] == '(') {
p++;
int result = expresie(s, p);
p++;
return result;
} else {
return numar(s, p);
}
}
int numar(const string& s, int& p) {
int sign = 1;
if (s[p] == '-') {
sign = -1;
p++;
}
int nr = 0;
for (; p < s.size() && isdigit(s[p]); p++) {
nr = nr * 10 + s[p] - '0';
}
return sign * nr;
}
int main() {
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
string s; cin >> s;
int p = 0;
cout << expresie(s, p) << "\n";
return 0;
}