Cod sursa(job #2672526)

Utilizator DVDPRODavid D DVDPRO Data 14 noiembrie 2020 10:19:53
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.21 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 <cstdio>



const long MAX = 100010;

char s[MAX];
int i = 0;



long termen();

long factor();



/*

 * Functia eval() va "aduna" toti termenii unei expresii/subexpresii.

 */

long eval()
{
    long rezultat = termen();
    while ( s[i] =='+' || s[i]=='-' )
    {
        switch ( s[i] )
        {
        case '+':
            ++i;						// trecem peste semnul "+"
            rezultat += termen();
            break;
        case '-':
            ++i;						// trecem peste semnul "-"
            rezultat -= termen();
            break;
        }
    }
    return rezultat;
}

/*

 * Functia termen() se ocupa de continutul unui termen. Acesta este compus la randul

 * lui din factori inmultiti.

 */

long termen()
{
    long rezultat=factor();
    while ( s[i] =='*' || s[i]=='/' )
    {
        switch ( s[i] )
        {
        case '*':
            ++i;						// trecem peste semnul "*"
            rezultat *= factor();
            break;
        case '/':
            ++i;						// trecem peste semnul "/"
            rezultat /= factor();
            break;
        }
    }
    return rezultat;
}

/*

 * Functia factor() va returna valoarea unui singur factor, care poate fi o subexpresie

 * sau un numar natural

 */

long factor()
{
    long f=0;
    if(s[i]=='(')
        {
            i++;
            f=eval();
            i++;
        }
    while(s[i]>='0' && s[i]<='9')
    {
        f*=10;
        f+=s[i]-'0';
        i++;
    }
    return f;
}



int main()
{

    fgets(s, MAX, fopen("evaluare.in", "r"));
    fprintf(fopen("evaluare.out", "w"), "%ld\n", eval());
    return 0;
}