Cod sursa(job #1823276)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 6 decembrie 2016 09:49:50
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include <cstdio>
#include <string.h>
using namespace std;

char s[100005];

int getNumber(const int& n, int& i);

int calculate(const int& n, int& i);

int parenthesis(const int& n, int& i);

int main()
{
    freopen("evaluare.in", "r", stdin);
    freopen("evaluare.out", "w", stdout);
    scanf("%s", s+1);
    s[0] = '(';
    int n = strlen(s + 1) + 1;
    s[n] = ')';
    int i = 0;
    printf("%d", parenthesis(n, i));
    return 0;
}

int getNumber(const int& n, int& i){
    if(s[i] == '('){
        return parenthesis(n, i);
    }
    int ret = 0;
    while(i <= n && s[i] >= '0' && s[i] <= '9'){
        ret = ret * 10 + (s[i] - '0');
        i++;
    }
    return ret;
}

int calculate(const int& n, int& i){
    int ret;
    if(s[i] == '('){
        ret = parenthesis(n, i);
    }else{
        ret = getNumber(n, i);
    }
    while(i <= n){
        switch(s[i]){
            case '*':
                i++;
                ret *= getNumber(n, i);
                break;
            case '/':
                i++;
                ret /= getNumber(n, i);
                break;
            default:
                return ret;
                break;
        }
    }
    return ret;
}

int parenthesis(const int& n, int& i){
    i++;
    int ret;
    if(s[i] == '('){
        ret = parenthesis(n, i);
    }else{
        ret = getNumber(n, i);
    }
    while(i <= n){
        switch(s[i]){
            case '+':
                i++;
                ret += calculate(n, i);
                break;
            case '-':
                i++;
                ret -= calculate(n, i);
                break;
            case '*':
                i++;
                ret *= getNumber(n, i);
                break;
            case '/':
                i++;
                ret /= getNumber(n, i);
                break;
            case ')':
                i++;
                return ret;
                break;
        }
    }
    return ret;
}