Cod sursa(job #603114)

Utilizator batistaUPB-Oprea-Cosmin-Dumitru batista Data 14 iulie 2011 16:54:12
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include<fstream>
using namespace std;
char s[100002],cp[100002];
ofstream g("evaluare.out");
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;  char aux[10];
	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]=='*')ltoa(rez1*rez2,aux,10); 
		  if(s[i]=='/')ltoa(rez1/rez2,aux,10); 
		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]=='+')ltoa(rez1+rez2,aux,10); 
		  if(s[i]=='-')ltoa(rez1-rez2,aux,10); 
		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--;
  }
  g<<eval(0,strlen(s));
}

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