Cod sursa(job #1204986)

Utilizator Pintilie_AndreiFII-Pintilie Andrei Pintilie_Andrei Data 4 iulie 2014 16:34:11
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 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>
#include <cstring>
using namespace std;

char s[100010];
int n,poz;

int Factori();
int Paranteza();

int Evaluare()
{
    int nr=Factori();
        while(s[poz]=='+' || s[poz]=='-')
    {
        if(s[poz]=='+')
        {
            poz++;
            nr=nr+Factori();
        }
        else
        {
            poz++;
            nr=nr-Factori();
        }
    }
    return nr;
}

int Factori()
{
    int nr=Paranteza();

    while(s[poz]=='*' || s[poz]=='/')
    {
        if(s[poz]=='*')
        {
            poz++;
            nr=nr*Paranteza();
        }
        else
        {
            poz++;
            nr=nr/Paranteza();
        }
    }
    // printf("%d ",nr);
    return nr;
}


int Paranteza()
{
    int nr=0;
    if(s[poz]=='(')
    {
        poz++;
        nr=Evaluare();
        poz++;
    }
    else while(s[poz]<='9' && s[poz]>='0')
    {
        nr=s[poz]-'0'+nr*10;
        poz++;
    }

    return nr;
}





int main()
{
    freopen("evaluare.in","r",stdin);
    scanf("%s",s+1);
    n=strlen(s+1);
    poz=1;
    freopen("evaluare.out","w",stdout);
    printf("%d ",Evaluare());
    return 0;
}