Cod sursa(job #2869262)

Utilizator RobertuRobert Udrea Robertu Data 11 martie 2022 13:33:26
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 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 <bits/stdc++.h>
#define dim 1e9 + 2
using namespace std;

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

char sir[dim], *p = sir;

long termen();
long factor();


//Functie care aduna/scade termenii unei expresii.
long eval() {
    long rez = termen();

    while( *p == '+' || *p == '-' ) {
        if( *p == '+' ) {
            p++;
            rez += factor();
            break;
        } else if( *p == '-' ) {
            p++;
            rez -= factor();
            break;
        }
    }

    return rez;
}


//Functie care se ocupa de continutul unui termen, acesta fiind compus
//din factori inmultiti/impartiti.
long termen() {
    long rez = factor();

    while( *p == '*' || *p == '/' ) {
        if( *p == '*' ) {
            p++;
            rez *= factor();
            break;
        } else if( *p == '/' ) {
            p++;
            rez /= factor();
            break;
        }
    }

    return rez;
}


//Functie care returneaza  un factor, fie numar fie subexpresie.
//Subexpresie = (...), adica cu paranteze.
long factor() {
    long rez = 0;

    if( *p == '(') {
        //suntem pe o subexpresie
        p++;
        rez = eval();
        p++;
    } else {
        //suntem pe un numar
        while('0' <= *p && *p <= '9') {
            rez = rez * 10 + (*p - '0');
            p++;
        }
    }

    return rez;
}

int main() {
    fin >> sir;
    fout << eval();

    return 0;
}