Cod sursa(job #357252)

Utilizator undogSavu Victor Gabriel undog Data 18 octombrie 2009 16:07:58
Problema Evaluarea unei expresii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.74 kb
#include <cstdio>
#include <cstring>

char a[100000];
int n;

int getExpression(int pos);

int getNumber(int i){
	int nr=0;
	while(a[i]>='0'&&a[i]<='9'){
		nr=nr*10+a[i]-48;
		i++;
	}
	return nr;
}

int getProduct(int pos){
	int i,nr=1,l=pos;
	for(i=pos;i<n;i++){
		if(a[i]=='*'||a[i]=='/'){
			if(l==pos)
				nr*=getNumber(l);
			else if(a[l]=='*')
				nr*=getNumber(l+1);
			else if(a[l]=='/')
				nr/=getNumber(l+1);
			l=i;
		}
		else if(a[i]==')'||a[i]=='+'||a[i]=='-'){
			if(l==pos)
				nr*=getNumber(l);
			else if(a[l]=='*')
				nr*=getNumber(l+1);
			else if(a[l]=='/')
				nr/=getNumber(l+1);
			return nr;
		}
		else if(a[i]=='('){
			int j=i+1,p=1;
			while(p){
				if(a[j]==')')
					p--;
				else if(a[j]=='(')
					p++;
				j++;
			}
				
			if(l==pos)
				nr*=getExpression(l+1);
			else if(a[l]=='*')
				nr*=getExpression(l+2);
			else if(a[l]=='/')
				nr/=getExpression(l+2);
					
			l=j;
			if(a[j]==')')
				i=j-1;
			else
				i=j;	
		}
	}
}

int getExpression(int pos){
	int i,nr=0,l=pos;
	for(i=pos;i<n;i++){
		if(a[i]=='+'||a[i]=='-'){
			if(l==pos)
				nr+=getNumber(l);
			else if(a[l]=='+')
				nr+=getNumber(l+1);
			else if(a[l]=='-')
				nr-=getNumber(l+1);
			l=i;
		}
		else if(a[i]=='*'||a[i]=='/'){
			if(l==pos)
				nr+=getProduct(l);
			else if(a[l]=='+')
				nr+=getProduct(l+1);
			else if(a[l]=='-')
				nr-=getProduct(l+1);
			int j,p;
			for(j=i;j<n;j++)
				if(a[j]=='('){
					p=1;j++;
					while(p){
						if(a[j]==')')
							p--;
						if(a[j]=='(')
							p++;
						j++;
					}
					j--;
				}
				else if(a[j]=='+'||a[j]=='-'||a[j]==')')
					break;
			if(a[j]==')')
				return nr;
			l=j;
			i=j;
		}
		else if(a[i]==')'){
			if(l==pos)
				nr+=getNumber(l);
			else if(a[l]=='+')
				nr+=getNumber(l+1);
			else if(a[l]=='-')
				nr-=getNumber(l+1);
			return nr;
		}
		else if(a[i]=='('){
			int j=i+1,p=1;
			while(p){
				if(a[j]==')')
					p--;
				else if(a[j]=='(')
					p++;
				j++;
			}
			if(a[j]=='+'||a[j]=='-'||a[j]==')'){
				if(l==pos)
					nr+=getExpression(l+1);
				else if(a[l]=='+')
					nr+=getExpression(l+2);
				else if(a[l]=='-')
					nr-=getExpression(l+2);
			}
			else{
				if(l==pos)
					nr+=getProduct(l);
				else if(a[l]=='+')
					nr+=getProduct(l+1);
				else if(a[l]=='-')
					nr-=getProduct(l+1);
				for(;j<n;j++)
					if(a[j]=='('){
						p=1;j++;
						while(p){
							if(a[j]==')')
								p--;
							if(a[j]=='(')
								p++;
							j++;
						}
						j--;
					}
					else if(a[j]=='+'||a[j]=='-'||a[j]==')')
						break;
				if(a[j]==')')
					return nr;
			}
			l=j;
			if(a[j]==')')
				i=j-1;
			else
				i=j;
		}
	}
}


int main(){
	freopen("evaluare.in","rt",stdin);
	freopen("evaluare.out","wt",stdout);
	scanf("%s",a);
	n=strlen(a);
	a[n]=')';
	n++;
	printf("%d\n",getExpression(0));
	return 0;
}