Cod sursa(job #477694)

Utilizator miculprogramatorA Cosmina - vechi miculprogramator Data 15 august 2010 23:44:45
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.47 kb
/*
** Metoda de rezolvare foloseste recursivitatea indirecta.
** Elementele unei expresii sunt termenii (separati prin + sau -)
** si subexpresiile incadrate intre (  ).
** Un termen poate fi la randul sau compus din factor (separati prin * sau /);
** Subexpresiile, asemenea expresiilor, sunt alcatuite din termeni.
*/
#include <stdio.h>
#include <string.h>
using namespace std;

char e[100001];
int lg, i, j, k;
int rezultat;

int evaluare_expresie ();
int evaluare_termen ();
int evaluare_factor ();

int e_operator (char ch)        // verficica daca elementul curent este cifra
{
    if (ch >= '0' && ch <= '9')
        return 1;
    return 0;
}

int evaluare_expresie()         // functia evaluare_expresie () va aduna/scadea toti termenii expresiei/subexpresiei
{
    int r;
    r = evaluare_termen ();
    while (e[i] == '+' || e[i] == '-')      // cat timp mai am termeni
    {
        if (e[i] == '+')
        {
            i ++;                           // trec peste semnul +
            r += evaluare_termen ();
        }
        else if (e[i] == '-')
        {
            i ++;                           // trec peste semnul -
            r -= evaluare_termen ();
        }
    }

    return r;
}

int evaluare_termen ()      // functia va inmulti/scadea toti factorii din termen
{
    int r;
    r = evaluare_factor ();
    while (e[i] == '*' || e[i] == '/')
    {
        if (e[i] == '*')
        {
            i ++;           // trec peste semnul *
            r *= evaluare_factor ();
        }
        else if (e[i] == '/')
        {
            i ++;           // trec peste semnul /
            r /= evaluare_factor ();
        }
    }

    return r;
}

int evaluare_factor ()      // functia va returna un factor sau o subexpresie
{
    int r = 0;

    if (e[i] == '(')        // am gasit o subexpresie
    {
        i ++;                           // trecem peste (
        r = evaluare_expresie ();       // evaluam subexpresia
        i ++;                           // trecem peste )
    }
    else
    {
        while (e_operator (e[i]))
        {
            r = r * 10 + e[i] - '0';
            i ++;
        }
    }

    return r;
}

int main ()
{
    FILE *f = fopen ("evaluare.in","r");
    FILE *g = fopen ("evaluare.out","w");
    fscanf (f,"%s", e);
    lg = strlen (e);

    rezultat = evaluare_expresie ();
    fprintf (g, "%d\n", rezultat);

    fclose (g);
    fclose (f);
    return 0;
}