Cod sursa(job #607838)

Utilizator batistaUPB-Oprea-Cosmin-Dumitru batista Data 13 august 2011 16:53:30
Problema Evaluarea unei expresii Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.22 kb
#include<fstream>
using namespace std;
char s[100002],cp[100002];
char aux[10];
ofstream g("evaluare.out");
void conv(long nr1)
{int k=0,nr=0;aux[0]=0;
	if(nr1<0){ s[0]='-';k++; }
	while(nr1){nr=nr*10+nr1%10;nr1/=10;}
	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;
}
long termens(int k)
{int nr=0,nr1=0;
	while(s[k]<='9' && s[k]>='0') k--; 
	k++;
	while(s[k]<='9' && s[k]>='0') { nr=nr*10+s[k]-'0'; k++; } 
	return nr;
}
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;
	 }
	 //adunare
	 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;
	 }
	return atol(s);
}

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;}