Cod sursa(job #2788578)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 25 octombrie 2021 22:37:44
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#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;
}