Cod sursa(job #3143242)

Utilizator raducostacheRadu Costache raducostache Data 28 iulie 2023 13:32:37
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#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;
}