Cod sursa(job #251332)

Utilizator willliIonel Bratianu willli Data 2 februarie 2009 12:43:59
Problema Evaluarea unei expresii Scor 10
Compilator c Status done
Runda Arhiva educationala Marime 1.29 kb
#include <stdio.h>
#include <stdlib.h>
#define MAX 100000

char *p;

long operatie(long a, char c, long b)
{
	//printf("operatie=%c\n", c);
	switch(c)
	{
		case '+' : return a + b;
		case '-' : return a - b;
		case '*' : return a * b;
		case '/' : return a / b;
	}
	return 0;
}

long eval();

long number()
{
	long nr = 0;
	if (*p == '(')
	{
		return eval(p);
	}
	else
	{
		while ('0' <= *p && *p <= '9')
		{
			nr = nr * 10 + (*p - '0');
			p++;
		}
	}	
	//printf("number=%ld\n", nr);
	return nr;
}

long eval()
{
	long a, c;
	char op;
	if (*p == '(')
	{
		p++;
		a = eval(p);
		p++;
	}
	else 
		a = number(p);
	//printf("a=%ld\n", a);
	op = *p;
	//printf("op=%c\n", op);
	if (*p == '+' || *p == '-')
	{	
		p++;
		return operatie(a, op, eval());
	}
	else if (*p == '*' || *p == '/')
	{
		p++;
		c = operatie(a, op, number(p));
		///printf("C=%ld\n", c);		
		if (*p != '\0')
		{
			op = *p;
			p++;
			return operatie(c, op, eval(p));
		}
		else return c;
		
	}
	else 
	{
		return a;
	}
}

int main()
{
	char a[MAX];
	long b;
	FILE *fin, *fout;
	
	if ((fin = fopen("evaluare.in", "r")) == NULL)
	{
		printf("Eroare \n");
		exit(-1);
	}
	
	fscanf(fin, "%s", a);
	fclose(fin);		
	fout = fopen("evaluare.out", "w");
	p = &a[0];
	b = eval();
	//printf("%s = %ld\n", a, b);
	fprintf(fout, "%ld", b);
	fclose(fout);

	return 0;
}