Cod sursa(job #2672504)

Utilizator George_CristianGeorge Dan-Cristian George_Cristian Data 14 noiembrie 2020 09:35:26
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.12 kb
/*

 * Se va folosi recursivitatea indirecta in rezolvarea problemei.

 * Vom observa ca orice expresie este "impartita" in urmatoarele componente:

 * 1) termeni ai unei adunari, separati de '+' sau '-'

 * 2) factori ai unui produs, separati de '*' sau '/'

 * 3) subexpresii, incadrate intre paranteze '(' si ')' sau numere formate numai din cifre.

 * Prezenta subexpresiilor ne indica faptul ca la un moment dat va fi necesara intoarcerea in cazul (1)

 * si implicit a necesitatii recursivitatii indirecte.

 */



#include <cstdio>
#include <iostream>

#define MAX 100010

char s[MAX];
int i = 0;


long termen();

long factor();


/*

 * Functia eval() va "aduna" toti termenii unei expresii/subexpresii.

 */

long eval() {

    long rezultat = termen();

    while (s[i] == '+' || s[i] == '-') {
        switch (s[i]) {
            case '+':
                ++i;                        // trecem peste semnul "+"
                rezultat += termen();
                break;
            case '-':
                ++i;                        // trecem peste semnul "-"
                rezultat -= termen();
                break;
        }
    }
    return rezultat;
}


/*

 * Functia termen() se ocupa de continutul unui termen. Acesta este compus la randul

 * lui din factori inmultiti.

 */

long termen() {
    long rezultat = factor();

    while (s[i] == '*' || s[i] == '/') {
        switch (s[i]) {
            case '*':
                i++;
                rezultat *= factor();
                break;
            case '/':
                i++;
                rezultat /= factor();
                break;
        }
    }
    return rezultat;
}


/*

 * Functia factor() va returna valoarea unui singur factor, care poate fi o subexpresie

 * sau un numar natural

 */

long factor() {
    if (s[i] == '(') {
        i++;
        long rezultat = eval();
        i++;
        return rezultat;
    }
    int rezultat = 0;
    while (isdigit(s[i]))
        rezultat = rezultat * 10 + s[i++] - '0';
    return rezultat;
}


int main() {

    fgets(s, MAX, fopen("evaluare.in", "r"));
    fprintf(fopen("evaluare.out", "w"), "%ld\n", eval());

    return 0;

}