Cod sursa(job #449175)

Utilizator DuxarFII-Stefan-Negrus Duxar Data 5 mai 2010 20:49:40
Problema Evaluarea unei expresii Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<iostream>
#include<fstream>

using namespace std;

#define LL long long

ifstream f("evaluare.in");
ofstream g("evaluare.out");

char s[100009];
int val[30],pos;

void citire();
LL eval_exp(int&);
LL eval_termen(int&);
LL eval_factor(int&);

int main()
{
	citire();
	g<<eval_exp(pos);
	f.close();
	g.close();
	return 0;
}

LL eval_factor(int &pos)
{
	LL v=0;
	if (s[pos]>='a'&&s[pos]<='z')
	{
		v=val[s[pos]-'a'+1];
		++pos;
		return v;
	}
	if (s[pos]>='0'&&s[pos]<='9')
	{
		while (s[pos]>='0'&&s[pos]<='9')
		{
			v=v*10+(s[pos]-'0');
			++pos;
		}
	return v;
	}
	++pos;
	v=eval_exp(pos);
	++pos;
	return v;
}
	
LL eval_termen(int &pos)
{
	LL f1=eval_factor(pos),f2;
	char semn;
	if (s[pos]=='*'||s[pos]=='/')
		while (s[pos]=='*'||s[pos]=='/')
		{
			semn=s[pos];
			++pos;
			f2=eval_termen(pos);
			if (semn=='*')
				f1*=f2;
			else f1/=f2;
		}
	return f1;
}

LL eval_exp(int &pos)
{
	LL t1=eval_termen(pos),t2;
	char semn;
	if(s[pos]=='+'||s[pos]=='-')
		while (s[pos]=='+'||s[pos]=='-')
		{
			semn=s[pos];
			++pos;
			t2=eval_exp(pos);
			if (semn=='-')
				t1-=t2;
			else
				t1+=t2;
		}
	return t1;
}


void citire()
{
	char x;
	int v,pos;
	f.getline(s,100009);
	while (f.get(x))
	{
		f.get();
		f>>v;
		f.get();
		pos=x-'a'+1;
		val[pos]=v;
	}
}