Cod sursa(job #153440)

Utilizator Andrei_ScorpioAndreiana Andrei Daniel Andrei_Scorpio Data 10 martie 2008 15:42:45
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include<fstream.h>
#include<string.h>
char a[100010],c,b[100010];
long vb1,i,nr,n,vb,vx,nrx[100010],vn,j;
long x[100010];
ifstream f("evaluare.in");
ofstream g("evaluare.out");
void plus_minus()
{
while(b[vb-1]=='*' || b[vb-1]=='/')
	{
	while(b[vb-1]=='*')
		{
		x[vx-2]=x[vx-2]*x[vx-1];
		vx--;
		vb--;
		}
	while(b[vb-1]=='/')
		{
		x[vx-2]=x[vx-2]/x[vx-1];
		vb--;
		vx--;
		}
	}
b[vb]=a[i];
vb++;
}
void ori_supra()
{
b[vb]=a[i];
vb++;
}
void paranteza_d()
{
b[vb]='(';
//par[vp]=vb;
nrx[vn]=vx;
vn++;
//vp++;
vb++;
}
void paranteza_i()
{
vb1=vb;
for(j=vb1-1;b[j]!='(';j--)
	{
	switch(b[j])
		{
		case '+':x[nrx[vn-1]]+=x[nrx[vn-1]+vb1-j];break;
		case '-':x[nrx[vn-1]]-=x[nrx[vn-1]+vb1-j];break;
		case '*':x[nrx[vn-1]]*=x[nrx[vn-1]+vb1-j];break;
		case '/':x[nrx[vn-1]]/=x[nrx[vn-1]+vb1-j];break;
		}
	vx--;
	vb--;
	}
vn--;
vb--;
//vp--;
}
int main()
{
f>>a;
int n;
n=strlen(a);
i=0;
while(i<n)
	{
	if(a[i]>='0' && a[i]<='9')
		{
		x[vx]=0;
		while(a[i]>='0' && a[i]<='9')
			{
			x[vx]=x[vx]*10+a[i]-'0';
			i++;
			}
		i--;
		vx++;
		}
	else
		{
		if(a[i]=='+' || a[i]=='-')
			plus_minus();
		else
			if(a[i]=='*' || a[i]=='/')
				ori_supra();
			else
				if(a[i]=='(')
					paranteza_d();
				else
					if(a[i]==')')
						paranteza_i();

		}

	i++;
	}
for(i=0;i<vb;i++)
	{
	switch(b[i])
		{
		case '+':x[0]+=x[i+1];break;
		case '-':x[0]-=x[vx-1];break;
		case '*':x[0]*=x[vx-1];break;
		case '/':if(x[i+1]!=0)
				x[0]/=x[i+1];
				break;
		}
	}
g<<x[0]<<'\n';
g.close();
return 0;
}