Cod sursa(job #194664)

Utilizator cipPaduraru Ciprian - Ionut cip Data 12 iunie 2008 16:46:54
Problema Evaluarea unei expresii Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define IN "evaluare.in"
#define OUT "evaluare.out"
#define MAXN 100001

char lg[MAXN];
int length;
class Node
{	public:

	char type;	//n, + - 
	int info;	//number
	Node *st,*dr;
	
};
bool isdigit(char c) {return (c>='0' && c<='9');}
int ExtrageNumar(int &i)
{
	int nr = 0;
	while(isdigit(lg[i]))
		nr=nr * 10 + (lg[i++] - '0');
	return nr;
}

int EvaluateArbore(int &i);
int EvaluateTermen(int &i);

int EvaluateFactor(int &i)
{
	int p=0;
	if (lg[i] == '(')
	{
		++i;
		p=EvaluateArbore(i);
		i++;
		return p;
	}
	
	return ExtrageNumar(i);
}

int EvaluateTermen(int &i)
{
	int r=0;
	r += EvaluateFactor(i);
	if (i >= length || (lg[i]!='*' && lg[i]!='/'))
		return r;
	else
	{
		switch(lg[i++])
		{
		case '*':
			r *= EvaluateTermen(i);
			break;
		case '/':
			r /= EvaluateTermen(i);
			break;
		}
	}

	return r;
}

int EvaluateArbore(int &i)
{
	if (i >= length) return 0;
	long r = EvaluateTermen(i);


	while(1)
	{
		if (i >= length || lg[i] == ')')
			return r;
		switch(lg[i++])
		{
			case '+':
				r += EvaluateTermen(i);
				break;
			case '-':
				r -= EvaluateTermen(i);
				break;
		}
		
	}
}

void read()
{
	FILE *f=fopen(IN,"r");
	fscanf(f,"%s",&lg);
	length = strlen(lg);
	fclose(f);
}


int main()
{
	read();
	int v=0;

	FILE *f=fopen(OUT,"w");
	fprintf(f,"%d\n",EvaluateArbore(v));
	fclose(f);

	return 0;
}