Cod sursa(job #1692994)

Utilizator HipixelHi Pixel Hipixel Data 22 aprilie 2016 01:40:37
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>

const int DIM = 1 << 17;
using namespace std;

char S[DIM]; int N, i;

int solve_expression( int &i );
int solve_term( int &i );
int solve_factor( int &i );
int solve_number( int &i );

int solve_expression( int &i ) {
    int result = solve_term( i );

    while( S[i] == '+' || S[i] == '-' ) {
        switch( S[i] ) {
            case '+': { i ++; result += solve_term( i ); break; }
            case '-': { i ++; result -= solve_term( i ); break; }
        }
    }

    return result;
}

int solve_term( int &i ) {
    int result = solve_factor( i );

    while( S[i] == '*' || S[i] == '/' ) {
        switch( S[i] ) {
            case '*': { i ++; result *= solve_factor( i ); break; }
            case '/': { i ++; result /= solve_factor( i ); break; }
        }
    }

    return result;
}

int solve_factor( int &i ) {
    int result;

    if( S[i] == '(' ) {
        i ++;
        result = solve_expression( i );
        i ++;
    } else
        result = solve_number( i );

    return result;
}

int solve_number( int &i ) {
    int result = 0;

    while( S[i] >= '0' && S[i] <= '9' ) {
        result = result * 10 + ( S[i] - '0' );
        i ++;
    }

    return result;
}

int main() {

    ifstream input_file ( "evaluare.in"  );
    ofstream output_file( "evaluare.out" );

    input_file >> S + 1;
    N = strlen( S + 1 );
    i = 1;

    output_file << solve_expression( i );
    return 0;
}