Pagini recente » Cod sursa (job #901534) | Cod sursa (job #692345) | Cod sursa (job #3143242)
#include <fstream>
#include <cstring>
#include <iostream>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
char s[100005];
int n;
int extract(int & i);
int eval(int & i);
int eval1 (int & i);
int main() {
f >> s;
n = strlen(s);
int i = 0;
g << eval(i);
return 0;
}
int extract(int & i) {
int num = 0;
while (isdigit(s[i])) {
num = num * 10 + s[i] - '0';
++i;
}
return num;
}
int eval(int & i) {
int ret = 0, sign = 1;
while (i < n && s[i] != ')') {
if (isdigit(s[i]))
ret += eval1(i);
else
if (s[i] == '-')
i += 1, ret -= eval1(i);
else
if (s[i] == '+')
i += 1, ret += eval1(i);
else
if (s[i] == '(')
ret += eval1(i);
}
if(s[i] == ')')
++i;
// cerr << ret << endl;
return ret;
}
int eval1 (int & i) {
int ret;
while (i < n && s[i] != '+' && s[i] != '-' && s[i] != ')') {
if (isdigit(s[i])) {
ret = extract(i);
}
else
if (s[i] == '*') {
int num;
if (isdigit(s[i + 1])) {
i = i + 1;
num = extract(i);
}
else
if (s[i + 1] == '(') {
i = i + 2;
num = eval(i);
}
ret *= num;
}
else
if (s[i] == '/') {
int num;
if (isdigit(s[i + 1])) {
i = i + 1;
num = extract(i);
}
else
if (s[i + 1] == '(') {
i = i + 2;
num = eval(i);
}
ret /= num;
}
else
if (s[i] == '(') {
i = i + 1;
ret = eval(i);
}
}
// cerr << ret << ' ' << s[i] << endl;
return ret;
}