Cod sursa(job #875188)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 9 februarie 2013 19:49:05
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <fstream>
 
using namespace std;

//Expresia 
char sir[100005];

//Un pointer la carcterul curent
char *p=sir;
 
//Prototipurile functiilor ce determina termenul respectiv factorul curent
int termen();
int factor();

//Functia ce evalueaza o expresie 
int eval()
{
    //Se determina primul termen
    int r=termen();
 
    //Cat timp dupa termenul curent avem plus sau minus continuam
    while(*p=='+' || *p=='-')
    {
        //Daca e plus se aduna la suma r          
        if(*p=='+')
        {
            p++; //Trecem peste semn
            r+=termen();
        }
        else //Daca e minus se scade din suma r
        {
            p++;
            r-=termen();
        }
    }
 
    return r;
}

//Functia ce determina termenul curent 
int termen()
{
    //Fix aceeasi idee ca mai sus numai ca folosim *,/ si factor in loc de +,- si termen
    int r=factor();
 
    while(*p=='*' || *p=='/')
    {
        if(*p=='*')
        {
            p++;
            r*=factor();
        }
        else
        {
            p++;
            r/=factor();
        }
    }
 
    return r;
}

//Functia determina factorul curent si se ocupa de paranteze 
int factor()
{
    int r=0;
    
    //Daca avem o paranteza consideram interiorul ei o noua expresie
    if(*p=='(')
    {
        p++; //Trecem de paranteza initiala
        r=eval();
        p++; //Trecem de paranteza finala
    }
    else while(*p>='0'&& *p<='9') //Daca avem cifre calculam numarul format de ele
    {
        r*=10;
        r+=((*p)-'0');
        p++;
    }
 
    return r;
}
int main()
{
    //Deschiderea fisierelor de intrare si iesire
    ifstream fin("evaluare.in");
    ofstream fout("evaluare.out");
 
    //Citim sirul si afisam raspunsul
    fin.get(sir,100005);
    fout<<eval()<<'\n';
 
    //Inchiderea fisierelor de intrare si iesire
    fin.close();
    fout.close();
    return 0;
}