Cod sursa(job #251370)

Utilizator willliIonel Bratianu willli Data 2 februarie 2009 14:03:35
Problema Evaluarea unei expresii Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.75 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 termen();
long expp(long);

long expresie()
{
	long value;
	value = termen();
	//printf("Ex termen %ld\n", value);
	return expp(value);
}

long expp(long value)
{
	long next;
	char op = *p;
	if (op == '+' || op == '-')
	{
		do
		{
			p++;
			next = termen();
			value = operatie(value, op, next);
			op = *p;			
		}
		while (op == '+' || op == '-');
		//printf("Expp value after op %ld\n", value);
	}
	return value;
}

long factor();
long term(long);
long termen()
{
	long value = factor();
	//printf("Termen factor %ld\n", value);
	return term(value);
}

long term(long value)
{
	char op = *p;
	long next;
	if (op == '*' || op == '/')
	{
		do
		{
			p++;
			next = factor();
			value = operatie(value, op, next);
			op = *p;
		}
		while (op == '*' || op == '/');
		//printf("Term after %ld\n", value);
	}
	return value;
}

long factor()
{
	long value = 0;
	if (*p == '(')
	{
		p++;
		//printf("Expresie (%c\n", *p);
		value = expresie();
		//printf("Sfarsit de Expresie %s\n", p);
		p++;
		//printf("*p =%c\n", *p);
	}
	else
	{
		while ('0' <= *p && *p <= '9')
		{
			value = value * 10 + (*p - '0');
			p++;
		}
	}
	//printf("Factor %ld\n", value);
	return value;
}

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 = expresie();
	//printf("%s = %ld\n", a, b);
	fprintf(fout, "%ld", b);
	fclose(fout);

	return 0;
}