Pagini recente » Borderou de evaluare (job #3320060) | Borderou de evaluare (job #2430438) | Cod sursa (job #1133166)
#include "stdio.h"
#define MAXLEN 100000
#define OP_MUL 0x00
#define OP_ADD 0x01
#define OP_SUB 0x03
#define OP_DIV 0x05
char s[MAXLEN];
int exp[MAXLEN][2];
int eval(int p1,int p2)
{
int i,min =0x7fffffff,p;
//printf("%d %d\n",p1,p2);
if(p1>p2)
{
printf("error1");
return -1;
}
if(p1 == p2)
return exp[p1][0];
for(i=p1+1;i<p2;i+=2)
if(exp[i][1] < min)
{
min = exp[i][1];
p = i;
}
if(exp[p][0] == OP_MUL)
return eval(p1,p-1) * eval(p+1,p2);
if(exp[p][0] == OP_DIV)
return eval(p1,p-1) / eval(p+1,p2);
if(exp[p][0] == OP_ADD)
return eval(p1,p-1) + eval(p+1,p2);
if(exp[p][0] == OP_SUB)
return eval(p1,p-1) - eval(p+1,p2);
printf("error2");
return -1;
}
int main()
{
char *c;
int pos,nr,pri;
FILE *g;
FILE*f = fopen("evaluare.in","r");
fscanf(f,"%s",s);
pri = nr = pos = 0;
for(c = s;*c;c++)
{
if((*c>='0')&&(*c<='9'))
{
nr = nr*10+(*c-'0');
continue;
}
if(*c=='(')
{
pri +=2;
continue;
}
if(*c == ')')
{
pri -=2;
continue;
}
exp[pos++][0] = nr;
nr = 0;
exp[pos][0] = *c - '*';
exp[pos++][1] = pri+((*c == '*')||(*c == '/'));
}
exp[pos][0] = nr;
g = fopen("evaluare.out","w");
fprintf(g,"%d",eval(0,pos));
}