Cod sursa(job #2692925)

Utilizator ionicaion ionica Data 4 ianuarie 2021 12:44:49
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.18 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 <fstream>
#define NM 100001
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char s[NM];

long termen();
long factor();
int i;
/**
 Functia eval() va "aduna" toti termenii unei expresii/subexpresii.
**/

long eval()
{
    long r;
    r= termen();
    while (s[i]=='+' || s[i]=='-')

        switch(s[i])
        {
        case '+':
            i++;
            r=r+termen();
            break;
        case '-':
            i++;
            r=r-termen();
            break;
        }
    return r;
}

/**
 Functia termen() se ocupa de continutul unui termen.
 Acesta este compus la randul lui din factori inmultiti
 sau impartiti
 **/
long termen()
{
    long r;
    r=factor();
    while (s[i]=='*' || s[i]=='/')
        switch(s[i])
        {
            case '*':i++;
                     r=r*factor();
                      break;

            case '/': i++;
                      r=r/factor();
                      break;
        }
    return r;
}

/**
 Functia factor() va returna valoarea unui singur factor,
 care poate fi o subexpresie  sau un numar natural
 **/
long factor()
{
    long r;
    r=0;
    if(s[i]=='(') ///avem o subexpresie
    {
        i++; /// trecem peste '('
        r=eval();
        i++; /// trecem peste ')'
    }
    else
            while(s[i]>='0' && s[i]<='9')
            {
                r=r*10+s[i]-'0';
                i++;
            }
return r;
}
    int main()
    {
        char x;
        i=0;
        while (fin>>x)
        {
            i++;
            s[i]=x;
        }

        i=1;
        fout<<eval();
        return 0;
    }