Cod sursa(job #2691288)

Utilizator Fantastic_Mantudor voicu Fantastic_Man Data 27 decembrie 2020 21:53:12
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <string.h>
using namespace std;
ifstream fin ( "evaluare.in" );
ofstream fout ( "evaluare.out" );
const int NMAX = 1e5;
char s[NMAX + 1];
int n, k;
inline int op ( int a, int b, char ch ) {
    if ( ch == '+' )
        return a + b;
    if ( ch == '-' )
        return a - b;
    if ( ch == '*' )
        return a * b;
    if ( ch == '/' )
        return a / b;
    return -1;
}
int eval ();
int factor() {
    int rez;
    if ( s[k] == '(' ) { // fie (expresie)
        k++; // sar peste '('
        rez = eval();
        k++; // sar peste ')'
    } else { // fie numar
        rez = 0;
        while ( k <= n && isdigit ( s[k] ) )
            rez = rez * 10 + s[k++] - '0';
    }
    return rez;
}
int termen () { // de forma factor * factor / factor
    int rez = factor();
    while ( k <= n && ( s[k] == '*' || s[k] == '/' ) ) {
        char semn = s[k];
        k++; // sar peste semn
        rez = op ( rez, factor(), semn );
    }
    return rez;
}
int eval () {
    int rez = termen();
    while ( k <= n && ( s[k] == '+' || s[k] == '-' ) ) {
        char semn = s[k++]; // salvez semnul si sar peste
        rez = op ( rez, termen(), semn );
    }
    return rez;
}
int main () {
    fin >> ( s + 1 );
    n = strlen ( s + 1 );
    k = 1;
    fout << eval();
    
    return 0;
}