Cod sursa(job #1133166)

Utilizator 0x7c00Gabriel Ciubotaru 0x7c00 Data 4 martie 2014 15:58:46
Problema Evaluarea unei expresii Scor 40
Compilator c Status done
Runda Arhiva educationala Marime 1.25 kb
#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));
}