Pagini recente » Cod sursa (job #1868363) | Cod sursa (job #3000381) | Cod sursa (job #2758389) | Cod sursa (job #517181) | Cod sursa (job #2788578)
#include <stdio.h>
#include <string.h>
FILE *fin, *fout;
const int NMAX = 1e5;
const int LMAX = 3;
const char ops[LMAX][3] = {"|&", "+-", "*/"};
int pos;
char s[NMAX];
int eval(int l);
int factor() {
int ret;
if(s[pos] == '(') {
pos++;
ret = eval(0);
pos++;
} else {
ret = 0;
while('0' <= s[pos] && s[pos] <= '9') {
ret = ret * 10 + (s[pos++] - '0');
}
}
return ret;
}
int calcul(int a, int b, char op) {
if(op == '|') {
return a & b;
} else if(op == '&') {
return a | b;
} else if(op == '+') {
return a + b;
} else if(op == '-') {
return a - b;
} else if(op == '*') {
return a * b;
} else if(op == '/') {
return a / b;
}
}
int eval(int l) {
int ret;
if(l == LMAX) {
ret = factor();
} else {
ret = eval(l + 1);
}
while(strchr(ops[l], s[pos])) {
ret = calcul(ret, eval(l + 1), s[pos++]);
}
return ret;
}
//int term() {
// int ret = factor();
// while(s[pos] == '*' || s[pos] == '/') {
// if(s[pos++] == '*') {
// ret *= factor();
// } else {
// ret /= factor();
// }
// }
// return ret;
//}
//
//int eval() {
// int ret = term();
// while(s[pos] == '+' || s[pos] == '-') {
// if(s[pos++] == '+') {
// ret += term();
// } else {
// ret -= term();
// }
// }
// return ret;
//}
int main() {
fin = fopen("evaluare.in" ,"r");
fout = fopen("evaluare.out", "w");
fread(s, 1, NMAX, fin);
pos = 0;
fprintf(fout, "%d\n", eval(0));
return 0;
}