Cod sursa(job #2019782)

Utilizator NashikAndrei Feodorov Nashik Data 8 septembrie 2017 15:09:21
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <bits/stdc++.h>
using namespace std;

int expresie();
int factor();
int termen();

bool is_digit();
int nr();

char v[100010];
int p;

int main()
{
    v[0] = '(';
    FILE *in = fopen("evaluare.in", "r"), *out = fopen("evaluare.out", "w");
    fscanf(in, "%s", v + 1);
    int n = strlen(v);
    v[n] = ')';

    fprintf(out, "%d", expresie());
    return 0;
}

int factor()
{
    int ans(expresie());
    bool add;
    while (v[p] == '*' || v[p] == '/') {
        add = (v[p] == '*');
        p++;
        ans = (add ? ans * expresie() : ans / expresie());
    }
    return ans;
}

int termen()
{
    int ans = 0;
    bool add = 1;
    if (v[p] == '+' || v[p] == '-')
        add = (v[p] == '+'), p++;
    ans = (add ? 1 : -1) * factor();
    while (v[p] == '+' || v[p] == '-') {
        add = (v[p] == '+');
        p++;
        ans += (add ? 1 : -1) * factor();
    }
    return ans;
}

int expresie()
{
    if (is_digit())
        return nr();
    /// e o paranteza
    p++;
    int x = termen();
    /// e o alta paranteza
    p++;
    return x;
}

bool is_digit()
{
    return ('0' <= v[p] && v[p] <= '9');
}

int nr()
{
    int ans(0);
    while (is_digit()) {
        ans = 10 * ans + v[p] - '0';
        p++;
    }
    return ans;
}