Cod sursa(job #2573542)

Utilizator Iustin01Isciuc Iustin - Constantin Iustin01 Data 5 martie 2020 18:05:44
Problema Evaluarea unei expresii Scor 10
Compilator cpp-64 Status done
Runda recapitulare_finala Marime 2.68 kb
#include <bits/stdc++.h>
using namespace std;

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


struct ex{
    int val;
    char semn;
}x, v[100001];

int rez, k, sum;

char s[100001], semne[] = "-+*/", sem = '1';

int exp(int & i){
    char se;
    ex v2[100001];
    int z = 0;
    while(s[i] != ')'){
        if(isdigit(s[i])){
            if(s[i - 1] != '(')
                se = s[i - 1];
            else
                se = '+';
            int nr = 0;
            while(isdigit(s[i]))
                nr = nr * 10 + (int)(s[i] - '0'), i++;
            if(strchr(semne, se))
                x.semn = se;
            x.val = nr;
            if(x.semn == '*'){
                v2[z].val *= x.val;
            }
            else
                if(x.semn == '/')
                v2[z].val /= x.val;
            else
                if(x.semn == '-')
                v2[++z].val = x.val, v2[z].semn = x.semn;
            else if(x.semn == '+')
                v2[++z].val = x.val, v2[z].semn = x.semn;
        }
        else
            i++;
    }
    for(int j = 1; j <= z; j++){
        if(v2[j].semn == '+')
            sum += v2[j].val;
        else
            sum -= v2[j].val;
    }
    return sum;
}

int main(){
    in.getline(s, 100001);
    for(int i = 0; i < strlen(s); i++){
        if(isdigit(s[i])){
            if(i > 0) sem = s[i - 1];
            else sem = '+';
            int nr = 0;
            while(isdigit(s[i]))
                nr = nr * 10 + (int)(s[i] - '0'), i++;
            if(strchr(semne, sem))
                x.semn = sem;
            x.val = nr;

            if(x.semn == '*'){
                v[k].val *= x.val;
            }
            else
                if(x.semn == '/')
                v[k].val /= x.val;
            else
                if(x.semn == '-')
                v[++k].val = x.val, v[k].semn = x.semn;
            else if(x.semn == '+')
                v[++k].val = x.val, v[k].semn = x.semn;
        }
        else
            if(s[i] == '('){
                if(i > 0) sem = s[i - 1];
                else sem = '+';
                int r = exp(i);
            if(sem == '*'){
                v[k].val *= r;
            }
            else
                if(sem == '/')
                v[k].val /= r;
            else
                if(sem == '-')
                v[++k].val = r, v[k].semn = '-';
            else if(sem == '+')
                v[++k].val = r, v[k].semn = '+';
            }
    }

    sum = 0;
    for(int i = 1; i <= k; i++){
        if(v[i].semn == '-')
            sum -= v[i].val;
        else
            sum += v[i].val;
    }
    out<<sum;
}