Cod sursa(job #2918198)

Utilizator BlueLuca888Girbovan Robert Luca BlueLuca888 Data 10 august 2022 14:31:40
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <bits/stdc++.h>
#pragma GCC optimize ("Ofast")

using namespace std;

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

string expresie;

int X(int &poz), F(int &poz), T(int &poz), E(int &poz);

int main (){
    ios_base::sync_with_stdio(false);
    fin.tie(nullptr), fout.tie(nullptr);

    fin>>expresie;

    int p = 0;
    fout<<E(p);
    return 0;
}

/// X   =   cif sau X*10 + cif
int X(int &poz){
    int answer = 0;

    while(poz < (int)expresie.size() && '0' <= expresie[poz] && expresie[poz] <= '9'){
        answer = answer * 10 + (expresie[poz] - '0');
        poz++;
    }

    return answer;
}

/// F   =   X sau ( E )
int F(int &poz){
    int answer;

    if(expresie[poz] == '('){ /// ( E )
        poz++; ///sar peste '('
        answer = E(poz);
        poz++; ///sar peste ')'
    }else /// X
        answer = X(poz);

    return answer;
}

/// T   =   F sau F*/X
int T(int &poz){
    int answer = F(poz);

    while(true)
        if(expresie[poz] == '*'){
            poz++; ///sar peste '*'
            answer *= F(poz);
        }else if(expresie[poz] == '/'){
            poz++; ///sar peste '/'
            answer /= F(poz);
        }else
            break;

    return answer;
}

/// E   =   E sau E+-T
int E(int &poz){
    int answer = T(poz);

    while(true)
        if(expresie[poz] == '+'){
            poz++; ///sar peste '+'
            answer += T(poz);
        }else if(expresie[poz] == '-'){
            poz++; ///sar peste '-'
            answer -= T(poz);
        }else
            break;

    return answer;
}