Pagini recente » Cod sursa (job #409143) | Cod sursa (job #661488) | Cod sursa (job #2085419) | Cod sursa (job #2517979) | Cod sursa (job #155289)
Cod sursa(job #155289)
#include<stdio.h>
#include<string.h>
#define dim 100001
char s[dim];
void citire() {
freopen("evaluare.in","r",stdin),
gets(s);
fclose(stdin);
}
void elimin(int &st, int &dr) {
while(1) {
if(s[st]!='(' || s[dr]!=')')
return;
int par = 0;
for(int i = st + 1; i < dr; i++) {
par -= ((s[i]==')') - (s[i]=='('));
if(par < 0)
return;
}
if(par)
return ;
st++;
dr--;
}
}
int caut(int st, int dr, char semne[]){
int par = 0;
for(int i = dr; i >= st; i--) {
par -= ((s[i]==')') - (s[i]=='('));
if(!par && (s[i] == semne[0] || s[i] == semne[1]))
return i;
}
return -1;
}
long eval(int st,int dr) {
elimin(st,dr);
long p = caut(st + 1, dr, "-+");
if(p == -1)
p = caut(st + 1, dr, "/*");
if(p == -1) {
char p[11];
strncpy(p, s + st, dr - st + 1);
p[dr - st + 2] = 0;
long x;
sscanf(p,"%ld",&x);
return x;
}
long e1 = eval(st ,p-1);
long e2 = eval(p + 1,dr);
switch(s[p]){
case '+':
return e1+e2;
case '-':
return e1-e2;
case '*':
return e1*e2;
default:
return e1/e2;
}
}
int main() {
citire();
freopen("evaluare.out","w",stdout);
printf("%ld",eval(0,strlen(s)-1));
fclose(stdout);
return 0;
}