Pagini recente » Cod sursa (job #348349) | Cod sursa (job #1482781) | Cod sursa (job #2720534) | Cod sursa (job #1911449) | Cod sursa (job #2573542)
#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;
}