Cod sursa(job #2539906)

Utilizator adiaioanaAdia R. adiaioana Data 6 februarie 2020 15:07:17
Problema Bool Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>
#define NMAX 100100
using namespace std;
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
char S[NMAX], *p=S;

long long eval(); ///prioritate +-(cea mai mica)
///apel -> termen
long long termen(); ///prioritate */
/// apel -> factor
long long factor(); /// (subexp) si nr.
/// apel -> eval
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin>>S;
    cout<<eval()<<'\n';
    return 0;
}

long long eval()
{
    long long r=termen();
    while(*p=='+' || *p=='-')
    {
        if(*p=='+'){
            ++p;//sar peste semn +
            r+=termen();
        }
        else{
            ++p;//-
            r-=termen();
        }
    }
    return r;
}

long long termen()
{
    long long r=factor();
    while(*p=='*'||*p=='/')
    {
        if(*p=='*'){
            ++p;//*
            r*=factor();
        }
        else{
            ++p;// /
            r/=factor();
        }
    }
    return r;
}

long long factor()
{
    long long r=0;
    if(*p=='(')
    {
        ++p;//(
        r=eval();
        ++p;//)
    }
    else while(isdigit(*p))
    {
        r=r*10+(*p-'0');
        ++p;
    }
    return r;
}
///multumesc simo cotizo pentru faptul ca mi a explicat indirect eval de expr
///sursa inspo> https://infoarena.ro/job_detail/145387?action=view-source