Cod sursa(job #2228768)

Utilizator rotti321Rotar Mircea rotti321 Data 4 august 2018 18:08:20
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.39 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>
using namespace std;
typedef unsigned long long ull;
constexpr ull MAX = 100010;
char S[MAX], *p=S;

ull termen();
ull factor();

/**
 * Functia eval() va "aduna" toti termenii unei expresii/subexpresii.
 */
ull eval() {
    ull r = termen();
    while ( *p=='+' || *p=='-' ) {
        switch ( *p ) {
            case '+':
                ++p;                        /// trecem peste semnul "+"
                r += termen();
                break;
            case '-':
                ++p;                        /// trecem peste semnul "-"
                r -= termen();
                break;
        }
    }
    return r;
}

/**
 * Functia termen() se ocupa de continutul unui termen. Acesta este compus la randul
 * lui din factori inmultiti.
 */
ull termen() {
    ull r = factor();
    while ( *p=='*' || *p=='/' ) {
        switch ( *p ) {
            case '*' :
                ++p;
                r *= factor();
                break;
            case '/':
                ++p;
                r /= factor();
                break;
        }
    }
    return r;
}

/**
 * Functia factor() va returna valoarea unui singur factor, care poate fi o subexpresie
 * sau un numar natural
 */
ull factor() {
    ull r=0;
///    cout<<"F:"<<"\n"<<p<<'\n';
    if ( *p == '(' ) {                      /// avem o subexpresie
        ++p;                                /// trecem peste '('
        r = eval();
    ///    cout<<"P: ( ) \n"<<r<<"\n"<<p<<'\n';
        ++p;                                /// trecem peste ')'
    } else {
        while ( *p>='0' && *p<='9' )  {       /// avem un numar
            r = r*10 + *p - '0';
            ++p;
        }
    }
    return r;
}

int main() {
    ifstream cin("evaluare.in");
    ofstream cout("evaluare.out");
    cin.getline(S,MAX);
    cout<<eval();
    return 0;
}