Cod sursa(job #603321)

Utilizator batistaUPB-Oprea-Cosmin-Dumitru batista Data 15 iulie 2011 14:58:49
Problema Evaluarea unei expresii Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.25 kb
#include<fstream>
using namespace std;
char s[100002],cp[100002];
char aux[10];
int x=1;
ofstream g("evaluare.out");
void conv(long nr)
{int k=0;aux[0]=0;
	if(nr<0){ aux[0]='-';k++; nr=-nr;}
	while(nr)
	{
		if(nr%10==0)aux[k]='0';
		if(nr%10==1)aux[k]='1';
		if(nr%10==2)aux[k]='2';
		if(nr%10==3)aux[k]='3';
		if(nr%10==4)aux[k]='4';
		if(nr%10==5)aux[k]='5';
		if(nr%10==6)aux[k]='6';
		if(nr%10==7)aux[k]='7';
		if(nr%10==8)aux[k]='8';
		if(nr%10==9)aux[k]='9';
		nr/=10;
		k++;
	}
	(aux+k)[0]=0;
	reverse(aux,aux+k);
}
long termens(int k)
{int nr=0,nr1=0;
  x=1;
	while(s[k]<='9' && s[k]>='0') k--; 
	if(s[k]=='-' && k==0)x=-1;
	k++;
	while(s[k]<='9' && s[k]>='0') { nr=nr*10+s[k]-'0'; k++; } 
	return nr*x;
}
long termend(int k)
{int nr=0;
	while(s[k]<='9' && s[k]>='0') { nr=nr*10+s[k]-'0'; k++; } 
	return nr;
}
long eval(int pozs,int pozd)
{long rez1,rez2,i,is=0,id=0;  
	for(i=pozs;i<pozd;i++) 
	 if(s[i]=='*' || s[i]=='/') 
	 { 
		 rez1=termens(i-1); 
	      for(is=i-1;is>=0 && s[is]<='9' && s[is]>='0';is--);
		rez2=termend(i+1); 
	      for(id=i+1;id<strlen(s) && s[id]<='9' && s[id]>='0';id++);
		aux[0]=0;
		  if(s[i]=='*')conv(rez1*rez2); 
		  if(s[i]=='/')conv(rez1/rez2); 
		cp[0]=0;
		  strcpy(cp,s+id);
		  (s+is+1)[0]=0;
		  strcpy(s+is+1,aux);
		  strcat(s,cp);
		  pozd=pozd-(id-is)+strlen(aux)+1;
		  i=is;
		  if(i<0)i=0;
	 }
	char *p,s1[100001];
	s1[0]=0;
	long sum=0;
	strncpy(s1,s+pozs,pozd-pozs+1);
	int xx=1;i=0;
	while(i<strlen(s1))
	{
		rez2=0;
	   for(;i<strlen(s) && s1[i]>='0' && s1[i]<='9';i++) rez2=rez2*10+s1[i]-'0';
	   rez2*=xx;
	   sum+=rez2;
	   if(s1[i]=='-')xx=-1;
	   i++;
	}
	
   cp[0]=0;
   strcpy(cp,s+pozd+1);
   conv(sum);
   strcpy(s+pozs,aux);
   strcpy(s+pozs+strlen(aux),cp);
   return sum;
}

void par()
{ int pozs,pozd,ps,i,k=0;  
  for(i=0;i<strlen(s);i++) 
	 if(s[i]=='(') k++;
  while(k)
  {
	for(i=0;i<strlen(s);i++) if(s[i]=='(')pozs=i;  
	   strcpy( s+pozs ,s+pozs+1 ); ps=pozs;
	for(pozd=pozs; s[pozd]!=')' ;pozd++); 
	   strcpy( s+pozd ,s+pozd+1 );
	 pozs=ps;
	 eval( pozs ,pozd-1);
	k--;
  }
  int x=strlen(s);
  g<<eval(0,x);
}

int main()
{
	ifstream f("evaluare.in");
	f.getline(s,1001);
	par();
	f.close();g.close();
return 0;}