Pagini recente » Cod sursa (job #899448) | Cod sursa (job #3133568) | Cod sursa (job #2878239) | Cod sursa (job #553339) | Cod sursa (job #155326)
Cod sursa(job #155326)
#include<stdio.h>
#include<string.h>
#define dim 1000001
char s[dim];
void citire() {
freopen("evaluare.in","r",stdin),
fgets(s, dim, stdin);
if(s[strlen(s) - 1]=='\n')
s[strlen(s) - 1] = 0;
fclose(stdin);
}
void elimin(long &st, long &dr) {
while(1) {
if(s[st]!='(' || s[dr]!=')')
return;
long par = 0;
for(long i = st + 1; i < dr; i++) {
par -= ((s[i]==')') - (s[i]=='('));
if(par < 0)
return;
}
if(par)
return ;
st++;
dr--;
}
}
long caut(long st, long dr, char semne[]){
long par = 0;
for(long 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(long st, long dr) {
elimin(st,dr);
long p = caut(st + 1, dr, "-+");
if(p == -1)
p = caut(st + 1, dr, "/*");
if(p == -1) {
char p[20];
strncpy(p, s + st, dr - st + 1);
p[dr - st + 1] = 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;
}