Cod sursa(job #2358242)

Utilizator AntoniuFicAntoniu Ficard AntoniuFic Data 27 februarie 2019 22:42:11
Problema Evaluarea unei expresii Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.13 kb
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;

int eval(char str[], int len){
    bool signs = false;
    for(int i=0; i<len && !signs; i++)
        if(strchr("+-/*", str[i]) != NULL)
            signs = true;
    if(!signs){
        int value = 0;
        for(int i=0; i<len; i++)
            value = value *10 + str[i] - '0';
        return value;
    }
    int start = 0, brackets = 0;
    if(str[start] == '(' && str[len-1] == ')')
        start++, str[len-1] = 0, len--;
    char * plus=NULL, * minus=NULL;
    char * mult=NULL, * div=NULL;
    for(int i=start; i<len; i++)
    {
        if(str[i] == '(')
            brackets++;
        else if(str[i] == ')')
            brackets--;
        if(brackets == 0 && str[i] == '+')
            plus = str+i;
        else if(brackets == 0 && str[i] == '-')
            minus = str+i;
        else if(brackets == 0 && str[i] == '*')
            mult = str+i;
        else if(brackets ==0 && str[i] == '/')
            div = str+i;
    }
    if(plus != NULL && minus != NULL){
        if(plus > minus){
            return eval(str+start, (int)(plus-str)) + eval(plus+1, len-(int)(plus-str)-1);
        }else{
            return eval(str+start, (int)(minus-str)) - eval(minus+1, len-(int)(minus-str)-1);
        }
    }else if(plus != NULL)
        return eval(str+start, (int)(plus-str)) + eval(plus+1, len-(int)(plus-str)-1);
    else if(minus != NULL)
        return eval(str+start, (int)(minus-str)) - eval(minus+1, len-(int)(minus-str)-1);

    if(mult != NULL && div != NULL){
        if(mult > div){
            return eval(str+start, (int)(mult-str)) * eval(mult+1, len-(int)(mult-str)-1);
        }else{
            return eval(str+start, (int)(div-str)) / eval(div+1, len-(int)(div-str)-1);
        }
    }else if(mult != NULL)
        return eval(str+start, (int)(mult-str)) * eval(mult+1, len-(int)(mult-str)-1);
    else if(div != NULL)
        return eval(str+start, (int)(div-str)) / eval(div+1, len-(int)(div-str)-1);
}

int main() {
    ifstream f("evaluare.in");
    ofstream g("evaluare.out");
    char str[100000]="";
    f>>str;
    g<<eval(str, strlen(str));
    return 0;
}