Cod sursa(job #3214955)

Utilizator ALEXANDRUspargoaseAlexandru Joita ALEXANDRUspargoase Data 14 martie 2024 16:26:16
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
/* Evaluare expresie aritmetica.
Operatori I: +- => Expresie
Operatori II: /* => Termeni
Operatori III: () => Factor
Constante: n ∈ ℕ

Definim:
-Expresie elemente ce urmeaza sa se adune cu prioritate minima
-Termeni elemente cu prioritate II ce sunt continute in expresii mari, ce se impart in factori
-Factori constante sau paranteze (care reprezinta o noua expresie)

Exemplu:  (10+(1+1)*13)/8+2*5/3-5 = 2
*/

#include <fstream>
#include <string>
#include <cstring>

#define LL long long
using namespace std;

ifstream cin("evaluare.in");
ofstream cout("evaluare.out");

// Lucram in scope global cu parcurgerea
string s;
int i = 0; // Observatie: fiecare functie se ocupa cu avansarea contorului doar cand indica operatia specifica

// Functii cu dependență circulară
LL expresie();
LL termen();
LL factor();
LL constanta();

int main()
{
    cin >> s;
    cout << expresie();

    return 0;
}

LL expresie()
{
    // primul termen al expresiei
    LL e = termen();
    while (s[i] == '+' or s[i] == '-')
        if (s[i] == '+')
            i++, e += termen(); // urmatorul termen
        else if (s[i] == '-')
            i++, e -= termen(); // urmatorul termen

    return e;
}

LL termen()
{
    LL t = factor();
    while (s[i] == '*' || s[i] == '/')
        if (s[i] == '*')
            i++, t *= factor();
        else if (s[i] == '/')
            i++, t /= factor();

    return t;
}

LL factor()
{
    LL f;
    if (s[i] == '(')
    {
        i++; // sar paranteza deschisa
        f = expresie();
        i++; // sar paranteza inchisa
    }
    else
        f = constanta();

    return f;
}

LL constanta()
{
    LL c = 0;
    while (isdigit(s[i]))
        c = c * 10 + (s[i++] - '0');

    return c;
}