Cod sursa(job #2406739)

Utilizator minculescualex9Minculescu Alex minculescualex9 Data 16 aprilie 2019 10:05:52
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <fstream>

using namespace std;

ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");

#define lenMax 100005
char Expresie[lenMax], *p = Expresie;

long termen();
long factor();
long eval();

int main(){

    //Citire din fisier
    fin.getline(Expresie, lenMax);

    //Rezolvare si scriere in fisier
    fout << eval();

    fin.close();
    fout.close();
    return 0;
}

/*
 *Functia eval() va "aduna" toti termenii unei expresii / subexpresii (paranteza)
 */
long eval(){
    long rezultat = termen();
    while( *p == '+' || *p == '-' ){
        switch ( *p ){
            case '+' :
                    ++p;
                    rezultat += termen();
                    break;
            case '-' :
                    ++p;
                    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( *p == '*' || *p == '/' ){
        switch ( *p ){
            case '*' :
                    ++p;
                    rezultat *= factor();
                    break;
            case '/' :
                    ++p;
                    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 rezultat = 0;
    if ( *p == '(' ){           //In cazul unei subexpresii (paranteza)
            ++p;        //Trece peste '('
            rezultat = eval();  //Calculeaza subexpresia pe care o va returna ulterior
            ++p;        //Trece peste ')'
    }else{
        while( *p >= '0' && *p <= '9'){ //In cazul unui numar, returneaza numarul
            rezultat = rezultat * 10 + *p - '0';
            ++p;
        }
    }
    return rezultat;
}